From f2640c074236380656c7a35d905cd18731652c44 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 25 Feb 2025 14:31:03 +0000 Subject: [PATCH 01/24] Use ciborium for serialization of Program --- Cargo.lock | 1 + Cargo.toml | 94 ++++++++++++++----------------- acvm-repo/acir/Cargo.toml | 1 + acvm-repo/acir/src/circuit/mod.rs | 7 ++- 4 files changed, 48 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a7740dfcd8..d6cbfbc77cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,6 +10,7 @@ dependencies = [ "base64 0.21.7", "bincode", "brillig", + "ciborium", "criterion", "flate2", "fxhash", diff --git a/Cargo.toml b/Cargo.toml index d41ea0939b7..4580a3ce332 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,50 +1,44 @@ [workspace] members = [ - # Compiler crates - "compiler/noirc_arena", - "compiler/noirc_evaluator", - "compiler/noirc_frontend", - "compiler/noirc_errors", - "compiler/noirc_driver", - "compiler/noirc_printable_type", - "compiler/fm", - "compiler/wasm", - # Crates related to tooling built on top of the Noir compiler - "tooling/lsp", - "tooling/debugger", - "tooling/fuzzer", - "tooling/nargo", - "tooling/nargo_fmt", - "tooling/nargo_cli", - "tooling/nargo_toml", - "tooling/noirc_artifacts", - "tooling/noirc_artifacts_info", - "tooling/noirc_abi", - "tooling/noirc_abi_wasm", - "tooling/acvm_cli", - "tooling/artifact_cli", - "tooling/profiler", - "tooling/inspector", - # ACVM - "acvm-repo/acir_field", - "acvm-repo/acir", - "acvm-repo/acvm", - "acvm-repo/acvm_js", - "acvm-repo/brillig", - "acvm-repo/brillig_vm", - "acvm-repo/blackbox_solver", - "acvm-repo/bn254_blackbox_solver", - # Utility crates - "utils/iter-extended", -] -default-members = [ - "tooling/nargo_cli", - "tooling/acvm_cli", - "tooling/artifact_cli", - "tooling/profiler", - "tooling/inspector", +# Compiler crates +"compiler/noirc_arena", +"compiler/noirc_evaluator", +"compiler/noirc_frontend", +"compiler/noirc_errors", +"compiler/noirc_driver", +"compiler/noirc_printable_type", +"compiler/fm", +"compiler/wasm", +# Crates related to tooling built on top of the Noir compiler +"tooling/lsp", +"tooling/debugger", +"tooling/fuzzer", +"tooling/nargo", +"tooling/nargo_fmt", +"tooling/nargo_cli", +"tooling/nargo_toml", +"tooling/noirc_artifacts", +"tooling/noirc_artifacts_info", +"tooling/noirc_abi", +"tooling/noirc_abi_wasm", +"tooling/acvm_cli", +"tooling/artifact_cli", +"tooling/profiler", +"tooling/inspector", +# ACVM +"acvm-repo/acir_field", +"acvm-repo/acir", +"acvm-repo/acvm", +"acvm-repo/acvm_js", +"acvm-repo/brillig", +"acvm-repo/brillig_vm", +"acvm-repo/blackbox_solver", +"acvm-repo/bn254_blackbox_solver", +# Utility crates +"utils/iter-extended", ] +default-members = ["tooling/nargo_cli", "tooling/acvm_cli", "tooling/artifact_cli", "tooling/profiler", "tooling/inspector"] resolver = "2" [workspace.package] @@ -96,12 +90,8 @@ noirc_artifacts_info = { path = "tooling/noirc_artifacts_info" } noir_artifact_cli = { path = "tooling/artifact_cli" } # Arkworks -ark-bn254 = { version = "^0.5.0", default-features = false, features = [ - "curve", -] } -ark-bls12-381 = { version = "^0.5.0", default-features = false, features = [ - "curve", -] } +ark-bn254 = { version = "^0.5.0", default-features = false, features = ["curve"] } +ark-bls12-381 = { version = "^0.5.0", default-features = false, features = ["curve"] } ark-grumpkin = { version = "^0.5.0", default-features = false } ark-ec = { version = "^0.5.0", default-features = false } ark-ff = { version = "^0.5.0", default-features = false } @@ -138,6 +128,7 @@ criterion = "0.5.0" pprof = { version = "0.14", features = ["flamegraph", "criterion"] } cfg-if = "1.0.0" +ciborium = "0.2" dirs = "4" serde = { version = "1.0.136", features = ["derive"] } serde_json = "1.0" @@ -162,10 +153,7 @@ flate2 = "1.0.24" color-eyre = "0.6.2" rand = "0.8.5" # The `fork` and `timeout` feature doesn't compile with Wasm (wait-timeout doesn't find the `imp` module). -proptest = { version = "1.6.0", default-features = false, features = [ - "std", - "bit-set", -] } +proptest = { version = "1.6.0", default-features = false, features = ["std", "bit-set"] } proptest-derive = "0.5.0" rayon = "1.8.0" sha2 = { version = "0.10.6", features = ["compress"] } diff --git a/acvm-repo/acir/Cargo.toml b/acvm-repo/acir/Cargo.toml index 2b15c2abf09..bac1bb52b86 100644 --- a/acvm-repo/acir/Cargo.toml +++ b/acvm-repo/acir/Cargo.toml @@ -17,6 +17,7 @@ workspace = true [dependencies] acir_field.workspace = true +ciborium.workspace = true brillig.workspace = true serde.workspace = true thiserror.workspace = true diff --git a/acvm-repo/acir/src/circuit/mod.rs b/acvm-repo/acir/src/circuit/mod.rs index 091a3dcb0e5..8cb6b718ca8 100644 --- a/acvm-repo/acir/src/circuit/mod.rs +++ b/acvm-repo/acir/src/circuit/mod.rs @@ -239,7 +239,9 @@ impl Circuit { impl Program { fn write(&self, writer: W) -> std::io::Result<()> { - let buf = bincode::serialize(self).unwrap(); + // let buf = bincode::serialize(self).unwrap(); + let mut buf = Vec::new(); + ciborium::into_writer(self, &mut buf).map_err(std::io::Error::other)?; let mut encoder = flate2::write::GzEncoder::new(writer, Compression::default()); encoder.write_all(&buf)?; encoder.finish()?; @@ -268,7 +270,8 @@ impl Deserialize<'a>> Program { let mut gz_decoder = flate2::read::GzDecoder::new(reader); let mut buf_d = Vec::new(); gz_decoder.read_to_end(&mut buf_d)?; - bincode::deserialize(&buf_d) + //bincode::deserialize(&buf_d) + ciborium::from_reader(buf_d.as_slice()) .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err)) } From 348e43a77243ff27666d8feec0a4a7c27ac0d04a Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 25 Feb 2025 14:49:15 +0000 Subject: [PATCH 02/24] fixup! Use ciborium for serialization of Program --- Cargo.toml | 93 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 40 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4580a3ce332..ab061bab4a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,44 +1,50 @@ [workspace] members = [ -# Compiler crates -"compiler/noirc_arena", -"compiler/noirc_evaluator", -"compiler/noirc_frontend", -"compiler/noirc_errors", -"compiler/noirc_driver", -"compiler/noirc_printable_type", -"compiler/fm", -"compiler/wasm", -# Crates related to tooling built on top of the Noir compiler -"tooling/lsp", -"tooling/debugger", -"tooling/fuzzer", -"tooling/nargo", -"tooling/nargo_fmt", -"tooling/nargo_cli", -"tooling/nargo_toml", -"tooling/noirc_artifacts", -"tooling/noirc_artifacts_info", -"tooling/noirc_abi", -"tooling/noirc_abi_wasm", -"tooling/acvm_cli", -"tooling/artifact_cli", -"tooling/profiler", -"tooling/inspector", -# ACVM -"acvm-repo/acir_field", -"acvm-repo/acir", -"acvm-repo/acvm", -"acvm-repo/acvm_js", -"acvm-repo/brillig", -"acvm-repo/brillig_vm", -"acvm-repo/blackbox_solver", -"acvm-repo/bn254_blackbox_solver", -# Utility crates -"utils/iter-extended", + # Compiler crates + "compiler/noirc_arena", + "compiler/noirc_evaluator", + "compiler/noirc_frontend", + "compiler/noirc_errors", + "compiler/noirc_driver", + "compiler/noirc_printable_type", + "compiler/fm", + "compiler/wasm", + # Crates related to tooling built on top of the Noir compiler + "tooling/lsp", + "tooling/debugger", + "tooling/fuzzer", + "tooling/nargo", + "tooling/nargo_fmt", + "tooling/nargo_cli", + "tooling/nargo_toml", + "tooling/noirc_artifacts", + "tooling/noirc_artifacts_info", + "tooling/noirc_abi", + "tooling/noirc_abi_wasm", + "tooling/acvm_cli", + "tooling/artifact_cli", + "tooling/profiler", + "tooling/inspector", + # ACVM + "acvm-repo/acir_field", + "acvm-repo/acir", + "acvm-repo/acvm", + "acvm-repo/acvm_js", + "acvm-repo/brillig", + "acvm-repo/brillig_vm", + "acvm-repo/blackbox_solver", + "acvm-repo/bn254_blackbox_solver", + # Utility crates + "utils/iter-extended", +] +default-members = [ + "tooling/nargo_cli", + "tooling/acvm_cli", + "tooling/artifact_cli", + "tooling/profiler", + "tooling/inspector", ] -default-members = ["tooling/nargo_cli", "tooling/acvm_cli", "tooling/artifact_cli", "tooling/profiler", "tooling/inspector"] resolver = "2" [workspace.package] @@ -90,8 +96,12 @@ noirc_artifacts_info = { path = "tooling/noirc_artifacts_info" } noir_artifact_cli = { path = "tooling/artifact_cli" } # Arkworks -ark-bn254 = { version = "^0.5.0", default-features = false, features = ["curve"] } -ark-bls12-381 = { version = "^0.5.0", default-features = false, features = ["curve"] } +ark-bn254 = { version = "^0.5.0", default-features = false, features = [ + "curve", +] } +ark-bls12-381 = { version = "^0.5.0", default-features = false, features = [ + "curve", +] } ark-grumpkin = { version = "^0.5.0", default-features = false } ark-ec = { version = "^0.5.0", default-features = false } ark-ff = { version = "^0.5.0", default-features = false } @@ -153,7 +163,10 @@ flate2 = "1.0.24" color-eyre = "0.6.2" rand = "0.8.5" # The `fork` and `timeout` feature doesn't compile with Wasm (wait-timeout doesn't find the `imp` module). -proptest = { version = "1.6.0", default-features = false, features = ["std", "bit-set"] } +proptest = { version = "1.6.0", default-features = false, features = [ + "std", + "bit-set", +] } proptest-derive = "0.5.0" rayon = "1.8.0" sha2 = { version = "0.10.6", features = ["compress"] } From d9df7219043a2ee5a66678cd15e69ad1e9e09c53 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 25 Feb 2025 14:26:04 +0000 Subject: [PATCH 03/24] Compared bincode against CBOR --- scripts/bytecode-sizes/bincode-vs-cbor.jsonl | 727 ++++++++++++++++++ scripts/bytecode-sizes/bincode-vs-cbor.png | Bin 0 -> 25071 bytes scripts/bytecode-sizes/bincode.jsonl | 727 ++++++++++++++++++ .../bytecode-sizes/bytecode-size-scatter.plt | 9 + scripts/bytecode-sizes/cbor.jsonl | 727 ++++++++++++++++++ .../bytecode-sizes/compare-bytecode-size.sh | 19 + scripts/bytecode-sizes/plot-bytecode-size.sh | 18 + scripts/bytecode-sizes/print-bytecode-size.sh | 21 + 8 files changed, 2248 insertions(+) create mode 100644 scripts/bytecode-sizes/bincode-vs-cbor.jsonl create mode 100644 scripts/bytecode-sizes/bincode-vs-cbor.png create mode 100644 scripts/bytecode-sizes/bincode.jsonl create mode 100644 scripts/bytecode-sizes/bytecode-size-scatter.plt create mode 100644 scripts/bytecode-sizes/cbor.jsonl create mode 100644 scripts/bytecode-sizes/compare-bytecode-size.sh create mode 100644 scripts/bytecode-sizes/plot-bytecode-size.sh create mode 100644 scripts/bytecode-sizes/print-bytecode-size.sh diff --git a/scripts/bytecode-sizes/bincode-vs-cbor.jsonl b/scripts/bytecode-sizes/bincode-vs-cbor.jsonl new file mode 100644 index 00000000000..b11e1ae4679 --- /dev/null +++ b/scripts/bytecode-sizes/bincode-vs-cbor.jsonl @@ -0,0 +1,727 @@ +{"name":"parity_base","base_size":38512,"alt_size":39479,"ratio":1.0251090569173245} +{"name":"parity_root","base_size":56652,"alt_size":62457,"ratio":1.1024676975217116} +{"name":"private_kernel_init","base_size":220963,"alt_size":239509,"ratio":1.083932604101139} +{"name":"private_kernel_init_simulated","base_size":58910,"alt_size":62602,"ratio":1.062671872347649} +{"name":"private_kernel_inner","base_size":360037,"alt_size":386852,"ratio":1.074478456380872} +{"name":"private_kernel_inner_simulated","base_size":86003,"alt_size":92241,"ratio":1.0725323535225515} +{"name":"private_kernel_reset","base_size":900341,"alt_size":968420,"ratio":1.0756146837698162} +{"name":"private_kernel_reset_0_0_0_0_0_64_0_0_0","base_size":240204,"alt_size":258991,"ratio":1.0782126858836656} +{"name":"private_kernel_reset_0_0_0_0_64_0_0_0_0","base_size":196989,"alt_size":210412,"ratio":1.068140860657194} +{"name":"private_kernel_reset_0_0_0_64_0_0_0_0_0","base_size":381535,"alt_size":414154,"ratio":1.085494122426514} +{"name":"private_kernel_reset_0_0_64_0_0_0_0_0_0","base_size":168641,"alt_size":185042,"ratio":1.0972539299458612} +{"name":"private_kernel_reset_0_64_0_0_0_0_0_0_0","base_size":382112,"alt_size":415357,"ratio":1.087003286994389} +{"name":"private_kernel_reset_16_16_16_16_16_16_16_16_16","base_size":422691,"alt_size":461786,"ratio":1.0924907320004447} +{"name":"private_kernel_reset_32_16_32_16_4_4_4_4_32","base_size":419518,"alt_size":462320,"ratio":1.1020266114922364} +{"name":"private_kernel_reset_32_16_32_16_4_4_4_4_4","base_size":399588,"alt_size":438602,"ratio":1.0976355646315705} +{"name":"private_kernel_reset_32_16_32_16_4_4_4_64_32","base_size":436743,"alt_size":480119,"ratio":1.0993169896254777} +{"name":"private_kernel_reset_32_16_32_16_4_4_4_64_4","base_size":412103,"alt_size":456265,"ratio":1.1071625297559105} +{"name":"private_kernel_reset_32_16_32_16_4_4_64_4_32","base_size":443428,"alt_size":485632,"ratio":1.0951766690420992} +{"name":"private_kernel_reset_32_16_32_16_4_4_64_4_4","base_size":419832,"alt_size":460924,"ratio":1.0978772461365498} +{"name":"private_kernel_reset_32_16_32_16_4_4_64_64_32","base_size":462153,"alt_size":502304,"ratio":1.0868781550698579} +{"name":"private_kernel_reset_32_16_32_16_4_4_64_64_4","base_size":435584,"alt_size":479096,"ratio":1.099893476344402} +{"name":"private_kernel_reset_32_16_32_4_4_4_4_4_32","base_size":377138,"alt_size":416649,"ratio":1.1047653644024202} +{"name":"private_kernel_reset_32_16_32_4_4_4_4_4_4","base_size":356647,"alt_size":391838,"ratio":1.0986717959214574} +{"name":"private_kernel_reset_32_16_32_4_4_4_4_64_32","base_size":394400,"alt_size":433778,"ratio":1.099842799188641} +{"name":"private_kernel_reset_32_16_32_4_4_4_4_64_4","base_size":370694,"alt_size":408600,"ratio":1.1022568479662471} +{"name":"private_kernel_reset_32_16_32_4_4_4_64_4_32","base_size":401514,"alt_size":439832,"ratio":1.0954337831308498} +{"name":"private_kernel_reset_32_16_32_4_4_4_64_4_4","base_size":377562,"alt_size":414951,"ratio":1.0990274444991817} +{"name":"private_kernel_reset_32_16_32_4_4_4_64_64_32","base_size":419246,"alt_size":456344,"ratio":1.088487427429242} +{"name":"private_kernel_reset_32_16_32_4_4_4_64_64_4","base_size":394170,"alt_size":433137,"ratio":1.09885836060583} +{"name":"private_kernel_reset_32_32_32_32_32_32_32_32_32","base_size":591387,"alt_size":641384,"ratio":1.0845419327783667} +{"name":"private_kernel_reset_32_4_32_16_4_4_4_4_32","base_size":376447,"alt_size":415549,"ratio":1.1038711956796043} +{"name":"private_kernel_reset_32_4_32_16_4_4_4_4_4","base_size":355489,"alt_size":390665,"ratio":1.0989510223945045} +{"name":"private_kernel_reset_32_4_32_16_4_4_4_64_32","base_size":393764,"alt_size":432862,"ratio":1.0992929775195295} +{"name":"private_kernel_reset_32_4_32_16_4_4_4_64_4","base_size":368166,"alt_size":407637,"ratio":1.1072097912354752} +{"name":"private_kernel_reset_32_4_32_16_4_4_64_4_32","base_size":399898,"alt_size":438609,"ratio":1.0968021845570621} +{"name":"private_kernel_reset_32_4_32_16_4_4_64_4_4","base_size":376506,"alt_size":413777,"ratio":1.098991782335474} +{"name":"private_kernel_reset_32_4_32_16_4_4_64_64_32","base_size":417917,"alt_size":455588,"ratio":1.0901399081635827} +{"name":"private_kernel_reset_32_4_32_16_4_4_64_64_4","base_size":391965,"alt_size":431430,"ratio":1.1006850101412116} +{"name":"private_kernel_reset_32_4_32_4_4_4_4_4_32","base_size":334123,"alt_size":368930,"ratio":1.1041742112934458} +{"name":"private_kernel_reset_32_4_32_4_4_4_4_4_4","base_size":312145,"alt_size":344321,"ratio":1.1030802992199138} +{"name":"private_kernel_reset_32_4_32_4_4_4_4_64_32","base_size":350172,"alt_size":385798,"ratio":1.1017385741863999} +{"name":"private_kernel_reset_32_4_32_4_4_4_4_64_4","base_size":327715,"alt_size":360381,"ratio":1.0996780739361947} +{"name":"private_kernel_reset_32_4_32_4_4_4_64_4_32","base_size":357578,"alt_size":390717,"ratio":1.0926762832165289} +{"name":"private_kernel_reset_32_4_32_4_4_4_64_4_4","base_size":334218,"alt_size":366683,"ratio":1.097137197876835} +{"name":"private_kernel_reset_32_4_32_4_4_4_64_64_32","base_size":374014,"alt_size":407262,"ratio":1.088895068099055} +{"name":"private_kernel_reset_32_4_32_4_4_4_64_64_4","base_size":350157,"alt_size":383955,"ratio":1.0965224170871923} +{"name":"private_kernel_reset_4_4_4_4_4_4_4_4_4","base_size":294895,"alt_size":326075,"ratio":1.1057325488733278} +{"name":"private_kernel_reset_64_0_0_0_0_0_0_0_0","base_size":168449,"alt_size":184492,"ratio":1.095239508694026} +{"name":"private_kernel_reset_simulated","base_size":109155,"alt_size":121248,"ratio":1.1107874123952177} +{"name":"private_kernel_reset_simulated_0_0_0_0_0_64_0_0_0","base_size":46863,"alt_size":51433,"ratio":1.097518298017626} +{"name":"private_kernel_reset_simulated_0_0_0_0_64_0_0_0_0","base_size":46859,"alt_size":51624,"ratio":1.1016880428519602} +{"name":"private_kernel_reset_simulated_0_0_0_64_0_0_0_0_0","base_size":60920,"alt_size":68755,"ratio":1.1286112934996717} +{"name":"private_kernel_reset_simulated_0_0_64_0_0_0_0_0_0","base_size":45100,"alt_size":49624,"ratio":1.100310421286031} +{"name":"private_kernel_reset_simulated_0_64_0_0_0_0_0_0_0","base_size":57694,"alt_size":65082,"ratio":1.1280549103892952} +{"name":"private_kernel_reset_simulated_16_16_16_16_16_16_16_16_16","base_size":79966,"alt_size":85309,"ratio":1.0668158967561214} +{"name":"private_kernel_reset_simulated_32_16_32_16_4_4_4_4_32","base_size":79780,"alt_size":85340,"ratio":1.0696916520431186} +{"name":"private_kernel_reset_simulated_32_16_32_16_4_4_4_4_4","base_size":80015,"alt_size":85713,"ratio":1.0712116478160345} +{"name":"private_kernel_reset_simulated_32_16_32_16_4_4_4_64_32","base_size":79643,"alt_size":85652,"ratio":1.0754491920193865} +{"name":"private_kernel_reset_simulated_32_16_32_16_4_4_4_64_4","base_size":79770,"alt_size":85732,"ratio":1.074739877146797} +{"name":"private_kernel_reset_simulated_32_16_32_16_4_4_64_4_32","base_size":79902,"alt_size":85689,"ratio":1.0724262221220995} +{"name":"private_kernel_reset_simulated_32_16_32_16_4_4_64_4_4","base_size":79769,"alt_size":85832,"ratio":1.0760069701262396} +{"name":"private_kernel_reset_simulated_32_16_32_16_4_4_64_64_32","base_size":79782,"alt_size":85887,"ratio":1.0765210197788975} +{"name":"private_kernel_reset_simulated_32_16_32_16_4_4_64_64_4","base_size":79888,"alt_size":85543,"ratio":1.0707866012417384} +{"name":"private_kernel_reset_simulated_32_16_32_4_4_4_4_4_32","base_size":77401,"alt_size":82571,"ratio":1.0667950026485447} +{"name":"private_kernel_reset_simulated_32_16_32_4_4_4_4_4_4","base_size":77763,"alt_size":82773,"ratio":1.064426526754369} +{"name":"private_kernel_reset_simulated_32_16_32_4_4_4_4_64_32","base_size":77385,"alt_size":82873,"ratio":1.0709181365897784} +{"name":"private_kernel_reset_simulated_32_16_32_4_4_4_4_64_4","base_size":77396,"alt_size":82926,"ratio":1.071450720967492} +{"name":"private_kernel_reset_simulated_32_16_32_4_4_4_64_4_32","base_size":77285,"alt_size":82598,"ratio":1.0687455521770073} +{"name":"private_kernel_reset_simulated_32_16_32_4_4_4_64_4_4","base_size":77360,"alt_size":82998,"ratio":1.0728800413650466} +{"name":"private_kernel_reset_simulated_32_16_32_4_4_4_64_64_32","base_size":77311,"alt_size":82666,"ratio":1.069265693109648} +{"name":"private_kernel_reset_simulated_32_16_32_4_4_4_64_64_4","base_size":77343,"alt_size":82950,"ratio":1.0724952484387726} +{"name":"private_kernel_reset_simulated_32_32_32_32_32_32_32_32_32","base_size":87519,"alt_size":95105,"ratio":1.086678321278808} +{"name":"private_kernel_reset_simulated_32_4_32_16_4_4_4_4_32","base_size":77673,"alt_size":83144,"ratio":1.0704363163518855} +{"name":"private_kernel_reset_simulated_32_4_32_16_4_4_4_4_4","base_size":77871,"alt_size":83296,"ratio":1.0696664997239023} +{"name":"private_kernel_reset_simulated_32_4_32_16_4_4_4_64_32","base_size":77677,"alt_size":83077,"ratio":1.0695186477335634} +{"name":"private_kernel_reset_simulated_32_4_32_16_4_4_4_64_4","base_size":77784,"alt_size":83093,"ratio":1.0682531111796771} +{"name":"private_kernel_reset_simulated_32_4_32_16_4_4_64_4_32","base_size":77650,"alt_size":83164,"ratio":1.0710109465550548} +{"name":"private_kernel_reset_simulated_32_4_32_16_4_4_64_4_4","base_size":77781,"alt_size":83138,"ratio":1.0688728609814737} +{"name":"private_kernel_reset_simulated_32_4_32_16_4_4_64_64_32","base_size":77727,"alt_size":83139,"ratio":1.069628314485314} +{"name":"private_kernel_reset_simulated_32_4_32_16_4_4_64_64_4","base_size":77718,"alt_size":83171,"ratio":1.0701639259888314} +{"name":"private_kernel_reset_simulated_32_4_32_4_4_4_4_4_32","base_size":74627,"alt_size":79191,"ratio":1.0611574899165181} +{"name":"private_kernel_reset_simulated_32_4_32_4_4_4_4_4_4","base_size":74974,"alt_size":79576,"ratio":1.0613812788433323} +{"name":"private_kernel_reset_simulated_32_4_32_4_4_4_4_64_32","base_size":74627,"alt_size":79332,"ratio":1.0630468865156042} +{"name":"private_kernel_reset_simulated_32_4_32_4_4_4_4_64_4","base_size":74630,"alt_size":79488,"ratio":1.0650944660324266} +{"name":"private_kernel_reset_simulated_32_4_32_4_4_4_64_4_32","base_size":74720,"alt_size":79342,"ratio":1.061857601713062} +{"name":"private_kernel_reset_simulated_32_4_32_4_4_4_64_4_4","base_size":74671,"alt_size":79653,"ratio":1.0667193421810341} +{"name":"private_kernel_reset_simulated_32_4_32_4_4_4_64_64_32","base_size":74628,"alt_size":79430,"ratio":1.0643458219435065} +{"name":"private_kernel_reset_simulated_32_4_32_4_4_4_64_64_4","base_size":74857,"alt_size":79617,"ratio":1.0635879076105108} +{"name":"private_kernel_reset_simulated_4_4_4_4_4_4_4_4_4","base_size":74093,"alt_size":78231,"ratio":1.0558487306493192} +{"name":"private_kernel_reset_simulated_64_0_0_0_0_0_0_0_0","base_size":45171,"alt_size":49839,"ratio":1.1033406389054925} +{"name":"private_kernel_tail","base_size":119739,"alt_size":129136,"ratio":1.078479025213172} +{"name":"private_kernel_tail_simulated","base_size":47129,"alt_size":49102,"ratio":1.0418638205775637} +{"name":"private_kernel_tail_to_public","base_size":213723,"alt_size":225427,"ratio":1.054762472920556} +{"name":"private_kernel_tail_to_public_simulated","base_size":69150,"alt_size":71890,"ratio":1.0396240057845263} +{"name":"rollup_base_private","base_size":1395946,"alt_size":1478760,"ratio":1.0593246443630342} +{"name":"rollup_base_private_simulated","base_size":81316,"alt_size":84989,"ratio":1.045169462344434} +{"name":"rollup_base_public","base_size":679704,"alt_size":713364,"ratio":1.049521556442216} +{"name":"rollup_base_public_simulated","base_size":77006,"alt_size":83361,"ratio":1.0825260369321872} +{"name":"rollup_block_merge","base_size":106886,"alt_size":118996,"ratio":1.113298280410905} +{"name":"rollup_block_root","base_size":14975740,"alt_size":15306791,"ratio":1.0221058191448302} +{"name":"rollup_block_root_empty","base_size":20689,"alt_size":22707,"ratio":1.0975397554255886} +{"name":"rollup_block_root_simulated","base_size":82459,"alt_size":98188,"ratio":1.1907493420972848} +{"name":"rollup_block_root_single_tx","base_size":14959959,"alt_size":15285913,"ratio":1.0217884286982337} +{"name":"rollup_block_root_single_tx_simulated","base_size":76009,"alt_size":89185,"ratio":1.1733478930126695} +{"name":"rollup_merge","base_size":29269,"alt_size":32257,"ratio":1.102087532884622} +{"name":"rollup_root","base_size":106709,"alt_size":119467,"ratio":1.1195588001012098} +{"name":"amm_contract-AMM::_add_liquidity","base_size":7622,"alt_size":8803,"ratio":1.1549462083442665} +{"name":"amm_contract-AMM::_remove_liquidity","base_size":4902,"alt_size":5754,"ratio":1.1738066095471236} +{"name":"amm_contract-AMM::_swap_exact_tokens_for_tokens","base_size":3837,"alt_size":4578,"ratio":1.193119624706802} +{"name":"amm_contract-AMM::_swap_tokens_for_exact_tokens","base_size":4339,"alt_size":5023,"ratio":1.157640009218714} +{"name":"amm_contract-AMM::add_liquidity","base_size":32091,"alt_size":34383,"ratio":1.0714218939889688} +{"name":"amm_contract-AMM::constructor","base_size":3729,"alt_size":4273,"ratio":1.1458836149101637} +{"name":"amm_contract-AMM::get_amount_in_for_exact_out","base_size":18345,"alt_size":20354,"ratio":1.1095121286454075} +{"name":"amm_contract-AMM::get_amount_out_for_exact_in","base_size":18221,"alt_size":20433,"ratio":1.1213983864771417} +{"name":"amm_contract-AMM::process_log","base_size":15154,"alt_size":16635,"ratio":1.0977299722845453} +{"name":"amm_contract-AMM::public_dispatch","base_size":21009,"alt_size":22866,"ratio":1.0883906897044124} +{"name":"amm_contract-AMM::remove_liquidity","base_size":29866,"alt_size":32295,"ratio":1.0813299404004553} +{"name":"amm_contract-AMM::swap_exact_tokens_for_tokens","base_size":29805,"alt_size":32337,"ratio":1.084952189229995} +{"name":"amm_contract-AMM::swap_tokens_for_exact_tokens","base_size":29991,"alt_size":32459,"ratio":1.0822913540728885} +{"name":"amm_contract-AMM::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"app_subscription_contract-AppSubscription::constructor","base_size":4363,"alt_size":4993,"ratio":1.1443960577584231} +{"name":"app_subscription_contract-AppSubscription::entrypoint","base_size":99041,"alt_size":104762,"ratio":1.0577639563413133} +{"name":"app_subscription_contract-AppSubscription::is_initialized","base_size":24104,"alt_size":26472,"ratio":1.098240955857949} +{"name":"app_subscription_contract-AppSubscription::process_log","base_size":21895,"alt_size":23834,"ratio":1.088559031742407} +{"name":"app_subscription_contract-AppSubscription::public_dispatch","base_size":4869,"alt_size":5617,"ratio":1.1536249743273772} +{"name":"app_subscription_contract-AppSubscription::subscribe","base_size":95196,"alt_size":100422,"ratio":1.0548972645909491} +{"name":"app_subscription_contract-AppSubscription::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"auth_contract-Auth::constructor","base_size":2997,"alt_size":3560,"ratio":1.1878545211878546} +{"name":"auth_contract-Auth::do_private_authorized_thing","base_size":12949,"alt_size":13875,"ratio":1.071511313614951} +{"name":"auth_contract-Auth::get_authorized","base_size":836,"alt_size":1309,"ratio":1.5657894736842106} +{"name":"auth_contract-Auth::get_authorized_delay","base_size":663,"alt_size":1094,"ratio":1.650075414781297} +{"name":"auth_contract-Auth::get_authorized_in_private","base_size":13295,"alt_size":14181,"ratio":1.0666415945844303} +{"name":"auth_contract-Auth::get_scheduled_authorized","base_size":748,"alt_size":1210,"ratio":1.6176470588235294} +{"name":"auth_contract-Auth::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"auth_contract-Auth::public_dispatch","base_size":9866,"alt_size":11053,"ratio":1.1203121832556253} +{"name":"auth_contract-Auth::set_authorized","base_size":3466,"alt_size":4373,"ratio":1.2616849394114253} +{"name":"auth_contract-Auth::set_authorized_delay","base_size":3492,"alt_size":4322,"ratio":1.2376861397479955} +{"name":"auth_contract-Auth::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"auth_registry_contract-AuthRegistry::_set_authorized","base_size":1740,"alt_size":2296,"ratio":1.3195402298850574} +{"name":"auth_registry_contract-AuthRegistry::consume","base_size":3874,"alt_size":4515,"ratio":1.1654620547237997} +{"name":"auth_registry_contract-AuthRegistry::is_consumable","base_size":1730,"alt_size":2320,"ratio":1.3410404624277457} +{"name":"auth_registry_contract-AuthRegistry::is_reject_all","base_size":1143,"alt_size":1728,"ratio":1.5118110236220472} +{"name":"auth_registry_contract-AuthRegistry::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"auth_registry_contract-AuthRegistry::public_dispatch","base_size":7767,"alt_size":8674,"ratio":1.11677610402987} +{"name":"auth_registry_contract-AuthRegistry::set_authorized","base_size":1693,"alt_size":2252,"ratio":1.3301831069108092} +{"name":"auth_registry_contract-AuthRegistry::set_authorized_private","base_size":5800,"alt_size":6515,"ratio":1.1232758620689656} +{"name":"auth_registry_contract-AuthRegistry::set_reject_all","base_size":1113,"alt_size":1689,"ratio":1.517520215633423} +{"name":"auth_registry_contract-AuthRegistry::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"auth_registry_contract-AuthRegistry::unconstrained_is_consumable","base_size":1756,"alt_size":2337,"ratio":1.330865603644647} +{"name":"auth_wit_test_contract-AuthWitTest::consume","base_size":5464,"alt_size":6118,"ratio":1.119692532942899} +{"name":"auth_wit_test_contract-AuthWitTest::consume_public","base_size":749,"alt_size":1271,"ratio":1.6969292389853137} +{"name":"auth_wit_test_contract-AuthWitTest::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"auth_wit_test_contract-AuthWitTest::public_dispatch","base_size":1308,"alt_size":1853,"ratio":1.4166666666666667} +{"name":"auth_wit_test_contract-AuthWitTest::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::keccak_f1600","base_size":712,"alt_size":1137,"ratio":1.5969101123595506} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::keccak_hash","base_size":2062,"alt_size":2587,"ratio":1.254607177497575} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::pedersen_hash","base_size":2820,"alt_size":3349,"ratio":1.1875886524822694} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::pedersen_hash_with_index","base_size":2797,"alt_size":3323,"ratio":1.1880586342509831} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::poseidon2_hash","base_size":1636,"alt_size":2135,"ratio":1.3050122249388754} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::public_dispatch","base_size":39194,"alt_size":39823,"ratio":1.0160483747512374} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_10","base_size":2487,"alt_size":2993,"ratio":1.2034579815038198} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_100","base_size":3910,"alt_size":4308,"ratio":1.1017902813299232} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_20","base_size":2503,"alt_size":3020,"ratio":1.2065521374350778} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_2048","base_size":22473,"alt_size":27410,"ratio":1.219685845236506} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_255","base_size":5869,"alt_size":6264,"ratio":1.0673027773044812} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_256","base_size":5530,"alt_size":5951,"ratio":1.076130198915009} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_30","base_size":2708,"alt_size":3223,"ratio":1.1901772525849335} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_40","base_size":2761,"alt_size":3262,"ratio":1.1814559942049982} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_50","base_size":2905,"alt_size":3452,"ratio":1.1882960413080894} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_511","base_size":8590,"alt_size":9470,"ratio":1.1024447031431897} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_512","base_size":8154,"alt_size":9018,"ratio":1.1059602649006623} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_60","base_size":2998,"alt_size":3476,"ratio":1.1594396264176117} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_70","base_size":3715,"alt_size":4135,"ratio":1.1130551816958276} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_80","base_size":3610,"alt_size":4120,"ratio":1.1412742382271468} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_90","base_size":3825,"alt_size":4290,"ratio":1.1215686274509804} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"avm_initializer_test_contract-AvmInitializerTest::constructor","base_size":2520,"alt_size":3078,"ratio":1.2214285714285715} +{"name":"avm_initializer_test_contract-AvmInitializerTest::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"avm_initializer_test_contract-AvmInitializerTest::public_dispatch","base_size":3106,"alt_size":3725,"ratio":1.1992916934964584} +{"name":"avm_initializer_test_contract-AvmInitializerTest::read_storage_immutable","base_size":321,"alt_size":671,"ratio":2.0903426791277258} +{"name":"avm_initializer_test_contract-AvmInitializerTest::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"avm_test_contract-AvmTest::add_args_return","base_size":228,"alt_size":583,"ratio":2.557017543859649} +{"name":"avm_test_contract-AvmTest::add_storage_map","base_size":2300,"alt_size":2826,"ratio":1.228695652173913} +{"name":"avm_test_contract-AvmTest::add_u128","base_size":345,"alt_size":762,"ratio":2.208695652173913} +{"name":"avm_test_contract-AvmTest::assert_calldata_copy","base_size":615,"alt_size":1124,"ratio":1.8276422764227642} +{"name":"avm_test_contract-AvmTest::assert_nullifier_exists","base_size":286,"alt_size":667,"ratio":2.332167832167832} +{"name":"avm_test_contract-AvmTest::assert_same","base_size":254,"alt_size":617,"ratio":2.4291338582677167} +{"name":"avm_test_contract-AvmTest::assertion_failure","base_size":213,"alt_size":537,"ratio":2.5211267605633805} +{"name":"avm_test_contract-AvmTest::bulk_testing","base_size":18366,"alt_size":19541,"ratio":1.063976913862572} +{"name":"avm_test_contract-AvmTest::create_different_nullifier_in_nested_call","base_size":737,"alt_size":1239,"ratio":1.6811397557666214} +{"name":"avm_test_contract-AvmTest::create_same_nullifier_in_nested_call","base_size":706,"alt_size":1221,"ratio":1.7294617563739376} +{"name":"avm_test_contract-AvmTest::debug_logging","base_size":1075,"alt_size":1585,"ratio":1.4744186046511627} +{"name":"avm_test_contract-AvmTest::divide_by_zero","base_size":209,"alt_size":524,"ratio":2.507177033492823} +{"name":"avm_test_contract-AvmTest::elliptic_curve_add","base_size":665,"alt_size":1214,"ratio":1.825563909774436} +{"name":"avm_test_contract-AvmTest::elliptic_curve_add_and_double","base_size":323,"alt_size":644,"ratio":1.9938080495356036} +{"name":"avm_test_contract-AvmTest::emit_nullifier_and_check","base_size":310,"alt_size":683,"ratio":2.203225806451613} +{"name":"avm_test_contract-AvmTest::emit_public_log","base_size":2015,"alt_size":2538,"ratio":1.2595533498759306} +{"name":"avm_test_contract-AvmTest::enqueue_public_from_private","base_size":5008,"alt_size":5595,"ratio":1.1172124600638977} +{"name":"avm_test_contract-AvmTest::external_call_to_assertion_failure","base_size":663,"alt_size":1141,"ratio":1.7209653092006034} +{"name":"avm_test_contract-AvmTest::external_call_to_divide_by_zero","base_size":673,"alt_size":1127,"ratio":1.674591381872214} +{"name":"avm_test_contract-AvmTest::external_call_to_divide_by_zero_recovers","base_size":2193,"alt_size":2801,"ratio":1.2772457820337437} +{"name":"avm_test_contract-AvmTest::get_address","base_size":212,"alt_size":543,"ratio":2.561320754716981} +{"name":"avm_test_contract-AvmTest::get_args_hash","base_size":1810,"alt_size":2369,"ratio":1.3088397790055248} +{"name":"avm_test_contract-AvmTest::get_block_number","base_size":216,"alt_size":554,"ratio":2.564814814814815} +{"name":"avm_test_contract-AvmTest::get_chain_id","base_size":210,"alt_size":554,"ratio":2.638095238095238} +{"name":"avm_test_contract-AvmTest::get_da_gas_left","base_size":216,"alt_size":541,"ratio":2.5046296296296298} +{"name":"avm_test_contract-AvmTest::get_fee_per_da_gas","base_size":218,"alt_size":555,"ratio":2.5458715596330275} +{"name":"avm_test_contract-AvmTest::get_fee_per_l2_gas","base_size":216,"alt_size":554,"ratio":2.564814814814815} +{"name":"avm_test_contract-AvmTest::get_l2_gas_left","base_size":215,"alt_size":543,"ratio":2.525581395348837} +{"name":"avm_test_contract-AvmTest::get_sender","base_size":214,"alt_size":543,"ratio":2.5373831775700935} +{"name":"avm_test_contract-AvmTest::get_timestamp","base_size":220,"alt_size":556,"ratio":2.5272727272727273} +{"name":"avm_test_contract-AvmTest::get_transaction_fee","base_size":219,"alt_size":565,"ratio":2.5799086757990866} +{"name":"avm_test_contract-AvmTest::get_version","base_size":216,"alt_size":553,"ratio":2.560185185185185} +{"name":"avm_test_contract-AvmTest::helper_with_failed_assertion","base_size":111,"alt_size":263,"ratio":2.369369369369369} +{"name":"avm_test_contract-AvmTest::inner_helper_with_failed_assertion","base_size":111,"alt_size":263,"ratio":2.369369369369369} +{"name":"avm_test_contract-AvmTest::l1_to_l2_msg_exists","base_size":266,"alt_size":637,"ratio":2.3947368421052633} +{"name":"avm_test_contract-AvmTest::modulo2","base_size":216,"alt_size":574,"ratio":2.6574074074074074} +{"name":"avm_test_contract-AvmTest::n_new_l2_to_l1_msgs","base_size":279,"alt_size":671,"ratio":2.4050179211469533} +{"name":"avm_test_contract-AvmTest::n_new_note_hashes","base_size":280,"alt_size":679,"ratio":2.425} +{"name":"avm_test_contract-AvmTest::n_new_nullifiers","base_size":279,"alt_size":667,"ratio":2.390681003584229} +{"name":"avm_test_contract-AvmTest::n_new_public_logs","base_size":386,"alt_size":826,"ratio":2.139896373056995} +{"name":"avm_test_contract-AvmTest::n_storage_writes","base_size":1174,"alt_size":1756,"ratio":1.495741056218058} +{"name":"avm_test_contract-AvmTest::nested_call_to_add","base_size":761,"alt_size":1244,"ratio":1.6346911957950065} +{"name":"avm_test_contract-AvmTest::nested_call_to_add_n_times_different_addresses","base_size":1092,"alt_size":1606,"ratio":1.4706959706959708} +{"name":"avm_test_contract-AvmTest::nested_call_to_add_with_gas","base_size":713,"alt_size":1213,"ratio":1.7012622720897617} +{"name":"avm_test_contract-AvmTest::nested_call_to_assert_same","base_size":765,"alt_size":1255,"ratio":1.6405228758169934} +{"name":"avm_test_contract-AvmTest::nested_call_to_nothing","base_size":667,"alt_size":1129,"ratio":1.6926536731634183} +{"name":"avm_test_contract-AvmTest::nested_call_to_nothing_recovers","base_size":414,"alt_size":857,"ratio":2.070048309178744} +{"name":"avm_test_contract-AvmTest::nested_static_call_to_add","base_size":753,"alt_size":1256,"ratio":1.6679946879150067} +{"name":"avm_test_contract-AvmTest::nested_static_call_to_set_storage","base_size":698,"alt_size":1167,"ratio":1.671919770773639} +{"name":"avm_test_contract-AvmTest::new_note_hash","base_size":224,"alt_size":580,"ratio":2.5892857142857144} +{"name":"avm_test_contract-AvmTest::new_nullifier","base_size":216,"alt_size":590,"ratio":2.7314814814814814} +{"name":"avm_test_contract-AvmTest::note_hash_exists","base_size":266,"alt_size":637,"ratio":2.3947368421052633} +{"name":"avm_test_contract-AvmTest::nullifier_collision","base_size":230,"alt_size":590,"ratio":2.5652173913043477} +{"name":"avm_test_contract-AvmTest::nullifier_exists","base_size":265,"alt_size":635,"ratio":2.3962264150943398} +{"name":"avm_test_contract-AvmTest::pedersen_commit","base_size":1168,"alt_size":1722,"ratio":1.4743150684931507} +{"name":"avm_test_contract-AvmTest::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"avm_test_contract-AvmTest::public_dispatch","base_size":39990,"alt_size":42155,"ratio":1.0541385346336585} +{"name":"avm_test_contract-AvmTest::read_assert_storage_single","base_size":266,"alt_size":658,"ratio":2.473684210526316} +{"name":"avm_test_contract-AvmTest::read_storage_list","base_size":392,"alt_size":791,"ratio":2.017857142857143} +{"name":"avm_test_contract-AvmTest::read_storage_map","base_size":1110,"alt_size":1675,"ratio":1.509009009009009} +{"name":"avm_test_contract-AvmTest::read_storage_single","base_size":231,"alt_size":587,"ratio":2.5411255411255413} +{"name":"avm_test_contract-AvmTest::return_oracle","base_size":510,"alt_size":941,"ratio":1.8450980392156864} +{"name":"avm_test_contract-AvmTest::returndata_copy_oracle","base_size":1359,"alt_size":1851,"ratio":1.3620309050772628} +{"name":"avm_test_contract-AvmTest::revert_oracle","base_size":496,"alt_size":940,"ratio":1.8951612903225807} +{"name":"avm_test_contract-AvmTest::send_l2_to_l1_msg","base_size":244,"alt_size":608,"ratio":2.4918032786885247} +{"name":"avm_test_contract-AvmTest::set_opcode_big_field","base_size":214,"alt_size":539,"ratio":2.5186915887850465} +{"name":"avm_test_contract-AvmTest::set_opcode_really_big_field","base_size":211,"alt_size":532,"ratio":2.5213270142180093} +{"name":"avm_test_contract-AvmTest::set_opcode_small_field","base_size":211,"alt_size":539,"ratio":2.5545023696682465} +{"name":"avm_test_contract-AvmTest::set_opcode_u32","base_size":196,"alt_size":508,"ratio":2.5918367346938775} +{"name":"avm_test_contract-AvmTest::set_opcode_u64","base_size":195,"alt_size":502,"ratio":2.5743589743589745} +{"name":"avm_test_contract-AvmTest::set_opcode_u8","base_size":187,"alt_size":506,"ratio":2.7058823529411766} +{"name":"avm_test_contract-AvmTest::set_read_storage_single","base_size":262,"alt_size":640,"ratio":2.4427480916030535} +{"name":"avm_test_contract-AvmTest::set_storage_list","base_size":264,"alt_size":630,"ratio":2.3863636363636362} +{"name":"avm_test_contract-AvmTest::set_storage_map","base_size":1677,"alt_size":2204,"ratio":1.3142516398330353} +{"name":"avm_test_contract-AvmTest::set_storage_single","base_size":230,"alt_size":607,"ratio":2.639130434782609} +{"name":"avm_test_contract-AvmTest::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"avm_test_contract-AvmTest::test_get_contract_instance","base_size":540,"alt_size":960,"ratio":1.7777777777777777} +{"name":"avm_test_contract-AvmTest::test_get_contract_instance_matches","base_size":564,"alt_size":988,"ratio":1.75177304964539} +{"name":"avm_test_contract-AvmTest::to_radix_le","base_size":472,"alt_size":909,"ratio":1.9258474576271187} +{"name":"avm_test_contract-AvmTest::u128_addition_overflow","base_size":1031,"alt_size":1567,"ratio":1.5198836081474296} +{"name":"avm_test_contract-AvmTest::u128_from_integer_overflow","base_size":606,"alt_size":1080,"ratio":1.7821782178217822} +{"name":"avm_test_contract-AvmTest::variable_base_msm","base_size":571,"alt_size":1017,"ratio":1.7810858143607706} +{"name":"benchmarking_contract-Benchmarking::broadcast","base_size":1192,"alt_size":1785,"ratio":1.4974832214765101} +{"name":"benchmarking_contract-Benchmarking::create_note","base_size":70451,"alt_size":74329,"ratio":1.0550453506692594} +{"name":"benchmarking_contract-Benchmarking::increment_balance","base_size":2177,"alt_size":2790,"ratio":1.281580156178227} +{"name":"benchmarking_contract-Benchmarking::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"benchmarking_contract-Benchmarking::public_dispatch","base_size":6092,"alt_size":6847,"ratio":1.1239330269205516} +{"name":"benchmarking_contract-Benchmarking::recreate_note","base_size":89161,"alt_size":93443,"ratio":1.0480254819932482} +{"name":"benchmarking_contract-Benchmarking::sha256_hash_2048","base_size":22473,"alt_size":27410,"ratio":1.219685845236506} +{"name":"benchmarking_contract-Benchmarking::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"card_game_contract-CardGame::buy_pack","base_size":120555,"alt_size":126226,"ratio":1.0470407697731325} +{"name":"card_game_contract-CardGame::claim_cards","base_size":149790,"alt_size":155529,"ratio":1.0383136390947327} +{"name":"card_game_contract-CardGame::join_game","base_size":329284,"alt_size":349588,"ratio":1.0616610585391333} +{"name":"card_game_contract-CardGame::on_card_played","base_size":3651,"alt_size":4485,"ratio":1.228430566967954} +{"name":"card_game_contract-CardGame::on_cards_claimed","base_size":4786,"alt_size":5671,"ratio":1.1849143334726284} +{"name":"card_game_contract-CardGame::on_game_joined","base_size":2716,"alt_size":3468,"ratio":1.2768777614138438} +{"name":"card_game_contract-CardGame::play_card","base_size":240993,"alt_size":259154,"ratio":1.0753590353246776} +{"name":"card_game_contract-CardGame::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"card_game_contract-CardGame::public_dispatch","base_size":13560,"alt_size":15608,"ratio":1.1510324483775811} +{"name":"card_game_contract-CardGame::start_game","base_size":3907,"alt_size":4620,"ratio":1.1824929613514206} +{"name":"card_game_contract-CardGame::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"card_game_contract-CardGame::view_collection_cards","base_size":19406,"alt_size":21284,"ratio":1.096774193548387} +{"name":"card_game_contract-CardGame::view_game","base_size":18112,"alt_size":19837,"ratio":1.0952407243816253} +{"name":"card_game_contract-CardGame::view_game_cards","base_size":19932,"alt_size":21882,"ratio":1.0978326309452138} +{"name":"child_contract-Child::private_get_value","base_size":44885,"alt_size":47626,"ratio":1.0610671716609112} +{"name":"child_contract-Child::private_set_value","base_size":70713,"alt_size":74751,"ratio":1.0571040685588222} +{"name":"child_contract-Child::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"child_contract-Child::pub_get_value","base_size":304,"alt_size":696,"ratio":2.289473684210526} +{"name":"child_contract-Child::pub_inc_value","base_size":398,"alt_size":840,"ratio":2.1105527638190953} +{"name":"child_contract-Child::pub_inc_value_internal","base_size":457,"alt_size":909,"ratio":1.9890590809628008} +{"name":"child_contract-Child::pub_set_value","base_size":381,"alt_size":809,"ratio":2.1233595800524934} +{"name":"child_contract-Child::public_dispatch","base_size":2811,"alt_size":3352,"ratio":1.192458199928851} +{"name":"child_contract-Child::set_value_twice_with_nested_first","base_size":838,"alt_size":1283,"ratio":1.5310262529832936} +{"name":"child_contract-Child::set_value_twice_with_nested_last","base_size":847,"alt_size":1284,"ratio":1.5159386068476977} +{"name":"child_contract-Child::set_value_with_two_nested_calls","base_size":1091,"alt_size":1561,"ratio":1.4307974335472045} +{"name":"child_contract-Child::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"child_contract-Child::value","base_size":21817,"alt_size":23425,"ratio":1.0737039922995828} +{"name":"child_contract-Child::value_internal","base_size":21771,"alt_size":23524,"ratio":1.0805199577419502} +{"name":"claim_contract-Claim::claim","base_size":40666,"alt_size":43497,"ratio":1.0696158953425465} +{"name":"claim_contract-Claim::constructor","base_size":3712,"alt_size":4408,"ratio":1.1875} +{"name":"claim_contract-Claim::process_log","base_size":15154,"alt_size":16635,"ratio":1.0977299722845453} +{"name":"claim_contract-Claim::public_dispatch","base_size":4175,"alt_size":4817,"ratio":1.1537724550898203} +{"name":"claim_contract-Claim::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::assert_class_id_is_registered","base_size":4047,"alt_size":4414,"ratio":1.0906844576229306} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::broadcast_private_function","base_size":20389,"alt_size":22511,"ratio":1.1040757271077541} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::broadcast_unconstrained_function","base_size":20346,"alt_size":22401,"ratio":1.101002654084341} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::register","base_size":221551,"alt_size":230787,"ratio":1.0416879183573986} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::deploy","base_size":7653,"alt_size":8583,"ratio":1.1215209721677772} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::get_update_delay","base_size":1447,"alt_size":2033,"ratio":1.404975812024879} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::public_dispatch","base_size":8624,"alt_size":9804,"ratio":1.1368274582560296} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::set_update_delay","base_size":4093,"alt_size":5087,"ratio":1.2428536525775715} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::update","base_size":4274,"alt_size":5329,"ratio":1.2468413664014975} +{"name":"counter_contract-Counter::decrement","base_size":236216,"alt_size":254480,"ratio":1.07731906390761} +{"name":"counter_contract-Counter::get_counter","base_size":19173,"alt_size":21075,"ratio":1.0992020028164606} +{"name":"counter_contract-Counter::increment","base_size":67041,"alt_size":70337,"ratio":1.0491639444519025} +{"name":"counter_contract-Counter::increment_and_decrement","base_size":252067,"alt_size":270638,"ratio":1.073674856288209} +{"name":"counter_contract-Counter::increment_twice","base_size":82288,"alt_size":86317,"ratio":1.0489621816060666} +{"name":"counter_contract-Counter::initialize","base_size":72005,"alt_size":76021,"ratio":1.055773904589959} +{"name":"counter_contract-Counter::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"counter_contract-Counter::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"crowdfunding_contract-Crowdfunding::_publish_donation_receipts","base_size":532,"alt_size":973,"ratio":1.8289473684210527} +{"name":"crowdfunding_contract-Crowdfunding::donate","base_size":73181,"alt_size":77345,"ratio":1.056900015031224} +{"name":"crowdfunding_contract-Crowdfunding::init","base_size":3744,"alt_size":4312,"ratio":1.1517094017094016} +{"name":"crowdfunding_contract-Crowdfunding::process_log","base_size":15154,"alt_size":16635,"ratio":1.0977299722845453} +{"name":"crowdfunding_contract-Crowdfunding::public_dispatch","base_size":4598,"alt_size":5255,"ratio":1.1428882122662027} +{"name":"crowdfunding_contract-Crowdfunding::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"crowdfunding_contract-Crowdfunding::withdraw","base_size":29044,"alt_size":31332,"ratio":1.0787770279575817} +{"name":"docs_example_contract-DocsExample::get_imm_card","base_size":23407,"alt_size":25226,"ratio":1.077711795616696} +{"name":"docs_example_contract-DocsExample::get_leader","base_size":16639,"alt_size":18185,"ratio":1.0929142376344732} +{"name":"docs_example_contract-DocsExample::get_legendary_card","base_size":18333,"alt_size":19987,"ratio":1.090219822178585} +{"name":"docs_example_contract-DocsExample::get_public_immutable","base_size":16569,"alt_size":18192,"ratio":1.097954010501539} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_private","base_size":28627,"alt_size":30684,"ratio":1.0718552415551752} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_private_indirect","base_size":22606,"alt_size":24417,"ratio":1.0801114748296912} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public","base_size":345,"alt_size":723,"ratio":2.0956521739130434} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public_indirect","base_size":782,"alt_size":1271,"ratio":1.6253196930946292} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public_multiple","base_size":425,"alt_size":842,"ratio":1.9811764705882353} +{"name":"docs_example_contract-DocsExample::increase_legendary_points","base_size":73860,"alt_size":78409,"ratio":1.0615894936366097} +{"name":"docs_example_contract-DocsExample::initialize_private","base_size":66697,"alt_size":70326,"ratio":1.0544102433392806} +{"name":"docs_example_contract-DocsExample::initialize_private_immutable","base_size":66776,"alt_size":70239,"ratio":1.0518599496825207} +{"name":"docs_example_contract-DocsExample::initialize_public_immutable","base_size":1238,"alt_size":1824,"ratio":1.4733441033925687} +{"name":"docs_example_contract-DocsExample::insert_note","base_size":66357,"alt_size":69930,"ratio":1.0538451105384512} +{"name":"docs_example_contract-DocsExample::insert_notes","base_size":93157,"alt_size":98188,"ratio":1.054005603443649} +{"name":"docs_example_contract-DocsExample::is_legendary_initialized","base_size":17171,"alt_size":18665,"ratio":1.087007163240347} +{"name":"docs_example_contract-DocsExample::is_priv_imm_initialized","base_size":17089,"alt_size":18679,"ratio":1.0930423079173737} +{"name":"docs_example_contract-DocsExample::match_public_immutable","base_size":28473,"alt_size":30504,"ratio":1.071330734379939} +{"name":"docs_example_contract-DocsExample::process_log","base_size":15386,"alt_size":16729,"ratio":1.0872871441570258} +{"name":"docs_example_contract-DocsExample::public_dispatch","base_size":3390,"alt_size":4145,"ratio":1.2227138643067847} +{"name":"docs_example_contract-DocsExample::read_note","base_size":18509,"alt_size":20277,"ratio":1.095521097844292} +{"name":"docs_example_contract-DocsExample::simple_macro_example","base_size":21701,"alt_size":23456,"ratio":1.080871849223538} +{"name":"docs_example_contract-DocsExample::simple_macro_example_expanded","base_size":4637,"alt_size":5189,"ratio":1.1190424843648912} +{"name":"docs_example_contract-DocsExample::spend_public_authwit","base_size":197,"alt_size":548,"ratio":2.781725888324873} +{"name":"docs_example_contract-DocsExample::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"docs_example_contract-DocsExample::update_leader","base_size":347,"alt_size":763,"ratio":2.1988472622478388} +{"name":"docs_example_contract-DocsExample::update_legendary_card","base_size":70434,"alt_size":74145,"ratio":1.0526876224550643} +{"name":"docs_example_contract-DocsExample::verify_private_authwit","base_size":21772,"alt_size":23518,"ratio":1.0801947455447363} +{"name":"docs_example_contract-DocsExample::view_imm_card","base_size":18266,"alt_size":19923,"ratio":1.0907149895981605} +{"name":"easy_private_token_contract-EasyPrivateToken::constructor","base_size":72005,"alt_size":76021,"ratio":1.055773904589959} +{"name":"easy_private_token_contract-EasyPrivateToken::get_balance","base_size":19173,"alt_size":21075,"ratio":1.0992020028164606} +{"name":"easy_private_token_contract-EasyPrivateToken::mint","base_size":70565,"alt_size":74268,"ratio":1.0524764401615532} +{"name":"easy_private_token_contract-EasyPrivateToken::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"easy_private_token_contract-EasyPrivateToken::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"easy_private_token_contract-EasyPrivateToken::transfer","base_size":276344,"alt_size":294981,"ratio":1.067441305040095} +{"name":"easy_private_voting_contract-EasyPrivateVoting::add_to_tally_public","base_size":1886,"alt_size":2406,"ratio":1.2757158006362672} +{"name":"easy_private_voting_contract-EasyPrivateVoting::cast_vote","base_size":7884,"alt_size":8727,"ratio":1.106925418569254} +{"name":"easy_private_voting_contract-EasyPrivateVoting::constructor","base_size":3014,"alt_size":3559,"ratio":1.1808228268082284} +{"name":"easy_private_voting_contract-EasyPrivateVoting::end_vote","base_size":380,"alt_size":739,"ratio":1.944736842105263} +{"name":"easy_private_voting_contract-EasyPrivateVoting::get_vote","base_size":1245,"alt_size":1809,"ratio":1.453012048192771} +{"name":"easy_private_voting_contract-EasyPrivateVoting::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"easy_private_voting_contract-EasyPrivateVoting::public_dispatch","base_size":4864,"alt_size":5517,"ratio":1.134251644736842} +{"name":"easy_private_voting_contract-EasyPrivateVoting::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::constructor","base_size":76618,"alt_size":80420,"ratio":1.049622804040826} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::entrypoint","base_size":67820,"alt_size":74347,"ratio":1.0962400471837217} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::process_log","base_size":17042,"alt_size":18391,"ratio":1.079157375894848} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::verify_private_authwit","base_size":41611,"alt_size":44192,"ratio":1.0620268678955085} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::constructor","base_size":76618,"alt_size":80420,"ratio":1.049622804040826} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::entrypoint","base_size":67801,"alt_size":74282,"ratio":1.0955885606406985} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::process_log","base_size":17042,"alt_size":18391,"ratio":1.079157375894848} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::verify_private_authwit","base_size":41563,"alt_size":44297,"ratio":1.0657796597935665} +{"name":"escrow_contract-Escrow::constructor","base_size":70605,"alt_size":74545,"ratio":1.0558034133559946} +{"name":"escrow_contract-Escrow::process_log","base_size":22078,"alt_size":23808,"ratio":1.0783585469698342} +{"name":"escrow_contract-Escrow::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"escrow_contract-Escrow::withdraw","base_size":30481,"alt_size":33106,"ratio":1.086119221810308} +{"name":"fee_juice_contract-FeeJuice::_increase_public_balance","base_size":1956,"alt_size":2563,"ratio":1.3103271983640081} +{"name":"fee_juice_contract-FeeJuice::balance_of_public","base_size":1239,"alt_size":1823,"ratio":1.4713478611783697} +{"name":"fee_juice_contract-FeeJuice::check_balance","base_size":1475,"alt_size":2085,"ratio":1.4135593220338982} +{"name":"fee_juice_contract-FeeJuice::claim","base_size":73078,"alt_size":76197,"ratio":1.0426804236569145} +{"name":"fee_juice_contract-FeeJuice::initialize","base_size":5884,"alt_size":6540,"ratio":1.1114887831407205} +{"name":"fee_juice_contract-FeeJuice::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"fee_juice_contract-FeeJuice::public_dispatch","base_size":4499,"alt_size":5371,"ratio":1.1938208490775728} +{"name":"fee_juice_contract-FeeJuice::set_portal","base_size":1144,"alt_size":1737,"ratio":1.5183566433566433} +{"name":"fee_juice_contract-FeeJuice::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"fpc_contract-FPC::complete_refund","base_size":1253,"alt_size":1837,"ratio":1.4660814046288906} +{"name":"fpc_contract-FPC::constructor","base_size":3483,"alt_size":4102,"ratio":1.1777203560149296} +{"name":"fpc_contract-FPC::fee_entrypoint_private","base_size":29899,"alt_size":32384,"ratio":1.0831131475969096} +{"name":"fpc_contract-FPC::fee_entrypoint_public","base_size":29523,"alt_size":31857,"ratio":1.0790570064017884} +{"name":"fpc_contract-FPC::get_accepted_asset","base_size":28403,"alt_size":30603,"ratio":1.0774566066964757} +{"name":"fpc_contract-FPC::pay_refund","base_size":1258,"alt_size":1838,"ratio":1.4610492845786964} +{"name":"fpc_contract-FPC::process_log","base_size":15154,"alt_size":16635,"ratio":1.0977299722845453} +{"name":"fpc_contract-FPC::public_dispatch","base_size":6737,"alt_size":7470,"ratio":1.1088021374499035} +{"name":"fpc_contract-FPC::pull_funds","base_size":1258,"alt_size":1813,"ratio":1.4411764705882353} +{"name":"fpc_contract-FPC::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"import_test_contract-ImportTest::call_no_args","base_size":29858,"alt_size":32298,"ratio":1.0817201420054927} +{"name":"import_test_contract-ImportTest::call_public_fn","base_size":29440,"alt_size":31949,"ratio":1.0852241847826087} +{"name":"import_test_contract-ImportTest::main_contract","base_size":29988,"alt_size":32495,"ratio":1.0836001067093504} +{"name":"import_test_contract-ImportTest::process_log","base_size":22935,"alt_size":24708,"ratio":1.0773054283845651} +{"name":"import_test_contract-ImportTest::pub_call_public_fn","base_size":676,"alt_size":1179,"ratio":1.7440828402366864} +{"name":"import_test_contract-ImportTest::public_dispatch","base_size":1188,"alt_size":1749,"ratio":1.4722222222222223} +{"name":"import_test_contract-ImportTest::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"inclusion_proofs_contract-InclusionProofs::constructor","base_size":2437,"alt_size":3070,"ratio":1.259745588838736} +{"name":"inclusion_proofs_contract-InclusionProofs::create_note","base_size":70570,"alt_size":74443,"ratio":1.0548816777667565} +{"name":"inclusion_proofs_contract-InclusionProofs::nullify_note","base_size":40457,"alt_size":43239,"ratio":1.068764367105816} +{"name":"inclusion_proofs_contract-InclusionProofs::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"inclusion_proofs_contract-InclusionProofs::public_dispatch","base_size":3234,"alt_size":3823,"ratio":1.1821273964131107} +{"name":"inclusion_proofs_contract-InclusionProofs::push_nullifier_public","base_size":309,"alt_size":692,"ratio":2.2394822006472492} +{"name":"inclusion_proofs_contract-InclusionProofs::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"inclusion_proofs_contract-InclusionProofs::test_contract_inclusion","base_size":34797,"alt_size":37382,"ratio":1.0742880133344828} +{"name":"inclusion_proofs_contract-InclusionProofs::test_contract_non_inclusion","base_size":38583,"alt_size":41252,"ratio":1.0691755436332064} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_inclusion","base_size":46853,"alt_size":49813,"ratio":1.0631763174183084} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_inclusion_fail_case","base_size":31242,"alt_size":33516,"ratio":1.0727866333781448} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_not_nullified","base_size":51610,"alt_size":54684,"ratio":1.0595621003681457} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_validity","base_size":54893,"alt_size":57999,"ratio":1.0565828065509264} +{"name":"inclusion_proofs_contract-InclusionProofs::test_nullifier_inclusion","base_size":31464,"alt_size":33902,"ratio":1.077485380116959} +{"name":"inclusion_proofs_contract-InclusionProofs::test_nullifier_inclusion_from_public","base_size":313,"alt_size":690,"ratio":2.2044728434504792} +{"name":"inclusion_proofs_contract-InclusionProofs::test_storage_historical_read","base_size":33536,"alt_size":36157,"ratio":1.07815481870229} +{"name":"inclusion_proofs_contract-InclusionProofs::test_storage_historical_read_unset_slot","base_size":33652,"alt_size":36218,"ratio":1.0762510400570546} +{"name":"lending_contract-Lending::_borrow","base_size":7972,"alt_size":9236,"ratio":1.1585549422980432} +{"name":"lending_contract-Lending::_deposit","base_size":2084,"alt_size":2741,"ratio":1.3152591170825336} +{"name":"lending_contract-Lending::_repay","base_size":5380,"alt_size":6498,"ratio":1.2078066914498142} +{"name":"lending_contract-Lending::_withdraw","base_size":7317,"alt_size":8470,"ratio":1.1575782424490912} +{"name":"lending_contract-Lending::borrow_private","base_size":22563,"alt_size":24566,"ratio":1.0887736559854628} +{"name":"lending_contract-Lending::borrow_public","base_size":803,"alt_size":1292,"ratio":1.6089663760896638} +{"name":"lending_contract-Lending::constructor","base_size":23355,"alt_size":25535,"ratio":1.093341896810105} +{"name":"lending_contract-Lending::deposit_private","base_size":23119,"alt_size":25152,"ratio":1.0879363294260131} +{"name":"lending_contract-Lending::deposit_public","base_size":1111,"alt_size":1608,"ratio":1.4473447344734474} +{"name":"lending_contract-Lending::get_asset","base_size":1671,"alt_size":2292,"ratio":1.371633752244165} +{"name":"lending_contract-Lending::get_assets","base_size":522,"alt_size":953,"ratio":1.8256704980842913} +{"name":"lending_contract-Lending::get_position","base_size":4476,"alt_size":5216,"ratio":1.16532618409294} +{"name":"lending_contract-Lending::init","base_size":1981,"alt_size":2628,"ratio":1.326602725896012} +{"name":"lending_contract-Lending::process_log","base_size":15154,"alt_size":16635,"ratio":1.0977299722845453} +{"name":"lending_contract-Lending::public_dispatch","base_size":30933,"alt_size":34158,"ratio":1.1042575889826398} +{"name":"lending_contract-Lending::repay_private","base_size":23019,"alt_size":25048,"ratio":1.0881445762196447} +{"name":"lending_contract-Lending::repay_public","base_size":1161,"alt_size":1649,"ratio":1.4203273040482343} +{"name":"lending_contract-Lending::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"lending_contract-Lending::update_accumulator","base_size":6404,"alt_size":7448,"ratio":1.1630231105559026} +{"name":"lending_contract-Lending::withdraw_private","base_size":22630,"alt_size":24565,"ratio":1.085505965532479} +{"name":"lending_contract-Lending::withdraw_public","base_size":799,"alt_size":1284,"ratio":1.607008760951189} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::entrypoint","base_size":19274,"alt_size":22132,"ratio":1.1482826605790184} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"nft_contract-NFT::_finalize_transfer_to_private_unsafe","base_size":3624,"alt_size":4393,"ratio":1.2121964679911699} +{"name":"nft_contract-NFT::_finish_transfer_to_public","base_size":1227,"alt_size":1813,"ratio":1.4775876120619398} +{"name":"nft_contract-NFT::_store_payload_in_transient_storage_unsafe","base_size":1225,"alt_size":1746,"ratio":1.4253061224489796} +{"name":"nft_contract-NFT::cancel_authwit","base_size":21353,"alt_size":23246,"ratio":1.0886526483398118} +{"name":"nft_contract-NFT::constructor","base_size":5808,"alt_size":6357,"ratio":1.0945247933884297} +{"name":"nft_contract-NFT::finalize_transfer_to_private","base_size":3569,"alt_size":4357,"ratio":1.2207901372933594} +{"name":"nft_contract-NFT::get_admin","base_size":367,"alt_size":734,"ratio":2} +{"name":"nft_contract-NFT::get_private_nfts","base_size":20357,"alt_size":22430,"ratio":1.1018322935599547} +{"name":"nft_contract-NFT::is_minter","base_size":1240,"alt_size":1836,"ratio":1.4806451612903226} +{"name":"nft_contract-NFT::mint","base_size":2593,"alt_size":3176,"ratio":1.224836097184728} +{"name":"nft_contract-NFT::owner_of","base_size":1824,"alt_size":2372,"ratio":1.3004385964912282} +{"name":"nft_contract-NFT::prepare_private_balance_increase","base_size":66800,"alt_size":70529,"ratio":1.0558233532934131} +{"name":"nft_contract-NFT::private_get_name","base_size":28334,"alt_size":30564,"ratio":1.0787040304934001} +{"name":"nft_contract-NFT::private_get_symbol","base_size":28195,"alt_size":30570,"ratio":1.0842347934030856} +{"name":"nft_contract-NFT::process_log","base_size":15100,"alt_size":16557,"ratio":1.0964900662251655} +{"name":"nft_contract-NFT::public_dispatch","base_size":20666,"alt_size":22926,"ratio":1.1093583663989162} +{"name":"nft_contract-NFT::public_get_name","base_size":375,"alt_size":735,"ratio":1.96} +{"name":"nft_contract-NFT::public_get_symbol","base_size":347,"alt_size":729,"ratio":2.1008645533141213} +{"name":"nft_contract-NFT::set_admin","base_size":376,"alt_size":790,"ratio":2.101063829787234} +{"name":"nft_contract-NFT::set_minter","base_size":1251,"alt_size":1846,"ratio":1.4756195043964828} +{"name":"nft_contract-NFT::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"nft_contract-NFT::transfer_in_private","base_size":99147,"alt_size":104038,"ratio":1.0493307916527983} +{"name":"nft_contract-NFT::transfer_in_public","base_size":3849,"alt_size":4525,"ratio":1.1756300337750065} +{"name":"nft_contract-NFT::transfer_to_private","base_size":66805,"alt_size":70684,"ratio":1.0580645161290323} +{"name":"nft_contract-NFT::transfer_to_public","base_size":50556,"alt_size":53653,"ratio":1.061258802120421} +{"name":"parent_contract-Parent::enqueue_call_to_child","base_size":22160,"alt_size":23839,"ratio":1.0757671480144404} +{"name":"parent_contract-Parent::enqueue_call_to_child_twice","base_size":22174,"alt_size":23961,"ratio":1.080589880039686} +{"name":"parent_contract-Parent::enqueue_call_to_pub_entry_point","base_size":22158,"alt_size":23786,"ratio":1.0734723350482895} +{"name":"parent_contract-Parent::enqueue_calls_to_child_with_nested_first","base_size":22477,"alt_size":24344,"ratio":1.0830626863015527} +{"name":"parent_contract-Parent::enqueue_calls_to_child_with_nested_last","base_size":22445,"alt_size":24290,"ratio":1.0822009356204054} +{"name":"parent_contract-Parent::enqueue_calls_to_pub_entry_point","base_size":22052,"alt_size":23879,"ratio":1.0828496281516415} +{"name":"parent_contract-Parent::enqueue_static_call_to_pub_function","base_size":22152,"alt_size":23849,"ratio":1.0766070783676418} +{"name":"parent_contract-Parent::enqueue_static_nested_call_to_pub_function","base_size":22013,"alt_size":23775,"ratio":1.08004361059374} +{"name":"parent_contract-Parent::entry_point","base_size":22420,"alt_size":24247,"ratio":1.0814897413024085} +{"name":"parent_contract-Parent::private_call","base_size":22488,"alt_size":24253,"ratio":1.0784863038064745} +{"name":"parent_contract-Parent::private_nested_static_call","base_size":22472,"alt_size":24396,"ratio":1.08561765752937} +{"name":"parent_contract-Parent::private_static_call","base_size":22390,"alt_size":24386,"ratio":1.0891469405984815} +{"name":"parent_contract-Parent::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"parent_contract-Parent::pub_entry_point","base_size":747,"alt_size":1269,"ratio":1.6987951807228916} +{"name":"parent_contract-Parent::pub_entry_point_twice","base_size":1033,"alt_size":1548,"ratio":1.4985479186834463} +{"name":"parent_contract-Parent::public_dispatch","base_size":4099,"alt_size":4912,"ratio":1.198341058794828} +{"name":"parent_contract-Parent::public_nested_static_call","base_size":2701,"alt_size":3407,"ratio":1.2613846723435764} +{"name":"parent_contract-Parent::public_static_call","base_size":1189,"alt_size":1755,"ratio":1.4760302775441547} +{"name":"parent_contract-Parent::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"pending_note_hashes_contract-PendingNoteHashes::dummy","base_size":21375,"alt_size":22984,"ratio":1.0752748538011696} +{"name":"pending_note_hashes_contract-PendingNoteHashes::get_note_zero_balance","base_size":57201,"alt_size":62117,"ratio":1.0859425534518627} +{"name":"pending_note_hashes_contract-PendingNoteHashes::get_then_nullify_note","base_size":40632,"alt_size":43453,"ratio":1.0694280370151605} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note","base_size":70652,"alt_size":74375,"ratio":1.0526948989412896} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note_extra_emit","base_size":81793,"alt_size":85778,"ratio":1.0487205506583692} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note_static_randomness","base_size":66696,"alt_size":70166,"ratio":1.0520271080724481} +{"name":"pending_note_hashes_contract-PendingNoteHashes::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"pending_note_hashes_contract-PendingNoteHashes::recursively_destroy_and_create_notes","base_size":432377,"alt_size":460237,"ratio":1.064434509698712} +{"name":"pending_note_hashes_contract-PendingNoteHashes::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_bad_get_then_insert_flat","base_size":90538,"alt_size":95555,"ratio":1.055413196668802} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_emit_bad_note_log","base_size":81631,"alt_size":85700,"ratio":1.0498462593867526} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert1_then_get2_then_nullify2_all_in_nested_calls","base_size":22403,"alt_size":24261,"ratio":1.0829353211623443} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert2_then_get2_then_nullify1_all_in_nested_calls","base_size":22389,"alt_size":24251,"ratio":1.083165840368038} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert2_then_get2_then_nullify2_all_in_nested_calls","base_size":22602,"alt_size":24326,"ratio":1.0762764357136536} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert_then_get_then_nullify_all_in_nested_calls","base_size":22406,"alt_size":24206,"ratio":1.0803356243863251} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert_then_get_then_nullify_flat","base_size":234489,"alt_size":253714,"ratio":1.0819867882928411} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_recursively_create_notes","base_size":299554,"alt_size":311745,"ratio":1.0406971697924248} +{"name":"price_feed_contract-PriceFeed::get_price","base_size":1236,"alt_size":1812,"ratio":1.4660194174757282} +{"name":"price_feed_contract-PriceFeed::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"price_feed_contract-PriceFeed::public_dispatch","base_size":2484,"alt_size":3212,"ratio":1.2930756843800322} +{"name":"price_feed_contract-PriceFeed::set_price","base_size":1151,"alt_size":1696,"ratio":1.473501303214596} +{"name":"price_feed_contract-PriceFeed::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"router_contract-Router::_check_block_number","base_size":995,"alt_size":1537,"ratio":1.5447236180904522} +{"name":"router_contract-Router::_check_timestamp","base_size":1030,"alt_size":1561,"ratio":1.5155339805825243} +{"name":"router_contract-Router::check_block_number","base_size":4928,"alt_size":5555,"ratio":1.1272321428571428} +{"name":"router_contract-Router::check_timestamp","base_size":4944,"alt_size":5562,"ratio":1.125} +{"name":"router_contract-Router::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"router_contract-Router::public_dispatch","base_size":2001,"alt_size":2660,"ratio":1.329335332333833} +{"name":"router_contract-Router::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"schnorr_account_contract-SchnorrAccount::constructor","base_size":64119,"alt_size":67241,"ratio":1.0486907157004943} +{"name":"schnorr_account_contract-SchnorrAccount::entrypoint","base_size":67390,"alt_size":73078,"ratio":1.084404214275115} +{"name":"schnorr_account_contract-SchnorrAccount::lookup_validity","base_size":24045,"alt_size":25868,"ratio":1.075816177999584} +{"name":"schnorr_account_contract-SchnorrAccount::process_log","base_size":15457,"alt_size":16693,"ratio":1.0799637704599858} +{"name":"schnorr_account_contract-SchnorrAccount::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"schnorr_account_contract-SchnorrAccount::verify_private_authwit","base_size":41146,"alt_size":43535,"ratio":1.0580615369659263} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::entrypoint","base_size":49331,"alt_size":53697,"ratio":1.0885041860087976} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::verify_private_authwit","base_size":22056,"alt_size":23403,"ratio":1.0610718171926006} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::entrypoint","base_size":45825,"alt_size":50603,"ratio":1.104266230223677} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::process_log","base_size":1279,"alt_size":1655,"ratio":1.293979671618452} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::verify_private_authwit","base_size":18615,"alt_size":19946,"ratio":1.07150147730325} +{"name":"spam_contract-Spam::process_log","base_size":22044,"alt_size":23784,"ratio":1.0789330430048993} +{"name":"spam_contract-Spam::public_dispatch","base_size":2421,"alt_size":3092,"ratio":1.2771581990912846} +{"name":"spam_contract-Spam::public_spam","base_size":1899,"alt_size":2508,"ratio":1.320695102685624} +{"name":"spam_contract-Spam::spam","base_size":96835,"alt_size":109031,"ratio":1.125946197139464} +{"name":"spam_contract-Spam::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"stateful_test_contract-StatefulTest::constructor","base_size":24200,"alt_size":26408,"ratio":1.0912396694214876} +{"name":"stateful_test_contract-StatefulTest::create_note","base_size":72583,"alt_size":76544,"ratio":1.0545720072193214} +{"name":"stateful_test_contract-StatefulTest::create_note_no_init_check","base_size":72641,"alt_size":76358,"ratio":1.0511694497597774} +{"name":"stateful_test_contract-StatefulTest::destroy_and_create","base_size":452799,"alt_size":475999,"ratio":1.0512368622722223} +{"name":"stateful_test_contract-StatefulTest::destroy_and_create_no_init_check","base_size":452957,"alt_size":475946,"ratio":1.0507531619999249} +{"name":"stateful_test_contract-StatefulTest::get_public_value","base_size":1166,"alt_size":1702,"ratio":1.4596912521440824} +{"name":"stateful_test_contract-StatefulTest::increment_public_value","base_size":1203,"alt_size":1790,"ratio":1.487946799667498} +{"name":"stateful_test_contract-StatefulTest::increment_public_value_no_init_check","base_size":1112,"alt_size":1695,"ratio":1.5242805755395683} +{"name":"stateful_test_contract-StatefulTest::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"stateful_test_contract-StatefulTest::public_constructor","base_size":3363,"alt_size":3974,"ratio":1.1816830211121023} +{"name":"stateful_test_contract-StatefulTest::public_dispatch","base_size":5887,"alt_size":6535,"ratio":1.1100730422965857} +{"name":"stateful_test_contract-StatefulTest::summed_values","base_size":19173,"alt_size":21075,"ratio":1.0992020028164606} +{"name":"stateful_test_contract-StatefulTest::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"stateful_test_contract-StatefulTest::wrong_constructor","base_size":24134,"alt_size":26179,"ratio":1.0847352283086102} +{"name":"static_child_contract-StaticChild::private_get_value","base_size":51394,"alt_size":54245,"ratio":1.055473401564385} +{"name":"static_child_contract-StaticChild::private_illegal_set_value","base_size":66648,"alt_size":70428,"ratio":1.056715880446525} +{"name":"static_child_contract-StaticChild::private_set_value","base_size":66805,"alt_size":70459,"ratio":1.0546965047526382} +{"name":"static_child_contract-StaticChild::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"static_child_contract-StaticChild::pub_get_value","base_size":368,"alt_size":759,"ratio":2.0625} +{"name":"static_child_contract-StaticChild::pub_illegal_inc_value","base_size":452,"alt_size":880,"ratio":1.9469026548672566} +{"name":"static_child_contract-StaticChild::pub_inc_value","base_size":398,"alt_size":840,"ratio":2.1105527638190953} +{"name":"static_child_contract-StaticChild::pub_set_value","base_size":381,"alt_size":809,"ratio":2.1233595800524934} +{"name":"static_child_contract-StaticChild::public_dispatch","base_size":1389,"alt_size":1920,"ratio":1.3822894168466522} +{"name":"static_child_contract-StaticChild::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"static_parent_contract-StaticParent::enqueue_call","base_size":22046,"alt_size":23870,"ratio":1.0827360972512021} +{"name":"static_parent_contract-StaticParent::enqueue_public_get_value_from_child","base_size":22073,"alt_size":23810,"ratio":1.078693426357994} +{"name":"static_parent_contract-StaticParent::enqueue_static_call_to_pub_function","base_size":22152,"alt_size":23849,"ratio":1.0766070783676418} +{"name":"static_parent_contract-StaticParent::enqueue_static_nested_call_to_pub_function","base_size":22057,"alt_size":23782,"ratio":1.078206465067779} +{"name":"static_parent_contract-StaticParent::private_call","base_size":22488,"alt_size":24253,"ratio":1.0784863038064745} +{"name":"static_parent_contract-StaticParent::private_call_3_args","base_size":22508,"alt_size":24429,"ratio":1.0853474320241692} +{"name":"static_parent_contract-StaticParent::private_get_value_from_child","base_size":22453,"alt_size":24279,"ratio":1.0813254353538502} +{"name":"static_parent_contract-StaticParent::private_nested_static_call","base_size":22442,"alt_size":24345,"ratio":1.0847963639604314} +{"name":"static_parent_contract-StaticParent::private_nested_static_call_3_args","base_size":22492,"alt_size":24294,"ratio":1.0801173750666904} +{"name":"static_parent_contract-StaticParent::private_static_call","base_size":22390,"alt_size":24386,"ratio":1.0891469405984815} +{"name":"static_parent_contract-StaticParent::private_static_call_3_args","base_size":22512,"alt_size":24394,"ratio":1.0835998578535893} +{"name":"static_parent_contract-StaticParent::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"static_parent_contract-StaticParent::public_call","base_size":747,"alt_size":1269,"ratio":1.6987951807228916} +{"name":"static_parent_contract-StaticParent::public_dispatch","base_size":2221,"alt_size":2769,"ratio":1.2467357046375507} +{"name":"static_parent_contract-StaticParent::public_get_value_from_child","base_size":729,"alt_size":1215,"ratio":1.6666666666666667} +{"name":"static_parent_contract-StaticParent::public_nested_static_call","base_size":947,"alt_size":1472,"ratio":1.5543822597676875} +{"name":"static_parent_contract-StaticParent::public_static_call","base_size":1189,"alt_size":1755,"ratio":1.4760302775441547} +{"name":"static_parent_contract-StaticParent::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"test_contract-Test::assert_header_private","base_size":29354,"alt_size":31722,"ratio":1.0806704367377529} +{"name":"test_contract-Test::assert_private_global_vars","base_size":28839,"alt_size":31230,"ratio":1.0829085613232081} +{"name":"test_contract-Test::assert_public_global_vars","base_size":529,"alt_size":940,"ratio":1.776937618147448} +{"name":"test_contract-Test::call_create_note","base_size":78135,"alt_size":82377,"ratio":1.054290650796698} +{"name":"test_contract-Test::call_destroy_note","base_size":71911,"alt_size":78240,"ratio":1.0880115698571846} +{"name":"test_contract-Test::call_get_notes","base_size":64935,"alt_size":70803,"ratio":1.0903672903672903} +{"name":"test_contract-Test::call_get_notes_many","base_size":64853,"alt_size":70630,"ratio":1.0890783772531725} +{"name":"test_contract-Test::call_view_notes","base_size":25750,"alt_size":28234,"ratio":1.0964660194174758} +{"name":"test_contract-Test::call_view_notes_many","base_size":25844,"alt_size":28307,"ratio":1.0953025847392044} +{"name":"test_contract-Test::consume_message_from_arbitrary_sender_private","base_size":77083,"alt_size":81241,"ratio":1.0539418548836967} +{"name":"test_contract-Test::consume_message_from_arbitrary_sender_public","base_size":5303,"alt_size":6082,"ratio":1.1468979822741845} +{"name":"test_contract-Test::consume_mint_to_private_message","base_size":84273,"alt_size":88804,"ratio":1.05376573754346} +{"name":"test_contract-Test::consume_mint_to_public_message","base_size":7825,"alt_size":8825,"ratio":1.1277955271565496} +{"name":"test_contract-Test::consume_note_from_secret","base_size":49918,"alt_size":53551,"ratio":1.0727793581473617} +{"name":"test_contract-Test::create_l2_to_l1_message_arbitrary_recipient_private","base_size":29025,"alt_size":31204,"ratio":1.0750732127476315} +{"name":"test_contract-Test::create_l2_to_l1_message_arbitrary_recipient_public","base_size":244,"alt_size":608,"ratio":2.4918032786885247} +{"name":"test_contract-Test::create_l2_to_l1_message_public","base_size":1850,"alt_size":2368,"ratio":1.28} +{"name":"test_contract-Test::deliver_note","base_size":43379,"alt_size":46705,"ratio":1.0766730445607322} +{"name":"test_contract-Test::deploy_contract","base_size":31740,"alt_size":34604,"ratio":1.0902331442974165} +{"name":"test_contract-Test::dummy_public_call","base_size":251,"alt_size":600,"ratio":2.3904382470119523} +{"name":"test_contract-Test::emit_array_as_encrypted_log","base_size":51594,"alt_size":56154,"ratio":1.0883823700430282} +{"name":"test_contract-Test::emit_encrypted_logs_nested","base_size":74678,"alt_size":78978,"ratio":1.057580545810011} +{"name":"test_contract-Test::emit_nullifier","base_size":29025,"alt_size":31516,"ratio":1.0858225667527992} +{"name":"test_contract-Test::emit_nullifier_public","base_size":216,"alt_size":590,"ratio":2.7314814814814814} +{"name":"test_contract-Test::emit_public","base_size":1104,"alt_size":1628,"ratio":1.4746376811594204} +{"name":"test_contract-Test::get_constant","base_size":25065,"alt_size":27586,"ratio":1.1005784959106324} +{"name":"test_contract-Test::get_master_incoming_viewing_public_key","base_size":30981,"alt_size":33860,"ratio":1.0929279235660567} +{"name":"test_contract-Test::get_ovsk_app","base_size":29812,"alt_size":32313,"ratio":1.0838923923252382} +{"name":"test_contract-Test::get_this_address","base_size":29123,"alt_size":31597,"ratio":1.08495003948769} +{"name":"test_contract-Test::is_time_equal","base_size":263,"alt_size":642,"ratio":2.44106463878327} +{"name":"test_contract-Test::process_log","base_size":22905,"alt_size":24685,"ratio":1.0777122898930365} +{"name":"test_contract-Test::public_dispatch","base_size":15580,"alt_size":17249,"ratio":1.1071245186136072} +{"name":"test_contract-Test::set_constant","base_size":30295,"alt_size":32705,"ratio":1.0795510810364746} +{"name":"test_contract-Test::set_tx_max_block_number","base_size":29406,"alt_size":32004,"ratio":1.0883493164660274} +{"name":"test_contract-Test::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"test_contract-Test::test_code_gen","base_size":29600,"alt_size":32031,"ratio":1.0821283783783784} +{"name":"test_contract-Test::test_nullifier_key_freshness","base_size":30878,"alt_size":33766,"ratio":1.0935293736640974} +{"name":"test_contract-Test::test_setting_fee_payer","base_size":29431,"alt_size":31919,"ratio":1.0845367129897048} +{"name":"test_contract-Test::test_setting_teardown","base_size":29376,"alt_size":31932,"ratio":1.0870098039215685} +{"name":"test_log_contract-TestLog::emit_encrypted_events","base_size":100662,"alt_size":105340,"ratio":1.0464723530229878} +{"name":"test_log_contract-TestLog::emit_unencrypted_events","base_size":663,"alt_size":1122,"ratio":1.6923076923076923} +{"name":"test_log_contract-TestLog::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"test_log_contract-TestLog::public_dispatch","base_size":1499,"alt_size":2070,"ratio":1.380920613742495} +{"name":"test_log_contract-TestLog::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"token_blacklist_contract-TokenBlacklist::_increase_public_balance","base_size":2037,"alt_size":2658,"ratio":1.304860088365243} +{"name":"token_blacklist_contract-TokenBlacklist::_reduce_total_supply","base_size":590,"alt_size":1057,"ratio":1.7915254237288136} +{"name":"token_blacklist_contract-TokenBlacklist::balance_of_private","base_size":24248,"alt_size":26485,"ratio":1.0922550313427912} +{"name":"token_blacklist_contract-TokenBlacklist::balance_of_public","base_size":1312,"alt_size":1917,"ratio":1.4611280487804879} +{"name":"token_blacklist_contract-TokenBlacklist::burn","base_size":252437,"alt_size":271060,"ratio":1.0737728621398606} +{"name":"token_blacklist_contract-TokenBlacklist::burn_public","base_size":5624,"alt_size":6318,"ratio":1.1233997155049786} +{"name":"token_blacklist_contract-TokenBlacklist::constructor","base_size":5720,"alt_size":6782,"ratio":1.1856643356643357} +{"name":"token_blacklist_contract-TokenBlacklist::deliver_transparent_note","base_size":37047,"alt_size":39832,"ratio":1.075174777984722} +{"name":"token_blacklist_contract-TokenBlacklist::get_roles","base_size":1691,"alt_size":2279,"ratio":1.3477232406859847} +{"name":"token_blacklist_contract-TokenBlacklist::mint_private","base_size":2880,"alt_size":3404,"ratio":1.1819444444444445} +{"name":"token_blacklist_contract-TokenBlacklist::mint_public","base_size":3750,"alt_size":4366,"ratio":1.1642666666666666} +{"name":"token_blacklist_contract-TokenBlacklist::process_log","base_size":18615,"alt_size":20037,"ratio":1.0763900080580178} +{"name":"token_blacklist_contract-TokenBlacklist::public_dispatch","base_size":48080,"alt_size":50353,"ratio":1.04727537437604} +{"name":"token_blacklist_contract-TokenBlacklist::redeem_shield","base_size":112463,"alt_size":117798,"ratio":1.0474378239954474} +{"name":"token_blacklist_contract-TokenBlacklist::shield","base_size":6609,"alt_size":7387,"ratio":1.1177182629747315} +{"name":"token_blacklist_contract-TokenBlacklist::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"token_blacklist_contract-TokenBlacklist::total_supply","base_size":451,"alt_size":868,"ratio":1.9246119733924612} +{"name":"token_blacklist_contract-TokenBlacklist::transfer","base_size":241705,"alt_size":262855,"ratio":1.0875033615357563} +{"name":"token_blacklist_contract-TokenBlacklist::transfer_public","base_size":7362,"alt_size":8167,"ratio":1.1093452866069002} +{"name":"token_blacklist_contract-TokenBlacklist::unshield","base_size":260032,"alt_size":278431,"ratio":1.070756676101403} +{"name":"token_blacklist_contract-TokenBlacklist::update_roles","base_size":5230,"alt_size":6200,"ratio":1.1854684512428297} +{"name":"token_bridge_contract-TokenBridge::claim_private","base_size":83713,"alt_size":88412,"ratio":1.0561322614169841} +{"name":"token_bridge_contract-TokenBridge::claim_public","base_size":8518,"alt_size":9631,"ratio":1.130664475228927} +{"name":"token_bridge_contract-TokenBridge::constructor","base_size":3483,"alt_size":4102,"ratio":1.1777203560149296} +{"name":"token_bridge_contract-TokenBridge::exit_to_l1_private","base_size":49544,"alt_size":52691,"ratio":1.0635192959793316} +{"name":"token_bridge_contract-TokenBridge::exit_to_l1_public","base_size":3948,"alt_size":4805,"ratio":1.2170719351570416} +{"name":"token_bridge_contract-TokenBridge::get_config","base_size":28402,"alt_size":30654,"ratio":1.0792901908316315} +{"name":"token_bridge_contract-TokenBridge::get_config_public","base_size":428,"alt_size":825,"ratio":1.9275700934579438} +{"name":"token_bridge_contract-TokenBridge::process_log","base_size":15154,"alt_size":16635,"ratio":1.0977299722845453} +{"name":"token_bridge_contract-TokenBridge::public_dispatch","base_size":15017,"alt_size":17134,"ratio":1.1409735632949325} +{"name":"token_bridge_contract-TokenBridge::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"token_contract-Token::_finalize_mint_to_private_unsafe","base_size":3726,"alt_size":4532,"ratio":1.2163177670424048} +{"name":"token_contract-Token::_finalize_transfer_to_private_unsafe","base_size":4227,"alt_size":5044,"ratio":1.1932812869647504} +{"name":"token_contract-Token::_increase_public_balance","base_size":2009,"alt_size":2586,"ratio":1.2872075659532105} +{"name":"token_contract-Token::_recurse_subtract_balance","base_size":110226,"alt_size":119993,"ratio":1.0886088581641356} +{"name":"token_contract-Token::_reduce_total_supply","base_size":559,"alt_size":1016,"ratio":1.8175313059033988} +{"name":"token_contract-Token::_store_payload_in_transient_storage_unsafe","base_size":1225,"alt_size":1746,"ratio":1.4253061224489796} +{"name":"token_contract-Token::balance_of_private","base_size":19316,"alt_size":21440,"ratio":1.1099606543797889} +{"name":"token_contract-Token::balance_of_public","base_size":1320,"alt_size":1911,"ratio":1.4477272727272728} +{"name":"token_contract-Token::burn_private","base_size":232328,"alt_size":252229,"ratio":1.0856590682139045} +{"name":"token_contract-Token::burn_public","base_size":4353,"alt_size":5316,"ratio":1.2212267401791868} +{"name":"token_contract-Token::cancel_authwit","base_size":21426,"alt_size":23329,"ratio":1.088817324745636} +{"name":"token_contract-Token::constructor","base_size":6193,"alt_size":6753,"ratio":1.0904246730179235} +{"name":"token_contract-Token::finalize_mint_to_private","base_size":3676,"alt_size":4496,"ratio":1.2230685527747551} +{"name":"token_contract-Token::finalize_transfer_to_private","base_size":4168,"alt_size":5026,"ratio":1.2058541266794627} +{"name":"token_contract-Token::get_admin","base_size":357,"alt_size":730,"ratio":2.044817927170868} +{"name":"token_contract-Token::is_minter","base_size":1245,"alt_size":1833,"ratio":1.472289156626506} +{"name":"token_contract-Token::mint_to_private","base_size":67137,"alt_size":70951,"ratio":1.0568092110162801} +{"name":"token_contract-Token::mint_to_public","base_size":2621,"alt_size":3213,"ratio":1.2258679893170545} +{"name":"token_contract-Token::prepare_private_balance_increase","base_size":66967,"alt_size":70693,"ratio":1.0556393447518928} +{"name":"token_contract-Token::private_get_decimals","base_size":28406,"alt_size":30618,"ratio":1.0778708723509118} +{"name":"token_contract-Token::private_get_name","base_size":28380,"alt_size":30661,"ratio":1.0803735024665257} +{"name":"token_contract-Token::private_get_symbol","base_size":28357,"alt_size":30684,"ratio":1.0820608668053744} +{"name":"token_contract-Token::process_log","base_size":15154,"alt_size":16635,"ratio":1.0977299722845453} +{"name":"token_contract-Token::public_dispatch","base_size":32221,"alt_size":37300,"ratio":1.157630117004438} +{"name":"token_contract-Token::public_get_decimals","base_size":384,"alt_size":783,"ratio":2.0390625} +{"name":"token_contract-Token::public_get_name","base_size":374,"alt_size":746,"ratio":1.9946524064171123} +{"name":"token_contract-Token::public_get_symbol","base_size":361,"alt_size":753,"ratio":2.085872576177285} +{"name":"token_contract-Token::set_admin","base_size":386,"alt_size":771,"ratio":1.9974093264248705} +{"name":"token_contract-Token::set_minter","base_size":1255,"alt_size":1831,"ratio":1.4589641434262948} +{"name":"token_contract-Token::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"token_contract-Token::total_supply","base_size":455,"alt_size":848,"ratio":1.8637362637362638} +{"name":"token_contract-Token::transfer","base_size":116065,"alt_size":127661,"ratio":1.0999095334510836} +{"name":"token_contract-Token::transfer_in_private","base_size":288372,"alt_size":311699,"ratio":1.0808920422232395} +{"name":"token_contract-Token::transfer_in_public","base_size":5501,"alt_size":6411,"ratio":1.1654244682784949} +{"name":"token_contract-Token::transfer_to_private","base_size":67108,"alt_size":71024,"ratio":1.0583536985158253} +{"name":"token_contract-Token::transfer_to_public","base_size":232245,"alt_size":252091,"ratio":1.0854528622790587} +{"name":"uniswap_contract-Uniswap::_approve_bridge_and_exit_input_asset_to_L1","base_size":5800,"alt_size":6481,"ratio":1.1174137931034482} +{"name":"uniswap_contract-Uniswap::constructor","base_size":2954,"alt_size":3554,"ratio":1.2031144211238998} +{"name":"uniswap_contract-Uniswap::process_log","base_size":15154,"alt_size":16635,"ratio":1.0977299722845453} +{"name":"uniswap_contract-Uniswap::public_dispatch","base_size":16599,"alt_size":18095,"ratio":1.0901259111994699} +{"name":"uniswap_contract-Uniswap::swap_private","base_size":73247,"alt_size":77278,"ratio":1.0550329706336095} +{"name":"uniswap_contract-Uniswap::swap_public","base_size":8226,"alt_size":9280,"ratio":1.1281303185023097} +{"name":"uniswap_contract-Uniswap::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"updatable_contract-Updatable::get_private_value","base_size":18282,"alt_size":19920,"ratio":1.089596324253364} +{"name":"updatable_contract-Updatable::get_public_value","base_size":16531,"alt_size":18173,"ratio":1.0993285342689492} +{"name":"updatable_contract-Updatable::get_update_delay","base_size":791,"alt_size":1265,"ratio":1.5992414664981036} +{"name":"updatable_contract-Updatable::initialize","base_size":68664,"alt_size":72190,"ratio":1.0513515087964582} +{"name":"updatable_contract-Updatable::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"updatable_contract-Updatable::public_dispatch","base_size":1384,"alt_size":1923,"ratio":1.3894508670520231} +{"name":"updatable_contract-Updatable::set_public_value","base_size":327,"alt_size":699,"ratio":2.1376146788990824} +{"name":"updatable_contract-Updatable::set_update_delay","base_size":21906,"alt_size":23765,"ratio":1.084862594722907} +{"name":"updatable_contract-Updatable::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} +{"name":"updatable_contract-Updatable::update_to","base_size":21930,"alt_size":23749,"ratio":1.0829457364341086} +{"name":"updated_contract-Updated::get_private_value","base_size":18282,"alt_size":19920,"ratio":1.089596324253364} +{"name":"updated_contract-Updated::get_public_value","base_size":16531,"alt_size":18173,"ratio":1.0993285342689492} +{"name":"updated_contract-Updated::get_update_delay","base_size":702,"alt_size":1183,"ratio":1.6851851851851851} +{"name":"updated_contract-Updated::process_log","base_size":15373,"alt_size":16700,"ratio":1.0863201717296558} +{"name":"updated_contract-Updated::public_dispatch","base_size":1255,"alt_size":1814,"ratio":1.445418326693227} +{"name":"updated_contract-Updated::set_private_value","base_size":65966,"alt_size":69334,"ratio":1.0510566049176848} +{"name":"updated_contract-Updated::set_public_value","base_size":231,"alt_size":552,"ratio":2.3896103896103895} +{"name":"updated_contract-Updated::sync_notes","base_size":194,"alt_size":516,"ratio":2.6597938144329896} diff --git a/scripts/bytecode-sizes/bincode-vs-cbor.png b/scripts/bytecode-sizes/bincode-vs-cbor.png new file mode 100644 index 0000000000000000000000000000000000000000..7edf72be23fd0596d11b799a5cc852831155f14b GIT binary patch literal 25071 zcmb?@2UJws(q@ySQNboC5+sTQB}hhc&Posw5D_E_NR%KMTM#5?Br6gm2SKu;%1~e{wQ|o_H2mTqRXxjfAC zKJUBl@f_c?{^`=m#oMF;ahjfbFOqUhU$gO3oGm{oYkD0{jv!rr{85HaZcyWbD(MGH zwDqk)mNTV4sn2{u$)h#y5n~@~YCa)5O_(r7UpG9QI7erm;9a-5#vWYlwd2y$A1%03 zu$Js(5*iwc10(y`&p1W^e@4*bGNMpYazt482Pq2%1}_&Qg+`$;n*R?!P~?zb6*gWR zsVboFc|(7&9B7g1ZcgH@adCS75gz6o%QhDZ^>rqQHTA5Z&CU8elrIkkjl;&PYvlEy zUKQmV(aU>WYW#}Z^7l`<+To&$Zx+AR7nlEWttlJzVzb3Zw z48 z#H=}likO&qCEI0b)T`;VuJgjz*LGv|nb!zJr|4iEaXuZ`8ZudVe+j@7s> zSr^p_N=R6ACvS=G?{3mxHu=z*$X97QywQHKh}LIsC7ShGn52OF>QwaAD|6ekX+FCP zm1%AhL0pE_VuyQcu*gCq_OeT(b!i@pRXaO7(;e}f^Fw8&rMw4GPr2*edefz?2l9tX z?zWU$_3y0z67t+y-qLm*^V+=JLc5k{w101~&`>q*(p=xmj%z+U{WAiRJ3n5eTzRmw zH5op6YI9+DFjqTUk>1Ps@L*ruW21ID&cJ2<3tTVk)vH%93b+~TG~qQ}_i7`h4*FL{ z4c^n!(?Z{z`&Xws8nz~$ZX6WhO1(j2Q4~2a0p1^;kOl>Q{`?ua!|(oUN%)OUJ>o(R zJy;@gg;46xTMf$dU@exbsU92i?Ck7ShX=dl%rIq=GYNO=;c_XWuE(T{Ek8d0pl!6% z7eC==594Z~b?St1kY7_z72EDGI&fTj=DP6pbB1i-OV#*hdM>@vO!(B-drvlpN@HqQ z+b;%*3fX>*;Z1#+SNqsV=>+|&6(2sQHCH^}=4J)X7buECSRP3S!`rtHnkbEG_cw;s z7pVm9U7x6ST^gnL`mKq)p+zu?pMa zI8Fn9hO?JVS}K3fM@rT1Kxj^319`9R(ydAN7_;*AgV z61($dFBHQUhbxz?vQu2XT4jgQ2rbs{F7CdkKfvI>)2&~P?d$8Cp%*cn=G>Ff-_i)W zr(I8jLT0#dw9bRIFkECNfdMVC|GWRf=7*NaE6!VKK1E)8D=pF(=U)Q_ZCxuXrKP1G zl=dFN)U9Mkjd3~{czJnY@F{QEOV9hj?YPkXu+)3I4Tl~k_7fk1q%k4qL^oh2#O%Mn zH9FiGjJ>Gayfi;jwT754m;-C7o5@sbWOlM+yY@Bl)A-VB@!5aRY#Skt?}d59&w~|H z-ni8&lh|C;I9ld&P?uZEU1QjSek=x_AFQkyFYYH7U@?xPPaxfM~@Zc=jVe( z<>?lMNzM-z8Da46Hisngnzg^u$=g^O^VwP+zkIj(Lz?(FmVBlsP15IJufU*k;M1pD zKKtwM1Bhv0&7%J`6pjO)$Y`8&qQd}Gx_yCRji5svEF9RdCm7BBt`mwOXFr0m>)v*M z+2-c%?w)-$-P5c3Cusa zg$@UMGh`nz2*ZFB!s+%KPjKhoESaD`7^i>u`v)ohI{-NH;b4+;SAJVa?&>Kkw>5{- zBsGZry_N;rhBz2A0Azxn%j54KJb17++jF>dc(4?2f28XNh4ai`?r|#Xmcd#&aumAw+u``!V$*F%`PY*!@ zz{Tkir=EhsLhtSA_`|Ih$x+X>F7V3W1_Qvh`}Ny1KY#x8*^c*dU#i;_wE1EW$oWB3 zOuKsHtF@8mN|RiJB?do9$gci(pDHEStv3MG3&WLTfGpCOWUq~(f}+1XtDwON^<1HY z4Ib(HyGQ+5>K>clTw$tL0L|c`reD8)UEt$xYirw+DxR&DSPIbWhevorSJ%k(+k+!h zRgS(;2RML7NRlk#G!sI_H^Hq}?L3#M9L?3Rx0)*Mfed}JCETdOMsF|o*|TS0-mqQ( z6?A~0lrUPr+rIrDU@B^O<AR9>H^&=xtYjk7C zBJJCQK|?@~urWa}U-)JE&24~PNl$UPuI8L=f*twP@SOAAqjy|-G z9?nurT`QaF2)1@B` zC=@z$uZU4i&~VdU~3gk;6aXvNA7y&C&F3 z-~GS{Sybbay?5ri(h72N-1gT8bqjA*!NWo<^d2fTL&EstQ+(v=Vs;$SJP&?;l7D(; z|EF$4H3aTwk~LtM++K649dVpBGtaCin8U?4Zo;&J*?>nz4y!Diu{uirkc}7P9Kk(|2;}*rfed zHgvFWAx9Eya~RGR%&puZv=ue=U6HmaiJ~b!v*5wZQ=iH5)vHEPxIR8cQG2T_R{JS> zJ9dKu*S}nFC&5CplOW->lW_U&l?Ok6&m`GhXzu9f05cExj z*qZDSo(utmm)QFL2uU0u_^;g*gS=3)!--*})J)Y7`Ftxi>xgRk_3Ib-bdp%9^IRV+ zL(=`~-1>SXgNeSN4i3|9TLKG}p@mQ0uUN30{f)9&P@Sloe_^ye>2=7N)qg&XB~=%9 z=8$6ZueJo1$Dy?zOiIS=h9kfU=FZnpz^=0Y4o|%bTvg#=#;390Q zJXAy`VVcHM*>RaUY(m{rnYXpULEk-_TiLInfm_*oJF5Jk+hp5L*AD~v_VeI7CObK& z=gW5+zhuokIvx7n$%u$xmnFk~E2@{eo|QI|n@Dj=wUN|pQk86`$Z-5n_BBt1GD&Aq z<6%^UYyJ81fTceNY)9G44Payfwi^t?TH~<;%i`ltJe7r+jL24H7{Jz^%q}W_kved;o(zRb zN0~8yr_eUNmp5@7OLXFH(v%c@8DxV``%kR8t|_Qfp%qyX0!crAwiyK=LkKAv44+Ab zq4RZ23v$1y)PEKOkKO6J{lA*=n`P(V{lG!_-e^~N%bwmE<3Mm4O@5|Xu+0x_#z4dc zF8KGQUSX0r_+IiDD8O~Y{Nps?n!F1CdFfHn>w2q+7%!QhC%6>5HtQMgxv2^gW0rl`xSrZCknor0Y8??F}pC|auW$>Hjzs|_8N|JzV-us16SK>iRibBL!)fak}nfea2}BcL^(gkzV$;HS@@A!90ROF4b|G=Qpl2t?El!c%m$Q&Fn=Zcf&) zTE4yLaS`mxmoH&xSLvwuEqfs!dN#HV>BBbw&7eTa+iu1KPZ5BB4TxxC0`Xur#r1ad zyE+JUBUNP(aFK!!#uo-9UT|cv-r-+L=&Gycc)?~tPf-4p}H9v-Jie!$$csW2K7`ZAn#!C2XA{UgbIzG#eWBR z29!`Yw6&cM_c!C?;$|{#z|AIf+4!*9*;gUwxn1wM?b@*WZKj9Lsq-?Vw`VUiU3Ofo zn)N=|o`uLLl84}l>2Z^Q<&9xGqguBWRqi@x1mJ5k006&LKX@t>*4#9EvIekmRkX#V zBxcfu9xURxb~Qyb@pjtZaly!K{IRnY585AsTo|lRQ}F4aNF>38Is)(5Nz3gnn*P?C z>kDN(73^ay@PLn5;@L0s_$|Nn!-J}ap3htjvd~dAN60uC(B_>9kvEy#AZQjDH5?F1 zZoNygtKWvI`18QP4IQ27*Bkldl(1m=?M@v(p!fjPh7bHDPVBak(O9M3*i>YZ&;G9- z@y%O0I-jGjNepFQO9L#2Wnr#t0%yUh%!F5S)0W)y^RAB3_5lb@8XNG0$#{}wgP)8W zsz#+*?8n1sHf3#g3(TB}g$9T9FsZ#)PHdOuAndTs72IA5{fA@F`Jo=Wp!uEiMc1yp zz*D&RoGD<{hj+g}u#~1Pn8J$CLivvn5awtn&MIzxhZHgTFPRRXY`{MwSa6LCUuSV& z$A#NCN_AKoD_0eP9ZLx&FkYfyH&9Lz<97nzGS!f#@9e!w;5{$rG#5wF?gy8>%PP|m z!vNRtkQWRbxF9bs`y=8Ztf!tJ?$t>7EJ5}-sV|Nj{m8xX^%dT8i0n>R0+upp(TZx` zV#L7HnxW6NE3tL>{ag{|10b^t= zw;X6Y?VW?CzXZKGLy~5{3YUop^}VZ|C__4C#80;ub$ASbgzOKb=QCbnm;}bR_;QOQ&a7`j@2DRd8SSGn>bu+k8>)AiI$8ThcE;ah32a)HkCNMxpkq0jK zBnPwjJ`vMys1PlJSjhADCFHi`J5mYXFTvuV#aphzMItW$f#Szixx819uqO4xiV9W& zo>B%@`@ck#;vX-?Qt42r?@#{uD@P~m`r}>N#+a1nf6@ZDEZ$#prLt;>QskDPf5TJJ z_JIN5nxgZsV18EcC@APFcUVR$cY7dlp_dNVI8yl%Ww|rVt|hA<&v~tGT9puFG4LBB zco35;*EtZ1wE}huYOcVORDFPgz(h#=?v>>nJA{0gn2Oi*tuIa$d(j*&U`8h9JJ!t^WGO()?__hyxNsY_G&u=xZTt}I1+ReLn@6!2r%F4b6 zoVa-L;!^Ee_g1UG;4N)k-OBsls$(|oz7&tcmr49qePuloyR(vqRntP@O{;rzFr&PP z+xGDNS4`I$^#quKJkRQDxfSHXBDsZZM**x{>tGNgSaR?4tF>-X?rH6CiJc$yUb_Gs zj<>*Zq}Zl?h>c5uZM#2O>)sZ{(v|iVe$Lk`yODqMBYZtV33iW>AfWg=rT+`LyV6p` z+*fsU4Ig}zr<|@YZjARt8-J&TRZV|zoCR|g%F&O{T_B8#3~OB0X1c1N ztQHPLmLSg`jjbH>-i0#B=;7Q;r*09}X<}}miXg$?`8^jccJ^u08K|G2E;utPa^~qv z+R9xv6iOqZ?`1;%UVg3O3!p4#c77EZ)jfPr%@5H7NEAsRPd>bdIzk*$X1m%I1t?7* zSoha)@V8v$Py78eoPUl&od*f-i&_+<-gPt2&;B?9?_ zl<0$2SMWL1l%moz4(;RW9hM!4iAzzy*>Vm6Jf^$$Dv!W5KL(jFAn@_WLoasb%|9#u zk~L59*$!?_K`@J{P_G_~H@pd6_x!Fl6=F$$GQ1qNqui3>+)>tP8uHIn@;?#I#=@K- zw(YKPRjCZ}f5Jg0{R1OmlM)`E>KHAT;2ZoTJzgwukU3a?!OI?hes_{+#??G(+$9=H% z^w`zf1(p96wO+g_AWCX4k77QKgGyh9C7*H+C@wE|2G46_esqjjzs$Vr<2U4XzYxG7 z&%04@1(1*T0S!|594#Eoak}r+zoQXVRcIW`?E4R|N8zcSgy9~?o)TM@dhlSq@1^QB z@brzbW>UyV1h8N_>W|6LkZ@H4!3<2gkweqzg@#b<1>5K5xDbA^{|nY+?^m)sZ8BkR zc~Q1&xypZs0dc)|s_`bJjE8>9i59831qFrxEFG7NVk-qmQ@*=WAeDkIZVXqGDKp#5 zc4j>!!zXD3=jY3MQUz`GR}tc|CG4C~PEyLX@6dN>>C^VJUja(aIf{nBb9; zq|VA8{r2U0z=f~XE0BFe&_MoV9HxeA?D547?B%$MAZ}QkW?1JjKDdU;pLBunn~ zh5+R&bBEX%PGCRh&~&Gr6x^l(oL_}^*M%Z-imLI$Yg(B0kBk@vU8Y@@89aj_IRpkC zNu51y`|K3|HTY4J0iz(lwk-vxPTcKhN@S4nNfIX`KkOm_-gS84sfgEAFrarvsuIIP1uoor zmC2T2zCXK%#;*3G>2g8k=ufDQ;#A=$2FkudMp~i!BfxfNT}wj-9v>SERP@s8!P|Mc zxrzK%T3o-FEyz-y@5sZ1F!dd41Qyxz_eVvjD#f63^vr~!kogww4x`)&Gr5k0rYDt-5;iE`}f|zD<))G>_Lfl6fN~hUw_04BB zi`5s)z`zWvU`#!U04Rev&1CTqa5lSaB|Clb>LCO;U^Q$Ge+xZ6x)cgwMjMXxZ}Q^iyg zsRS_ht$G+QadS)Bf0v4W2W>#;YnWA?UzOd!L;2$lkdY}y0`|qr!n4>FW2v5VJFh;nNiZf#AYg%d)!bqtg!@cn81N4yVp(Dqd=IOZiaID@7OwW7$vo3UIx1sGjQ_-59 zkzov^c5G~{>!`bh=hQRn!rZ((;5H0T6qV+xDI8tuxHJIlSE@!xKE1)hR-|sKll+PS zlRDA@+_+HzHuCNfVH))H?CREUm|wIEg=QWk_N?J2srfCto(WVHAsHAy7&X%0WmSJh z(Qxo}uwD?-OUeDYYryV6J<+XW%c=MJ-e>Tk_$6dQgKxr31L?ipR;Sule(9B&8@ddc zStL6s0KY`%_50(k&v64IRZc>7qqU}OQJ$1!GF>!s>riq@-F#g^^Z@$DFq{G4_>Y~U zOI~=Uzws9DR433p&=wxsUvxF7@275j5kZSCpaUyyjI4Pyceo~bxHgxacCf$XlXi9v z+D-D5hWx-T(L*ySu^?SN>uQR=p<$ip_9}Chbe~n1^cu+v1P?5!FM|<#%)N}SUumXU z350eraO{nUMgadEbhms)pqn#XVJqtVLxYZk*nilrVZRNQW&ANE5HQIDBlJ(3`ovF9 zC%%ta^PVG1r;-6=D!FwmF^dlig%ZMjK`nqhDcm|-@?a|~>Hb$Rip_?@{S#bo(k*&Y zx4#ar{fW)CUeqDhYRn!F&g2F+kFQ9oHv^5`bXdOU$QKN8guP1bvbqHt_^?}gdfU)| zn8X5Q zT$?U&2<5k!prY3SGwFAQ<_aVS>q4L;*m@6n0FX)30W|k>a&uumb{-c`a02S9ikRy!+;K}*&NgI_t~s7luljF?5r zgE-508i+J%shVoHR09BJFZHF$q7_42NOF)YK5pj=kxafon|d_>1)CB8#r=^tP(ZST z-||>^-Nx**^`5@;Hsxc*M*tUCwSJu-q^Uz{1S*KV3)btVQR-%;a>#E}x48sk+2e{K z`;ZbnDjG4Gkdgn%dLiowqmt258kK}#jK266Cjjf_`{arv`AYhBA@qp?S!l+f{t>>Kc3kX5{CyVKyk4^{As&KpuVWXs^O z$04qG@9)$>dsO|H5wwk=5ob|#9(>a=bnUz0J~*#5Dr1O2UN+?cZ>)UIbUoD=JzVDw};m%8c~5hUn9DAQeKGB@K-~QMMUe zejibPnEN0@e4K9eL2Rv)&%pZ~v`b5%185T$bJ-kS){@TvYkQN+96f2!iZ5*s4R^?k zU4IQMSR3u?Ln|4SA-}&`7d?QH?QN|j7WkUPqXV_T#3|yl{FYfIx0UxMKo>zJ>Ai<{ zN-V}@3U$+RfjW-e6mgkPt>URV@5ZMYKgh*~dU3rN4tyN9(wxepb zV%k|d5gghLnpWz#<3JTRK(81UfK+*^?m`>SO0OUCgmSPD;OBRM3WsL2E2PuFh(O}g z05K6n25EraRr%rmv9u&zNDX{hg$4~eowk+9mTS-W+1;0c);27+)ZEC!g#rG8iy_J* zge-=EA`Am!gdi}Y5r6m_QkiER6Kpq;;(!6auTaIt(h_OMA!h(IHY)!3mP|K=lZje{0rzGX#N2P41$E<8Lb=+ zyGZm=@$pqk7-AwYK$bI|i2#ft;Yhe{#1c8pbhhc(!qrSal0MUbNqP@y226VcxHe!s z;9R?&*@6YJFU6flG)QCiel;BYI<0#vQfw83JFC^d3Oj5FhL|xkqenfwD0sqh zqpNu1cf-Y@*H8%~vuJw+@iGkn9yDWo26Ay|tou=+!+SBiCS>5~BS`NFZD>9N92ky! zq#y=jLJgvBiGBxUSWRIeR~`ZU6hUK!XACwBna8t}_rI3s0x7S@6~xoa4U_V?=%o|d zu6iyDYzE$J|od<@09bUQ46e+RL0(9qQogI{vf1`;$xx(4Bkt7g8`B=P(w-e-JJ zQz!GmH0j0m3t%A~8ZEi22seF{DYXUtD`Hw#YDTwjk9rDy{40z8D_k^X@shJ% z4KY%C#-E!xWq1E3lm=YE2t@2^;Wui&P(buVXn%n82S1jDw4dzntb;h_c9_bG1QvSD zgf|1CU{eGvw&Xt_Q{H~#INc6uA1!5!^Z@1zF4AOUV0NqySO%0wgj$kFS#SVtdDL;a zuTozcd=7zXMFfDuV+R{>%sv!n)1{XhS*wD6|F{o_@m{oL*jq31sRLiL0QUv$UYeM@ zBgCls!~G?srB`(+43lF?JDQrw$^z@Okx7gNIoQJ2b6bs;>ou0p$P{ z&z-lBN=R-`MJLCCwMz+>-_w}@*eOGl4IS}NAb5Yu(FBd&_TE|#A_pq+oW3Z+wvsb+ zJqweWJfS*jo;6J~uMA6w^j|saCV@EGL;?5>3Az;c5hg@B$8@C$OZ zB|Zanb0X~aXPG`#s@UzS?J@;VsKn8W_4b4TMg{yzQ%7co{9@g)?WDUeCsL^o8 ztP~h7VOBB+&o4pQZGfbz=yq^FByR>WgAb^@1eG62V}1iJ!Q=K^Cq)FB^78V)x6r#! zMLKVK0=$6gXb|!#Fc1mnAHCaav-DS-*|Z5@mgO{*+do2O2~xc^P+!?#@DJCG4t2D( zfpr(M>`k}o&+-B()+zt*(2|2e-c#VX39$#n846*vdRkG{32)f7vueRBL2yY0nkp!} z;MO(Z8%W%v%JrkQEd6FVapf|O}1j;3dDb6Bgis5vK<}<~0l*-3#GE}G@ zG>}lb*p8=wR^w7=IwX=eV4c)ir_Fm(_g7lz5ltf0{wtukx>0ybPe*6{1^qr7+8?r1 zDA~pm1*`|`e0GOV-r#}C^2Vq;BnDG~=dP4Hn?s6+;lWw>K%{U}5(Qb+@45bX zZX-IMSCBt}q%{?cv(WmaKLZ-kFoCrqCIouAo6zO}gcgPKYOjNHVMx^RjJ>?}i;dq; z3?e}U8p=S=PYi)GSi#d(<#DxnZGNkSJR4lFiT(zBu3w*eN%r+x10ZK=Yj{ zSJf0`n6=P@Fz!vw zoGpw7h9ZrjmGE=}1A`v1IR+o5myMG%1&mQ$T^;BkNM0U-^bbj1^5qVyk z`)@Kp3LsK=20_hLALm^tyTHDlU3dhoanN|GFky~KFUL3Ry{xWAI@;^&>xgz))Wt?e zN2kND_uX&#cSvedj_2-z<5bnCQgu)LIuC6=@AHiwOxax1!_8X5spv|OR{Y>JOImar5d}re~0a`6gIXlyrbSl z`g*eL7eQQO>B~r7un_t5NYTJtKT}w<*nU)%z++{=*KUnOth6fvO{E<TC94q1(l=klfd_QGNOurX5dseajskk?O+<+eC~&a2 zbimcpL@Lpi@;vBQT+eg+Td-`V%KcJX*A9PQgEPEAZx;yUlT}~lFObH?XkQI#GJ*Kp zrs{=NWBMB84pZm~rUxxAPw*q?&TSm-Hyp;t`@;xZL$mzsAq~HHBY&&gwcZJm$uN4! z+evKOjuc%lA*v*03b#&h11YCx3^+c;=U^K!kcQ8^lZZ7rV(56OBEv~Sq{Q?ep;wax2q&a- zy8~W;2>Bo&0wHwm%3S7Cu4=Zj(^3~jI)DJ;{nbj?58b*IgRz|fa9u+qqeGyU7RMSS z3C*Pa=cM6TqIiUK?okm_)xCf~pjSAEIV0*<{H2NfPWx5OHVm+AZ3=I#9?s)aP+JV) zp`_wy-4U4)D#J7&!hcc;WlBMVpObrHn>f;}E2`;02rwE+XOLs&_P@4=uriu|5 zz*K}voqf1+)Goyk;36!(vDrgdN_1)NNqlL{b$*iYLuIi}J0z{n#Fq(9;)j`2R7dJ5 zm}6uyc}DtDM2x%P9F2Am$hFN6OLMW5jx~O{AOZ&X^%aA@0+K^Pya9q!Vzrf-bELxf zeEK>vh}hWK6D57T zyMJa%op%iuoTC;%8VR;hhf;4K2LbBVYsq8m7i1SFD!=(0?jsu|&T!p=0s}~|ZD=&n ziMjFU3TR37y$;GU(1KGlqYtGJig;jTLn?-Q*zjeyeh_fZ-whHE5Y= zT}K>1H3kyYR#!s`EOcyw=H6|+9s+By44pt@A@%Ua;6t^8@WUY9ZvYY&P^c$agm3IY z6kPRYzcx;_Zi4tcmU9zZ5M`(Sk>FAtwuFU zQ9xo>!4^i;!Ni^jA$JFwT!P_`rB4LSHznh`fi= zx_qzk=A}5tS`Z69nvPWLx|WLW1ci@ACx`)T*utcceJvkfC>Gr;F@Yp_<=>QAkNu5= zGsQf3Qg`}NWZ(|+9EQPd3L2e03?l$Y5cxs%519@uG$Kc5Kr4it)zsI&@-H1O0~(Q8 z!@iP3M7RZ1Jj5I*77YvyQ)c_xPUiyEk2DSKp_GOMImig9pn+?!$Kd}JbysbXtry5X zAE*X^5G}oyCIJB#RzZ=j9sC~s^yZT!j=M#f-MauMVw*Z_u5(>1GfEoa0n*7gR z@!wr;GMP3)04~(rAOHHZLF{_MwVzHT#-B3hDIP?C8;pOyvjZ`U+1l798u8m!;RHI~ zw{b{UjrDJzMbA+JjtrpJI7F?{%5jC-*B|1e(%GOej4|C~MpA;VAp(>LZ1_jeq3QC84;vKNwG;_iPU{P3TUw*X4_lFo21}t2v$vH46zdGw z!7?RUu41lIr42;GfoOU^jJ`=K00^d^S0(eMXkc%(G&~(c=dS%%vzP(Z%8R+S=Ait* zKz6RLz{qI@huVX5&5FhD%2!iBBAK@*8S$kJqEdkdkSR8;^eVYXV z3mYqi_FY8Gsrk_{4ik*W)kJd8ZcsJY;|ooWPhDA zJj@2nlj{C*{aESrkLM|70HYKFewYKr=x=i5r^p|HDBqHn3vr>^d`2v@W$C2lnl%hp z%N#v!mzjK8Z7)S^(Gz?;*f62euq5{+RS75^>Gr~eFS60&q9VlMv5-bBWA77CyixRpEM!&ZVc&`13;;!!+5un6k%b zkYU_vtX&9JHxoY2Zn397YIYqY4h)3zyk7;8TX+&1w`c3WfyAA+mFq>sHNjYjRi^kd zmK@(Q)AV58WwK=JPx#`ptm1%O;WC!{T?JEXlR z%z|l*6bYaM{3kHqIj0N1k#=*gH#bti0l{uVtWd;&C8`xh6vd>m& zV>xZH@1TJRKD2WD_Ru9AD3P}y1G9(B9Vx#>98Hy#^MZ2=3rAmD>q4uc%sY?L#kOPTNbkPXf6m(^TEGqH#c5>1;jCAa zzqE^I?u4k`Jnu1{;(rgVB3BEjR&!mK5k78b7^-tJT)9%W+ zETsQ~QeBK6fgxj#Fe!w%`AfRB&4nM9{`fTndJW59W(=~a4+>bI9j~q4xpc;$_|7}v z_5P}kMq%$w+YVqB?|A^*fQc{HXT}5RM-xqfHV1}f7_?;or25{*cd4t`lX4tXVDcB@ zJ1C+LsTx7nj3jVqe<;9~zLZQtih9!j4(vaKXadP1G+98S_XGMYMYrq7xY7fTBn z@$&*botz{Jl&>Jd+eBHnSjRtok&t zsPQcmimjl#&<^^S>Zx($dahXvtz{PxKz^_H-)>fAst#tWXGRPYg(wj4#v5w+22prTWKXAGbBbR0u%YpbkTFNV zOVD8+AFBu&V6r>%llBNk(UPMxdWRky0}05Vod&PYj}b^so$uLVDI}+)R)k4O};DG0bJ#el7~Dt)1Lf~GAqS>zLtZbz=;N_TPb=@f<*?VbB*#d8m+bBn-^zdk6`E`oAVsC zMCUj6@3tiEE{-n1XK`V%&gi{x{QkOF&8F{e+uD4Yue@`Es)pbu)OM&l6se5(&b;;~ zvzN5}`(~H3$;_TWbV2z)55znX`<4RI5tNkh4@Ug_Eap{G3LH4&*h92m@0Y!ED}qH( z^q_2-y4LJ@JJ{4<*HcPZ>5uF9keO4NQxS~x2({)qZ$@syK^O_R&AfGxMa*x-4LveT zI?dQ^`NW5yn?cp1vA$QcTzVg;jr@>=bEPy+QW4lli(L7%l&+zt5#xP+7w#%WFLbS@ zF_YJxiJkD37}Jl+HI1)LOOCOIjd{p$FPSO4b#O9e!ZbRRvkJx5ORw`FvNV)E8y_x7 z4+d9oB1KYRD@h()2gP&74^vDTN~EEvanj;BbrvglpgjvN<9C#TIKGk(GaTXx#wN;C z1^0c6TkC>rf6`04kJegh8o-LG<|yJ}ALxc@P~7XOdtakb0szrnmgzO3*z zBM?)}ZFlU%j-$+U^NmlCkfBIg_^`g;lns4G4^@0Tb%&x;ejy_vf`N#>xPA5P)k;Rg zF!-Vnx-7H|nPO+&Eh`i;zxT$aJN-=OMM_Pb5%{QsB zYb}=S9j-Jp6)<3)Gi4#T#mo(L{&2lwNnA!>`|X9(=b=_XeMw6q)ZsOy&}{tlE>U{S z)lN?xj(MI;g%hZ!fU|ibyR3Utp0aw(4K9Q7V8Y;XSxon;PcZ#Gj_cA!%XeB)R~y0! z?s=x+Gb_PyHepg|;n+AzF)a1?r>D`!qe$fYoG?)$kVIe^U-*hX=BH9iXt9t1AVdX% zP1)1PKEIP*o4uDW=Ga@3kBpJXpf+K=J@z6L0ibb(egZJl8}?20#BpXz?_}m^iu;)=;aR!2gGtI&wGuYY z%*+5EEDpsM>>u~5sPf)_2n-@0NcLiSm#*o1l9#k^Z zs^4-+3*Cuobs3pPh%BD*C+WoAl$3ldSHZcT&Js&NY**@fwe=x^z#^ap$|Km5;nOUL zqabbsIdl55J@<_2osZ0!Qhs62f`gJ`2s?@8uKTT}s@eg8lG%{-txKcw4MsDuG0vAg z;}l)}2yst3UMsZ)jIAfUlK{9#Y9Q<~f8h$pQrVII_Hq)>AOS-rr9FdA19=g$vw3h3 zS~a454{+v{?&>Cub@5-2pw=>kOXWfo?~AiKw*TnIcxpDOI|yxGvi#AJ_ab|3ph zX7qZNnss{*3*hpC02orrT-V zfEQ<*J8#E-?<@y6GR5&2lTLJS@q!a4=O{=VL}N>|M@!=~fv z6%iH?=utNQQfN7X*o=(QQ+_wt%k&cLp0m!slh_knQqlpGxJZij%lYnFo~;s}GG9kA z`nWISjV^p|PYAy4i@T1)k#_84ZcWcp+*e9)^0#czrecil5`ASRLp??xo3_7kjatWm z0dt!d?&XJh!c|Inj6*WdW=7T3obR5#j|_8Ti|Pf4f}zd?D7o9cm5TPr4w>&NzhSJ( zBC=LFva)#RG>nl{k z1IvlPJYbj-;g??2OpWUGb?(cZAR7GwFfWDfL_3;Kv4pNY(`U9kIpCnfOvg)9jzYb` zgC8x+)q2VL&U2Z&(p0a$r1&^A2qe%+MFxD#vvl(2*3w|t=bG=dJz?O2vhZbc9MN6e zmEri)DQy~OGMFXiAtmyaLNf?ko6nc?o)}^bq2is7Mgig42%9d`1LJ6)18r6;7OkF|h8S1-pNn{}k#j5FkyxU%(OLlS-UDU+C zd-XB(kOj4@3dP6mEf#=wB5^G0(uC+-j%(0w=>d1kJMpT$B3BK!wSw75Een}NJ9}k2 za8SYoei+|xxg);_>lQXb(+AW-@jCFIy&dpBZ(g|v^L!s!yc4tcZ*I&GHF&U(Sr?6n zXR17m7v79Z!8f_sX^e-mCx$tVQ2us*^zfBk{^d4&>YlkI8rh${+VyK1dY0+!!#rM* zQnc>^I0;dx2bbx>S^FOFsH%k|^^iQdwBV;v@f5vrDQ#6#cG_G&_1JYunVbg|r}TPW z? zj+@Cy_&T+i4<+g?FEaRu(O!)6&#QP(wc}_w;=h&VC5I7g_RgFpU5WQOD>I<+%|VNL z?yBoYry$hZRJQ;ygT}>@0 zGNYcF8->#-`KI)eZa{ErYJ6Pxy=jj1Ni2W(WvI;H86V>R^yJ%H>tzdgJhzt%O&k-=_v?uf4EithBhk%D}idYt^$gW)8nj57eR8cvadS zP?Fj)9=~!n z(Ca00?yRHedl#Fw&|mxdcjU2qp=1pW>paB)M_G>VxuHGtL5yGZO|!D7trR<17uq2~ zzv>%uKMaLR>Ey>)0({Qx(5;qdMfY|aMmG0}&qg@jjm-@=9k#ZKyT6|e8@*s>0>dS5 zLZ$$p8uP9MDUZ<`JL*RIF4x;aIY=+}+8Zg#F@%28V6wmDz=d}hcJ{z9@b_}IYkWk# ziWlw2S2%A?U{Z}sE>y|O1{x=Px|>=5(e6`|oFUwmH_RJ}5~ zVm9`A=Zz($=>wGg8CXL?`w!=tcJP0i5c3ZQkDa}ssy%+qA-ANcx$=X3aKEFe9{bM> z)vEZ?K%P%Z`Ql%5<4t-5=Qq_tRm$pXF49}*#L@h?$X9CueFyM-*?QN`!iMn^6m)Sp z^}*`m*DXDNcNYc?$Vw^{<|+1UzMiMuq48yf$9^DdwTniEw23eve!=9 zIH(3#=#Y2f5zLmg+XIS2L6qLobnvnRIebek-azX+N?Q! zu683=@iVLNdd?McAC=szO1@1C}(t!$pptY7ark` z*fd&sA)4*grA^Uu4dbTlR|Rdfs&26?vE#*}BO-LTB6G{W=h&r>hUSLH4mIb{iA+D} zrCSYhLfvr!+o^cLi}|SM8s~Q*pd{V0p}%A+?BvNg^v}HVlTx2~ErP1;9Ut?`(1>b% zsz_8c3Qum2p%)Uf+1 z6W#DFh(p!++SM0zcYBxWxhxYIFMFD6W^f9SO5nVuh5_(IQpplO8huJ5s=@O~C*#JY z-gmFnOikPbwFA_~2&r}MO~_@W$}7xtOb4JS^2LVpHq)5$UgMe z+C=Lt40f@Xb>B3)7)_m_{>&Nwqr>sH_HYZAS$~gnl*uw%o`k)@cLwG5>&N_Ccprrs z#d7Kv73@;`?shAg9CCNuZ&<|njteK)pKbX@aF3RqLzCqA`YvtOyyA<(ps+Uc%<9LV za?cLg^*R`;xfIf%-az7ky47*PwNL+cqw&wR;PGVxcf8r-rKwGZY5^4EZ!jlNB*;dR zo9*+J)MpP=h=yjR&ZU-S6qB^`D6q(`k!1}r4oDlt#dqZqzLkd6MAa;(C@Ji-oY8+s zVOEr-v9Z*q^2w2Z$zln|Y}i9+&4BpZHOVXGLVfIRJg21ik@qTGGD$PAT_2KuT|4=4 z^HH3Yqs>_n8!ciWxDjfh0@F=%;d;*RZuYSUq&gwgtX9)*sxp^QXStduSLCWm%!7g) z)`oC=4H5?fvm|t^girHW#c8g`3sE;6K!J%mZ;ns<5U#W3v*r}uzLt|S?!t+%uWJ5n4y6(brDZ*uc}i0@=3;|q9$3B0pK`PQuw=y5U`QofN> zQ&Y>#L)E;9lsfU1$p3jH16wq8+n?yl$KasGum>6mcxR3SXzsS$0;(W;Liys*k{3Qp zN`jZIYy!auFSwGc=0c&=-9n)Cl;otw;0by$CPMzeoLRw&kHTQL+5BWvR^(Y7EHib` z&M|(n6T$W?cd_N`eB7{ng@ zysoPok9l5HR8&{D5AQjWdD7U}h{a-+bb-DFKC10<4<;@)HWaE45T1&Qi$nd{HwzV~ z(jZi4Zz(_>;(=%Y`S?IVSqw#hk}hGz8VINan-rnGLtaxgr}EAPQE1qC{W1WOkREp4 zLNi)*`q<@=JfI+oGqTgXs|yN{7ZXA6JQ*Zsph;*6p(2M9>w%>$14SvkFG``BsW|eY zZsF9_6fG##pjH7D);ZW!0YZNuUVqet-VHd~s2IMuxClj@prGId78c^OJm1F-4_q^? z@ePJyw=8JslpjS{+1V}4%_WMtmtss{k1zoN0VgMCsnm}I#uxC=A16Nqk+-$AfdnYb zS^hif+qZAfDsl%=36z&#xj&6_vSs)U{=2-m6j z%&*@7dC+Xi>Z6CWzd%9R-qlqH8htWya@e!;qvjsGmj|8*_=B#lE?B~ql@(|xqN|TD z-f?@M-u1>ew!r_`p2@1M^UW_h0yRJ^0mDK_`a`R-8 z&O7SNE6;e0WxTxVB3V&udi_dVw`&t3BOSJujl)~|M@J=Khs<0VHz8po(q8=h*gx5%{LMN^-V&^^X06&?s zhlhuw<0^2VqXdbu$;6yTTT^!xkjh=PVz;6+ehY;w@S^+U_rOGwm^ZXBnh2YenG(- z0|nW2FHn>k)ByM_i&CFHc}@sN9YN$iP`xST3aEshQtn9)ixTv2g~X zhOS!GRqgf;=q-YGMlj0VzMbl-eET-M9>U1lI64O@Kt^J2USQ0Am!=JDPXZ)RP?GDS9pDWipju`>WN{d`W`!Q@d90GU`Z`yn zgc0m$FpK^C8aw@4;N;hk8mdtaOP)ewv*GliH_GbjU7&8Sup9G+ZPgna8}O2)T)U!! z1v}`Vz@Bj`Dk>{0E8zB1MVzt{9|X#W*q)bp0>b&(si}k;MsmJ>p{AV)mqED%k+B=v0AhpqbSpm$BlI4w5?&y2-%s?JL^3r4{_ygIzn_E=V-zrX)624rv>@Nn7L z*?IY;)p5ni^#RgJ4npq@2#A{n@@>G(rX*41o=ysZm9ad9{F^r)Qg*6;t2 zW0uyqAxK7ftP$CxCMoFyBC$~xMBzooz%M58irHTe}QQ47$&t z(8;swsic2wc^=*VKRP?txTvc%j*n$UU`l>6tu&k^74U+VLJ2sErrbnKKplz}i%8Ky z5Q{sZXsMtg15+VTI4CF(${=zlHS1f1tI@U=p6iVriDIB7udZ8fa1r(GGe$4Fq^|TZSVor%rU~WPBB^u@eW-oE zI2bGAUp*4@pdo)-VBp1}V1kXhkO0EiK62#9nf3AKfB0ea&Su{k?^nf%d%N_XTe zWBv#srMbBd|Cw}1H=0joxiz)55y)Algm2&`(%`ZCkr`Eha+nwy=D@w}U=}?gwM7JA>91UB`Zr&xIVyN3A*@cF`!f6{C8bV8K)KyE@9#$%qwdu0T z!ovMr!)SYSWsI*Knv`QNFJ@cxN=&u>=&@tB$#I+%yrxyqJqMxDnsxkjd&%l6>^759 ze${GYjng5*ASWW&BFt2)r(m@RRx+#@0a*0yYs?mM8wNfQ>NpUv^L1i&^iX2@Z{#Sh z32}RiW@qB@Al{FFl>1L!%saRWg!zG(JAb^~Z%$ zX@_;?!#YlTQN-c6C^Gso!-=u>361JcK2{VLhq9R}&&#dZo^BV8QEf52-S8Kap7svy zP7?M@2!*ugsYT%HqA-$@b7Pthptf^E75RHl5B`6=gpVnqi-*idZ7YafoQbRgu^E=L ze8>JP=4ZHVT3%jWV`C!|oxNRNTixB?Sg-&Oq+hxQbG*w-K)*%5wzs#LoIAN z=<;Q3Y#)m`b%KWKz^xzJf3Hgk4+{g*&fnW{6?RZApOJM1O#Afd(?G7V%wMp; z z#+mXe_Zt`tfx}5jNaz?vZ1$R{=Iyu0<*%BUq$fOirKK&2{TkXCsoA(f_@AP24zo== zdv?C`C-fS3Ke$PYgUHUT0CB3RaeBZt4iWF%t_$tsM(aD8(BV&X)#SL)VIRt`?c2Z6 z*t!KG%y4pX$;r)4nh}Qc3)vmaGDMXlFBBfS)U)K%7wvc7DY;o{VQIPP==#=8PVaen zkw_QDnwgnxD+{^!(zyOX7`vvvBrnfZF4ALM+?4hw znvLhBa=HAe)J2ji&snf>1}*$N)}1_`L(Joh3m5!>kJzRM>~2?j(Ma(w3)yV2*-gC2 zNe5tK;q#+s+N1n_lOfAY#4Qj@&*A$NlG@hRFphMx2AkXHojY|XYSoJ|5Vod9t*v!w zdGVhhRALCq8Wag%JPB9$iHY-#x>F|lj(>(=^`%*=NUI?COc zZkSRI-m$i^@v?AsUPBvQEGe%B4cA#u=+DXO>g!d{eig+^p?$1vRJ~wu`t<4ahb;Ca zE0w`m+QR?eYHAYk6Jy6p)OFXafA(P{we@u3Dl<3s>^wQaJQYAfyNj4+qPy z+}mN_?HzN}CVV8vxDy5HsXfsThkT{658jH>_5i8v^q?{E@rB^@MpQwR)eq0f9%W}{ zc0H`lW&!H8n$bwzdxOeL3Xxy4mc= zN~WAlNx9wBGy)flme?P$AYC)2n~Rgvw={%4PpPe~6;`s{st;GO#KHvZ>LDX4v-$5T zMPWmit>QUlT|tI-o<5YdW^r*b`5&ob$wq3p$}Lf0XCI;B+VxhhA~DTj8p?wyJm3BRuBlLJJFK z-8c;Y$G4rYmp?jf{}t7@Mzeh9WS$eNEA3EQoA-lHS~vA^V??UhzrS#I=$0*sIXxQ< z28Doyl?J7CDFX6?X$hBd`ulgso4(_5W2H>?VMJp3A!D-drDOAFNMD%!jHKCwjsGuB zBJ%YJ+Y?5O?dR7+n@vo3T!-evoUn|6t3=w6o12RtE9ZAA?BC2%Qgk7+gBWcfRe$-2 z)Q6|^1V|CH%F5chh(%UG!7vuO^))q^EtQT0mA|G;N_x~evr@1&$X&{f$cC<`-yTHV z^OlXxShAPmdH3H~fyq5QR_t!h2b&Zo2>fa^mSU4-O`571B5zvsK@t zq()OD+-_;=lFJ@%m9rlEzC4F|&~(FbGt2D$j(S##49wMjkt{AL$UQtgNm_oszIIG} zO8JUX*5+@Rn*Kw*b^<(;>t6aCLQ!h=@Qo#!xNWpz!xk zL1hsX6y)jI#3ZB;-{R(GtaWt6DAw7@2?Hofm7NY5vn7&Ak>YOzAfpsQa&Cvig|dP; zBraYLWq~^Visbz`4m3A6<5V%ZM16`&%1Zz9=fnjZMSY%Rm#k7zpS6{KM%)&X%+9kw}I`)vMS`UBey=D_oJ1H5&bccA0j?r8D9Xd $DAT + +gnuplot \ + -e "NAME='$(echo $NAME | tr _ - )'" \ + -e "FILEIN='$DAT'" \ + -e "FILEOUT='$PNG'" \ + $PLT + +rm $DAT diff --git a/scripts/bytecode-sizes/print-bytecode-size.sh b/scripts/bytecode-sizes/print-bytecode-size.sh new file mode 100644 index 00000000000..ed5a354af57 --- /dev/null +++ b/scripts/bytecode-sizes/print-bytecode-size.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -eu + +OUT=${1:-bytecode-size.jsonl} +rm -f $OUT + +for file in aztec-packages/noir-projects/noir-protocol-circuits/target/*.json; do + PROGRAM=$(basename $file .json) + cat $file \ + | jq --arg PROGRAM $PROGRAM \ + -c '{name: $PROGRAM, bytecode_size: .bytecode | @base64d | length}' \ + >> $OUT +done + +for file in aztec-packages/noir-projects/noir-contracts/target/*.json; do + CONTRACT=$(basename $file .json) + cat $file \ + | jq --arg CONTRACT $CONTRACT \ + -c '.functions | sort_by(.name) | .[] | {name: ($CONTRACT + "::" + .name), "bytecode_size": .bytecode | @base64d | length}' \ + >> $OUT +done From 948cd8e0270cfac6d9df3a272e9f70944fe8de69 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 25 Feb 2025 15:45:09 +0000 Subject: [PATCH 04/24] Use FlexBuffers for serialization --- Cargo.lock | 48 +++++++++++++++++++++++++++++-- Cargo.toml | 1 + acvm-repo/acir/Cargo.toml | 2 +- acvm-repo/acir/src/circuit/mod.rs | 36 +++++++++++++++++------ 4 files changed, 76 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d6cbfbc77cb..24346b7c40a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ dependencies = [ "base64 0.21.7", "bincode", "brillig", - "ciborium", "criterion", "flate2", + "flexbuffers", "fxhash", "pprof", "serde", @@ -1742,6 +1742,19 @@ dependencies = [ "miniz_oxide 0.8.3", ] +[[package]] +name = "flexbuffers" +version = "25.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "935627e7bc8f083035d9faad09ffaed9128f73fb1f74a8798f115749c43378e8" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "num_enum", + "serde", + "serde_derive", +] + [[package]] name = "float-cmp" version = "0.9.0" @@ -2682,7 +2695,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fcae0c6c159e11541080f1f829873d8f374f81eda0abc67695a13fc8dc1a580" dependencies = [ "heck 0.5.0", - "proc-macro-crate", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 2.0.98", @@ -3610,6 +3623,27 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "numtoa" version = "0.1.0" @@ -3963,6 +3997,16 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + [[package]] name = "proc-macro-crate" version = "3.2.0" diff --git a/Cargo.toml b/Cargo.toml index ab061bab4a9..c6ae0b5ba8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -147,6 +147,7 @@ thiserror = "1.0.21" toml = "0.7.2" url = "2.5.4" base64 = "0.21.2" +flexbuffers = "25" fxhash = "0.2.1" build-data = "0.1.3" bincode = "1.3.3" diff --git a/acvm-repo/acir/Cargo.toml b/acvm-repo/acir/Cargo.toml index bac1bb52b86..aaaa0f99c85 100644 --- a/acvm-repo/acir/Cargo.toml +++ b/acvm-repo/acir/Cargo.toml @@ -17,11 +17,11 @@ workspace = true [dependencies] acir_field.workspace = true -ciborium.workspace = true brillig.workspace = true serde.workspace = true thiserror.workspace = true flate2.workspace = true +flexbuffers.workspace = true bincode.workspace = true base64.workspace = true serde-big-array = "0.5.1" diff --git a/acvm-repo/acir/src/circuit/mod.rs b/acvm-repo/acir/src/circuit/mod.rs index 8cb6b718ca8..0680637b95b 100644 --- a/acvm-repo/acir/src/circuit/mod.rs +++ b/acvm-repo/acir/src/circuit/mod.rs @@ -239,9 +239,20 @@ impl Circuit { impl Program { fn write(&self, writer: W) -> std::io::Result<()> { - // let buf = bincode::serialize(self).unwrap(); - let mut buf = Vec::new(); - ciborium::into_writer(self, &mut buf).map_err(std::io::Error::other)?; + let buf = { + // # Bincode + // bincode::serialize(self).unwrap() + + // # CBOR + // let mut buf = Vec::new(); + // ciborium::into_writer(self, &mut buf).map_err(std::io::Error::other)?; + // buf + + // # FlexBuffers + let mut s = flexbuffers::FlexbufferSerializer::new(); + self.serialize(&mut s).map_err(std::io::Error::other)?; + s.take_buffer() + }; let mut encoder = flate2::write::GzEncoder::new(writer, Compression::default()); encoder.write_all(&buf)?; encoder.finish()?; @@ -268,11 +279,20 @@ impl Program { impl Deserialize<'a>> Program { fn read(reader: R) -> std::io::Result { let mut gz_decoder = flate2::read::GzDecoder::new(reader); - let mut buf_d = Vec::new(); - gz_decoder.read_to_end(&mut buf_d)?; - //bincode::deserialize(&buf_d) - ciborium::from_reader(buf_d.as_slice()) - .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err)) + let mut buf = Vec::new(); + gz_decoder.read_to_end(&mut buf)?; + let result = { + // # Bincode + //bincode::deserialize(&buf) + + // # CBOR + // ciborium::from_reader(buf.as_slice()) + + // # FlexBuffers + let r = flexbuffers::Reader::get_root(buf.as_slice()).map_err(std::io::Error::other)?; + Self::deserialize(r) + }; + result.map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err)) } /// Deserialize bytecode. From 67e98a975231d3a2091165e968a50e2ce0c39dc1 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 25 Feb 2025 16:00:07 +0000 Subject: [PATCH 05/24] Measure and display FlexBuffer sizes --- .../bincode-vs-flexbuffers.jsonl | 645 ++++++++++++++++++ .../bytecode-sizes/bincode-vs-flexbuffers.png | Bin 0 -> 23842 bytes .../bytecode-sizes/compare-bytecode-size.sh | 0 scripts/bytecode-sizes/flexbuffers.jsonl | 645 ++++++++++++++++++ scripts/bytecode-sizes/plot-bytecode-size.sh | 0 scripts/bytecode-sizes/print-bytecode-size.sh | 13 +- 6 files changed, 1295 insertions(+), 8 deletions(-) create mode 100644 scripts/bytecode-sizes/bincode-vs-flexbuffers.jsonl create mode 100644 scripts/bytecode-sizes/bincode-vs-flexbuffers.png mode change 100644 => 100755 scripts/bytecode-sizes/compare-bytecode-size.sh create mode 100644 scripts/bytecode-sizes/flexbuffers.jsonl mode change 100644 => 100755 scripts/bytecode-sizes/plot-bytecode-size.sh mode change 100644 => 100755 scripts/bytecode-sizes/print-bytecode-size.sh diff --git a/scripts/bytecode-sizes/bincode-vs-flexbuffers.jsonl b/scripts/bytecode-sizes/bincode-vs-flexbuffers.jsonl new file mode 100644 index 00000000000..0c788cc379e --- /dev/null +++ b/scripts/bytecode-sizes/bincode-vs-flexbuffers.jsonl @@ -0,0 +1,645 @@ +{"name":"parity_base","base_size":38512,"alt_size":132137,"ratio":3.431060448691317} +{"name":"parity_root","base_size":56652,"alt_size":195369,"ratio":3.4485808091506036} +{"name":"private_kernel_init","base_size":220963,"alt_size":877913,"ratio":3.9731221969288977} +{"name":"private_kernel_init_simulated","base_size":58910,"alt_size":385003,"ratio":6.535443897470718} +{"name":"private_kernel_inner","base_size":360037,"alt_size":1474626,"ratio":4.0957623799776135} +{"name":"private_kernel_inner_simulated","base_size":86003,"alt_size":548470,"ratio":6.377335674336941} +{"name":"private_kernel_reset","base_size":900341,"alt_size":3563809,"ratio":3.958288026425543} +{"name":"private_kernel_reset_simulated","base_size":109155,"alt_size":676273,"ratio":6.195529293206907} +{"name":"private_kernel_tail","base_size":119739,"alt_size":643104,"ratio":5.3708816676270885} +{"name":"private_kernel_tail_simulated","base_size":47129,"alt_size":290026,"ratio":6.153875533111248} +{"name":"private_kernel_tail_to_public","base_size":213723,"alt_size":1032856,"ratio":4.832685298259897} +{"name":"private_kernel_tail_to_public_simulated","base_size":69150,"alt_size":443226,"ratio":6.409631236442516} +{"name":"rollup_base_private","base_size":1395946,"alt_size":4945646,"ratio":3.5428634058910586} +{"name":"rollup_base_private_simulated","base_size":81316,"alt_size":527527,"ratio":6.487370259235575} +{"name":"rollup_base_public","base_size":679704,"alt_size":2397504,"ratio":3.5272765792168355} +{"name":"rollup_base_public_simulated","base_size":77006,"alt_size":455061,"ratio":5.909422642391502} +{"name":"rollup_block_merge","base_size":106886,"alt_size":531093,"ratio":4.968779821492057} +{"name":"rollup_block_root","base_size":14975740,"alt_size":49341442,"ratio":3.294758188910865} +{"name":"rollup_block_root_empty","base_size":20689,"alt_size":66040,"ratio":3.1920344144231234} +{"name":"rollup_block_root_simulated","base_size":82459,"alt_size":437365,"ratio":5.304029881516875} +{"name":"rollup_block_root_single_tx","base_size":14959959,"alt_size":49235159,"ratio":3.29112927381686} +{"name":"rollup_block_root_single_tx_simulated","base_size":76009,"alt_size":393224,"ratio":5.173387362022918} +{"name":"rollup_merge","base_size":29269,"alt_size":101367,"ratio":3.463288803853907} +{"name":"rollup_root","base_size":106709,"alt_size":530963,"ratio":4.9758033530442605} +{"name":"amm_contract-AMM::_add_liquidity","base_size":7622,"alt_size":44005,"ratio":5.773419050118079} +{"name":"amm_contract-AMM::_remove_liquidity","base_size":4902,"alt_size":27078,"ratio":5.523867809057528} +{"name":"amm_contract-AMM::_swap_exact_tokens_for_tokens","base_size":3837,"alt_size":19947,"ratio":5.19859265050821} +{"name":"amm_contract-AMM::_swap_tokens_for_exact_tokens","base_size":4339,"alt_size":22802,"ratio":5.255127909656603} +{"name":"amm_contract-AMM::add_liquidity","base_size":32091,"alt_size":177007,"ratio":5.515783241407248} +{"name":"amm_contract-AMM::constructor","base_size":3729,"alt_size":22424,"ratio":6.013408420488067} +{"name":"amm_contract-AMM::get_amount_in_for_exact_out","base_size":18345,"alt_size":129931,"ratio":7.082638321068411} +{"name":"amm_contract-AMM::get_amount_out_for_exact_in","base_size":18221,"alt_size":129506,"ratio":7.107513308819494} +{"name":"amm_contract-AMM::process_log","base_size":15154,"alt_size":107077,"ratio":7.06592318859707} +{"name":"amm_contract-AMM::public_dispatch","base_size":21009,"alt_size":132727,"ratio":6.317625779427864} +{"name":"amm_contract-AMM::remove_liquidity","base_size":29866,"alt_size":169544,"ratio":5.676823143373736} +{"name":"amm_contract-AMM::swap_exact_tokens_for_tokens","base_size":29805,"alt_size":169249,"ratio":5.678543868478443} +{"name":"amm_contract-AMM::swap_tokens_for_exact_tokens","base_size":29991,"alt_size":170054,"ratio":5.670167716981761} +{"name":"amm_contract-AMM::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"app_subscription_contract-AppSubscription::constructor","base_size":4363,"alt_size":24341,"ratio":5.5789594315837725} +{"name":"app_subscription_contract-AppSubscription::entrypoint","base_size":99041,"alt_size":445495,"ratio":4.498086650982926} +{"name":"app_subscription_contract-AppSubscription::is_initialized","base_size":24104,"alt_size":179915,"ratio":7.464113840026552} +{"name":"app_subscription_contract-AppSubscription::process_log","base_size":21895,"alt_size":160846,"ratio":7.346243434574104} +{"name":"app_subscription_contract-AppSubscription::public_dispatch","base_size":4869,"alt_size":28124,"ratio":5.776134729924009} +{"name":"app_subscription_contract-AppSubscription::subscribe","base_size":95196,"alt_size":428609,"ratio":4.502384553972856} +{"name":"app_subscription_contract-AppSubscription::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"auth_contract-Auth::constructor","base_size":2997,"alt_size":16666,"ratio":5.560894227560894} +{"name":"auth_contract-Auth::do_private_authorized_thing","base_size":12949,"alt_size":46204,"ratio":3.568151980847942} +{"name":"auth_contract-Auth::get_authorized","base_size":836,"alt_size":3816,"ratio":4.564593301435407} +{"name":"auth_contract-Auth::get_authorized_delay","base_size":663,"alt_size":3102,"ratio":4.678733031674208} +{"name":"auth_contract-Auth::get_authorized_in_private","base_size":13295,"alt_size":47732,"ratio":3.5902218879277923} +{"name":"auth_contract-Auth::get_scheduled_authorized","base_size":748,"alt_size":3378,"ratio":4.516042780748663} +{"name":"auth_contract-Auth::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"auth_contract-Auth::public_dispatch","base_size":9866,"alt_size":67633,"ratio":6.855159132373809} +{"name":"auth_contract-Auth::set_authorized","base_size":3466,"alt_size":24157,"ratio":6.969705712637046} +{"name":"auth_contract-Auth::set_authorized_delay","base_size":3492,"alt_size":24239,"ratio":6.941294387170676} +{"name":"auth_contract-Auth::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"auth_registry_contract-AuthRegistry::_set_authorized","base_size":1740,"alt_size":9411,"ratio":5.408620689655172} +{"name":"auth_registry_contract-AuthRegistry::consume","base_size":3874,"alt_size":26659,"ratio":6.881517811048012} +{"name":"auth_registry_contract-AuthRegistry::is_consumable","base_size":1730,"alt_size":9454,"ratio":5.4647398843930635} +{"name":"auth_registry_contract-AuthRegistry::is_reject_all","base_size":1143,"alt_size":5903,"ratio":5.164479440069991} +{"name":"auth_registry_contract-AuthRegistry::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"auth_registry_contract-AuthRegistry::public_dispatch","base_size":7767,"alt_size":66022,"ratio":8.500321874597656} +{"name":"auth_registry_contract-AuthRegistry::set_authorized","base_size":1693,"alt_size":9222,"ratio":5.447135262847017} +{"name":"auth_registry_contract-AuthRegistry::set_authorized_private","base_size":5800,"alt_size":23807,"ratio":4.104655172413793} +{"name":"auth_registry_contract-AuthRegistry::set_reject_all","base_size":1113,"alt_size":5747,"ratio":5.163522012578617} +{"name":"auth_registry_contract-AuthRegistry::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"auth_registry_contract-AuthRegistry::unconstrained_is_consumable","base_size":1756,"alt_size":9759,"ratio":5.55751708428246} +{"name":"auth_wit_test_contract-AuthWitTest::consume","base_size":5464,"alt_size":20881,"ratio":3.821559297218155} +{"name":"auth_wit_test_contract-AuthWitTest::consume_public","base_size":749,"alt_size":3676,"ratio":4.907877169559413} +{"name":"auth_wit_test_contract-AuthWitTest::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"auth_wit_test_contract-AuthWitTest::public_dispatch","base_size":1308,"alt_size":6573,"ratio":5.025229357798165} +{"name":"auth_wit_test_contract-AuthWitTest::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::keccak_f1600","base_size":712,"alt_size":2997,"ratio":4.209269662921348} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::keccak_hash","base_size":2062,"alt_size":9971,"ratio":4.835596508244423} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::pedersen_hash","base_size":2820,"alt_size":10828,"ratio":3.8397163120567375} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::pedersen_hash_with_index","base_size":2797,"alt_size":10829,"ratio":3.871648194494101} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::poseidon2_hash","base_size":1636,"alt_size":7995,"ratio":4.886919315403423} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::public_dispatch","base_size":39194,"alt_size":296545,"ratio":7.566081543093331} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_10","base_size":2487,"alt_size":12304,"ratio":4.947326095697628} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_100","base_size":3910,"alt_size":18085,"ratio":4.625319693094629} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_20","base_size":2503,"alt_size":12424,"ratio":4.963643627646824} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_2048","base_size":22473,"alt_size":95793,"ratio":4.262581764784408} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_255","base_size":5869,"alt_size":25511,"ratio":4.346737093201567} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_256","base_size":5530,"alt_size":24470,"ratio":4.424954792043399} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_30","base_size":2708,"alt_size":13128,"ratio":4.847858197932053} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_40","base_size":2761,"alt_size":13271,"ratio":4.806591814559942} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_50","base_size":2905,"alt_size":13927,"ratio":4.7941480206540446} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_511","base_size":8590,"alt_size":36944,"ratio":4.30081490104773} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_512","base_size":8154,"alt_size":35733,"ratio":4.382266372332597} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_60","base_size":2998,"alt_size":14050,"ratio":4.686457638425617} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_70","base_size":3715,"alt_size":17192,"ratio":4.627725437415881} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_80","base_size":3610,"alt_size":17332,"ratio":4.801108033240998} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_90","base_size":3825,"alt_size":18059,"ratio":4.721307189542483} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"avm_initializer_test_contract-AvmInitializerTest::constructor","base_size":2520,"alt_size":12912,"ratio":5.123809523809523} +{"name":"avm_initializer_test_contract-AvmInitializerTest::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"avm_initializer_test_contract-AvmInitializerTest::public_dispatch","base_size":3106,"alt_size":16491,"ratio":5.309401159047006} +{"name":"avm_initializer_test_contract-AvmInitializerTest::read_storage_immutable","base_size":321,"alt_size":1420,"ratio":4.423676012461059} +{"name":"avm_initializer_test_contract-AvmInitializerTest::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"avm_test_contract-AvmTest::add_args_return","base_size":228,"alt_size":1162,"ratio":5.0964912280701755} +{"name":"avm_test_contract-AvmTest::add_storage_map","base_size":2300,"alt_size":12854,"ratio":5.588695652173913} +{"name":"avm_test_contract-AvmTest::add_u128","base_size":345,"alt_size":1697,"ratio":4.918840579710145} +{"name":"avm_test_contract-AvmTest::assert_calldata_copy","base_size":615,"alt_size":2958,"ratio":4.809756097560975} +{"name":"avm_test_contract-AvmTest::assert_nullifier_exists","base_size":286,"alt_size":1321,"ratio":4.618881118881119} +{"name":"avm_test_contract-AvmTest::assert_same","base_size":254,"alt_size":1275,"ratio":5.019685039370079} +{"name":"avm_test_contract-AvmTest::assertion_failure","base_size":213,"alt_size":1089,"ratio":5.112676056338028} +{"name":"avm_test_contract-AvmTest::bulk_testing","base_size":18366,"alt_size":120787,"ratio":6.5766633997604265} +{"name":"avm_test_contract-AvmTest::create_different_nullifier_in_nested_call","base_size":737,"alt_size":3410,"ratio":4.626865671641791} +{"name":"avm_test_contract-AvmTest::create_same_nullifier_in_nested_call","base_size":706,"alt_size":3324,"ratio":4.708215297450425} +{"name":"avm_test_contract-AvmTest::debug_logging","base_size":1075,"alt_size":7343,"ratio":6.830697674418604} +{"name":"avm_test_contract-AvmTest::divide_by_zero","base_size":209,"alt_size":1065,"ratio":5.095693779904306} +{"name":"avm_test_contract-AvmTest::elliptic_curve_add","base_size":665,"alt_size":3332,"ratio":5.010526315789473} +{"name":"avm_test_contract-AvmTest::elliptic_curve_add_and_double","base_size":323,"alt_size":1272,"ratio":3.9380804953560373} +{"name":"avm_test_contract-AvmTest::emit_nullifier_and_check","base_size":310,"alt_size":1382,"ratio":4.458064516129032} +{"name":"avm_test_contract-AvmTest::emit_public_log","base_size":2015,"alt_size":11559,"ratio":5.736476426799007} +{"name":"avm_test_contract-AvmTest::enqueue_public_from_private","base_size":5008,"alt_size":19665,"ratio":3.926717252396166} +{"name":"avm_test_contract-AvmTest::external_call_to_assertion_failure","base_size":663,"alt_size":3147,"ratio":4.746606334841629} +{"name":"avm_test_contract-AvmTest::external_call_to_divide_by_zero","base_size":673,"alt_size":3153,"ratio":4.684992570579495} +{"name":"avm_test_contract-AvmTest::external_call_to_divide_by_zero_recovers","base_size":2193,"alt_size":11581,"ratio":5.280893752849977} +{"name":"avm_test_contract-AvmTest::get_address","base_size":212,"alt_size":1041,"ratio":4.910377358490566} +{"name":"avm_test_contract-AvmTest::get_args_hash","base_size":1810,"alt_size":9106,"ratio":5.030939226519337} +{"name":"avm_test_contract-AvmTest::get_block_number","base_size":216,"alt_size":1053,"ratio":4.875} +{"name":"avm_test_contract-AvmTest::get_chain_id","base_size":210,"alt_size":1044,"ratio":4.9714285714285715} +{"name":"avm_test_contract-AvmTest::get_da_gas_left","base_size":216,"alt_size":1050,"ratio":4.861111111111111} +{"name":"avm_test_contract-AvmTest::get_fee_per_da_gas","base_size":218,"alt_size":1053,"ratio":4.830275229357798} +{"name":"avm_test_contract-AvmTest::get_fee_per_l2_gas","base_size":216,"alt_size":1058,"ratio":4.898148148148148} +{"name":"avm_test_contract-AvmTest::get_l2_gas_left","base_size":215,"alt_size":1040,"ratio":4.837209302325581} +{"name":"avm_test_contract-AvmTest::get_sender","base_size":214,"alt_size":1037,"ratio":4.845794392523365} +{"name":"avm_test_contract-AvmTest::get_timestamp","base_size":220,"alt_size":1044,"ratio":4.745454545454545} +{"name":"avm_test_contract-AvmTest::get_transaction_fee","base_size":219,"alt_size":1051,"ratio":4.799086757990867} +{"name":"avm_test_contract-AvmTest::get_version","base_size":216,"alt_size":1040,"ratio":4.814814814814815} +{"name":"avm_test_contract-AvmTest::helper_with_failed_assertion","base_size":111,"alt_size":365,"ratio":3.2882882882882885} +{"name":"avm_test_contract-AvmTest::inner_helper_with_failed_assertion","base_size":111,"alt_size":365,"ratio":3.2882882882882885} +{"name":"avm_test_contract-AvmTest::l1_to_l2_msg_exists","base_size":266,"alt_size":1254,"ratio":4.714285714285714} +{"name":"avm_test_contract-AvmTest::modulo2","base_size":216,"alt_size":1166,"ratio":5.398148148148148} +{"name":"avm_test_contract-AvmTest::n_new_l2_to_l1_msgs","base_size":279,"alt_size":1398,"ratio":5.010752688172043} +{"name":"avm_test_contract-AvmTest::n_new_note_hashes","base_size":280,"alt_size":1405,"ratio":5.017857142857143} +{"name":"avm_test_contract-AvmTest::n_new_nullifiers","base_size":279,"alt_size":1400,"ratio":5.017921146953405} +{"name":"avm_test_contract-AvmTest::n_new_public_logs","base_size":386,"alt_size":1954,"ratio":5.062176165803109} +{"name":"avm_test_contract-AvmTest::n_storage_writes","base_size":1174,"alt_size":5918,"ratio":5.040885860306644} +{"name":"avm_test_contract-AvmTest::nested_call_to_add","base_size":761,"alt_size":3548,"ratio":4.662286465177398} +{"name":"avm_test_contract-AvmTest::nested_call_to_add_n_times_different_addresses","base_size":1092,"alt_size":4815,"ratio":4.40934065934066} +{"name":"avm_test_contract-AvmTest::nested_call_to_add_with_gas","base_size":713,"alt_size":3537,"ratio":4.9607293127629735} +{"name":"avm_test_contract-AvmTest::nested_call_to_assert_same","base_size":765,"alt_size":3553,"ratio":4.644444444444445} +{"name":"avm_test_contract-AvmTest::nested_call_to_nothing","base_size":667,"alt_size":3120,"ratio":4.677661169415292} +{"name":"avm_test_contract-AvmTest::nested_call_to_nothing_recovers","base_size":414,"alt_size":2095,"ratio":5.0603864734299515} +{"name":"avm_test_contract-AvmTest::nested_static_call_to_add","base_size":753,"alt_size":3577,"ratio":4.750332005312085} +{"name":"avm_test_contract-AvmTest::nested_static_call_to_set_storage","base_size":698,"alt_size":3219,"ratio":4.611747851002866} +{"name":"avm_test_contract-AvmTest::new_note_hash","base_size":224,"alt_size":1107,"ratio":4.941964285714286} +{"name":"avm_test_contract-AvmTest::new_nullifier","base_size":216,"alt_size":1107,"ratio":5.125} +{"name":"avm_test_contract-AvmTest::note_hash_exists","base_size":266,"alt_size":1266,"ratio":4.7593984962406015} +{"name":"avm_test_contract-AvmTest::nullifier_collision","base_size":230,"alt_size":1157,"ratio":5.030434782608696} +{"name":"avm_test_contract-AvmTest::nullifier_exists","base_size":265,"alt_size":1231,"ratio":4.645283018867924} +{"name":"avm_test_contract-AvmTest::pedersen_commit","base_size":1168,"alt_size":5364,"ratio":4.592465753424658} +{"name":"avm_test_contract-AvmTest::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"avm_test_contract-AvmTest::public_dispatch","base_size":39990,"alt_size":301076,"ratio":7.528782195548887} +{"name":"avm_test_contract-AvmTest::read_assert_storage_single","base_size":266,"alt_size":1287,"ratio":4.838345864661654} +{"name":"avm_test_contract-AvmTest::read_storage_list","base_size":392,"alt_size":1861,"ratio":4.747448979591836} +{"name":"avm_test_contract-AvmTest::read_storage_map","base_size":1110,"alt_size":5734,"ratio":5.165765765765766} +{"name":"avm_test_contract-AvmTest::read_storage_single","base_size":231,"alt_size":1109,"ratio":4.800865800865801} +{"name":"avm_test_contract-AvmTest::return_oracle","base_size":510,"alt_size":2558,"ratio":5.015686274509804} +{"name":"avm_test_contract-AvmTest::returndata_copy_oracle","base_size":1359,"alt_size":6682,"ratio":4.916850625459897} +{"name":"avm_test_contract-AvmTest::revert_oracle","base_size":496,"alt_size":2552,"ratio":5.145161290322581} +{"name":"avm_test_contract-AvmTest::send_l2_to_l1_msg","base_size":244,"alt_size":1179,"ratio":4.831967213114754} +{"name":"avm_test_contract-AvmTest::set_opcode_big_field","base_size":214,"alt_size":1023,"ratio":4.780373831775701} +{"name":"avm_test_contract-AvmTest::set_opcode_really_big_field","base_size":211,"alt_size":1022,"ratio":4.843601895734597} +{"name":"avm_test_contract-AvmTest::set_opcode_small_field","base_size":211,"alt_size":1021,"ratio":4.838862559241706} +{"name":"avm_test_contract-AvmTest::set_opcode_u32","base_size":196,"alt_size":961,"ratio":4.903061224489796} +{"name":"avm_test_contract-AvmTest::set_opcode_u64","base_size":195,"alt_size":979,"ratio":5.02051282051282} +{"name":"avm_test_contract-AvmTest::set_opcode_u8","base_size":187,"alt_size":975,"ratio":5.213903743315508} +{"name":"avm_test_contract-AvmTest::set_read_storage_single","base_size":262,"alt_size":1248,"ratio":4.763358778625954} +{"name":"avm_test_contract-AvmTest::set_storage_list","base_size":264,"alt_size":1296,"ratio":4.909090909090909} +{"name":"avm_test_contract-AvmTest::set_storage_map","base_size":1677,"alt_size":9112,"ratio":5.433512224209899} +{"name":"avm_test_contract-AvmTest::set_storage_single","base_size":230,"alt_size":1154,"ratio":5.017391304347826} +{"name":"avm_test_contract-AvmTest::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"avm_test_contract-AvmTest::test_get_contract_instance","base_size":540,"alt_size":2455,"ratio":4.546296296296297} +{"name":"avm_test_contract-AvmTest::test_get_contract_instance_matches","base_size":564,"alt_size":2531,"ratio":4.48758865248227} +{"name":"avm_test_contract-AvmTest::to_radix_le","base_size":472,"alt_size":2366,"ratio":5.012711864406779} +{"name":"avm_test_contract-AvmTest::u128_addition_overflow","base_size":1031,"alt_size":6826,"ratio":6.620756547041707} +{"name":"avm_test_contract-AvmTest::u128_from_integer_overflow","base_size":606,"alt_size":3979,"ratio":6.566006600660066} +{"name":"avm_test_contract-AvmTest::variable_base_msm","base_size":571,"alt_size":2887,"ratio":5.056042031523643} +{"name":"benchmarking_contract-Benchmarking::broadcast","base_size":1192,"alt_size":6170,"ratio":5.176174496644295} +{"name":"benchmarking_contract-Benchmarking::create_note","base_size":70451,"alt_size":312547,"ratio":4.43637421754127} +{"name":"benchmarking_contract-Benchmarking::increment_balance","base_size":2177,"alt_size":11486,"ratio":5.276067983463482} +{"name":"benchmarking_contract-Benchmarking::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"benchmarking_contract-Benchmarking::public_dispatch","base_size":6092,"alt_size":38219,"ratio":6.273637557452396} +{"name":"benchmarking_contract-Benchmarking::recreate_note","base_size":89161,"alt_size":390058,"ratio":4.374760265138345} +{"name":"benchmarking_contract-Benchmarking::sha256_hash_2048","base_size":22473,"alt_size":95793,"ratio":4.262581764784408} +{"name":"benchmarking_contract-Benchmarking::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"card_game_contract-CardGame::buy_pack","base_size":120555,"alt_size":484032,"ratio":4.015030484011447} +{"name":"card_game_contract-CardGame::claim_cards","base_size":149790,"alt_size":563284,"ratio":3.760491354563055} +{"name":"card_game_contract-CardGame::join_game","base_size":329284,"alt_size":1167966,"ratio":3.5469867955928622} +{"name":"card_game_contract-CardGame::on_card_played","base_size":3651,"alt_size":19985,"ratio":5.473842782799233} +{"name":"card_game_contract-CardGame::on_cards_claimed","base_size":4786,"alt_size":24387,"ratio":5.09548683660677} +{"name":"card_game_contract-CardGame::on_game_joined","base_size":2716,"alt_size":14207,"ratio":5.230854197349043} +{"name":"card_game_contract-CardGame::play_card","base_size":240993,"alt_size":879678,"ratio":3.65022220562423} +{"name":"card_game_contract-CardGame::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"card_game_contract-CardGame::public_dispatch","base_size":13560,"alt_size":84048,"ratio":6.198230088495575} +{"name":"card_game_contract-CardGame::start_game","base_size":3907,"alt_size":22724,"ratio":5.8162272843614025} +{"name":"card_game_contract-CardGame::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"card_game_contract-CardGame::view_collection_cards","base_size":19406,"alt_size":145108,"ratio":7.477481191384108} +{"name":"card_game_contract-CardGame::view_game","base_size":18112,"alt_size":134004,"ratio":7.39863074204947} +{"name":"card_game_contract-CardGame::view_game_cards","base_size":19932,"alt_size":148503,"ratio":7.45048163756773} +{"name":"child_contract-Child::private_get_value","base_size":44885,"alt_size":234434,"ratio":5.222992090898964} +{"name":"child_contract-Child::private_set_value","base_size":70713,"alt_size":313838,"ratio":4.4381938257463265} +{"name":"child_contract-Child::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"child_contract-Child::pub_get_value","base_size":304,"alt_size":1460,"ratio":4.802631578947368} +{"name":"child_contract-Child::pub_inc_value","base_size":398,"alt_size":1919,"ratio":4.821608040201005} +{"name":"child_contract-Child::pub_inc_value_internal","base_size":457,"alt_size":2153,"ratio":4.711159737417943} +{"name":"child_contract-Child::pub_set_value","base_size":381,"alt_size":1814,"ratio":4.761154855643045} +{"name":"child_contract-Child::public_dispatch","base_size":2811,"alt_size":17759,"ratio":6.317680540732836} +{"name":"child_contract-Child::set_value_twice_with_nested_first","base_size":838,"alt_size":3939,"ratio":4.700477326968974} +{"name":"child_contract-Child::set_value_twice_with_nested_last","base_size":847,"alt_size":3872,"ratio":4.571428571428571} +{"name":"child_contract-Child::set_value_with_two_nested_calls","base_size":1091,"alt_size":5602,"ratio":5.134738771769019} +{"name":"child_contract-Child::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"child_contract-Child::value","base_size":21817,"alt_size":140742,"ratio":6.451024430489985} +{"name":"child_contract-Child::value_internal","base_size":21771,"alt_size":140708,"ratio":6.463093105507326} +{"name":"claim_contract-Claim::claim","base_size":40666,"alt_size":202301,"ratio":4.974696306496828} +{"name":"claim_contract-Claim::constructor","base_size":3712,"alt_size":22066,"ratio":5.944504310344827} +{"name":"claim_contract-Claim::process_log","base_size":15154,"alt_size":107077,"ratio":7.06592318859707} +{"name":"claim_contract-Claim::public_dispatch","base_size":4175,"alt_size":25485,"ratio":6.104191616766467} +{"name":"claim_contract-Claim::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::assert_class_id_is_registered","base_size":4047,"alt_size":14901,"ratio":3.681986656782802} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::broadcast_private_function","base_size":20389,"alt_size":70594,"ratio":3.4623571533670114} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::broadcast_unconstrained_function","base_size":20346,"alt_size":70252,"ratio":3.452865428093974} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::register","base_size":221551,"alt_size":832290,"ratio":3.7566519672671306} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::deploy","base_size":7653,"alt_size":29130,"ratio":3.8063504508036066} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::get_update_delay","base_size":1447,"alt_size":7454,"ratio":5.151347615756738} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::public_dispatch","base_size":8624,"alt_size":59488,"ratio":6.8979591836734695} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::set_update_delay","base_size":4093,"alt_size":28800,"ratio":7.036403615929636} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::update","base_size":4274,"alt_size":29430,"ratio":6.88582124473561} +{"name":"counter_contract-Counter::decrement","base_size":236216,"alt_size":916247,"ratio":3.8788524062722254} +{"name":"counter_contract-Counter::get_counter","base_size":19173,"alt_size":145806,"ratio":7.604756689094039} +{"name":"counter_contract-Counter::increment","base_size":67041,"alt_size":301734,"ratio":4.500738354141496} +{"name":"counter_contract-Counter::increment_and_decrement","base_size":252067,"alt_size":968206,"ratio":3.8410660657682283} +{"name":"counter_contract-Counter::increment_twice","base_size":82288,"alt_size":351593,"ratio":4.272712910752479} +{"name":"counter_contract-Counter::initialize","base_size":72005,"alt_size":316972,"ratio":4.402083188667453} +{"name":"counter_contract-Counter::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"counter_contract-Counter::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"crowdfunding_contract-Crowdfunding::_publish_donation_receipts","base_size":532,"alt_size":2508,"ratio":4.714285714285714} +{"name":"crowdfunding_contract-Crowdfunding::donate","base_size":73181,"alt_size":320957,"ratio":4.385796859840669} +{"name":"crowdfunding_contract-Crowdfunding::init","base_size":3744,"alt_size":22493,"ratio":6.007745726495727} +{"name":"crowdfunding_contract-Crowdfunding::process_log","base_size":15154,"alt_size":107077,"ratio":7.06592318859707} +{"name":"crowdfunding_contract-Crowdfunding::public_dispatch","base_size":4598,"alt_size":28413,"ratio":6.179425837320574} +{"name":"crowdfunding_contract-Crowdfunding::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"crowdfunding_contract-Crowdfunding::withdraw","base_size":29044,"alt_size":163766,"ratio":5.638548409310013} +{"name":"docs_example_contract-DocsExample::get_imm_card","base_size":23407,"alt_size":150042,"ratio":6.410133720681848} +{"name":"docs_example_contract-DocsExample::get_leader","base_size":16639,"alt_size":125039,"ratio":7.5148145922230905} +{"name":"docs_example_contract-DocsExample::get_legendary_card","base_size":18333,"alt_size":139524,"ratio":7.610538373424971} +{"name":"docs_example_contract-DocsExample::get_public_immutable","base_size":16569,"alt_size":125007,"ratio":7.5446315408292595} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_private","base_size":28627,"alt_size":166373,"ratio":5.811751144024871} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_private_indirect","base_size":22606,"alt_size":146120,"ratio":6.46377068035035} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public","base_size":345,"alt_size":1556,"ratio":4.510144927536232} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public_indirect","base_size":782,"alt_size":3744,"ratio":4.78772378516624} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public_multiple","base_size":425,"alt_size":2316,"ratio":5.449411764705882} +{"name":"docs_example_contract-DocsExample::increase_legendary_points","base_size":73860,"alt_size":332350,"ratio":4.499729217438397} +{"name":"docs_example_contract-DocsExample::initialize_private","base_size":66697,"alt_size":298994,"ratio":4.482870294016223} +{"name":"docs_example_contract-DocsExample::initialize_private_immutable","base_size":66776,"alt_size":298925,"ratio":4.476533485084461} +{"name":"docs_example_contract-DocsExample::initialize_public_immutable","base_size":1238,"alt_size":6456,"ratio":5.21486268174475} +{"name":"docs_example_contract-DocsExample::insert_note","base_size":66357,"alt_size":298099,"ratio":4.49235197492352} +{"name":"docs_example_contract-DocsExample::insert_notes","base_size":93157,"alt_size":383424,"ratio":4.115890378608156} +{"name":"docs_example_contract-DocsExample::is_legendary_initialized","base_size":17171,"alt_size":127810,"ratio":7.443363811076815} +{"name":"docs_example_contract-DocsExample::is_priv_imm_initialized","base_size":17089,"alt_size":127701,"ratio":7.472701737960091} +{"name":"docs_example_contract-DocsExample::match_public_immutable","base_size":28473,"alt_size":164761,"ratio":5.7865697327292525} +{"name":"docs_example_contract-DocsExample::process_log","base_size":15386,"alt_size":112960,"ratio":7.341739243468088} +{"name":"docs_example_contract-DocsExample::public_dispatch","base_size":3390,"alt_size":18848,"ratio":5.559882005899705} +{"name":"docs_example_contract-DocsExample::read_note","base_size":18509,"alt_size":139287,"ratio":7.525366038143606} +{"name":"docs_example_contract-DocsExample::simple_macro_example","base_size":21701,"alt_size":140703,"ratio":6.4837104280908715} +{"name":"docs_example_contract-DocsExample::simple_macro_example_expanded","base_size":4637,"alt_size":16995,"ratio":3.6650851843864567} +{"name":"docs_example_contract-DocsExample::spend_public_authwit","base_size":197,"alt_size":1095,"ratio":5.558375634517766} +{"name":"docs_example_contract-DocsExample::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"docs_example_contract-DocsExample::update_leader","base_size":347,"alt_size":1577,"ratio":4.544668587896253} +{"name":"docs_example_contract-DocsExample::update_legendary_card","base_size":70434,"alt_size":318790,"ratio":4.526081153988131} +{"name":"docs_example_contract-DocsExample::verify_private_authwit","base_size":21772,"alt_size":140792,"ratio":6.466654418519199} +{"name":"docs_example_contract-DocsExample::view_imm_card","base_size":18266,"alt_size":139101,"ratio":7.615296178692653} +{"name":"easy_private_token_contract-EasyPrivateToken::constructor","base_size":72005,"alt_size":316972,"ratio":4.402083188667453} +{"name":"easy_private_token_contract-EasyPrivateToken::get_balance","base_size":19173,"alt_size":145806,"ratio":7.604756689094039} +{"name":"easy_private_token_contract-EasyPrivateToken::mint","base_size":70565,"alt_size":311891,"ratio":4.419910720612202} +{"name":"easy_private_token_contract-EasyPrivateToken::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"easy_private_token_contract-EasyPrivateToken::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"easy_private_token_contract-EasyPrivateToken::transfer","base_size":276344,"alt_size":1037077,"ratio":3.7528478997191907} +{"name":"easy_private_voting_contract-EasyPrivateVoting::add_to_tally_public","base_size":1886,"alt_size":9931,"ratio":5.265641569459173} +{"name":"easy_private_voting_contract-EasyPrivateVoting::cast_vote","base_size":7884,"alt_size":29468,"ratio":3.7376966007102994} +{"name":"easy_private_voting_contract-EasyPrivateVoting::constructor","base_size":3014,"alt_size":16725,"ratio":5.5491041804910415} +{"name":"easy_private_voting_contract-EasyPrivateVoting::end_vote","base_size":380,"alt_size":1622,"ratio":4.268421052631579} +{"name":"easy_private_voting_contract-EasyPrivateVoting::get_vote","base_size":1245,"alt_size":6151,"ratio":4.940562248995984} +{"name":"easy_private_voting_contract-EasyPrivateVoting::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"easy_private_voting_contract-EasyPrivateVoting::public_dispatch","base_size":4864,"alt_size":29789,"ratio":6.124383223684211} +{"name":"easy_private_voting_contract-EasyPrivateVoting::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::constructor","base_size":76618,"alt_size":335049,"ratio":4.372980239630374} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::entrypoint","base_size":67820,"alt_size":327912,"ratio":4.835033913299911} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::process_log","base_size":17042,"alt_size":123092,"ratio":7.22286116652975} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::verify_private_authwit","base_size":41611,"alt_size":227776,"ratio":5.473937180072577} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::constructor","base_size":76618,"alt_size":335049,"ratio":4.372980239630374} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::entrypoint","base_size":67801,"alt_size":327912,"ratio":4.836388843822363} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::process_log","base_size":17042,"alt_size":123092,"ratio":7.22286116652975} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::verify_private_authwit","base_size":41563,"alt_size":227615,"ratio":5.476385246493275} +{"name":"escrow_contract-Escrow::constructor","base_size":70605,"alt_size":336419,"ratio":4.764804192337653} +{"name":"escrow_contract-Escrow::process_log","base_size":22078,"alt_size":158244,"ratio":7.167497055892744} +{"name":"escrow_contract-Escrow::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"escrow_contract-Escrow::withdraw","base_size":30481,"alt_size":198058,"ratio":6.497752698402284} +{"name":"fee_juice_contract-FeeJuice::_increase_public_balance","base_size":1956,"alt_size":10220,"ratio":5.224948875255624} +{"name":"fee_juice_contract-FeeJuice::balance_of_public","base_size":1239,"alt_size":6209,"ratio":5.011299435028248} +{"name":"fee_juice_contract-FeeJuice::check_balance","base_size":1475,"alt_size":7232,"ratio":4.903050847457627} +{"name":"fee_juice_contract-FeeJuice::claim","base_size":73078,"alt_size":260342,"ratio":3.5625222365144094} +{"name":"fee_juice_contract-FeeJuice::initialize","base_size":5884,"alt_size":24018,"ratio":4.081917063222297} +{"name":"fee_juice_contract-FeeJuice::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"fee_juice_contract-FeeJuice::public_dispatch","base_size":4499,"alt_size":29138,"ratio":6.476550344521005} +{"name":"fee_juice_contract-FeeJuice::set_portal","base_size":1144,"alt_size":5701,"ratio":4.983391608391608} +{"name":"fee_juice_contract-FeeJuice::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"fpc_contract-FPC::complete_refund","base_size":1253,"alt_size":5816,"ratio":4.641660015961692} +{"name":"fpc_contract-FPC::constructor","base_size":3483,"alt_size":19863,"ratio":5.702842377260982} +{"name":"fpc_contract-FPC::fee_entrypoint_private","base_size":29899,"alt_size":171076,"ratio":5.7217967156092175} +{"name":"fpc_contract-FPC::fee_entrypoint_public","base_size":29523,"alt_size":167903,"ratio":5.6871930359380825} +{"name":"fpc_contract-FPC::get_accepted_asset","base_size":28403,"alt_size":159964,"ratio":5.631940287997747} +{"name":"fpc_contract-FPC::pay_refund","base_size":1258,"alt_size":5941,"ratio":4.722575516693164} +{"name":"fpc_contract-FPC::process_log","base_size":15154,"alt_size":107077,"ratio":7.06592318859707} +{"name":"fpc_contract-FPC::public_dispatch","base_size":6737,"alt_size":40442,"ratio":6.002968680421553} +{"name":"fpc_contract-FPC::pull_funds","base_size":1258,"alt_size":6274,"ratio":4.987281399046105} +{"name":"fpc_contract-FPC::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"import_test_contract-ImportTest::call_no_args","base_size":29858,"alt_size":198018,"ratio":6.631991426083462} +{"name":"import_test_contract-ImportTest::call_public_fn","base_size":29440,"alt_size":194463,"ratio":6.605400815217391} +{"name":"import_test_contract-ImportTest::main_contract","base_size":29988,"alt_size":198194,"ratio":6.609110310790983} +{"name":"import_test_contract-ImportTest::process_log","base_size":22935,"alt_size":165186,"ratio":7.202354480052322} +{"name":"import_test_contract-ImportTest::pub_call_public_fn","base_size":676,"alt_size":3268,"ratio":4.834319526627219} +{"name":"import_test_contract-ImportTest::public_dispatch","base_size":1188,"alt_size":6063,"ratio":5.103535353535354} +{"name":"import_test_contract-ImportTest::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"inclusion_proofs_contract-InclusionProofs::constructor","base_size":2437,"alt_size":12955,"ratio":5.315962248666393} +{"name":"inclusion_proofs_contract-InclusionProofs::create_note","base_size":70570,"alt_size":312297,"ratio":4.425350715601531} +{"name":"inclusion_proofs_contract-InclusionProofs::nullify_note","base_size":40457,"alt_size":222954,"ratio":5.510888103418444} +{"name":"inclusion_proofs_contract-InclusionProofs::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"inclusion_proofs_contract-InclusionProofs::public_dispatch","base_size":3234,"alt_size":17711,"ratio":5.476499690785405} +{"name":"inclusion_proofs_contract-InclusionProofs::push_nullifier_public","base_size":309,"alt_size":1406,"ratio":4.550161812297735} +{"name":"inclusion_proofs_contract-InclusionProofs::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"inclusion_proofs_contract-InclusionProofs::test_contract_inclusion","base_size":34797,"alt_size":187914,"ratio":5.400293128717993} +{"name":"inclusion_proofs_contract-InclusionProofs::test_contract_non_inclusion","base_size":38583,"alt_size":202962,"ratio":5.260399657880414} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_inclusion","base_size":46853,"alt_size":248475,"ratio":5.303289010308839} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_inclusion_fail_case","base_size":31242,"alt_size":178018,"ratio":5.698034696882402} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_not_nullified","base_size":51610,"alt_size":267192,"ratio":5.177136213912033} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_validity","base_size":54893,"alt_size":279805,"ratio":5.097280163226641} +{"name":"inclusion_proofs_contract-InclusionProofs::test_nullifier_inclusion","base_size":31464,"alt_size":178247,"ratio":5.665109331299263} +{"name":"inclusion_proofs_contract-InclusionProofs::test_nullifier_inclusion_from_public","base_size":313,"alt_size":1529,"ratio":4.884984025559105} +{"name":"inclusion_proofs_contract-InclusionProofs::test_storage_historical_read","base_size":33536,"alt_size":187655,"ratio":5.595628578244275} +{"name":"inclusion_proofs_contract-InclusionProofs::test_storage_historical_read_unset_slot","base_size":33652,"alt_size":187660,"ratio":5.576488767383811} +{"name":"lending_contract-Lending::_borrow","base_size":7972,"alt_size":44954,"ratio":5.638986452584044} +{"name":"lending_contract-Lending::_deposit","base_size":2084,"alt_size":10402,"ratio":4.991362763915547} +{"name":"lending_contract-Lending::_repay","base_size":5380,"alt_size":29070,"ratio":5.403345724907063} +{"name":"lending_contract-Lending::_withdraw","base_size":7317,"alt_size":40733,"ratio":5.566899002323357} +{"name":"lending_contract-Lending::borrow_private","base_size":22563,"alt_size":138372,"ratio":6.1326951203297435} +{"name":"lending_contract-Lending::borrow_public","base_size":803,"alt_size":3833,"ratio":4.773349937733499} +{"name":"lending_contract-Lending::constructor","base_size":23355,"alt_size":141218,"ratio":6.046585313637337} +{"name":"lending_contract-Lending::deposit_private","base_size":23119,"alt_size":141845,"ratio":6.1354297331199446} +{"name":"lending_contract-Lending::deposit_public","base_size":1111,"alt_size":5979,"ratio":5.3816381638163815} +{"name":"lending_contract-Lending::get_asset","base_size":1671,"alt_size":8397,"ratio":5.025134649910234} +{"name":"lending_contract-Lending::get_assets","base_size":522,"alt_size":2362,"ratio":4.524904214559387} +{"name":"lending_contract-Lending::get_position","base_size":4476,"alt_size":24298,"ratio":5.428507596067917} +{"name":"lending_contract-Lending::init","base_size":1981,"alt_size":10114,"ratio":5.1055022715800105} +{"name":"lending_contract-Lending::process_log","base_size":15154,"alt_size":107077,"ratio":7.06592318859707} +{"name":"lending_contract-Lending::public_dispatch","base_size":30933,"alt_size":195103,"ratio":6.307277018071315} +{"name":"lending_contract-Lending::repay_private","base_size":23019,"alt_size":140479,"ratio":6.102741213779921} +{"name":"lending_contract-Lending::repay_public","base_size":1161,"alt_size":5819,"ratio":5.012058570198105} +{"name":"lending_contract-Lending::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"lending_contract-Lending::update_accumulator","base_size":6404,"alt_size":34223,"ratio":5.344003747657714} +{"name":"lending_contract-Lending::withdraw_private","base_size":22630,"alt_size":138430,"ratio":6.117101193106496} +{"name":"lending_contract-Lending::withdraw_public","base_size":799,"alt_size":3839,"ratio":4.804755944931164} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::entrypoint","base_size":19274,"alt_size":70395,"ratio":3.6523295631420565} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"nft_contract-NFT::_finalize_transfer_to_private_unsafe","base_size":3624,"alt_size":19855,"ratio":5.478752759381899} +{"name":"nft_contract-NFT::_finish_transfer_to_public","base_size":1227,"alt_size":6130,"ratio":4.995925020374898} +{"name":"nft_contract-NFT::_store_payload_in_transient_storage_unsafe","base_size":1225,"alt_size":5871,"ratio":4.79265306122449} +{"name":"nft_contract-NFT::cancel_authwit","base_size":21353,"alt_size":133621,"ratio":6.257715543483351} +{"name":"nft_contract-NFT::constructor","base_size":5808,"alt_size":33062,"ratio":5.692493112947658} +{"name":"nft_contract-NFT::finalize_transfer_to_private","base_size":3569,"alt_size":19640,"ratio":5.502942000560381} +{"name":"nft_contract-NFT::get_admin","base_size":367,"alt_size":1624,"ratio":4.425068119891008} +{"name":"nft_contract-NFT::get_private_nfts","base_size":20357,"alt_size":148533,"ratio":7.296409097607703} +{"name":"nft_contract-NFT::is_minter","base_size":1240,"alt_size":6194,"ratio":4.995161290322581} +{"name":"nft_contract-NFT::mint","base_size":2593,"alt_size":17019,"ratio":6.563440030852295} +{"name":"nft_contract-NFT::owner_of","base_size":1824,"alt_size":9816,"ratio":5.381578947368421} +{"name":"nft_contract-NFT::prepare_private_balance_increase","base_size":66800,"alt_size":292157,"ratio":4.373607784431138} +{"name":"nft_contract-NFT::private_get_name","base_size":28334,"alt_size":159523,"ratio":5.630091056681019} +{"name":"nft_contract-NFT::private_get_symbol","base_size":28195,"alt_size":159548,"ratio":5.658733818052847} +{"name":"nft_contract-NFT::process_log","base_size":15100,"alt_size":106448,"ratio":7.04953642384106} +{"name":"nft_contract-NFT::public_dispatch","base_size":20666,"alt_size":149527,"ratio":7.235410819703861} +{"name":"nft_contract-NFT::public_get_name","base_size":375,"alt_size":1620,"ratio":4.32} +{"name":"nft_contract-NFT::public_get_symbol","base_size":347,"alt_size":1593,"ratio":4.590778097982709} +{"name":"nft_contract-NFT::set_admin","base_size":376,"alt_size":1702,"ratio":4.526595744680851} +{"name":"nft_contract-NFT::set_minter","base_size":1251,"alt_size":6255,"ratio":5} +{"name":"nft_contract-NFT::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"nft_contract-NFT::transfer_in_private","base_size":99147,"alt_size":415691,"ratio":4.19267350499763} +{"name":"nft_contract-NFT::transfer_in_public","base_size":3849,"alt_size":21443,"ratio":5.571057417511041} +{"name":"nft_contract-NFT::transfer_to_private","base_size":66805,"alt_size":292396,"ratio":4.376858019609311} +{"name":"nft_contract-NFT::transfer_to_public","base_size":50556,"alt_size":252027,"ratio":4.985105625445051} +{"name":"parent_contract-Parent::enqueue_call_to_child","base_size":22160,"alt_size":142182,"ratio":6.416155234657039} +{"name":"parent_contract-Parent::enqueue_call_to_child_twice","base_size":22174,"alt_size":142630,"ratio":6.432308108595652} +{"name":"parent_contract-Parent::enqueue_call_to_pub_entry_point","base_size":22158,"alt_size":142003,"ratio":6.40865601588591} +{"name":"parent_contract-Parent::enqueue_calls_to_child_with_nested_first","base_size":22477,"alt_size":145692,"ratio":6.481825866441251} +{"name":"parent_contract-Parent::enqueue_calls_to_child_with_nested_last","base_size":22445,"alt_size":145486,"ratio":6.481889062151927} +{"name":"parent_contract-Parent::enqueue_calls_to_pub_entry_point","base_size":22052,"alt_size":142335,"ratio":6.454516597134047} +{"name":"parent_contract-Parent::enqueue_static_call_to_pub_function","base_size":22152,"alt_size":141995,"ratio":6.410030697002528} +{"name":"parent_contract-Parent::enqueue_static_nested_call_to_pub_function","base_size":22013,"alt_size":142017,"ratio":6.451505928315086} +{"name":"parent_contract-Parent::entry_point","base_size":22420,"alt_size":143901,"ratio":6.418421052631579} +{"name":"parent_contract-Parent::private_call","base_size":22488,"alt_size":146005,"ratio":6.492573817146923} +{"name":"parent_contract-Parent::private_nested_static_call","base_size":22472,"alt_size":145493,"ratio":6.474412602349591} +{"name":"parent_contract-Parent::private_static_call","base_size":22390,"alt_size":145873,"ratio":6.515096025011165} +{"name":"parent_contract-Parent::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"parent_contract-Parent::pub_entry_point","base_size":747,"alt_size":3534,"ratio":4.730923694779117} +{"name":"parent_contract-Parent::pub_entry_point_twice","base_size":1033,"alt_size":5329,"ratio":5.158760890609874} +{"name":"parent_contract-Parent::public_dispatch","base_size":4099,"alt_size":28079,"ratio":6.850207367650646} +{"name":"parent_contract-Parent::public_nested_static_call","base_size":2701,"alt_size":14582,"ratio":5.398741206960385} +{"name":"parent_contract-Parent::public_static_call","base_size":1189,"alt_size":5564,"ratio":4.679562657695542} +{"name":"parent_contract-Parent::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"pending_note_hashes_contract-PendingNoteHashes::dummy","base_size":21375,"alt_size":138808,"ratio":6.493941520467836} +{"name":"pending_note_hashes_contract-PendingNoteHashes::get_note_zero_balance","base_size":57201,"alt_size":279403,"ratio":4.884582437369976} +{"name":"pending_note_hashes_contract-PendingNoteHashes::get_then_nullify_note","base_size":40632,"alt_size":224557,"ratio":5.526604646583973} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note","base_size":70652,"alt_size":312624,"ratio":4.424842891920965} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note_extra_emit","base_size":81793,"alt_size":346816,"ratio":4.240167251476287} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note_static_randomness","base_size":66696,"alt_size":298592,"ratio":4.476910159529807} +{"name":"pending_note_hashes_contract-PendingNoteHashes::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"pending_note_hashes_contract-PendingNoteHashes::recursively_destroy_and_create_notes","base_size":432377,"alt_size":1513697,"ratio":3.500873080668028} +{"name":"pending_note_hashes_contract-PendingNoteHashes::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_bad_get_then_insert_flat","base_size":90538,"alt_size":426365,"ratio":4.709238109964876} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_emit_bad_note_log","base_size":81631,"alt_size":346771,"ratio":4.248030772623146} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert1_then_get2_then_nullify2_all_in_nested_calls","base_size":22403,"alt_size":145143,"ratio":6.478730527161541} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert2_then_get2_then_nullify1_all_in_nested_calls","base_size":22389,"alt_size":144996,"ratio":6.476215998928045} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert2_then_get2_then_nullify2_all_in_nested_calls","base_size":22602,"alt_size":145318,"ratio":6.429431023803203} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert_then_get_then_nullify_all_in_nested_calls","base_size":22406,"alt_size":144801,"ratio":6.462599303757922} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert_then_get_then_nullify_flat","base_size":234489,"alt_size":913218,"ratio":3.8945025139772014} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_recursively_create_notes","base_size":299554,"alt_size":1046846,"ratio":3.4946820940464822} +{"name":"price_feed_contract-PriceFeed::get_price","base_size":1236,"alt_size":6229,"ratio":5.039644012944984} +{"name":"price_feed_contract-PriceFeed::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"price_feed_contract-PriceFeed::public_dispatch","base_size":2484,"alt_size":13805,"ratio":5.55756843800322} +{"name":"price_feed_contract-PriceFeed::set_price","base_size":1151,"alt_size":5823,"ratio":5.059079061685491} +{"name":"price_feed_contract-PriceFeed::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"router_contract-Router::_check_block_number","base_size":995,"alt_size":4873,"ratio":4.89748743718593} +{"name":"router_contract-Router::_check_timestamp","base_size":1030,"alt_size":4953,"ratio":4.80873786407767} +{"name":"router_contract-Router::check_block_number","base_size":4928,"alt_size":18242,"ratio":3.7017045454545454} +{"name":"router_contract-Router::check_timestamp","base_size":4944,"alt_size":18302,"ratio":3.7018608414239482} +{"name":"router_contract-Router::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"router_contract-Router::public_dispatch","base_size":2001,"alt_size":10187,"ratio":5.090954522738631} +{"name":"router_contract-Router::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"schnorr_account_contract-SchnorrAccount::constructor","base_size":64119,"alt_size":289672,"ratio":4.517724855347089} +{"name":"schnorr_account_contract-SchnorrAccount::entrypoint","base_size":67390,"alt_size":308736,"ratio":4.581332541920166} +{"name":"schnorr_account_contract-SchnorrAccount::lookup_validity","base_size":24045,"alt_size":175192,"ratio":7.286005406529424} +{"name":"schnorr_account_contract-SchnorrAccount::process_log","base_size":15457,"alt_size":112883,"ratio":7.303034223976192} +{"name":"schnorr_account_contract-SchnorrAccount::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"schnorr_account_contract-SchnorrAccount::verify_private_authwit","base_size":41146,"alt_size":208068,"ratio":5.0568220483157535} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::entrypoint","base_size":49331,"alt_size":173401,"ratio":3.515051387565628} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::verify_private_authwit","base_size":22056,"alt_size":75900,"ratio":3.441240478781284} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::entrypoint","base_size":45825,"alt_size":160633,"ratio":3.505357337697763} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::process_log","base_size":1279,"alt_size":6085,"ratio":4.757623143080532} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::verify_private_authwit","base_size":18615,"alt_size":63474,"ratio":3.40983078162772} +{"name":"spam_contract-Spam::process_log","base_size":22044,"alt_size":164633,"ratio":7.468381418980221} +{"name":"spam_contract-Spam::public_dispatch","base_size":2421,"alt_size":13024,"ratio":5.379595208591491} +{"name":"spam_contract-Spam::public_spam","base_size":1899,"alt_size":10133,"ratio":5.3359662980516065} +{"name":"spam_contract-Spam::spam","base_size":96835,"alt_size":594958,"ratio":6.144038828935819} +{"name":"spam_contract-Spam::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"stateful_test_contract-StatefulTest::constructor","base_size":24200,"alt_size":149601,"ratio":6.181859504132231} +{"name":"stateful_test_contract-StatefulTest::create_note","base_size":72583,"alt_size":319048,"ratio":4.395629830676604} +{"name":"stateful_test_contract-StatefulTest::create_note_no_init_check","base_size":72641,"alt_size":318720,"ratio":4.38760479618948} +{"name":"stateful_test_contract-StatefulTest::destroy_and_create","base_size":452799,"alt_size":1563638,"ratio":3.453271760759189} +{"name":"stateful_test_contract-StatefulTest::destroy_and_create_no_init_check","base_size":452957,"alt_size":1563070,"ratio":3.4508132118501313} +{"name":"stateful_test_contract-StatefulTest::get_public_value","base_size":1166,"alt_size":5833,"ratio":5.002572898799314} +{"name":"stateful_test_contract-StatefulTest::increment_public_value","base_size":1203,"alt_size":6005,"ratio":4.991687448046551} +{"name":"stateful_test_contract-StatefulTest::increment_public_value_no_init_check","base_size":1112,"alt_size":5740,"ratio":5.161870503597123} +{"name":"stateful_test_contract-StatefulTest::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"stateful_test_contract-StatefulTest::public_constructor","base_size":3363,"alt_size":17892,"ratio":5.320249776984835} +{"name":"stateful_test_contract-StatefulTest::public_dispatch","base_size":5887,"alt_size":36058,"ratio":6.125021233225752} +{"name":"stateful_test_contract-StatefulTest::summed_values","base_size":19173,"alt_size":145806,"ratio":7.604756689094039} +{"name":"stateful_test_contract-StatefulTest::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"stateful_test_contract-StatefulTest::wrong_constructor","base_size":24134,"alt_size":148945,"ratio":6.171583657910002} +{"name":"static_child_contract-StaticChild::private_get_value","base_size":51394,"alt_size":254991,"ratio":4.961493559559481} +{"name":"static_child_contract-StaticChild::private_illegal_set_value","base_size":66648,"alt_size":299512,"ratio":4.493938302724763} +{"name":"static_child_contract-StaticChild::private_set_value","base_size":66805,"alt_size":299889,"ratio":4.489020282912955} +{"name":"static_child_contract-StaticChild::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"static_child_contract-StaticChild::pub_get_value","base_size":368,"alt_size":1657,"ratio":4.502717391304348} +{"name":"static_child_contract-StaticChild::pub_illegal_inc_value","base_size":452,"alt_size":2096,"ratio":4.6371681415929205} +{"name":"static_child_contract-StaticChild::pub_inc_value","base_size":398,"alt_size":1919,"ratio":4.821608040201005} +{"name":"static_child_contract-StaticChild::pub_set_value","base_size":381,"alt_size":1814,"ratio":4.761154855643045} +{"name":"static_child_contract-StaticChild::public_dispatch","base_size":1389,"alt_size":8568,"ratio":6.168466522678186} +{"name":"static_child_contract-StaticChild::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"static_parent_contract-StaticParent::enqueue_call","base_size":22046,"alt_size":142214,"ratio":6.450784722852218} +{"name":"static_parent_contract-StaticParent::enqueue_public_get_value_from_child","base_size":22073,"alt_size":141962,"ratio":6.431477370543198} +{"name":"static_parent_contract-StaticParent::enqueue_static_call_to_pub_function","base_size":22152,"alt_size":141995,"ratio":6.410030697002528} +{"name":"static_parent_contract-StaticParent::enqueue_static_nested_call_to_pub_function","base_size":22057,"alt_size":141937,"ratio":6.435009294101646} +{"name":"static_parent_contract-StaticParent::private_call","base_size":22488,"alt_size":146005,"ratio":6.492573817146923} +{"name":"static_parent_contract-StaticParent::private_call_3_args","base_size":22508,"alt_size":145933,"ratio":6.483605829038564} +{"name":"static_parent_contract-StaticParent::private_get_value_from_child","base_size":22453,"alt_size":145423,"ratio":6.4767737050728185} +{"name":"static_parent_contract-StaticParent::private_nested_static_call","base_size":22442,"alt_size":145662,"ratio":6.490597985919258} +{"name":"static_parent_contract-StaticParent::private_nested_static_call_3_args","base_size":22492,"alt_size":145369,"ratio":6.463142450649119} +{"name":"static_parent_contract-StaticParent::private_static_call","base_size":22390,"alt_size":145873,"ratio":6.515096025011165} +{"name":"static_parent_contract-StaticParent::private_static_call_3_args","base_size":22512,"alt_size":145605,"ratio":6.467883795309168} +{"name":"static_parent_contract-StaticParent::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"static_parent_contract-StaticParent::public_call","base_size":747,"alt_size":3534,"ratio":4.730923694779117} +{"name":"static_parent_contract-StaticParent::public_dispatch","base_size":2221,"alt_size":15313,"ratio":6.894642053129221} +{"name":"static_parent_contract-StaticParent::public_get_value_from_child","base_size":729,"alt_size":3466,"ratio":4.7544581618655695} +{"name":"static_parent_contract-StaticParent::public_nested_static_call","base_size":947,"alt_size":4303,"ratio":4.543822597676875} +{"name":"static_parent_contract-StaticParent::public_static_call","base_size":1189,"alt_size":5564,"ratio":4.679562657695542} +{"name":"static_parent_contract-StaticParent::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"test_contract-Test::assert_header_private","base_size":29354,"alt_size":192143,"ratio":6.545717789739047} +{"name":"test_contract-Test::assert_private_global_vars","base_size":28839,"alt_size":190958,"ratio":6.6215194701619335} +{"name":"test_contract-Test::assert_public_global_vars","base_size":529,"alt_size":2334,"ratio":4.4120982986767485} +{"name":"test_contract-Test::call_create_note","base_size":78135,"alt_size":366702,"ratio":4.6931848723363405} +{"name":"test_contract-Test::call_destroy_note","base_size":71911,"alt_size":368526,"ratio":5.12475142884955} +{"name":"test_contract-Test::call_get_notes","base_size":64935,"alt_size":335103,"ratio":5.1605913605913605} +{"name":"test_contract-Test::call_get_notes_many","base_size":64853,"alt_size":335103,"ratio":5.167116401708479} +{"name":"test_contract-Test::call_view_notes","base_size":25750,"alt_size":191461,"ratio":7.435378640776699} +{"name":"test_contract-Test::call_view_notes_many","base_size":25844,"alt_size":191930,"ratio":7.42648196873549} +{"name":"test_contract-Test::consume_message_from_arbitrary_sender_private","base_size":77083,"alt_size":362459,"ratio":4.702191144610355} +{"name":"test_contract-Test::consume_message_from_arbitrary_sender_public","base_size":5303,"alt_size":33165,"ratio":6.254007165755233} +{"name":"test_contract-Test::consume_mint_to_private_message","base_size":84273,"alt_size":390879,"ratio":4.638247125413834} +{"name":"test_contract-Test::consume_mint_to_public_message","base_size":7825,"alt_size":51409,"ratio":6.569840255591054} +{"name":"test_contract-Test::consume_note_from_secret","base_size":49918,"alt_size":278442,"ratio":5.5779879001562565} +{"name":"test_contract-Test::create_l2_to_l1_message_arbitrary_recipient_private","base_size":29025,"alt_size":191117,"ratio":6.584565030146425} +{"name":"test_contract-Test::create_l2_to_l1_message_arbitrary_recipient_public","base_size":244,"alt_size":1180,"ratio":4.836065573770492} +{"name":"test_contract-Test::create_l2_to_l1_message_public","base_size":1850,"alt_size":8320,"ratio":4.4972972972972975} +{"name":"test_contract-Test::deliver_note","base_size":43379,"alt_size":323762,"ratio":7.463565319624704} +{"name":"test_contract-Test::deploy_contract","base_size":31740,"alt_size":203146,"ratio":6.400315059861374} +{"name":"test_contract-Test::dummy_public_call","base_size":251,"alt_size":1172,"ratio":4.669322709163347} +{"name":"test_contract-Test::emit_array_as_encrypted_log","base_size":51594,"alt_size":353051,"ratio":6.842869325890607} +{"name":"test_contract-Test::emit_encrypted_logs_nested","base_size":74678,"alt_size":356060,"ratio":4.767937009561049} +{"name":"test_contract-Test::emit_nullifier","base_size":29025,"alt_size":191829,"ratio":6.609095607235142} +{"name":"test_contract-Test::emit_nullifier_public","base_size":216,"alt_size":1107,"ratio":5.125} +{"name":"test_contract-Test::emit_public","base_size":1104,"alt_size":5895,"ratio":5.3396739130434785} +{"name":"test_contract-Test::get_constant","base_size":25065,"alt_size":186667,"ratio":7.447316975862757} +{"name":"test_contract-Test::get_master_incoming_viewing_public_key","base_size":30981,"alt_size":201550,"ratio":6.505600206578225} +{"name":"test_contract-Test::get_ovsk_app","base_size":29812,"alt_size":195888,"ratio":6.570776868375151} +{"name":"test_contract-Test::get_this_address","base_size":29123,"alt_size":193161,"ratio":6.632592796071833} +{"name":"test_contract-Test::is_time_equal","base_size":263,"alt_size":1291,"ratio":4.908745247148289} +{"name":"test_contract-Test::process_log","base_size":22905,"alt_size":165244,"ratio":7.214320017463436} +{"name":"test_contract-Test::public_dispatch","base_size":15580,"alt_size":102750,"ratio":6.594993581514762} +{"name":"test_contract-Test::set_constant","base_size":30295,"alt_size":198574,"ratio":6.554678989932332} +{"name":"test_contract-Test::set_tx_max_block_number","base_size":29406,"alt_size":194509,"ratio":6.614602462082568} +{"name":"test_contract-Test::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"test_contract-Test::test_code_gen","base_size":29600,"alt_size":194071,"ratio":6.556452702702702} +{"name":"test_contract-Test::test_nullifier_key_freshness","base_size":30878,"alt_size":200155,"ratio":6.482123194507416} +{"name":"test_contract-Test::test_setting_fee_payer","base_size":29431,"alt_size":194473,"ratio":6.607760524616901} +{"name":"test_contract-Test::test_setting_teardown","base_size":29376,"alt_size":193868,"ratio":6.599537037037037} +{"name":"test_log_contract-TestLog::emit_encrypted_events","base_size":100662,"alt_size":399523,"ratio":3.9689555144940494} +{"name":"test_log_contract-TestLog::emit_unencrypted_events","base_size":663,"alt_size":3515,"ratio":5.301659125188537} +{"name":"test_log_contract-TestLog::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"test_log_contract-TestLog::public_dispatch","base_size":1499,"alt_size":7931,"ratio":5.29086057371581} +{"name":"test_log_contract-TestLog::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"token_blacklist_contract-TokenBlacklist::_increase_public_balance","base_size":2037,"alt_size":10679,"ratio":5.242513500245459} +{"name":"token_blacklist_contract-TokenBlacklist::_reduce_total_supply","base_size":590,"alt_size":2767,"ratio":4.689830508474576} +{"name":"token_blacklist_contract-TokenBlacklist::balance_of_private","base_size":24248,"alt_size":187785,"ratio":7.7443500494886175} +{"name":"token_blacklist_contract-TokenBlacklist::balance_of_public","base_size":1312,"alt_size":6481,"ratio":4.939786585365853} +{"name":"token_blacklist_contract-TokenBlacklist::burn","base_size":252437,"alt_size":949051,"ratio":3.7595558495783106} +{"name":"token_blacklist_contract-TokenBlacklist::burn_public","base_size":5624,"alt_size":34065,"ratio":6.057076813655761} +{"name":"token_blacklist_contract-TokenBlacklist::constructor","base_size":5720,"alt_size":41403,"ratio":7.238286713286714} +{"name":"token_blacklist_contract-TokenBlacklist::deliver_transparent_note","base_size":37047,"alt_size":288538,"ratio":7.7884309120846495} +{"name":"token_blacklist_contract-TokenBlacklist::get_roles","base_size":1691,"alt_size":8564,"ratio":5.064458900059137} +{"name":"token_blacklist_contract-TokenBlacklist::mint_private","base_size":2880,"alt_size":15268,"ratio":5.301388888888889} +{"name":"token_blacklist_contract-TokenBlacklist::mint_public","base_size":3750,"alt_size":22810,"ratio":6.082666666666666} +{"name":"token_blacklist_contract-TokenBlacklist::process_log","base_size":18615,"alt_size":141221,"ratio":7.586408810099382} +{"name":"token_blacklist_contract-TokenBlacklist::public_dispatch","base_size":48080,"alt_size":421824,"ratio":8.773377703826956} +{"name":"token_blacklist_contract-TokenBlacklist::redeem_shield","base_size":112463,"alt_size":482139,"ratio":4.287089976258859} +{"name":"token_blacklist_contract-TokenBlacklist::shield","base_size":6609,"alt_size":39974,"ratio":6.0484188228173705} +{"name":"token_blacklist_contract-TokenBlacklist::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"token_blacklist_contract-TokenBlacklist::total_supply","base_size":451,"alt_size":2044,"ratio":4.532150776053215} +{"name":"token_blacklist_contract-TokenBlacklist::transfer","base_size":241705,"alt_size":1012275,"ratio":4.188059824993277} +{"name":"token_blacklist_contract-TokenBlacklist::transfer_public","base_size":7362,"alt_size":48020,"ratio":6.5226840532464} +{"name":"token_blacklist_contract-TokenBlacklist::unshield","base_size":260032,"alt_size":971997,"ratio":3.7379899396997294} +{"name":"token_blacklist_contract-TokenBlacklist::update_roles","base_size":5230,"alt_size":36899,"ratio":7.055258126195029} +{"name":"token_bridge_contract-TokenBridge::claim_private","base_size":83713,"alt_size":359546,"ratio":4.2949840526560985} +{"name":"token_bridge_contract-TokenBridge::claim_public","base_size":8518,"alt_size":54296,"ratio":6.374266259685372} +{"name":"token_bridge_contract-TokenBridge::constructor","base_size":3483,"alt_size":19863,"ratio":5.702842377260982} +{"name":"token_bridge_contract-TokenBridge::exit_to_l1_private","base_size":49544,"alt_size":237567,"ratio":4.7950710479573715} +{"name":"token_bridge_contract-TokenBridge::exit_to_l1_public","base_size":3948,"alt_size":26307,"ratio":6.663373860182371} +{"name":"token_bridge_contract-TokenBridge::get_config","base_size":28402,"alt_size":160264,"ratio":5.642701218224069} +{"name":"token_bridge_contract-TokenBridge::get_config_public","base_size":428,"alt_size":1907,"ratio":4.455607476635514} +{"name":"token_bridge_contract-TokenBridge::process_log","base_size":15154,"alt_size":107077,"ratio":7.06592318859707} +{"name":"token_bridge_contract-TokenBridge::public_dispatch","base_size":15017,"alt_size":103345,"ratio":6.881867217153892} +{"name":"token_bridge_contract-TokenBridge::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"token_contract-Token::_finalize_mint_to_private_unsafe","base_size":3726,"alt_size":20687,"ratio":5.552066559312936} +{"name":"token_contract-Token::_finalize_transfer_to_private_unsafe","base_size":4227,"alt_size":24076,"ratio":5.695765318192572} +{"name":"token_contract-Token::_increase_public_balance","base_size":2009,"alt_size":10470,"ratio":5.211548033847685} +{"name":"token_contract-Token::_recurse_subtract_balance","base_size":110226,"alt_size":492342,"ratio":4.466659408850906} +{"name":"token_contract-Token::_reduce_total_supply","base_size":559,"alt_size":2623,"ratio":4.6923076923076925} +{"name":"token_contract-Token::_store_payload_in_transient_storage_unsafe","base_size":1225,"alt_size":5871,"ratio":4.79265306122449} +{"name":"token_contract-Token::balance_of_private","base_size":19316,"alt_size":143147,"ratio":7.410799337336923} +{"name":"token_contract-Token::balance_of_public","base_size":1320,"alt_size":6438,"ratio":4.877272727272727} +{"name":"token_contract-Token::burn_private","base_size":232328,"alt_size":895936,"ratio":3.8563410350883234} +{"name":"token_contract-Token::burn_public","base_size":4353,"alt_size":26807,"ratio":6.158281644842638} +{"name":"token_contract-Token::cancel_authwit","base_size":21426,"alt_size":133832,"ratio":6.246242882479231} +{"name":"token_contract-Token::constructor","base_size":6193,"alt_size":36883,"ratio":5.9555950266429845} +{"name":"token_contract-Token::finalize_mint_to_private","base_size":3676,"alt_size":20552,"ratio":5.590859630032644} +{"name":"token_contract-Token::finalize_transfer_to_private","base_size":4168,"alt_size":23904,"ratio":5.735124760076776} +{"name":"token_contract-Token::get_admin","base_size":357,"alt_size":1592,"ratio":4.459383753501401} +{"name":"token_contract-Token::is_minter","base_size":1245,"alt_size":6194,"ratio":4.975100401606426} +{"name":"token_contract-Token::mint_to_private","base_size":67137,"alt_size":293348,"ratio":4.369393925853107} +{"name":"token_contract-Token::mint_to_public","base_size":2621,"alt_size":14580,"ratio":5.562762304463945} +{"name":"token_contract-Token::prepare_private_balance_increase","base_size":66967,"alt_size":292346,"ratio":4.3655233174548655} +{"name":"token_contract-Token::private_get_decimals","base_size":28406,"alt_size":159961,"ratio":5.631239878898824} +{"name":"token_contract-Token::private_get_name","base_size":28380,"alt_size":159773,"ratio":5.629774489076815} +{"name":"token_contract-Token::private_get_symbol","base_size":28357,"alt_size":160008,"ratio":5.642627922558804} +{"name":"token_contract-Token::process_log","base_size":15154,"alt_size":107077,"ratio":7.06592318859707} +{"name":"token_contract-Token::public_dispatch","base_size":32221,"alt_size":241835,"ratio":7.505508829645263} +{"name":"token_contract-Token::public_get_decimals","base_size":384,"alt_size":1712,"ratio":4.458333333333333} +{"name":"token_contract-Token::public_get_name","base_size":374,"alt_size":1634,"ratio":4.3689839572192515} +{"name":"token_contract-Token::public_get_symbol","base_size":361,"alt_size":1650,"ratio":4.570637119113574} +{"name":"token_contract-Token::set_admin","base_size":386,"alt_size":1702,"ratio":4.409326424870466} +{"name":"token_contract-Token::set_minter","base_size":1255,"alt_size":6237,"ratio":4.9697211155378485} +{"name":"token_contract-Token::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"token_contract-Token::total_supply","base_size":455,"alt_size":2001,"ratio":4.397802197802198} +{"name":"token_contract-Token::transfer","base_size":116065,"alt_size":713305,"ratio":6.14573730237367} +{"name":"token_contract-Token::transfer_in_private","base_size":288372,"alt_size":1087851,"ratio":3.7723877491573385} +{"name":"token_contract-Token::transfer_in_public","base_size":5501,"alt_size":35240,"ratio":6.406107980367206} +{"name":"token_contract-Token::transfer_to_private","base_size":67108,"alt_size":293213,"ratio":4.369270429755022} +{"name":"token_contract-Token::transfer_to_public","base_size":232245,"alt_size":897229,"ratio":3.8632866154276733} +{"name":"uniswap_contract-Uniswap::_approve_bridge_and_exit_input_asset_to_L1","base_size":5800,"alt_size":35065,"ratio":6.0456896551724135} +{"name":"uniswap_contract-Uniswap::constructor","base_size":2954,"alt_size":16495,"ratio":5.583953960731212} +{"name":"uniswap_contract-Uniswap::process_log","base_size":15154,"alt_size":107077,"ratio":7.06592318859707} +{"name":"uniswap_contract-Uniswap::public_dispatch","base_size":16599,"alt_size":115643,"ratio":6.966865473823725} +{"name":"uniswap_contract-Uniswap::swap_private","base_size":73247,"alt_size":325309,"ratio":4.441260392917116} +{"name":"uniswap_contract-Uniswap::swap_public","base_size":8226,"alt_size":61125,"ratio":7.430707512764405} +{"name":"uniswap_contract-Uniswap::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"updatable_contract-Updatable::get_private_value","base_size":18282,"alt_size":138313,"ratio":7.565528935565037} +{"name":"updatable_contract-Updatable::get_public_value","base_size":16531,"alt_size":124093,"ratio":7.506684411106406} +{"name":"updatable_contract-Updatable::get_update_delay","base_size":791,"alt_size":3656,"ratio":4.621997471554994} +{"name":"updatable_contract-Updatable::initialize","base_size":68664,"alt_size":306461,"ratio":4.463197599906793} +{"name":"updatable_contract-Updatable::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"updatable_contract-Updatable::public_dispatch","base_size":1384,"alt_size":7281,"ratio":5.260838150289017} +{"name":"updatable_contract-Updatable::set_public_value","base_size":327,"alt_size":1459,"ratio":4.461773700305811} +{"name":"updatable_contract-Updatable::set_update_delay","base_size":21906,"alt_size":141940,"ratio":6.479503332420341} +{"name":"updatable_contract-Updatable::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} +{"name":"updatable_contract-Updatable::update_to","base_size":21930,"alt_size":141900,"ratio":6.470588235294118} +{"name":"updated_contract-Updated::get_private_value","base_size":18282,"alt_size":138313,"ratio":7.565528935565037} +{"name":"updated_contract-Updated::get_public_value","base_size":16531,"alt_size":124093,"ratio":7.506684411106406} +{"name":"updated_contract-Updated::get_update_delay","base_size":702,"alt_size":3370,"ratio":4.800569800569801} +{"name":"updated_contract-Updated::process_log","base_size":15373,"alt_size":112936,"ratio":7.346386521823977} +{"name":"updated_contract-Updated::public_dispatch","base_size":1255,"alt_size":6571,"ratio":5.235856573705179} +{"name":"updated_contract-Updated::set_private_value","base_size":65966,"alt_size":301812,"ratio":4.575266046144984} +{"name":"updated_contract-Updated::set_public_value","base_size":231,"alt_size":1071,"ratio":4.636363636363637} +{"name":"updated_contract-Updated::sync_notes","base_size":194,"alt_size":965,"ratio":4.974226804123711} diff --git a/scripts/bytecode-sizes/bincode-vs-flexbuffers.png b/scripts/bytecode-sizes/bincode-vs-flexbuffers.png new file mode 100644 index 0000000000000000000000000000000000000000..e538ddce454d5f065f6e7ce9e442660ca1c681b2 GIT binary patch literal 23842 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%0DDT@v<0q%E$A<2RtG@A3v*wm%cdLQxuUxmZ~&{ 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 $OUT + -c '{name: $PROGRAM, bytecode_size: .bytecode | @base64d | length}' done -for file in aztec-packages/noir-projects/noir-contracts/target/*.json; do +for file in $AZTEC_PACKAGES_DIR/noir-projects/noir-contracts/target/*.json; do CONTRACT=$(basename $file .json) cat $file \ | jq --arg CONTRACT $CONTRACT \ - -c '.functions | sort_by(.name) | .[] | {name: ($CONTRACT + "::" + .name), "bytecode_size": .bytecode | @base64d | length}' \ - >> $OUT + -c '.functions | sort_by(.name) | .[] | {name: ($CONTRACT + "::" + .name), "bytecode_size": .bytecode | @base64d | length}' done From 13a440f3243d1c3252f9b23d350c5c567b8de34d Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Wed, 26 Feb 2025 19:02:04 +0000 Subject: [PATCH 06/24] Define protobuf schema for Program --- Cargo.lock | 119 ++++++++++++++++++++ Cargo.toml | 7 ++ acvm-repo/acir/Cargo.toml | 9 ++ acvm-repo/acir/build.rs | 19 ++++ acvm-repo/acir/src/lib.rs | 1 + acvm-repo/acir/src/proto/acir-program.proto | 16 +++ acvm-repo/acir/src/proto/acir.proto | 85 ++++++++++++++ acvm-repo/acir/src/proto/brillig.proto | 5 + acvm-repo/acir/src/proto/conversion.rs | 48 ++++++++ acvm-repo/acir/src/proto/mod.rs | 16 +++ acvm-repo/acir/src/proto/program.proto | 15 +++ acvm-repo/acir/src/proto/witness.proto | 5 + cspell.json | 6 + utils/protobuf/Cargo.toml | 13 +++ utils/protobuf/src/lib.rs | 49 ++++++++ 15 files changed, 413 insertions(+) create mode 100644 acvm-repo/acir/build.rs create mode 100644 acvm-repo/acir/src/proto/acir-program.proto create mode 100644 acvm-repo/acir/src/proto/acir.proto create mode 100644 acvm-repo/acir/src/proto/brillig.proto create mode 100644 acvm-repo/acir/src/proto/conversion.rs create mode 100644 acvm-repo/acir/src/proto/mod.rs create mode 100644 acvm-repo/acir/src/proto/program.proto create mode 100644 acvm-repo/acir/src/proto/witness.proto create mode 100644 utils/protobuf/Cargo.toml create mode 100644 utils/protobuf/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 24346b7c40a..7c6b9426b18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,11 +10,17 @@ dependencies = [ "base64 0.21.7", "bincode", "brillig", + "color-eyre", "criterion", "flate2", "flexbuffers", "fxhash", + "iter-extended", + "noir_protobuf", "pprof", + "prost", + "prost-build", + "protoc-prebuilt", "serde", "serde-big-array", "serde-generate", @@ -3002,6 +3008,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + [[package]] name = "nargo" version = "1.0.0-beta.3" @@ -3301,6 +3313,14 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "noir_protobuf" +version = "1.0.0-beta.3" +dependencies = [ + "color-eyre", + "prost", +] + [[package]] name = "noir_wasm" version = "1.0.0-beta.3" @@ -3983,6 +4003,16 @@ dependencies = [ "termtree", ] +[[package]] +name = "prettyplease" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +dependencies = [ + "proc-macro2", + "syn 2.0.98", +] + [[package]] name = "prettytable-rs" version = "0.10.0" @@ -4062,6 +4092,68 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck 0.5.0", + "itertools 0.13.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.98", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.13.0", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "protoc-prebuilt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d85d4641fe3b8c6e853dfd09fe35379bc6b6e66bd692ac29ed4f7087de69ed5" +dependencies = [ + "ureq", + "zip", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -5587,6 +5679,21 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "url", + "webpki-roots", +] + [[package]] name = "url" version = "2.5.4" @@ -6158,6 +6265,18 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "byteorder", + "crc32fast", + "crossbeam-utils", + "flate2", +] + [[package]] name = "zkhash" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index c6ae0b5ba8f..2643d8db4d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ members = [ "acvm-repo/bn254_blackbox_solver", # Utility crates "utils/iter-extended", + "utils/protobuf", ] default-members = [ "tooling/nargo_cli", @@ -94,6 +95,7 @@ noirc_abi = { path = "tooling/noirc_abi" } noirc_artifacts = { path = "tooling/noirc_artifacts" } noirc_artifacts_info = { path = "tooling/noirc_artifacts_info" } noir_artifact_cli = { path = "tooling/artifact_cli" } +noir_protobuf = { path = "utils/protobuf" } # Arkworks ark-bn254 = { version = "^0.5.0", default-features = false, features = [ @@ -137,6 +139,11 @@ criterion = "0.5.0" # https://github.com/tikv/pprof-rs/pull/172 pprof = { version = "0.14", features = ["flamegraph", "criterion"] } +# Protobuf +prost = "0.13" +prost-build = "0.13" +protoc-prebuilt = "0.3" + cfg-if = "1.0.0" ciborium = "0.2" dirs = "4" diff --git a/acvm-repo/acir/Cargo.toml b/acvm-repo/acir/Cargo.toml index aaaa0f99c85..e985e73f12c 100644 --- a/acvm-repo/acir/Cargo.toml +++ b/acvm-repo/acir/Cargo.toml @@ -18,16 +18,25 @@ workspace = true [dependencies] acir_field.workspace = true brillig.workspace = true +noir_protobuf.workspace = true +iter-extended.workspace = true + +color-eyre.workspace = true serde.workspace = true thiserror.workspace = true flate2.workspace = true flexbuffers.workspace = true bincode.workspace = true base64.workspace = true +prost.workspace = true serde-big-array = "0.5.1" strum = { workspace = true } strum_macros = { workspace = true } +[build-dependencies] +prost-build.workspace = true +protoc-prebuilt.workspace = true + [dev-dependencies] serde_json = "1.0" serde-reflection = "0.3.6" diff --git a/acvm-repo/acir/build.rs b/acvm-repo/acir/build.rs new file mode 100644 index 00000000000..1050151e131 --- /dev/null +++ b/acvm-repo/acir/build.rs @@ -0,0 +1,19 @@ +use std::path::Path; + +fn main() { + let (protoc_bin, include_dir) = + protoc_prebuilt::init("29.3").expect("failed to initialize protoc"); + + std::env::set_var("PROTOC", protoc_bin); + + prost_build::compile_protos( + &[ + "./src/proto/program.proto", + // This is only included to make sure it compiles. + // A separate compilation is needed to turn it into C++ code. + "./src/proto/acir-program.proto", + ], + &[Path::new("./src/proto"), include_dir.as_path()], + ) + .expect("failed to compile .proto schemas"); +} diff --git a/acvm-repo/acir/src/lib.rs b/acvm-repo/acir/src/lib.rs index bb5b50c0daf..963853e900a 100644 --- a/acvm-repo/acir/src/lib.rs +++ b/acvm-repo/acir/src/lib.rs @@ -7,6 +7,7 @@ pub mod circuit; pub mod native_types; +mod proto; pub use acir_field; pub use acir_field::{AcirField, FieldElement}; diff --git a/acvm-repo/acir/src/proto/acir-program.proto b/acvm-repo/acir/src/proto/acir-program.proto new file mode 100644 index 00000000000..ce90fb5fb3d --- /dev/null +++ b/acvm-repo/acir/src/proto/acir-program.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package noir.proto.acir_program; + +// Only including the ACIR types for Berratenberg, not Brillig. +import "acir.proto"; + +// Same as in `program.proto` but ignores the `unconstrained_functions` field, +// so that Berratenberg doesn't need to deserialize it. +message Program { + // ACIR circuits + repeated acir.Circuit functions = 1; + + reserved 2; + reserved "unconstrained_functions"; +} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/acir.proto b/acvm-repo/acir/src/proto/acir.proto new file mode 100644 index 00000000000..a80e2a4ab1d --- /dev/null +++ b/acvm-repo/acir/src/proto/acir.proto @@ -0,0 +1,85 @@ +syntax = "proto3"; + +package noir.proto.acir; + +import "witness.proto"; + +message Circuit { + u32 current_witness_index = 1; + repeated Opcode opcodes = 2; + ExpressionWidth expression_width = 3; + repeated witness.Witness private_parameters = 4; + repeated witness.Witness public_parameters = 5; + repeated witness.Witness return_values = 6; + repeated AssertMessage assert_messages = 7; +} + +message ExpressionWidth { + oneof value { + Unbounded unbounded = 1; + Bounded bounded = 2; + } + message Unbounded {} + message Bounded { u64 width = 1; } +} + +message AssertMessage { + OpcodeLocation location = 1; + AssertionPayload payload = 2; +} + +message OpcodeLocation { + oneof value { + u64 acir = 1; + BrilligLocation brillig = 2; + } + message BrilligLocation { + u64 acir_index = 1; + u64 brillig_index = 2; + } +} + +message AssertionPayload { + u64 error_selector = 1; + repeated ExpressionOrMemory payload = 2; +} + +message ExpressionOrMemory { + oneof value { + Expression expression = 1; + BlockId memory = 2; + } +} + +message BlockId { u32 value = 1; } + +message Expression { + repeated MulTerm mul_terms = 1; + repeated LinearCombination linear_combinations = 2; + Field q_c = 3; + + message MulTerm { + Field q_m = 1; + witness.Witness witness_left = 2; + witness.Witness witness_right = 3; + } + + message LinearCombination { + Field q_l = 1; + witness.Witness witness = 2; + } +} + +message Field { bytes value = 1; } + +message Opcode { + oneof value { + Expression assert_zero = 1; + BlackBoxFuncCall blackbox_func_call = 2; + MemoryOp memory_op = 3; + MemoryInit memory_init = 4; + BrilligCall brillig_call = 5; + Call call = 6; + } +} +message BlackBoxFuncCall {} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/brillig.proto b/acvm-repo/acir/src/proto/brillig.proto new file mode 100644 index 00000000000..34ee71c081a --- /dev/null +++ b/acvm-repo/acir/src/proto/brillig.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; + +package noir.proto.brillig; + +message BrilligBytecode {} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/conversion.rs b/acvm-repo/acir/src/proto/conversion.rs new file mode 100644 index 00000000000..b6f52b033e1 --- /dev/null +++ b/acvm-repo/acir/src/proto/conversion.rs @@ -0,0 +1,48 @@ +use color_eyre::eyre::{self, Context}; +use iter_extended::{try_vecmap, vecmap}; +use noir_protobuf::{from_proto, to_proto, ProtoCodec, ProtoRepr}; + +use super::program::Program; + +impl ProtoCodec for crate::circuit::Program { + type Repr = Program; + + fn encode(&self) -> Self::Repr { + Program { + functions: vecmap(&self.functions, to_proto), + unconstrained_functions: vecmap(&self.unconstrained_functions, to_proto), + } + } + + fn decode(value: &Self::Repr) -> eyre::Result { + Ok(Self { + functions: try_vecmap(&value.functions, from_proto).wrap_err("functions")?, + unconstrained_functions: try_vecmap(&value.unconstrained_functions, from_proto) + .wrap_err("unconstrained_functions")?, + }) + } +} + +impl ProtoCodec for crate::circuit::brillig::BrilligBytecode { + type Repr = super::brillig::BrilligBytecode; + + fn encode(&self) -> Self::Repr { + todo!() + } + + fn decode(value: &Self::Repr) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for crate::circuit::Circuit { + type Repr = super::acir::Circuit; + + fn encode(&self) -> Self::Repr { + todo!() + } + + fn decode(value: &Self::Repr) -> eyre::Result { + todo!() + } +} diff --git a/acvm-repo/acir/src/proto/mod.rs b/acvm-repo/acir/src/proto/mod.rs new file mode 100644 index 00000000000..90e38723a58 --- /dev/null +++ b/acvm-repo/acir/src/proto/mod.rs @@ -0,0 +1,16 @@ +mod conversion; + +#[allow(unreachable_pub)] +pub(crate) mod acir { + include!(concat!(env!("OUT_DIR"), "/noir.proto.acir.rs")); +} + +#[allow(unreachable_pub)] +pub(crate) mod brillig { + include!(concat!(env!("OUT_DIR"), "/noir.proto.brillig.rs")); +} + +#[allow(unreachable_pub)] +pub(crate) mod program { + include!(concat!(env!("OUT_DIR"), "/noir.proto.program.rs")); +} diff --git a/acvm-repo/acir/src/proto/program.proto b/acvm-repo/acir/src/proto/program.proto new file mode 100644 index 00000000000..181951e1352 --- /dev/null +++ b/acvm-repo/acir/src/proto/program.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package noir.proto.program; + +import public "acir.proto"; +import public "brillig.proto"; + +// A program represents an entire circuit with ACIR and Brillig functions and +// potentially multiple endpoints. +message Program { + // ACIR circuits + repeated acir.Circuit functions = 1; + // Brillig functions + repeated brillig.BrilligBytecode unconstrained_functions = 2; +} diff --git a/acvm-repo/acir/src/proto/witness.proto b/acvm-repo/acir/src/proto/witness.proto new file mode 100644 index 00000000000..fea46786e3b --- /dev/null +++ b/acvm-repo/acir/src/proto/witness.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; + +package noir.proto.witness; + +message Witness { u32 index = 1; } diff --git a/cspell.json b/cspell.json index 3bbbede78cc..31c81657144 100644 --- a/cspell.json +++ b/cspell.json @@ -173,6 +173,7 @@ "noncanonical", "nouner", "oneshot", + "oneof", "overflowing", "pedersen", "peekable", @@ -188,6 +189,11 @@ "printstd", "proptest", "proptests", + "prost", + "proto", + "protobuf", + "protoc", + "protos", "pseudocode", "pubkey", "quantile", diff --git a/utils/protobuf/Cargo.toml b/utils/protobuf/Cargo.toml new file mode 100644 index 00000000000..fdd8fb0ba2e --- /dev/null +++ b/utils/protobuf/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "noir_protobuf" +version.workspace = true +authors.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +color-eyre.workspace = true +prost.workspace = true diff --git a/utils/protobuf/src/lib.rs b/utils/protobuf/src/lib.rs new file mode 100644 index 00000000000..7b6b980dbc2 --- /dev/null +++ b/utils/protobuf/src/lib.rs @@ -0,0 +1,49 @@ +use color_eyre::eyre; + +/// Convert a type to/from Protobuf format. +pub trait ProtoCodec: Sized { + /// The DTO type defined in the `.proto` schema representing `Self`. + type Repr: prost::Message; + /// Convert `Self` to `Repr`. + fn encode(&self) -> Self::Repr; + /// Try to convert `Repr` to `Self`. + fn decode(value: &Self::Repr) -> eyre::Result; +} + +/// Convert a Protobuf representation to/from a domain type. +/// We can use this to define protobuf mapping for types +/// defined in external crates, e.g. to place the `bar.proto` +/// definition in crate `foo`, and define the mappings from +/// `bar::proto::Bar` for `bar::Bar` in `foo::proto`. +pub trait ProtoRepr: Sized { + /// The domain type. + type Type; + /// Convert `Type` to `Self`. + fn encode(value: &Self::Type) -> Self; + /// Try to convert `Self` to `Type`. + fn decode(&self) -> eyre::Result; +} + +pub fn to_proto(value: &T) -> T::Repr { + value.encode() +} + +pub fn into_proto(value: T) -> T::Repr { + to_proto(&value) +} + +pub fn from_proto(value: &T::Repr) -> eyre::Result { + T::decode(value) +} + +pub fn to_proto_repr(value: &R::Type) -> R { + R::encode(value) +} + +pub fn into_proto_repr(value: R::Type) -> R { + to_proto_repr(&value) +} + +pub fn from_proto_repr(value: &R) -> eyre::Result { + value.decode() +} From 44c8afe4052bc495d515881d0fc2909e2dfa6c4d Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Wed, 26 Feb 2025 19:53:20 +0000 Subject: [PATCH 07/24] Refactor package names --- acvm-repo/acir/build.rs | 2 +- acvm-repo/acir/src/proto/acir-program.proto | 16 --- acvm-repo/acir/src/proto/acir.proto | 85 ----------- acvm-repo/acir/src/proto/acir/circuit.proto | 149 ++++++++++++++++++++ acvm-repo/acir/src/proto/acir/program.proto | 17 +++ acvm-repo/acir/src/proto/acir/witness.proto | 5 + acvm-repo/acir/src/proto/brillig.proto | 2 +- acvm-repo/acir/src/proto/conversion.rs | 8 +- acvm-repo/acir/src/proto/mod.rs | 16 ++- acvm-repo/acir/src/proto/program.proto | 8 +- acvm-repo/acir/src/proto/witness.proto | 5 - utils/protobuf/src/lib.rs | 12 +- 12 files changed, 198 insertions(+), 127 deletions(-) delete mode 100644 acvm-repo/acir/src/proto/acir-program.proto delete mode 100644 acvm-repo/acir/src/proto/acir.proto create mode 100644 acvm-repo/acir/src/proto/acir/circuit.proto create mode 100644 acvm-repo/acir/src/proto/acir/program.proto create mode 100644 acvm-repo/acir/src/proto/acir/witness.proto delete mode 100644 acvm-repo/acir/src/proto/witness.proto diff --git a/acvm-repo/acir/build.rs b/acvm-repo/acir/build.rs index 1050151e131..dc822d3fd8c 100644 --- a/acvm-repo/acir/build.rs +++ b/acvm-repo/acir/build.rs @@ -11,7 +11,7 @@ fn main() { "./src/proto/program.proto", // This is only included to make sure it compiles. // A separate compilation is needed to turn it into C++ code. - "./src/proto/acir-program.proto", + "./src/proto/acir/program.proto", ], &[Path::new("./src/proto"), include_dir.as_path()], ) diff --git a/acvm-repo/acir/src/proto/acir-program.proto b/acvm-repo/acir/src/proto/acir-program.proto deleted file mode 100644 index ce90fb5fb3d..00000000000 --- a/acvm-repo/acir/src/proto/acir-program.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -package noir.proto.acir_program; - -// Only including the ACIR types for Berratenberg, not Brillig. -import "acir.proto"; - -// Same as in `program.proto` but ignores the `unconstrained_functions` field, -// so that Berratenberg doesn't need to deserialize it. -message Program { - // ACIR circuits - repeated acir.Circuit functions = 1; - - reserved 2; - reserved "unconstrained_functions"; -} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/acir.proto b/acvm-repo/acir/src/proto/acir.proto deleted file mode 100644 index a80e2a4ab1d..00000000000 --- a/acvm-repo/acir/src/proto/acir.proto +++ /dev/null @@ -1,85 +0,0 @@ -syntax = "proto3"; - -package noir.proto.acir; - -import "witness.proto"; - -message Circuit { - u32 current_witness_index = 1; - repeated Opcode opcodes = 2; - ExpressionWidth expression_width = 3; - repeated witness.Witness private_parameters = 4; - repeated witness.Witness public_parameters = 5; - repeated witness.Witness return_values = 6; - repeated AssertMessage assert_messages = 7; -} - -message ExpressionWidth { - oneof value { - Unbounded unbounded = 1; - Bounded bounded = 2; - } - message Unbounded {} - message Bounded { u64 width = 1; } -} - -message AssertMessage { - OpcodeLocation location = 1; - AssertionPayload payload = 2; -} - -message OpcodeLocation { - oneof value { - u64 acir = 1; - BrilligLocation brillig = 2; - } - message BrilligLocation { - u64 acir_index = 1; - u64 brillig_index = 2; - } -} - -message AssertionPayload { - u64 error_selector = 1; - repeated ExpressionOrMemory payload = 2; -} - -message ExpressionOrMemory { - oneof value { - Expression expression = 1; - BlockId memory = 2; - } -} - -message BlockId { u32 value = 1; } - -message Expression { - repeated MulTerm mul_terms = 1; - repeated LinearCombination linear_combinations = 2; - Field q_c = 3; - - message MulTerm { - Field q_m = 1; - witness.Witness witness_left = 2; - witness.Witness witness_right = 3; - } - - message LinearCombination { - Field q_l = 1; - witness.Witness witness = 2; - } -} - -message Field { bytes value = 1; } - -message Opcode { - oneof value { - Expression assert_zero = 1; - BlackBoxFuncCall blackbox_func_call = 2; - MemoryOp memory_op = 3; - MemoryInit memory_init = 4; - BrilligCall brillig_call = 5; - Call call = 6; - } -} -message BlackBoxFuncCall {} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/acir/circuit.proto b/acvm-repo/acir/src/proto/acir/circuit.proto new file mode 100644 index 00000000000..e445d73398e --- /dev/null +++ b/acvm-repo/acir/src/proto/acir/circuit.proto @@ -0,0 +1,149 @@ +syntax = "proto3"; + +package acvm.acir.circuit; + +import "acir/witness.proto"; + +message Circuit { + uint32 current_witness_index = 1; + repeated Opcode opcodes = 2; + ExpressionWidth expression_width = 3; + repeated witness.Witness private_parameters = 4; + repeated witness.Witness public_parameters = 5; + repeated witness.Witness return_values = 6; + repeated AssertMessage assert_messages = 7; +} + +message ExpressionWidth { + oneof value { + Unbounded unbounded = 1; + Bounded bounded = 2; + } + message Unbounded {} + message Bounded { uint64 width = 1; } +} + +message AssertMessage { + OpcodeLocation location = 1; + AssertionPayload payload = 2; +} + +message OpcodeLocation { + oneof value { + uint64 acir = 1; + BrilligLocation brillig = 2; + } + message BrilligLocation { + uint64 acir_index = 1; + uint64 brillig_index = 2; + } +} + +message AssertionPayload { + uint64 error_selector = 1; + repeated ExpressionOrMemory payload = 2; +} + +message ExpressionOrMemory { + oneof value { + Expression expression = 1; + BlockId memory = 2; + } +} + +message BlockId { uint32 value = 1; } + +message Expression { + repeated MulTerm mul_terms = 1; + repeated LinearCombination linear_combinations = 2; + Field q_c = 3; + + message MulTerm { + Field q_m = 1; + witness.Witness witness_left = 2; + witness.Witness witness_right = 3; + } + + message LinearCombination { + Field q_l = 1; + witness.Witness witness = 2; + } +} + +message Field { bytes value = 1; } + +message Opcode { + oneof value { + Expression assert_zero = 1; + BlackBoxFuncCall blackbox_func_call = 2; + MemoryOp memory_op = 3; + MemoryInit memory_init = 4; + BrilligCall brillig_call = 5; + Call call = 6; + } + message MemoryOp { + BlockId block_id = 1; + MemOp op = 2; + optional Expression predicate = 3; + } + message MemoryInit { + BlockId block_id = 1; + repeated witness.Witness init = 2; + BlockType block_type = 3; + } + message BrilligCall { + BrilligFunctionId id = 1; + repeated BrilligInputs inputs = 2; + repeated BrilligOutputs outputs = 3; + optional Expression predicate = 4; + } + message Call { + AcirFunctionId id = 1; + repeated witness.Witness inputs = 2; + repeated witness.Witness outputs = 3; + optional Expression predicate = 4; + } +} + +message BlackBoxFuncCall { + // oneof value { + // // TODO + // } +} + +message MemOp { + Expression operation = 1; + Expression index = 2; + Expression value = 3; +} + +message BlockType { + oneof value { + Memory memory = 1; + CallData call_data = 2; + ReturnData return_data = 3; + } + message Memory {} + message CallData { uint32 value = 1; } + message ReturnData {} +} + +message BrilligFunctionId { uint32 value = 1; } +message AcirFunctionId { uint32 value = 1; } + +message BrilligInputs { + oneof value { + Expression single = 1; + Array array = 2; + BlockId memory_array = 3; + } + message Array { repeated Expression values = 2; } +} + +message BrilligOutputs { + oneof value { + witness.Witness simple = 1; + Array array = 2; + } + message Array { repeated witness.Witness values = 1; } +} diff --git a/acvm-repo/acir/src/proto/acir/program.proto b/acvm-repo/acir/src/proto/acir/program.proto new file mode 100644 index 00000000000..0032966d0cb --- /dev/null +++ b/acvm-repo/acir/src/proto/acir/program.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +package acvm.acir.program; + +// Only including the ACIR types for Berratenberg, not Brillig. +import "acir/circuit.proto"; + +// Same as the top level `program.proto` but ignores the +// `unconstrained_functions` field, so that Berratenberg doesn't need to +// deserialize it. +message Program { + // ACIR circuits + repeated acvm.acir.circuit.Circuit functions = 1; + + reserved 2; + reserved "unconstrained_functions"; +} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/acir/witness.proto b/acvm-repo/acir/src/proto/acir/witness.proto new file mode 100644 index 00000000000..5402ea00331 --- /dev/null +++ b/acvm-repo/acir/src/proto/acir/witness.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; + +package acvm.acir.witness; + +message Witness { uint32 index = 1; } diff --git a/acvm-repo/acir/src/proto/brillig.proto b/acvm-repo/acir/src/proto/brillig.proto index 34ee71c081a..43bf919b33f 100644 --- a/acvm-repo/acir/src/proto/brillig.proto +++ b/acvm-repo/acir/src/proto/brillig.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -package noir.proto.brillig; +package acvm.brillig; message BrilligBytecode {} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/conversion.rs b/acvm-repo/acir/src/proto/conversion.rs index b6f52b033e1..911c72aabe7 100644 --- a/acvm-repo/acir/src/proto/conversion.rs +++ b/acvm-repo/acir/src/proto/conversion.rs @@ -2,7 +2,9 @@ use color_eyre::eyre::{self, Context}; use iter_extended::{try_vecmap, vecmap}; use noir_protobuf::{from_proto, to_proto, ProtoCodec, ProtoRepr}; -use super::program::Program; +use crate::proto::acir::circuit::Circuit; +use crate::proto::brillig::BrilligBytecode; +use crate::proto::program::Program; impl ProtoCodec for crate::circuit::Program { type Repr = Program; @@ -24,7 +26,7 @@ impl ProtoCodec for crate::circuit::Program { } impl ProtoCodec for crate::circuit::brillig::BrilligBytecode { - type Repr = super::brillig::BrilligBytecode; + type Repr = BrilligBytecode; fn encode(&self) -> Self::Repr { todo!() @@ -36,7 +38,7 @@ impl ProtoCodec for crate::circuit::brillig::BrilligBytecode { } impl ProtoCodec for crate::circuit::Circuit { - type Repr = super::acir::Circuit; + type Repr = Circuit; fn encode(&self) -> Self::Repr { todo!() diff --git a/acvm-repo/acir/src/proto/mod.rs b/acvm-repo/acir/src/proto/mod.rs index 90e38723a58..cc9e941eb19 100644 --- a/acvm-repo/acir/src/proto/mod.rs +++ b/acvm-repo/acir/src/proto/mod.rs @@ -1,16 +1,24 @@ mod conversion; -#[allow(unreachable_pub)] pub(crate) mod acir { - include!(concat!(env!("OUT_DIR"), "/noir.proto.acir.rs")); + + #[allow(unreachable_pub)] + pub(crate) mod witness { + include!(concat!(env!("OUT_DIR"), "/acvm.acir.witness.rs")); + } + + #[allow(unreachable_pub)] + pub(crate) mod circuit { + include!(concat!(env!("OUT_DIR"), "/acvm.acir.circuit.rs")); + } } #[allow(unreachable_pub)] pub(crate) mod brillig { - include!(concat!(env!("OUT_DIR"), "/noir.proto.brillig.rs")); + include!(concat!(env!("OUT_DIR"), "/acvm.brillig.rs")); } #[allow(unreachable_pub)] pub(crate) mod program { - include!(concat!(env!("OUT_DIR"), "/noir.proto.program.rs")); + include!(concat!(env!("OUT_DIR"), "/acvm.program.rs")); } diff --git a/acvm-repo/acir/src/proto/program.proto b/acvm-repo/acir/src/proto/program.proto index 181951e1352..d54d0aff5a9 100644 --- a/acvm-repo/acir/src/proto/program.proto +++ b/acvm-repo/acir/src/proto/program.proto @@ -1,15 +1,15 @@ syntax = "proto3"; -package noir.proto.program; +package acvm.program; -import public "acir.proto"; +import public "acir/circuit.proto"; import public "brillig.proto"; // A program represents an entire circuit with ACIR and Brillig functions and // potentially multiple endpoints. message Program { // ACIR circuits - repeated acir.Circuit functions = 1; + repeated acvm.acir.circuit.Circuit functions = 1; // Brillig functions - repeated brillig.BrilligBytecode unconstrained_functions = 2; + repeated acvm.brillig.BrilligBytecode unconstrained_functions = 2; } diff --git a/acvm-repo/acir/src/proto/witness.proto b/acvm-repo/acir/src/proto/witness.proto deleted file mode 100644 index fea46786e3b..00000000000 --- a/acvm-repo/acir/src/proto/witness.proto +++ /dev/null @@ -1,5 +0,0 @@ -syntax = "proto3"; - -package noir.proto.witness; - -message Witness { u32 index = 1; } diff --git a/utils/protobuf/src/lib.rs b/utils/protobuf/src/lib.rs index 7b6b980dbc2..b6f293a547e 100644 --- a/utils/protobuf/src/lib.rs +++ b/utils/protobuf/src/lib.rs @@ -24,26 +24,22 @@ pub trait ProtoRepr: Sized { fn decode(&self) -> eyre::Result; } +/// Convert a domain type to its protobuf representation. pub fn to_proto(value: &T) -> T::Repr { value.encode() } -pub fn into_proto(value: T) -> T::Repr { - to_proto(&value) -} - +/// Convert a protobuf representation into its domain type. pub fn from_proto(value: &T::Repr) -> eyre::Result { T::decode(value) } +/// Same as [to_proto] but works with [ProtoRepr]. pub fn to_proto_repr(value: &R::Type) -> R { R::encode(value) } -pub fn into_proto_repr(value: R::Type) -> R { - to_proto_repr(&value) -} - +/// Same as [from_proto] but works with [ProtoRepr]. pub fn from_proto_repr(value: &R) -> eyre::Result { value.decode() } From 17654ca3c7963e542fec595ea0d87e108b8deb8d Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 10:45:06 +0000 Subject: [PATCH 08/24] Brillig opcodes --- acvm-repo/acir/src/proto/acir/circuit.proto | 185 ++++++++++-- acvm-repo/acir/src/proto/acir/native.proto | 6 + acvm-repo/acir/src/proto/acir/witness.proto | 2 +- acvm-repo/acir/src/proto/brillig.proto | 306 +++++++++++++++++++- acvm-repo/acir/src/proto/conversion.rs | 2 +- acvm-repo/acir/src/proto/mod.rs | 5 + 6 files changed, 472 insertions(+), 34 deletions(-) create mode 100644 acvm-repo/acir/src/proto/acir/native.proto diff --git a/acvm-repo/acir/src/proto/acir/circuit.proto b/acvm-repo/acir/src/proto/acir/circuit.proto index e445d73398e..e93060c3222 100644 --- a/acvm-repo/acir/src/proto/acir/circuit.proto +++ b/acvm-repo/acir/src/proto/acir/circuit.proto @@ -2,15 +2,15 @@ syntax = "proto3"; package acvm.acir.circuit; -import "acir/witness.proto"; +import "acir/native.proto"; message Circuit { uint32 current_witness_index = 1; repeated Opcode opcodes = 2; ExpressionWidth expression_width = 3; - repeated witness.Witness private_parameters = 4; - repeated witness.Witness public_parameters = 5; - repeated witness.Witness return_values = 6; + repeated native.Witness private_parameters = 4; + repeated native.Witness public_parameters = 5; + repeated native.Witness return_values = 6; repeated AssertMessage assert_messages = 7; } @@ -47,31 +47,27 @@ message AssertionPayload { message ExpressionOrMemory { oneof value { Expression expression = 1; - BlockId memory = 2; + uint32 memory = 2; } } -message BlockId { uint32 value = 1; } - message Expression { repeated MulTerm mul_terms = 1; repeated LinearCombination linear_combinations = 2; - Field q_c = 3; + native.Field q_c = 3; message MulTerm { - Field q_m = 1; - witness.Witness witness_left = 2; - witness.Witness witness_right = 3; + native.Field q_m = 1; + native.Witness witness_left = 2; + native.Witness witness_right = 3; } message LinearCombination { - Field q_l = 1; - witness.Witness witness = 2; + native.Field q_l = 1; + native.Witness witness = 2; } } -message Field { bytes value = 1; } - message Opcode { oneof value { Expression assert_zero = 1; @@ -82,33 +78,163 @@ message Opcode { Call call = 6; } message MemoryOp { - BlockId block_id = 1; + uint32 block_id = 1; MemOp op = 2; optional Expression predicate = 3; } message MemoryInit { - BlockId block_id = 1; - repeated witness.Witness init = 2; + uint32 block_id = 1; + repeated native.Witness init = 2; BlockType block_type = 3; } message BrilligCall { - BrilligFunctionId id = 1; + uint32 id = 1; repeated BrilligInputs inputs = 2; repeated BrilligOutputs outputs = 3; optional Expression predicate = 4; } message Call { - AcirFunctionId id = 1; - repeated witness.Witness inputs = 2; - repeated witness.Witness outputs = 3; + uint32 id = 1; + repeated native.Witness inputs = 2; + repeated native.Witness outputs = 3; optional Expression predicate = 4; } } message BlackBoxFuncCall { - // oneof value { - // // TODO - // } + oneof value { + AES128Encrypt aes128_encrypt = 1; + AND and = 2; + XOR xor = 3; + RANGE range = 4; + Blake2s blake2s = 5; + Blake3 blake3 = 6; + EcdsaSecp256k1 ecdsa_secp256k1 = 7; + EcdsaSecp256r1 ecdsa_secp256r1 = 8; + MultiScalarMul multi_scalar_mul = 9; + EmbeddedCurveAdd embedded_curve_add = 10; + Keccakf1600 keccak_f1600 = 11; + RecursiveAggregation recursive_aggregation = 12; + BigIntAdd bigint_add = 13; + BigIntSub bigint_sub = 14; + BigIntMul bigint_mul = 15; + BigIntDiv bigint_div = 16; + BigIntFromLeBytes bigint_from_le_bytes = 17; + BigIntToLeBytes bigint_to_le_bytes = 18; + Poseidon2Permutation poseidon2_permutation = 19; + Sha256Compression sha256_compression = 20; + } + message AES128Encrypt { + repeated FunctionInput inputs = 1; + repeated FunctionInput iv = 2; + repeated FunctionInput key = 3; + repeated native.Witness outputs = 4; + } + message AND { + FunctionInput lhs = 1; + FunctionInput rhs = 2; + native.Witness output = 3; + } + message XOR { + FunctionInput lhs = 1; + FunctionInput rhs = 2; + native.Witness output = 3; + } + message RANGE { FunctionInput input = 1; } + message Blake2s { + repeated FunctionInput inputs = 1; + repeated native.Witness outputs = 2; + } + message Blake3 { + repeated FunctionInput inputs = 1; + repeated native.Witness outputs = 2; + } + message EcdsaSecp256k1 { + repeated FunctionInput public_key_x = 1; + repeated FunctionInput public_key_y = 2; + repeated FunctionInput signature = 3; + repeated FunctionInput hashed_message = 4; + native.Witness output = 5; + } + message EcdsaSecp256r1 { + repeated FunctionInput public_key_x = 1; + repeated FunctionInput public_key_y = 2; + repeated FunctionInput signature = 3; + repeated FunctionInput hashed_message = 4; + native.Witness output = 5; + } + message MultiScalarMul { + repeated FunctionInput points = 1; + repeated FunctionInput scalars = 2; + repeated native.Witness outputs = 3; + } + message EmbeddedCurveAdd { + repeated FunctionInput points = 1; + repeated FunctionInput scalars = 2; + repeated native.Witness outputs = 3; + } + message Keccakf1600 { + repeated FunctionInput points = 1; + repeated native.Witness outputs = 2; + } + message RecursiveAggregation { + repeated FunctionInput verification_key = 1; + repeated FunctionInput proof = 2; + repeated FunctionInput public_inputs = 3; + FunctionInput key_hash = 4; + uint32 proof_type = 5; + } + message BigIntAdd { + uint32 lhs = 1; + uint32 rhs = 2; + uint32 output = 3; + } + message BigIntSub { + uint32 lhs = 1; + uint32 rhs = 2; + uint32 output = 3; + } + message BigIntMul { + uint32 lhs = 1; + uint32 rhs = 2; + uint32 output = 3; + } + message BigIntDiv { + uint32 lhs = 1; + uint32 rhs = 2; + uint32 output = 3; + } + message BigIntFromLeBytes { + repeated FunctionInput inputs = 1; + bytes modulus = 2; + uint32 output = 3; + } + message BigIntToLeBytes { + uint32 input = 1; + repeated native.Witness outputs = 2; + } + message Poseidon2Permutation { + repeated FunctionInput inputs = 1; + repeated native.Witness outputs = 2; + uint32 len = 3; + } + message Sha256Compression { + repeated FunctionInput inputs = 1; + repeated FunctionInput hash_values = 2; + repeated native.Witness outputs = 3; + } +} + +message FunctionInput { + ConstantOrWitnessEnum input = 1; + uint32 num_bits = 2; +} + +message ConstantOrWitnessEnum { + oneof value { + native.Field constant = 1; + native.Witness witness = 2; + } } message MemOp { @@ -128,22 +254,19 @@ message BlockType { message ReturnData {} } -message BrilligFunctionId { uint32 value = 1; } -message AcirFunctionId { uint32 value = 1; } - message BrilligInputs { oneof value { Expression single = 1; Array array = 2; - BlockId memory_array = 3; + uint32 memory_array = 3; } message Array { repeated Expression values = 2; } } message BrilligOutputs { oneof value { - witness.Witness simple = 1; + native.Witness simple = 1; Array array = 2; } - message Array { repeated witness.Witness values = 1; } + message Array { repeated native.Witness values = 1; } } diff --git a/acvm-repo/acir/src/proto/acir/native.proto b/acvm-repo/acir/src/proto/acir/native.proto new file mode 100644 index 00000000000..ddba25713c4 --- /dev/null +++ b/acvm-repo/acir/src/proto/acir/native.proto @@ -0,0 +1,6 @@ +syntax = "proto3"; + +package acvm.acir.native; + +message Field { bytes value = 1; } +message Witness { uint32 index = 1; } diff --git a/acvm-repo/acir/src/proto/acir/witness.proto b/acvm-repo/acir/src/proto/acir/witness.proto index 5402ea00331..3d39d40a9df 100644 --- a/acvm-repo/acir/src/proto/acir/witness.proto +++ b/acvm-repo/acir/src/proto/acir/witness.proto @@ -2,4 +2,4 @@ syntax = "proto3"; package acvm.acir.witness; -message Witness { uint32 index = 1; } +import "acir/native.proto"; diff --git a/acvm-repo/acir/src/proto/brillig.proto b/acvm-repo/acir/src/proto/brillig.proto index 43bf919b33f..cb608acc084 100644 --- a/acvm-repo/acir/src/proto/brillig.proto +++ b/acvm-repo/acir/src/proto/brillig.proto @@ -2,4 +2,308 @@ syntax = "proto3"; package acvm.brillig; -message BrilligBytecode {} \ No newline at end of file +import "acir/native.proto"; + +message BrilligBytecode { repeated BrilligOpcode bytecode = 1; } + +message BrilligOpcode { + oneof value { + BinaryFieldOp binary_field_op = 1; + BinaryIntOp binary_int_op = 2; + Not not = 3; + Cast cast = 4; + JumpIfNot jump_if_not = 5; + JumpIf jump_if = 6; + Jump jump = 7; + CalldataCopy calldata_copy = 8; + Call call = 9; + Const const = 10; + IndirectConst indirect_cost = 11; + Return return = 12; + ForeignCall foreign_call = 13; + Mov mov = 14; + ConditionalMov conditional_mov = 15; + Load load = 16; + Store store = 17; + BlackBox black_box = 18; + Trap trap = 19; + Stop stop = 20; + } + message BinaryFieldOp { + MemoryAddress destination = 1; + BinaryFieldOpKind op = 2; + MemoryAddress lhs = 3; + MemoryAddress rhs = 4; + } + message BinaryIntOp { + MemoryAddress destination = 1; + BinaryIntOpKind op = 2; + IntegerBitSize bit_size = 3; + MemoryAddress lhs = 4; + MemoryAddress rhs = 5; + } + message Not { + MemoryAddress destination = 1; + MemoryAddress source = 2; + IntegerBitSize bit_size = 3; + } + message Cast { + MemoryAddress destination = 1; + MemoryAddress source = 2; + IntegerBitSize bit_size = 3; + } + message JumpIfNot { + MemoryAddress condition = 1; + uint64 location = 2; + } + message JumpIf { + MemoryAddress condition = 1; + uint64 location = 2; + } + message Jump { uint64 location = 1; } + message CalldataCopy { + MemoryAddress destination_address = 1; + MemoryAddress size_address = 2; + MemoryAddress offset_address = 3; + } + message Call { uint64 location = 1; } + message Const { + MemoryAddress destination = 1; + BitSize bit_size = 2; + acir.native.Field value = 3; + } + message IndirectConst { + MemoryAddress destination = 1; + BitSize bit_size = 2; + acir.native.Field value = 3; + } + message Return {} + message ForeignCall { + string function = 1; + repeated ValueOrArray destinations = 2; + repeated HeapValueType destination_value_types = 3; + repeated ValueOrArray inputs = 4; + repeated HeapValueType input_value_types = 5; + } + message Mov { + MemoryAddress destination = 1; + MemoryAddress source = 2; + } + message ConditionalMov { + MemoryAddress destination = 1; + MemoryAddress source_a = 2; + MemoryAddress source_b = 3; + MemoryAddress condition = 4; + } + message Load { + MemoryAddress destination = 1; + MemoryAddress source_pointer = 2; + } + message Store { + MemoryAddress destination_pointer = 1; + MemoryAddress source = 2; + } + message BlackBox { BlackBoxOp op = 1; } + message Trap { HeapVector revert_data = 1; } + message Stop { HeapVector revert_data = 1; } +} + +message MemoryAddress { + oneof value { + uint64 direct = 1; + uint64 relative = 2; + } +} + +message ValueOrArray { + oneof value { + MemoryAddress memory_address = 1; + HeapArray heap_array = 2; + HeapVector heap_vector = 3; + } +} + +message HeapArray { + MemoryAddress pointer = 1; + MemoryAddress size = 2; +} + +message HeapVector { + MemoryAddress pointer = 1; + MemoryAddress size = 2; +} + +message HeapValueType { + oneof value { + BitSize simple = 1; + Array array = 2; + Vector vector = 3; + } + message Array { + repeated HeapValueType value_types = 1; + uint64 size = 2; + } + message Vector { repeated HeapValueType value_types = 1; } +} + +enum BinaryFieldOpKind { + BFO_UNSPECIFIED = 0; + BFO_ADD = 1; + BFO_SUB = 2; + BFO_MUL = 3; + BFO_DIV = 4; + BFO_INT_DIV = 5; + BFO_EQ = 6; + BFO_LT = 7; + BFO_LTE = 8; +} + +enum BinaryIntOpKind { + BIO_UNSPECIFIED = 0; + BIO_ADD = 1; + BIO_SUB = 2; + BIO_MUL = 3; + BIO_DIV = 4; + BIO_INT_DIV = 5; + BIO_EQ = 6; + BIO_LT = 7; + BIO_LTE = 8; + BIO_AND = 9; + BIO_OR = 10; + BIO_XOR = 11; + BIO_SHL = 12; + BIO_SHR = 13; +} + +enum IntegerBitSize { + IBS_UNSPECIFIED = 0; + IBS_U1 = 1; + IBS_U8 = 8; + IBS_U16 = 16; + IBS_U32 = 32; + IBS_U64 = 64; + IBS_U128 = 128; +} + +message BitSize { + oneof value { + FieldSize field = 1; + IntegerBitSize integer = 2; + } + message FieldSize {} +} + +message BlackBoxOp { + oneof value { + AES128Encrypt aes128_encrypt = 1; + Blake2s blake2s = 2; + Blake3 blake3 = 3; + Keccakf1600 keccak_f1600 = 4; + EcdsaSecp256k1 ecdsa_secp256k1 = 5; + EcdsaSecp256r1 ecdsa_secp256r1 = 6; + MultiScalarMul multi_scalar_mul = 7; + EmbeddedCurveAdd embedded_curve_add = 8; + BigIntAdd big_int_add = 9; + BigIntSub big_int_sub = 10; + BigIntMul big_int_mul = 11; + BigIntDiv big_int_div = 12; + BigIntFromLeBytes big_int_from_le_bytes = 13; + BigIntToLeBytes big_int_to_le_bytes = 14; + Poseidon2Permutation poseidon2_permutation = 15; + Sha256Compression sha256_compression = 16; + ToRadix to_radix = 17; + } + message AES128Encrypt { + HeapVector inputs = 1; + HeapArray iv = 2; + HeapArray key = 3; + HeapVector outputs = 4; + } + message Blake2s { + HeapVector message = 1; + HeapArray output = 2; + } + message Blake3 { + HeapVector message = 1; + HeapArray output = 2; + } + message Keccakf1600 { + HeapArray input = 1; + HeapArray output = 2; + } + message EcdsaSecp256k1 { + HeapVector hashed_msg = 1; + HeapArray public_key_x = 2; + HeapArray public_key_y = 3; + HeapArray signature = 4; + MemoryAddress result = 5; + } + message EcdsaSecp256r1 { + HeapVector hashed_msg = 1; + HeapArray public_key_x = 2; + HeapArray public_key_y = 3; + HeapArray signature = 4; + MemoryAddress result = 5; + } + + message MultiScalarMul { + HeapVector points = 1; + HeapVector scalars = 2; + HeapArray outputs = 3; + } + message EmbeddedCurveAdd { + MemoryAddress input1_x = 1; + MemoryAddress input1_y = 2; + MemoryAddress input1_infinite = 3; + MemoryAddress input2_x = 4; + MemoryAddress input2_y = 5; + MemoryAddress input2_infinite = 6; + HeapArray result = 7; + } + message BigIntAdd { + MemoryAddress lhs = 1; + MemoryAddress rhs = 2; + MemoryAddress output = 3; + } + message BigIntSub { + MemoryAddress lhs = 1; + MemoryAddress rhs = 2; + MemoryAddress output = 3; + } + message BigIntMul { + MemoryAddress lhs = 1; + MemoryAddress rhs = 2; + MemoryAddress output = 3; + } + message BigIntDiv { + MemoryAddress lhs = 1; + MemoryAddress rhs = 2; + MemoryAddress output = 3; + } + message BigIntFromLeBytes { + HeapVector inputs = 1; + HeapVector modulus = 2; + MemoryAddress output = 3; + } + message BigIntToLeBytes { + MemoryAddress input = 1; + HeapVector output = 2; + } + message Poseidon2Permutation { + HeapVector message = 1; + HeapArray output = 2; + MemoryAddress len = 3; + } + message Sha256Compression { + HeapArray input = 1; + HeapArray hash_values = 2; + HeapArray output = 3; + } + message ToRadix { + MemoryAddress input = 1; + MemoryAddress radix = 2; + MemoryAddress output_pointer = 3; + MemoryAddress num_limbs = 4; + MemoryAddress output_bits = 5; + } +} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/conversion.rs b/acvm-repo/acir/src/proto/conversion.rs index 911c72aabe7..71a7e999480 100644 --- a/acvm-repo/acir/src/proto/conversion.rs +++ b/acvm-repo/acir/src/proto/conversion.rs @@ -1,6 +1,6 @@ use color_eyre::eyre::{self, Context}; use iter_extended::{try_vecmap, vecmap}; -use noir_protobuf::{from_proto, to_proto, ProtoCodec, ProtoRepr}; +use noir_protobuf::{from_proto, to_proto, ProtoCodec}; use crate::proto::acir::circuit::Circuit; use crate::proto::brillig::BrilligBytecode; diff --git a/acvm-repo/acir/src/proto/mod.rs b/acvm-repo/acir/src/proto/mod.rs index cc9e941eb19..409068bd765 100644 --- a/acvm-repo/acir/src/proto/mod.rs +++ b/acvm-repo/acir/src/proto/mod.rs @@ -2,6 +2,11 @@ mod conversion; pub(crate) mod acir { + #[allow(unreachable_pub)] + pub(crate) mod native { + include!(concat!(env!("OUT_DIR"), "/acvm.acir.native.rs")); + } + #[allow(unreachable_pub)] pub(crate) mod witness { include!(concat!(env!("OUT_DIR"), "/acvm.acir.witness.rs")); From ebb1369e896d29c11fb17f432f0fa2ab31cccb91 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 12:20:41 +0000 Subject: [PATCH 09/24] Add ProtoReprF --- acvm-repo/acir/src/proto/conversion.rs | 158 ++++++++++++++++++++++--- utils/protobuf/src/lib.rs | 24 ++++ 2 files changed, 167 insertions(+), 15 deletions(-) diff --git a/acvm-repo/acir/src/proto/conversion.rs b/acvm-repo/acir/src/proto/conversion.rs index 71a7e999480..b2114cf9774 100644 --- a/acvm-repo/acir/src/proto/conversion.rs +++ b/acvm-repo/acir/src/proto/conversion.rs @@ -2,8 +2,6 @@ use color_eyre::eyre::{self, Context}; use iter_extended::{try_vecmap, vecmap}; use noir_protobuf::{from_proto, to_proto, ProtoCodec}; -use crate::proto::acir::circuit::Circuit; -use crate::proto::brillig::BrilligBytecode; use crate::proto::program::Program; impl ProtoCodec for crate::circuit::Program { @@ -25,26 +23,156 @@ impl ProtoCodec for crate::circuit::Program { } } -impl ProtoCodec for crate::circuit::brillig::BrilligBytecode { - type Repr = BrilligBytecode; +mod brillig { + use color_eyre::eyre; + use iter_extended::vecmap; + use noir_protobuf::{ + from_proto, to_proto, to_proto_repr, to_proto_repr_f, ProtoCodec, ProtoRepr, ProtoReprF, + }; - fn encode(&self) -> Self::Repr { - todo!() + use crate::proto::brillig::{ + brillig_opcode, BinaryFieldOpKind, BinaryIntOpKind, BrilligBytecode, BrilligOpcode, + IntegerBitSize, MemoryAddress, + }; + + impl ProtoCodec for crate::circuit::brillig::BrilligBytecode { + type Repr = BrilligBytecode; + + fn encode(&self) -> Self::Repr { + BrilligBytecode { bytecode: vecmap(&self.bytecode, to_proto_repr_f) } + } + + fn decode(value: &Self::Repr) -> eyre::Result { + todo!() + } } - fn decode(value: &Self::Repr) -> eyre::Result { - todo!() + impl ProtoReprF for BrilligOpcode { + type Type = brillig::Opcode; + + fn encode(value: &Self::Type) -> Self { + use brillig_opcode::*; + + let value = match value { + brillig::Opcode::BinaryFieldOp { destination, op, lhs, rhs } => { + Value::BinaryFieldOp(BinaryFieldOp { + destination: Some(to_proto_repr(destination)), + op: to_proto_repr::(op).into(), + lhs: Some(to_proto_repr(lhs)), + rhs: Some(to_proto_repr(rhs)), + }) + } + brillig::Opcode::BinaryIntOp { destination, op, bit_size, lhs, rhs } => { + Value::BinaryIntOp(BinaryIntOp { + destination: Some(to_proto_repr(destination)), + op: to_proto_repr::(op).into(), + bit_size: to_proto_repr::(bit_size).into(), + lhs: Some(to_proto_repr(lhs)), + rhs: Some(to_proto_repr(rhs)), + }) + } + brillig::Opcode::Not { destination, source, bit_size } => todo!(), + brillig::Opcode::Cast { destination, source, bit_size } => todo!(), + brillig::Opcode::JumpIfNot { condition, location } => todo!(), + brillig::Opcode::JumpIf { condition, location } => todo!(), + brillig::Opcode::Jump { location } => todo!(), + brillig::Opcode::CalldataCopy { + destination_address, + size_address, + offset_address, + } => todo!(), + brillig::Opcode::Call { location } => todo!(), + brillig::Opcode::Const { destination, bit_size, value } => todo!(), + brillig::Opcode::IndirectConst { destination_pointer, bit_size, value } => todo!(), + brillig::Opcode::Return => todo!(), + brillig::Opcode::ForeignCall { + function, + destinations, + destination_value_types, + inputs, + input_value_types, + } => todo!(), + brillig::Opcode::Mov { destination, source } => todo!(), + brillig::Opcode::ConditionalMov { destination, source_a, source_b, condition } => { + todo!() + } + brillig::Opcode::Load { destination, source_pointer } => todo!(), + brillig::Opcode::Store { destination_pointer, source } => todo!(), + brillig::Opcode::BlackBox(black_box_op) => todo!(), + brillig::Opcode::Trap { revert_data } => todo!(), + brillig::Opcode::Stop { return_data } => todo!(), + }; + BrilligOpcode { value: Some(value) } + } + + fn decode(&self) -> eyre::Result { + todo!() + } } -} -impl ProtoCodec for crate::circuit::Circuit { - type Repr = Circuit; + impl ProtoRepr for MemoryAddress { + type Type = brillig::MemoryAddress; - fn encode(&self) -> Self::Repr { - todo!() + fn encode(value: &Self::Type) -> Self { + todo!() + } + + fn decode(&self) -> eyre::Result { + todo!() + } } - fn decode(value: &Self::Repr) -> eyre::Result { - todo!() + impl ProtoRepr for BinaryFieldOpKind { + type Type = brillig::BinaryFieldOp; + + fn encode(value: &Self::Type) -> Self { + todo!() + } + + fn decode(&self) -> eyre::Result { + todo!() + } + } + + impl ProtoRepr for BinaryIntOpKind { + type Type = brillig::BinaryIntOp; + + fn encode(value: &Self::Type) -> Self { + todo!() + } + + fn decode(&self) -> eyre::Result { + todo!() + } + } + + impl ProtoRepr for IntegerBitSize { + type Type = brillig::IntegerBitSize; + + fn encode(value: &Self::Type) -> Self { + todo!() + } + + fn decode(&self) -> eyre::Result { + todo!() + } + } +} + +mod acir { + use crate::proto::acir::circuit::Circuit; + use color_eyre::eyre; + use noir_protobuf::{from_proto, to_proto, to_proto_repr, ProtoCodec}; + + impl ProtoCodec for crate::circuit::Circuit { + type Repr = Circuit; + + fn encode(&self) -> Self::Repr { + todo!() + } + + fn decode(value: &Self::Repr) -> eyre::Result { + todo!() + } } } diff --git a/utils/protobuf/src/lib.rs b/utils/protobuf/src/lib.rs index b6f293a547e..ebee1545fd5 100644 --- a/utils/protobuf/src/lib.rs +++ b/utils/protobuf/src/lib.rs @@ -24,6 +24,16 @@ pub trait ProtoRepr: Sized { fn decode(&self) -> eyre::Result; } +/// Similar to [ProtoRepr] but used when `Self::Type` is generic in the `F` field type. +pub trait ProtoReprF: Sized { + /// The domain type. + type Type; + /// Convert `Type` to `Self`. + fn encode(value: &Self::Type) -> Self; + /// Try to convert `Self` to `Type`. + fn decode(&self) -> eyre::Result; +} + /// Convert a domain type to its protobuf representation. pub fn to_proto(value: &T) -> T::Repr { value.encode() @@ -43,3 +53,17 @@ pub fn to_proto_repr(value: &R::Type) -> R { pub fn from_proto_repr(value: &R) -> eyre::Result { value.decode() } + +/// Same as [to_proto_repr] but works with [ProtoReprF]. +pub fn to_proto_repr_f>(value: &R::Type) -> R { + R::encode(value) +} + +/// Same as [from_proto_repr] but works with [ProtoReprF]. +pub fn from_proto_repr_f>(value: &R) -> eyre::Result { + value.decode() +} + +pub fn to_proto_enum>(value: &R::Type) -> i32 { + to_proto_repr::(value).into() +} From 08d17fb973a1fdbb747d5b00a89abca429e267bd Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 13:04:45 +0000 Subject: [PATCH 10/24] Switch to ProtoSchema --- Cargo.lock | 1 - acvm-repo/acir/Cargo.toml | 1 - acvm-repo/acir/src/proto/conversion.rs | 118 ++++++++++++------------- utils/protobuf/src/lib.rs | 112 +++++++++-------------- 4 files changed, 100 insertions(+), 132 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af9719653a3..1fa53efe691 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,7 +15,6 @@ dependencies = [ "flate2", "flexbuffers", "fxhash", - "iter-extended", "noir_protobuf", "pprof", "prost", diff --git a/acvm-repo/acir/Cargo.toml b/acvm-repo/acir/Cargo.toml index e985e73f12c..6df19c19eb1 100644 --- a/acvm-repo/acir/Cargo.toml +++ b/acvm-repo/acir/Cargo.toml @@ -19,7 +19,6 @@ workspace = true acir_field.workspace = true brillig.workspace = true noir_protobuf.workspace = true -iter-extended.workspace = true color-eyre.workspace = true serde.workspace = true diff --git a/acvm-repo/acir/src/proto/conversion.rs b/acvm-repo/acir/src/proto/conversion.rs index b2114cf9774..9dabafabf8d 100644 --- a/acvm-repo/acir/src/proto/conversion.rs +++ b/acvm-repo/acir/src/proto/conversion.rs @@ -1,74 +1,76 @@ -use color_eyre::eyre::{self, Context}; -use iter_extended::{try_vecmap, vecmap}; -use noir_protobuf::{from_proto, to_proto, ProtoCodec}; +use std::marker::PhantomData; +use color_eyre::eyre; +use noir_protobuf::ProtoCodec; + +use crate::circuit; use crate::proto::program::Program; -impl ProtoCodec for crate::circuit::Program { - type Repr = Program; +pub struct ProtoSchema { + field: PhantomData, +} - fn encode(&self) -> Self::Repr { +impl ProtoCodec, Program> for ProtoSchema { + fn encode(value: &circuit::Program) -> Program { Program { - functions: vecmap(&self.functions, to_proto), - unconstrained_functions: vecmap(&self.unconstrained_functions, to_proto), + functions: Self::encode_vec(&value.functions), + unconstrained_functions: Self::encode_vec(&value.unconstrained_functions), } } - fn decode(value: &Self::Repr) -> eyre::Result { - Ok(Self { - functions: try_vecmap(&value.functions, from_proto).wrap_err("functions")?, - unconstrained_functions: try_vecmap(&value.unconstrained_functions, from_proto) - .wrap_err("unconstrained_functions")?, + fn decode(value: &Program) -> eyre::Result> { + Ok(circuit::Program { + functions: Self::decode_vec_msg(&value.functions, "functions")?, + unconstrained_functions: Self::decode_vec_msg( + &value.unconstrained_functions, + "unconstrained_functions", + )?, }) } } mod brillig { + use crate::circuit; use color_eyre::eyre; - use iter_extended::vecmap; - use noir_protobuf::{ - from_proto, to_proto, to_proto_repr, to_proto_repr_f, ProtoCodec, ProtoRepr, ProtoReprF, - }; + use noir_protobuf::ProtoCodec; use crate::proto::brillig::{ brillig_opcode, BinaryFieldOpKind, BinaryIntOpKind, BrilligBytecode, BrilligOpcode, IntegerBitSize, MemoryAddress, }; - impl ProtoCodec for crate::circuit::brillig::BrilligBytecode { - type Repr = BrilligBytecode; + use super::ProtoSchema; - fn encode(&self) -> Self::Repr { - BrilligBytecode { bytecode: vecmap(&self.bytecode, to_proto_repr_f) } + impl ProtoCodec, BrilligBytecode> for ProtoSchema { + fn encode(value: &circuit::brillig::BrilligBytecode) -> BrilligBytecode { + BrilligBytecode { bytecode: Self::encode_vec(&value.bytecode) } } - fn decode(value: &Self::Repr) -> eyre::Result { + fn decode(value: &BrilligBytecode) -> eyre::Result> { todo!() } } - impl ProtoReprF for BrilligOpcode { - type Type = brillig::Opcode; - - fn encode(value: &Self::Type) -> Self { + impl ProtoCodec, BrilligOpcode> for ProtoSchema { + fn encode(value: &brillig::Opcode) -> BrilligOpcode { use brillig_opcode::*; let value = match value { brillig::Opcode::BinaryFieldOp { destination, op, lhs, rhs } => { Value::BinaryFieldOp(BinaryFieldOp { - destination: Some(to_proto_repr(destination)), - op: to_proto_repr::(op).into(), - lhs: Some(to_proto_repr(lhs)), - rhs: Some(to_proto_repr(rhs)), + destination: Self::encode_some(destination), + op: Self::encode_enum(op), + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), }) } brillig::Opcode::BinaryIntOp { destination, op, bit_size, lhs, rhs } => { Value::BinaryIntOp(BinaryIntOp { - destination: Some(to_proto_repr(destination)), - op: to_proto_repr::(op).into(), - bit_size: to_proto_repr::(bit_size).into(), - lhs: Some(to_proto_repr(lhs)), - rhs: Some(to_proto_repr(rhs)), + destination: Self::encode_some(destination), + op: Self::encode_enum(op), + bit_size: Self::encode_enum(bit_size), + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), }) } brillig::Opcode::Not { destination, source, bit_size } => todo!(), @@ -105,73 +107,65 @@ mod brillig { BrilligOpcode { value: Some(value) } } - fn decode(&self) -> eyre::Result { + fn decode(value: &BrilligOpcode) -> eyre::Result> { todo!() } } - impl ProtoRepr for MemoryAddress { - type Type = brillig::MemoryAddress; - - fn encode(value: &Self::Type) -> Self { + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::MemoryAddress) -> MemoryAddress { todo!() } - fn decode(&self) -> eyre::Result { + fn decode(value: &MemoryAddress) -> eyre::Result { todo!() } } - impl ProtoRepr for BinaryFieldOpKind { - type Type = brillig::BinaryFieldOp; - - fn encode(value: &Self::Type) -> Self { + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BinaryFieldOp) -> BinaryFieldOpKind { todo!() } - fn decode(&self) -> eyre::Result { + fn decode(value: &BinaryFieldOpKind) -> eyre::Result { todo!() } } - impl ProtoRepr for BinaryIntOpKind { - type Type = brillig::BinaryIntOp; - - fn encode(value: &Self::Type) -> Self { + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BinaryIntOp) -> BinaryIntOpKind { todo!() } - fn decode(&self) -> eyre::Result { + fn decode(value: &BinaryIntOpKind) -> eyre::Result { todo!() } } - impl ProtoRepr for IntegerBitSize { - type Type = brillig::IntegerBitSize; - - fn encode(value: &Self::Type) -> Self { + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::IntegerBitSize) -> IntegerBitSize { todo!() } - fn decode(&self) -> eyre::Result { + fn decode(value: &IntegerBitSize) -> eyre::Result { todo!() } } } mod acir { - use crate::proto::acir::circuit::Circuit; + use crate::{circuit, proto::acir::circuit::Circuit}; use color_eyre::eyre; - use noir_protobuf::{from_proto, to_proto, to_proto_repr, ProtoCodec}; + use noir_protobuf::ProtoCodec; - impl ProtoCodec for crate::circuit::Circuit { - type Repr = Circuit; + use super::ProtoSchema; - fn encode(&self) -> Self::Repr { + impl ProtoCodec, Circuit> for ProtoSchema { + fn encode(value: &circuit::Circuit) -> Circuit { todo!() } - fn decode(value: &Self::Repr) -> eyre::Result { + fn decode(value: &Circuit) -> eyre::Result> { todo!() } } diff --git a/utils/protobuf/src/lib.rs b/utils/protobuf/src/lib.rs index ebee1545fd5..d64529b43f8 100644 --- a/utils/protobuf/src/lib.rs +++ b/utils/protobuf/src/lib.rs @@ -1,69 +1,45 @@ -use color_eyre::eyre; - -/// Convert a type to/from Protobuf format. -pub trait ProtoCodec: Sized { - /// The DTO type defined in the `.proto` schema representing `Self`. - type Repr: prost::Message; - /// Convert `Self` to `Repr`. - fn encode(&self) -> Self::Repr; - /// Try to convert `Repr` to `Self`. - fn decode(value: &Self::Repr) -> eyre::Result; -} - -/// Convert a Protobuf representation to/from a domain type. -/// We can use this to define protobuf mapping for types -/// defined in external crates, e.g. to place the `bar.proto` -/// definition in crate `foo`, and define the mappings from -/// `bar::proto::Bar` for `bar::Bar` in `foo::proto`. -pub trait ProtoRepr: Sized { - /// The domain type. - type Type; - /// Convert `Type` to `Self`. - fn encode(value: &Self::Type) -> Self; - /// Try to convert `Self` to `Type`. - fn decode(&self) -> eyre::Result; -} - -/// Similar to [ProtoRepr] but used when `Self::Type` is generic in the `F` field type. -pub trait ProtoReprF: Sized { - /// The domain type. - type Type; - /// Convert `Type` to `Self`. - fn encode(value: &Self::Type) -> Self; - /// Try to convert `Self` to `Type`. - fn decode(&self) -> eyre::Result; -} - -/// Convert a domain type to its protobuf representation. -pub fn to_proto(value: &T) -> T::Repr { - value.encode() -} - -/// Convert a protobuf representation into its domain type. -pub fn from_proto(value: &T::Repr) -> eyre::Result { - T::decode(value) -} - -/// Same as [to_proto] but works with [ProtoRepr]. -pub fn to_proto_repr(value: &R::Type) -> R { - R::encode(value) -} - -/// Same as [from_proto] but works with [ProtoRepr]. -pub fn from_proto_repr(value: &R) -> eyre::Result { - value.decode() -} - -/// Same as [to_proto_repr] but works with [ProtoReprF]. -pub fn to_proto_repr_f>(value: &R::Type) -> R { - R::encode(value) -} - -/// Same as [from_proto_repr] but works with [ProtoReprF]. -pub fn from_proto_repr_f>(value: &R) -> eyre::Result { - value.decode() -} - -pub fn to_proto_enum>(value: &R::Type) -> i32 { - to_proto_repr::(value).into() +use color_eyre::eyre::{self, Context}; + +/// A protobuf codec to convert between a domain type `T` +/// and its protobuf representation `R`. +/// +/// It is to be implemented on a `Self` independent of `T` and `R`, +/// so that `T` can be in a third party crate, and `Self` can be +/// generic in the `F` _field_ type as well, which would be cumbersome +/// if we had to implement traits on `R` because `T` is in another +/// crate from the schema, or to scatter the `.proto` schema around +/// so that the traits can be co-defined with `T` which is what can +/// actually be generic in `F`. +pub trait ProtoCodec { + /// Convert domain type `T` to protobuf representation `R`. + fn encode(value: &T) -> R; + /// Try to convert protobuf representation `R` to domain type `T`. + fn decode(value: &R) -> eyre::Result; + /// Decode a field and attach the name of the field if it fails. + fn decode_msg(value: &R, msg: &'static str) -> eyre::Result { + Self::decode(value).wrap_err(msg) + } + /// Encode multiple values as a vector. + fn encode_vec(values: &[T]) -> Vec { + values.iter().map(Self::encode).collect() + } + /// Decode multiple values into a vector. + fn decode_vec(values: &[R]) -> eyre::Result> { + values.iter().map(Self::decode).collect() + } + /// Decode multiple values into a vector, attaching a field name to any errors. + fn decode_vec_msg(values: &[R], msg: &'static str) -> eyre::Result> { + Self::decode_vec(values).wrap_err(msg) + } + /// Encode an optional `message` field as `Some`. + fn encode_some(value: &T) -> Option { + Some(Self::encode(value)) + } + /// Encode an `enum` to the `i32` value that `prost` represents it with. + fn encode_enum(value: &T) -> i32 + where + R: Into, + { + Self::encode(value).into() + } } From 33a32b65e57aff27fcaeb3085195749520e48d78 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 13:55:53 +0000 Subject: [PATCH 11/24] BrilligOpcode encode --- acvm-repo/acir/src/proto/brillig.proto | 8 +- acvm-repo/acir/src/proto/conversion.rs | 179 +++++++++++++++++++++---- 2 files changed, 160 insertions(+), 27 deletions(-) diff --git a/acvm-repo/acir/src/proto/brillig.proto b/acvm-repo/acir/src/proto/brillig.proto index cb608acc084..ebc05ef56f3 100644 --- a/acvm-repo/acir/src/proto/brillig.proto +++ b/acvm-repo/acir/src/proto/brillig.proto @@ -18,7 +18,7 @@ message BrilligOpcode { CalldataCopy calldata_copy = 8; Call call = 9; Const const = 10; - IndirectConst indirect_cost = 11; + IndirectConst indirect_const = 11; Return return = 12; ForeignCall foreign_call = 13; Mov mov = 14; @@ -50,7 +50,7 @@ message BrilligOpcode { message Cast { MemoryAddress destination = 1; MemoryAddress source = 2; - IntegerBitSize bit_size = 3; + BitSize bit_size = 3; } message JumpIfNot { MemoryAddress condition = 1; @@ -73,7 +73,7 @@ message BrilligOpcode { acir.native.Field value = 3; } message IndirectConst { - MemoryAddress destination = 1; + MemoryAddress destination_pointer = 1; BitSize bit_size = 2; acir.native.Field value = 3; } @@ -105,7 +105,7 @@ message BrilligOpcode { } message BlackBox { BlackBoxOp op = 1; } message Trap { HeapVector revert_data = 1; } - message Stop { HeapVector revert_data = 1; } + message Stop { HeapVector return_data = 1; } } message MemoryAddress { diff --git a/acvm-repo/acir/src/proto/conversion.rs b/acvm-repo/acir/src/proto/conversion.rs index 9dabafabf8d..9a471c1cb1e 100644 --- a/acvm-repo/acir/src/proto/conversion.rs +++ b/acvm-repo/acir/src/proto/conversion.rs @@ -1,16 +1,21 @@ use std::marker::PhantomData; +use acir_field::AcirField; use color_eyre::eyre; use noir_protobuf::ProtoCodec; use crate::circuit; +use crate::proto::acir::native::Field; use crate::proto::program::Program; -pub struct ProtoSchema { +pub(crate) struct ProtoSchema { field: PhantomData, } -impl ProtoCodec, Program> for ProtoSchema { +impl ProtoCodec, Program> for ProtoSchema +where + F: AcirField, +{ fn encode(value: &circuit::Program) -> Program { Program { functions: Self::encode_vec(&value.functions), @@ -29,8 +34,22 @@ impl ProtoCodec, Program> for ProtoSchema { } } +impl ProtoCodec for ProtoSchema { + fn encode(value: &F) -> Field { + Field { value: value.to_le_bytes() } + } + + fn decode(value: &Field) -> eyre::Result { + Ok(F::from_le_bytes_reduce(&value.value)) + } +} + mod brillig { - use crate::circuit; + use crate::{ + circuit, + proto::brillig::{BitSize, BlackBoxOp, HeapValueType, HeapVector, ValueOrArray}, + }; + use acir_field::AcirField; use color_eyre::eyre; use noir_protobuf::ProtoCodec; @@ -41,7 +60,10 @@ mod brillig { use super::ProtoSchema; - impl ProtoCodec, BrilligBytecode> for ProtoSchema { + impl ProtoCodec, BrilligBytecode> for ProtoSchema + where + F: AcirField, + { fn encode(value: &circuit::brillig::BrilligBytecode) -> BrilligBytecode { BrilligBytecode { bytecode: Self::encode_vec(&value.bytecode) } } @@ -51,7 +73,10 @@ mod brillig { } } - impl ProtoCodec, BrilligOpcode> for ProtoSchema { + impl ProtoCodec, BrilligOpcode> for ProtoSchema + where + F: AcirField, + { fn encode(value: &brillig::Opcode) -> BrilligOpcode { use brillig_opcode::*; @@ -73,36 +98,94 @@ mod brillig { rhs: Self::encode_some(rhs), }) } - brillig::Opcode::Not { destination, source, bit_size } => todo!(), - brillig::Opcode::Cast { destination, source, bit_size } => todo!(), - brillig::Opcode::JumpIfNot { condition, location } => todo!(), - brillig::Opcode::JumpIf { condition, location } => todo!(), - brillig::Opcode::Jump { location } => todo!(), + brillig::Opcode::Not { destination, source, bit_size } => Value::Not(Not { + destination: Self::encode_some(destination), + source: Self::encode_some(source), + bit_size: Self::encode_enum(bit_size), + }), + brillig::Opcode::Cast { destination, source, bit_size } => Value::Cast(Cast { + destination: Self::encode_some(destination), + source: Self::encode_some(source), + bit_size: Self::encode_some(bit_size), + }), + brillig::Opcode::JumpIfNot { condition, location } => Value::JumpIfNot(JumpIfNot { + condition: Self::encode_some(condition), + location: *location as u64, + }), + brillig::Opcode::JumpIf { condition, location } => Value::JumpIf(JumpIf { + condition: Self::encode_some(condition), + location: *location as u64, + }), + brillig::Opcode::Jump { location } => { + Value::Jump(Jump { location: *location as u64 }) + } brillig::Opcode::CalldataCopy { destination_address, size_address, offset_address, - } => todo!(), - brillig::Opcode::Call { location } => todo!(), - brillig::Opcode::Const { destination, bit_size, value } => todo!(), - brillig::Opcode::IndirectConst { destination_pointer, bit_size, value } => todo!(), - brillig::Opcode::Return => todo!(), + } => Value::CalldataCopy(CalldataCopy { + destination_address: Self::encode_some(destination_address), + size_address: Self::encode_some(size_address), + offset_address: Self::encode_some(offset_address), + }), + brillig::Opcode::Call { location } => { + Value::Call(Call { location: *location as u64 }) + } + brillig::Opcode::Const { destination, bit_size, value } => Value::Const(Const { + destination: Self::encode_some(destination), + bit_size: Self::encode_some(bit_size), + value: Self::encode_some(value), + }), + brillig::Opcode::IndirectConst { destination_pointer, bit_size, value } => { + Value::IndirectConst(IndirectConst { + destination_pointer: Self::encode_some(destination_pointer), + bit_size: Self::encode_some(bit_size), + value: Self::encode_some(value), + }) + } + brillig::Opcode::Return => Value::Return(Return {}), brillig::Opcode::ForeignCall { function, destinations, destination_value_types, inputs, input_value_types, - } => todo!(), - brillig::Opcode::Mov { destination, source } => todo!(), + } => Value::ForeignCall(ForeignCall { + function: function.to_string(), + destinations: Self::encode_vec(destinations), + destination_value_types: Self::encode_vec(destination_value_types), + inputs: Self::encode_vec(inputs), + input_value_types: Self::encode_vec(input_value_types), + }), + brillig::Opcode::Mov { destination, source } => Value::Mov(Mov { + destination: Self::encode_some(destination), + source: Self::encode_some(source), + }), brillig::Opcode::ConditionalMov { destination, source_a, source_b, condition } => { - todo!() + Value::ConditionalMov(ConditionalMov { + destination: Self::encode_some(destination), + source_a: Self::encode_some(source_a), + source_b: Self::encode_some(source_b), + condition: Self::encode_some(condition), + }) + } + brillig::Opcode::Load { destination, source_pointer } => Value::Load(Load { + destination: Self::encode_some(destination), + source_pointer: Self::encode_some(source_pointer), + }), + brillig::Opcode::Store { destination_pointer, source } => Value::Store(Store { + destination_pointer: Self::encode_some(destination_pointer), + source: Self::encode_some(source), + }), + brillig::Opcode::BlackBox(black_box_op) => { + Value::BlackBox(BlackBox { op: Self::encode_some(black_box_op) }) + } + brillig::Opcode::Trap { revert_data } => { + Value::Trap(Trap { revert_data: Self::encode_some(revert_data) }) + } + brillig::Opcode::Stop { return_data } => { + Value::Stop(Stop { return_data: Self::encode_some(return_data) }) } - brillig::Opcode::Load { destination, source_pointer } => todo!(), - brillig::Opcode::Store { destination_pointer, source } => todo!(), - brillig::Opcode::BlackBox(black_box_op) => todo!(), - brillig::Opcode::Trap { revert_data } => todo!(), - brillig::Opcode::Stop { return_data } => todo!(), }; BrilligOpcode { value: Some(value) } } @@ -151,6 +234,56 @@ mod brillig { todo!() } } + + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BitSize) -> BitSize { + todo!() + } + + fn decode(value: &BitSize) -> eyre::Result { + todo!() + } + } + + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::ValueOrArray) -> ValueOrArray { + todo!() + } + + fn decode(value: &ValueOrArray) -> eyre::Result { + todo!() + } + } + + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::HeapValueType) -> HeapValueType { + todo!() + } + + fn decode(value: &HeapValueType) -> eyre::Result { + todo!() + } + } + + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BlackBoxOp) -> BlackBoxOp { + todo!() + } + + fn decode(value: &BlackBoxOp) -> eyre::Result { + todo!() + } + } + + impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::HeapVector) -> HeapVector { + todo!() + } + + fn decode(value: &HeapVector) -> eyre::Result { + todo!() + } + } } mod acir { From f2fcc5c78a6c70ba80dc7340ac08fa163e0f8258 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 14:12:08 +0000 Subject: [PATCH 12/24] Split up conversions --- acvm-repo/acir/src/proto/conv/acir.rs | 15 ++ acvm-repo/acir/src/proto/conv/brillig.rs | 233 +++++++++++++++++ acvm-repo/acir/src/proto/conv/mod.rs | 48 ++++ acvm-repo/acir/src/proto/conversion.rs | 305 ----------------------- acvm-repo/acir/src/proto/mod.rs | 2 +- 5 files changed, 297 insertions(+), 306 deletions(-) create mode 100644 acvm-repo/acir/src/proto/conv/acir.rs create mode 100644 acvm-repo/acir/src/proto/conv/brillig.rs create mode 100644 acvm-repo/acir/src/proto/conv/mod.rs delete mode 100644 acvm-repo/acir/src/proto/conversion.rs diff --git a/acvm-repo/acir/src/proto/conv/acir.rs b/acvm-repo/acir/src/proto/conv/acir.rs new file mode 100644 index 00000000000..4a79426b736 --- /dev/null +++ b/acvm-repo/acir/src/proto/conv/acir.rs @@ -0,0 +1,15 @@ +use crate::{circuit, proto::acir::circuit::Circuit}; +use color_eyre::eyre; +use noir_protobuf::ProtoCodec; + +use super::ProtoSchema; + +impl ProtoCodec, Circuit> for ProtoSchema { + fn encode(value: &circuit::Circuit) -> Circuit { + todo!() + } + + fn decode(value: &Circuit) -> eyre::Result> { + todo!() + } +} diff --git a/acvm-repo/acir/src/proto/conv/brillig.rs b/acvm-repo/acir/src/proto/conv/brillig.rs new file mode 100644 index 00000000000..b9719ab5899 --- /dev/null +++ b/acvm-repo/acir/src/proto/conv/brillig.rs @@ -0,0 +1,233 @@ +use crate::{ + circuit, + proto::brillig::{BitSize, BlackBoxOp, HeapValueType, HeapVector, ValueOrArray}, +}; +use acir_field::AcirField; +use color_eyre::eyre; +use noir_protobuf::ProtoCodec; + +use crate::proto::brillig::{ + brillig_opcode, BinaryFieldOpKind, BinaryIntOpKind, BrilligBytecode, BrilligOpcode, + IntegerBitSize, MemoryAddress, +}; + +use super::ProtoSchema; + +impl ProtoCodec, BrilligBytecode> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &circuit::brillig::BrilligBytecode) -> BrilligBytecode { + BrilligBytecode { bytecode: Self::encode_vec(&value.bytecode) } + } + + fn decode(value: &BrilligBytecode) -> eyre::Result> { + todo!() + } +} + +impl ProtoCodec, BrilligOpcode> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &brillig::Opcode) -> BrilligOpcode { + use brillig_opcode::*; + + let value = match value { + brillig::Opcode::BinaryFieldOp { destination, op, lhs, rhs } => { + Value::BinaryFieldOp(BinaryFieldOp { + destination: Self::encode_some(destination), + op: Self::encode_enum(op), + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), + }) + } + brillig::Opcode::BinaryIntOp { destination, op, bit_size, lhs, rhs } => { + Value::BinaryIntOp(BinaryIntOp { + destination: Self::encode_some(destination), + op: Self::encode_enum(op), + bit_size: Self::encode_enum(bit_size), + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), + }) + } + brillig::Opcode::Not { destination, source, bit_size } => Value::Not(Not { + destination: Self::encode_some(destination), + source: Self::encode_some(source), + bit_size: Self::encode_enum(bit_size), + }), + brillig::Opcode::Cast { destination, source, bit_size } => Value::Cast(Cast { + destination: Self::encode_some(destination), + source: Self::encode_some(source), + bit_size: Self::encode_some(bit_size), + }), + brillig::Opcode::JumpIfNot { condition, location } => Value::JumpIfNot(JumpIfNot { + condition: Self::encode_some(condition), + location: *location as u64, + }), + brillig::Opcode::JumpIf { condition, location } => Value::JumpIf(JumpIf { + condition: Self::encode_some(condition), + location: *location as u64, + }), + brillig::Opcode::Jump { location } => Value::Jump(Jump { location: *location as u64 }), + brillig::Opcode::CalldataCopy { destination_address, size_address, offset_address } => { + Value::CalldataCopy(CalldataCopy { + destination_address: Self::encode_some(destination_address), + size_address: Self::encode_some(size_address), + offset_address: Self::encode_some(offset_address), + }) + } + brillig::Opcode::Call { location } => Value::Call(Call { location: *location as u64 }), + brillig::Opcode::Const { destination, bit_size, value } => Value::Const(Const { + destination: Self::encode_some(destination), + bit_size: Self::encode_some(bit_size), + value: Self::encode_some(value), + }), + brillig::Opcode::IndirectConst { destination_pointer, bit_size, value } => { + Value::IndirectConst(IndirectConst { + destination_pointer: Self::encode_some(destination_pointer), + bit_size: Self::encode_some(bit_size), + value: Self::encode_some(value), + }) + } + brillig::Opcode::Return => Value::Return(Return {}), + brillig::Opcode::ForeignCall { + function, + destinations, + destination_value_types, + inputs, + input_value_types, + } => Value::ForeignCall(ForeignCall { + function: function.to_string(), + destinations: Self::encode_vec(destinations), + destination_value_types: Self::encode_vec(destination_value_types), + inputs: Self::encode_vec(inputs), + input_value_types: Self::encode_vec(input_value_types), + }), + brillig::Opcode::Mov { destination, source } => Value::Mov(Mov { + destination: Self::encode_some(destination), + source: Self::encode_some(source), + }), + brillig::Opcode::ConditionalMov { destination, source_a, source_b, condition } => { + Value::ConditionalMov(ConditionalMov { + destination: Self::encode_some(destination), + source_a: Self::encode_some(source_a), + source_b: Self::encode_some(source_b), + condition: Self::encode_some(condition), + }) + } + brillig::Opcode::Load { destination, source_pointer } => Value::Load(Load { + destination: Self::encode_some(destination), + source_pointer: Self::encode_some(source_pointer), + }), + brillig::Opcode::Store { destination_pointer, source } => Value::Store(Store { + destination_pointer: Self::encode_some(destination_pointer), + source: Self::encode_some(source), + }), + brillig::Opcode::BlackBox(black_box_op) => { + Value::BlackBox(BlackBox { op: Self::encode_some(black_box_op) }) + } + brillig::Opcode::Trap { revert_data } => { + Value::Trap(Trap { revert_data: Self::encode_some(revert_data) }) + } + brillig::Opcode::Stop { return_data } => { + Value::Stop(Stop { return_data: Self::encode_some(return_data) }) + } + }; + BrilligOpcode { value: Some(value) } + } + + fn decode(value: &BrilligOpcode) -> eyre::Result> { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::MemoryAddress) -> MemoryAddress { + todo!() + } + + fn decode(value: &MemoryAddress) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BinaryFieldOp) -> BinaryFieldOpKind { + todo!() + } + + fn decode(value: &BinaryFieldOpKind) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BinaryIntOp) -> BinaryIntOpKind { + todo!() + } + + fn decode(value: &BinaryIntOpKind) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::IntegerBitSize) -> IntegerBitSize { + todo!() + } + + fn decode(value: &IntegerBitSize) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BitSize) -> BitSize { + todo!() + } + + fn decode(value: &BitSize) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::ValueOrArray) -> ValueOrArray { + todo!() + } + + fn decode(value: &ValueOrArray) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::HeapValueType) -> HeapValueType { + todo!() + } + + fn decode(value: &HeapValueType) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BlackBoxOp) -> BlackBoxOp { + todo!() + } + + fn decode(value: &BlackBoxOp) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::HeapVector) -> HeapVector { + todo!() + } + + fn decode(value: &HeapVector) -> eyre::Result { + todo!() + } +} diff --git a/acvm-repo/acir/src/proto/conv/mod.rs b/acvm-repo/acir/src/proto/conv/mod.rs new file mode 100644 index 00000000000..affff4c56e2 --- /dev/null +++ b/acvm-repo/acir/src/proto/conv/mod.rs @@ -0,0 +1,48 @@ +use std::marker::PhantomData; + +use acir_field::AcirField; +use color_eyre::eyre; +use noir_protobuf::ProtoCodec; + +use crate::circuit; +use crate::proto::acir::native::Field; +use crate::proto::program::Program; + +mod acir; +mod brillig; + +pub(crate) struct ProtoSchema { + field: PhantomData, +} + +impl ProtoCodec, Program> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &circuit::Program) -> Program { + Program { + functions: Self::encode_vec(&value.functions), + unconstrained_functions: Self::encode_vec(&value.unconstrained_functions), + } + } + + fn decode(value: &Program) -> eyre::Result> { + Ok(circuit::Program { + functions: Self::decode_vec_msg(&value.functions, "functions")?, + unconstrained_functions: Self::decode_vec_msg( + &value.unconstrained_functions, + "unconstrained_functions", + )?, + }) + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &F) -> Field { + Field { value: value.to_le_bytes() } + } + + fn decode(value: &Field) -> eyre::Result { + Ok(F::from_le_bytes_reduce(&value.value)) + } +} diff --git a/acvm-repo/acir/src/proto/conversion.rs b/acvm-repo/acir/src/proto/conversion.rs deleted file mode 100644 index 9a471c1cb1e..00000000000 --- a/acvm-repo/acir/src/proto/conversion.rs +++ /dev/null @@ -1,305 +0,0 @@ -use std::marker::PhantomData; - -use acir_field::AcirField; -use color_eyre::eyre; -use noir_protobuf::ProtoCodec; - -use crate::circuit; -use crate::proto::acir::native::Field; -use crate::proto::program::Program; - -pub(crate) struct ProtoSchema { - field: PhantomData, -} - -impl ProtoCodec, Program> for ProtoSchema -where - F: AcirField, -{ - fn encode(value: &circuit::Program) -> Program { - Program { - functions: Self::encode_vec(&value.functions), - unconstrained_functions: Self::encode_vec(&value.unconstrained_functions), - } - } - - fn decode(value: &Program) -> eyre::Result> { - Ok(circuit::Program { - functions: Self::decode_vec_msg(&value.functions, "functions")?, - unconstrained_functions: Self::decode_vec_msg( - &value.unconstrained_functions, - "unconstrained_functions", - )?, - }) - } -} - -impl ProtoCodec for ProtoSchema { - fn encode(value: &F) -> Field { - Field { value: value.to_le_bytes() } - } - - fn decode(value: &Field) -> eyre::Result { - Ok(F::from_le_bytes_reduce(&value.value)) - } -} - -mod brillig { - use crate::{ - circuit, - proto::brillig::{BitSize, BlackBoxOp, HeapValueType, HeapVector, ValueOrArray}, - }; - use acir_field::AcirField; - use color_eyre::eyre; - use noir_protobuf::ProtoCodec; - - use crate::proto::brillig::{ - brillig_opcode, BinaryFieldOpKind, BinaryIntOpKind, BrilligBytecode, BrilligOpcode, - IntegerBitSize, MemoryAddress, - }; - - use super::ProtoSchema; - - impl ProtoCodec, BrilligBytecode> for ProtoSchema - where - F: AcirField, - { - fn encode(value: &circuit::brillig::BrilligBytecode) -> BrilligBytecode { - BrilligBytecode { bytecode: Self::encode_vec(&value.bytecode) } - } - - fn decode(value: &BrilligBytecode) -> eyre::Result> { - todo!() - } - } - - impl ProtoCodec, BrilligOpcode> for ProtoSchema - where - F: AcirField, - { - fn encode(value: &brillig::Opcode) -> BrilligOpcode { - use brillig_opcode::*; - - let value = match value { - brillig::Opcode::BinaryFieldOp { destination, op, lhs, rhs } => { - Value::BinaryFieldOp(BinaryFieldOp { - destination: Self::encode_some(destination), - op: Self::encode_enum(op), - lhs: Self::encode_some(lhs), - rhs: Self::encode_some(rhs), - }) - } - brillig::Opcode::BinaryIntOp { destination, op, bit_size, lhs, rhs } => { - Value::BinaryIntOp(BinaryIntOp { - destination: Self::encode_some(destination), - op: Self::encode_enum(op), - bit_size: Self::encode_enum(bit_size), - lhs: Self::encode_some(lhs), - rhs: Self::encode_some(rhs), - }) - } - brillig::Opcode::Not { destination, source, bit_size } => Value::Not(Not { - destination: Self::encode_some(destination), - source: Self::encode_some(source), - bit_size: Self::encode_enum(bit_size), - }), - brillig::Opcode::Cast { destination, source, bit_size } => Value::Cast(Cast { - destination: Self::encode_some(destination), - source: Self::encode_some(source), - bit_size: Self::encode_some(bit_size), - }), - brillig::Opcode::JumpIfNot { condition, location } => Value::JumpIfNot(JumpIfNot { - condition: Self::encode_some(condition), - location: *location as u64, - }), - brillig::Opcode::JumpIf { condition, location } => Value::JumpIf(JumpIf { - condition: Self::encode_some(condition), - location: *location as u64, - }), - brillig::Opcode::Jump { location } => { - Value::Jump(Jump { location: *location as u64 }) - } - brillig::Opcode::CalldataCopy { - destination_address, - size_address, - offset_address, - } => Value::CalldataCopy(CalldataCopy { - destination_address: Self::encode_some(destination_address), - size_address: Self::encode_some(size_address), - offset_address: Self::encode_some(offset_address), - }), - brillig::Opcode::Call { location } => { - Value::Call(Call { location: *location as u64 }) - } - brillig::Opcode::Const { destination, bit_size, value } => Value::Const(Const { - destination: Self::encode_some(destination), - bit_size: Self::encode_some(bit_size), - value: Self::encode_some(value), - }), - brillig::Opcode::IndirectConst { destination_pointer, bit_size, value } => { - Value::IndirectConst(IndirectConst { - destination_pointer: Self::encode_some(destination_pointer), - bit_size: Self::encode_some(bit_size), - value: Self::encode_some(value), - }) - } - brillig::Opcode::Return => Value::Return(Return {}), - brillig::Opcode::ForeignCall { - function, - destinations, - destination_value_types, - inputs, - input_value_types, - } => Value::ForeignCall(ForeignCall { - function: function.to_string(), - destinations: Self::encode_vec(destinations), - destination_value_types: Self::encode_vec(destination_value_types), - inputs: Self::encode_vec(inputs), - input_value_types: Self::encode_vec(input_value_types), - }), - brillig::Opcode::Mov { destination, source } => Value::Mov(Mov { - destination: Self::encode_some(destination), - source: Self::encode_some(source), - }), - brillig::Opcode::ConditionalMov { destination, source_a, source_b, condition } => { - Value::ConditionalMov(ConditionalMov { - destination: Self::encode_some(destination), - source_a: Self::encode_some(source_a), - source_b: Self::encode_some(source_b), - condition: Self::encode_some(condition), - }) - } - brillig::Opcode::Load { destination, source_pointer } => Value::Load(Load { - destination: Self::encode_some(destination), - source_pointer: Self::encode_some(source_pointer), - }), - brillig::Opcode::Store { destination_pointer, source } => Value::Store(Store { - destination_pointer: Self::encode_some(destination_pointer), - source: Self::encode_some(source), - }), - brillig::Opcode::BlackBox(black_box_op) => { - Value::BlackBox(BlackBox { op: Self::encode_some(black_box_op) }) - } - brillig::Opcode::Trap { revert_data } => { - Value::Trap(Trap { revert_data: Self::encode_some(revert_data) }) - } - brillig::Opcode::Stop { return_data } => { - Value::Stop(Stop { return_data: Self::encode_some(return_data) }) - } - }; - BrilligOpcode { value: Some(value) } - } - - fn decode(value: &BrilligOpcode) -> eyre::Result> { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::MemoryAddress) -> MemoryAddress { - todo!() - } - - fn decode(value: &MemoryAddress) -> eyre::Result { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::BinaryFieldOp) -> BinaryFieldOpKind { - todo!() - } - - fn decode(value: &BinaryFieldOpKind) -> eyre::Result { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::BinaryIntOp) -> BinaryIntOpKind { - todo!() - } - - fn decode(value: &BinaryIntOpKind) -> eyre::Result { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::IntegerBitSize) -> IntegerBitSize { - todo!() - } - - fn decode(value: &IntegerBitSize) -> eyre::Result { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::BitSize) -> BitSize { - todo!() - } - - fn decode(value: &BitSize) -> eyre::Result { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::ValueOrArray) -> ValueOrArray { - todo!() - } - - fn decode(value: &ValueOrArray) -> eyre::Result { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::HeapValueType) -> HeapValueType { - todo!() - } - - fn decode(value: &HeapValueType) -> eyre::Result { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::BlackBoxOp) -> BlackBoxOp { - todo!() - } - - fn decode(value: &BlackBoxOp) -> eyre::Result { - todo!() - } - } - - impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::HeapVector) -> HeapVector { - todo!() - } - - fn decode(value: &HeapVector) -> eyre::Result { - todo!() - } - } -} - -mod acir { - use crate::{circuit, proto::acir::circuit::Circuit}; - use color_eyre::eyre; - use noir_protobuf::ProtoCodec; - - use super::ProtoSchema; - - impl ProtoCodec, Circuit> for ProtoSchema { - fn encode(value: &circuit::Circuit) -> Circuit { - todo!() - } - - fn decode(value: &Circuit) -> eyre::Result> { - todo!() - } - } -} diff --git a/acvm-repo/acir/src/proto/mod.rs b/acvm-repo/acir/src/proto/mod.rs index 409068bd765..7ec5e94bcc9 100644 --- a/acvm-repo/acir/src/proto/mod.rs +++ b/acvm-repo/acir/src/proto/mod.rs @@ -1,4 +1,4 @@ -mod conversion; +mod conv; pub(crate) mod acir { From 0734118903ec0b5b0dc60b9d2e68bc2069128e8a Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 14:37:28 +0000 Subject: [PATCH 13/24] Encoder for usize --- acvm-repo/acir/src/proto/brillig.proto | 22 ++--- acvm-repo/acir/src/proto/conv/brillig.rs | 115 +++++++++++++++++++---- acvm-repo/acir/src/proto/conv/mod.rs | 12 ++- 3 files changed, 120 insertions(+), 29 deletions(-) diff --git a/acvm-repo/acir/src/proto/brillig.proto b/acvm-repo/acir/src/proto/brillig.proto index ebc05ef56f3..dec3df6559d 100644 --- a/acvm-repo/acir/src/proto/brillig.proto +++ b/acvm-repo/acir/src/proto/brillig.proto @@ -125,7 +125,7 @@ message ValueOrArray { message HeapArray { MemoryAddress pointer = 1; - MemoryAddress size = 2; + uint64 size = 2; } message HeapVector { @@ -152,10 +152,10 @@ enum BinaryFieldOpKind { BFO_SUB = 2; BFO_MUL = 3; BFO_DIV = 4; - BFO_INT_DIV = 5; - BFO_EQ = 6; - BFO_LT = 7; - BFO_LTE = 8; + BFO_INTEGER_DIV = 5; + BFO_EQUALS = 6; + BFO_LESS_THAN = 7; + BFO_LESS_THAN_EQUALS = 8; } enum BinaryIntOpKind { @@ -164,10 +164,10 @@ enum BinaryIntOpKind { BIO_SUB = 2; BIO_MUL = 3; BIO_DIV = 4; - BIO_INT_DIV = 5; - BIO_EQ = 6; - BIO_LT = 7; - BIO_LTE = 8; + BIO_INTEGER_DIV = 5; + BIO_EQUALS = 6; + BIO_LESS_THAN = 7; + BIO_LESS_THAN_EQUALS = 8; BIO_AND = 9; BIO_OR = 10; BIO_XOR = 11; @@ -187,10 +187,10 @@ enum IntegerBitSize { message BitSize { oneof value { - FieldSize field = 1; + Field field = 1; IntegerBitSize integer = 2; } - message FieldSize {} + message Field {} } message BlackBoxOp { diff --git a/acvm-repo/acir/src/proto/conv/brillig.rs b/acvm-repo/acir/src/proto/conv/brillig.rs index b9719ab5899..5d0338eb386 100644 --- a/acvm-repo/acir/src/proto/conv/brillig.rs +++ b/acvm-repo/acir/src/proto/conv/brillig.rs @@ -1,6 +1,6 @@ use crate::{ circuit, - proto::brillig::{BitSize, BlackBoxOp, HeapValueType, HeapVector, ValueOrArray}, + proto::brillig::{BitSize, BlackBoxOp, HeapArray, HeapValueType, HeapVector, ValueOrArray}, }; use acir_field::AcirField; use color_eyre::eyre; @@ -63,13 +63,15 @@ where }), brillig::Opcode::JumpIfNot { condition, location } => Value::JumpIfNot(JumpIfNot { condition: Self::encode_some(condition), - location: *location as u64, + location: Self::encode(location), }), brillig::Opcode::JumpIf { condition, location } => Value::JumpIf(JumpIf { condition: Self::encode_some(condition), - location: *location as u64, + location: Self::encode(location), }), - brillig::Opcode::Jump { location } => Value::Jump(Jump { location: *location as u64 }), + brillig::Opcode::Jump { location } => { + Value::Jump(Jump { location: Self::encode(location) }) + } brillig::Opcode::CalldataCopy { destination_address, size_address, offset_address } => { Value::CalldataCopy(CalldataCopy { destination_address: Self::encode_some(destination_address), @@ -77,7 +79,9 @@ where offset_address: Self::encode_some(offset_address), }) } - brillig::Opcode::Call { location } => Value::Call(Call { location: *location as u64 }), + brillig::Opcode::Call { location } => { + Value::Call(Call { location: Self::encode(location) }) + } brillig::Opcode::Const { destination, bit_size, value } => Value::Const(Const { destination: Self::encode_some(destination), bit_size: Self::encode_some(bit_size), @@ -144,7 +148,12 @@ where impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::MemoryAddress) -> MemoryAddress { - todo!() + use crate::proto::brillig::memory_address::*; + let value = match value { + brillig::MemoryAddress::Direct(addr) => Value::Direct(Self::encode(addr)), + brillig::MemoryAddress::Relative(addr) => Value::Relative(Self::encode(addr)), + }; + MemoryAddress { value: Some(value) } } fn decode(value: &MemoryAddress) -> eyre::Result { @@ -154,7 +163,16 @@ impl ProtoCodec for ProtoSchema { impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::BinaryFieldOp) -> BinaryFieldOpKind { - todo!() + match value { + brillig::BinaryFieldOp::Add => BinaryFieldOpKind::BfoAdd, + brillig::BinaryFieldOp::Sub => BinaryFieldOpKind::BfoSub, + brillig::BinaryFieldOp::Mul => BinaryFieldOpKind::BfoMul, + brillig::BinaryFieldOp::Div => BinaryFieldOpKind::BfoDiv, + brillig::BinaryFieldOp::IntegerDiv => BinaryFieldOpKind::BfoIntegerDiv, + brillig::BinaryFieldOp::Equals => BinaryFieldOpKind::BfoEquals, + brillig::BinaryFieldOp::LessThan => BinaryFieldOpKind::BfoLessThan, + brillig::BinaryFieldOp::LessThanEquals => BinaryFieldOpKind::BfoLessThanEquals, + } } fn decode(value: &BinaryFieldOpKind) -> eyre::Result { @@ -164,7 +182,20 @@ impl ProtoCodec for ProtoSchema impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::BinaryIntOp) -> BinaryIntOpKind { - todo!() + match value { + brillig::BinaryIntOp::Add => BinaryIntOpKind::BioAdd, + brillig::BinaryIntOp::Sub => BinaryIntOpKind::BioSub, + brillig::BinaryIntOp::Mul => BinaryIntOpKind::BioMul, + brillig::BinaryIntOp::Div => BinaryIntOpKind::BioDiv, + brillig::BinaryIntOp::Equals => BinaryIntOpKind::BioEquals, + brillig::BinaryIntOp::LessThan => BinaryIntOpKind::BioLessThan, + brillig::BinaryIntOp::LessThanEquals => BinaryIntOpKind::BioLessThanEquals, + brillig::BinaryIntOp::And => BinaryIntOpKind::BioAnd, + brillig::BinaryIntOp::Or => BinaryIntOpKind::BioOr, + brillig::BinaryIntOp::Xor => BinaryIntOpKind::BioXor, + brillig::BinaryIntOp::Shl => BinaryIntOpKind::BioShl, + brillig::BinaryIntOp::Shr => BinaryIntOpKind::BioShr, + } } fn decode(value: &BinaryIntOpKind) -> eyre::Result { @@ -174,7 +205,14 @@ impl ProtoCodec for ProtoSchema { impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::IntegerBitSize) -> IntegerBitSize { - todo!() + match value { + brillig::IntegerBitSize::U1 => IntegerBitSize::IbsU1, + brillig::IntegerBitSize::U8 => IntegerBitSize::IbsU8, + brillig::IntegerBitSize::U16 => IntegerBitSize::IbsU16, + brillig::IntegerBitSize::U32 => IntegerBitSize::IbsU32, + brillig::IntegerBitSize::U64 => IntegerBitSize::IbsU64, + brillig::IntegerBitSize::U128 => IntegerBitSize::IbsU128, + } } fn decode(value: &IntegerBitSize) -> eyre::Result { @@ -184,7 +222,14 @@ impl ProtoCodec for ProtoSchema { impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::BitSize) -> BitSize { - todo!() + use crate::proto::brillig::bit_size::*; + let value = match value { + brillig::BitSize::Field => Value::Field(Field {}), + brillig::BitSize::Integer(integer_bit_size) => { + Value::Integer(Self::encode_enum(integer_bit_size)) + } + }; + BitSize { value: Some(value) } } fn decode(value: &BitSize) -> eyre::Result { @@ -194,7 +239,19 @@ impl ProtoCodec for ProtoSchema { impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::ValueOrArray) -> ValueOrArray { - todo!() + use crate::proto::brillig::value_or_array::*; + let value = match value { + brillig::ValueOrArray::MemoryAddress(memory_address) => { + Value::MemoryAddress(Self::encode(memory_address)) + } + brillig::ValueOrArray::HeapArray(heap_array) => { + Value::HeapArray(Self::encode(heap_array)) + } + brillig::ValueOrArray::HeapVector(heap_vector) => { + Value::HeapVector(Self::encode(heap_vector)) + } + }; + ValueOrArray { value: Some(value) } } fn decode(value: &ValueOrArray) -> eyre::Result { @@ -204,7 +261,18 @@ impl ProtoCodec for ProtoSchema { impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::HeapValueType) -> HeapValueType { - todo!() + use crate::proto::brillig::heap_value_type::*; + let value = match value { + brillig::HeapValueType::Simple(bit_size) => Value::Simple(Self::encode(bit_size)), + brillig::HeapValueType::Array { value_types, size } => Value::Array(Array { + value_types: Self::encode_vec(value_types), + size: *size as u64, + }), + brillig::HeapValueType::Vector { value_types } => { + Value::Vector(Vector { value_types: Self::encode_vec(value_types) }) + } + }; + HeapValueType { value: Some(value) } } fn decode(value: &HeapValueType) -> eyre::Result { @@ -212,22 +280,35 @@ impl ProtoCodec for ProtoSchema { } } -impl ProtoCodec for ProtoSchema { - fn encode(value: &brillig::BlackBoxOp) -> BlackBoxOp { - todo!() +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::HeapArray) -> HeapArray { + HeapArray { pointer: Self::encode_some(&value.pointer), size: Self::encode(&value.size) } } - fn decode(value: &BlackBoxOp) -> eyre::Result { + fn decode(value: &HeapArray) -> eyre::Result { todo!() } } impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::HeapVector) -> HeapVector { - todo!() + HeapVector { + pointer: Self::encode_some(&value.pointer), + size: Self::encode_some(&value.size), + } } fn decode(value: &HeapVector) -> eyre::Result { todo!() } } + +impl ProtoCodec for ProtoSchema { + fn encode(value: &brillig::BlackBoxOp) -> BlackBoxOp { + todo!() + } + + fn decode(value: &BlackBoxOp) -> eyre::Result { + todo!() + } +} diff --git a/acvm-repo/acir/src/proto/conv/mod.rs b/acvm-repo/acir/src/proto/conv/mod.rs index affff4c56e2..a80a55ee24e 100644 --- a/acvm-repo/acir/src/proto/conv/mod.rs +++ b/acvm-repo/acir/src/proto/conv/mod.rs @@ -1,7 +1,7 @@ use std::marker::PhantomData; use acir_field::AcirField; -use color_eyre::eyre; +use color_eyre::eyre::{self, Context}; use noir_protobuf::ProtoCodec; use crate::circuit; @@ -46,3 +46,13 @@ impl ProtoCodec for ProtoSchema { Ok(F::from_le_bytes_reduce(&value.value)) } } + +impl ProtoCodec for ProtoSchema { + fn encode(value: &usize) -> u64 { + *value as u64 + } + + fn decode(value: &u64) -> eyre::Result { + (*value).try_into().wrap_err("failed to convert u64 to usize") + } +} From a2494c26803ea47cfc96bd4f38d63a0c27898ace Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 14:49:34 +0000 Subject: [PATCH 14/24] All brillig encoding --- acvm-repo/acir/src/proto/conv/brillig.rs | 183 +++++++++++++++++++---- 1 file changed, 158 insertions(+), 25 deletions(-) diff --git a/acvm-repo/acir/src/proto/conv/brillig.rs b/acvm-repo/acir/src/proto/conv/brillig.rs index 5d0338eb386..d04269fea8f 100644 --- a/acvm-repo/acir/src/proto/conv/brillig.rs +++ b/acvm-repo/acir/src/proto/conv/brillig.rs @@ -21,8 +21,8 @@ where BrilligBytecode { bytecode: Self::encode_vec(&value.bytecode) } } - fn decode(value: &BrilligBytecode) -> eyre::Result> { - todo!() + fn decode(_value: &BrilligBytecode) -> eyre::Result> { + todo!("decode") } } @@ -141,8 +141,8 @@ where BrilligOpcode { value: Some(value) } } - fn decode(value: &BrilligOpcode) -> eyre::Result> { - todo!() + fn decode(_value: &BrilligOpcode) -> eyre::Result> { + todo!("decode") } } @@ -156,8 +156,8 @@ impl ProtoCodec for ProtoSchema { MemoryAddress { value: Some(value) } } - fn decode(value: &MemoryAddress) -> eyre::Result { - todo!() + fn decode(_value: &MemoryAddress) -> eyre::Result { + todo!("decode") } } @@ -175,8 +175,8 @@ impl ProtoCodec for ProtoSchema } } - fn decode(value: &BinaryFieldOpKind) -> eyre::Result { - todo!() + fn decode(_value: &BinaryFieldOpKind) -> eyre::Result { + todo!("decode") } } @@ -198,8 +198,8 @@ impl ProtoCodec for ProtoSchema { } } - fn decode(value: &BinaryIntOpKind) -> eyre::Result { - todo!() + fn decode(_value: &BinaryIntOpKind) -> eyre::Result { + todo!("decode") } } @@ -215,8 +215,8 @@ impl ProtoCodec for ProtoSchema { } } - fn decode(value: &IntegerBitSize) -> eyre::Result { - todo!() + fn decode(_value: &IntegerBitSize) -> eyre::Result { + todo!("decode") } } @@ -232,8 +232,8 @@ impl ProtoCodec for ProtoSchema { BitSize { value: Some(value) } } - fn decode(value: &BitSize) -> eyre::Result { - todo!() + fn decode(_value: &BitSize) -> eyre::Result { + todo!("decode") } } @@ -254,8 +254,8 @@ impl ProtoCodec for ProtoSchema { ValueOrArray { value: Some(value) } } - fn decode(value: &ValueOrArray) -> eyre::Result { - todo!() + fn decode(_value: &ValueOrArray) -> eyre::Result { + todo!("decode") } } @@ -275,8 +275,8 @@ impl ProtoCodec for ProtoSchema { HeapValueType { value: Some(value) } } - fn decode(value: &HeapValueType) -> eyre::Result { - todo!() + fn decode(_value: &HeapValueType) -> eyre::Result { + todo!("decode") } } @@ -285,8 +285,8 @@ impl ProtoCodec for ProtoSchema { HeapArray { pointer: Self::encode_some(&value.pointer), size: Self::encode(&value.size) } } - fn decode(value: &HeapArray) -> eyre::Result { - todo!() + fn decode(_value: &HeapArray) -> eyre::Result { + todo!("decode") } } @@ -298,17 +298,150 @@ impl ProtoCodec for ProtoSchema { } } - fn decode(value: &HeapVector) -> eyre::Result { - todo!() + fn decode(_value: &HeapVector) -> eyre::Result { + todo!("decode") } } impl ProtoCodec for ProtoSchema { fn encode(value: &brillig::BlackBoxOp) -> BlackBoxOp { - todo!() + use crate::proto::brillig::black_box_op::*; + let value = match value { + brillig::BlackBoxOp::AES128Encrypt { inputs, iv, key, outputs } => { + Value::Aes128Encrypt(Aes128Encrypt { + inputs: Self::encode_some(inputs), + iv: Self::encode_some(iv), + key: Self::encode_some(key), + outputs: Self::encode_some(outputs), + }) + } + brillig::BlackBoxOp::Blake2s { message, output } => Value::Blake2s(Blake2s { + message: Self::encode_some(message), + output: Self::encode_some(output), + }), + brillig::BlackBoxOp::Blake3 { message, output } => Value::Blake3(Blake3 { + message: Self::encode_some(message), + output: Self::encode_some(output), + }), + brillig::BlackBoxOp::Keccakf1600 { input, output } => Value::KeccakF1600(Keccakf1600 { + input: Self::encode_some(input), + output: Self::encode_some(output), + }), + brillig::BlackBoxOp::EcdsaSecp256k1 { + hashed_msg, + public_key_x, + public_key_y, + signature, + result, + } => Value::EcdsaSecp256k1(EcdsaSecp256k1 { + hashed_msg: Self::encode_some(hashed_msg), + public_key_x: Self::encode_some(public_key_x), + public_key_y: Self::encode_some(public_key_y), + signature: Self::encode_some(signature), + result: Self::encode_some(result), + }), + brillig::BlackBoxOp::EcdsaSecp256r1 { + hashed_msg, + public_key_x, + public_key_y, + signature, + result, + } => Value::EcdsaSecp256r1(EcdsaSecp256r1 { + hashed_msg: Self::encode_some(hashed_msg), + public_key_x: Self::encode_some(public_key_x), + public_key_y: Self::encode_some(public_key_y), + signature: Self::encode_some(signature), + result: Self::encode_some(result), + }), + brillig::BlackBoxOp::MultiScalarMul { points, scalars, outputs } => { + Value::MultiScalarMul(MultiScalarMul { + points: Self::encode_some(points), + scalars: Self::encode_some(scalars), + outputs: Self::encode_some(outputs), + }) + } + brillig::BlackBoxOp::EmbeddedCurveAdd { + input1_x, + input1_y, + input1_infinite, + input2_x, + input2_y, + input2_infinite, + result, + } => Value::EmbeddedCurveAdd(EmbeddedCurveAdd { + input1_x: Self::encode_some(input1_x), + input1_y: Self::encode_some(input1_y), + input1_infinite: Self::encode_some(input1_infinite), + input2_x: Self::encode_some(input2_x), + input2_y: Self::encode_some(input2_y), + input2_infinite: Self::encode_some(input2_infinite), + result: Self::encode_some(result), + }), + brillig::BlackBoxOp::BigIntAdd { lhs, rhs, output } => Value::BigIntAdd(BigIntAdd { + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), + output: Self::encode_some(output), + }), + brillig::BlackBoxOp::BigIntSub { lhs, rhs, output } => Value::BigIntSub(BigIntSub { + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), + output: Self::encode_some(output), + }), + brillig::BlackBoxOp::BigIntMul { lhs, rhs, output } => Value::BigIntMul(BigIntMul { + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), + output: Self::encode_some(output), + }), + brillig::BlackBoxOp::BigIntDiv { lhs, rhs, output } => Value::BigIntDiv(BigIntDiv { + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), + output: Self::encode_some(output), + }), + brillig::BlackBoxOp::BigIntFromLeBytes { inputs, modulus, output } => { + Value::BigIntFromLeBytes(BigIntFromLeBytes { + inputs: Self::encode_some(inputs), + modulus: Self::encode_some(modulus), + output: Self::encode_some(output), + }) + } + brillig::BlackBoxOp::BigIntToLeBytes { input, output } => { + Value::BigIntToLeBytes(BigIntToLeBytes { + input: Self::encode_some(input), + output: Self::encode_some(output), + }) + } + brillig::BlackBoxOp::Poseidon2Permutation { message, output, len } => { + Value::Poseidon2Permutation(Poseidon2Permutation { + message: Self::encode_some(message), + output: Self::encode_some(output), + len: Self::encode_some(len), + }) + } + brillig::BlackBoxOp::Sha256Compression { input, hash_values, output } => { + Value::Sha256Compression(Sha256Compression { + input: Self::encode_some(input), + hash_values: Self::encode_some(hash_values), + output: Self::encode_some(output), + }) + } + brillig::BlackBoxOp::ToRadix { + input, + radix, + output_pointer, + num_limbs, + output_bits, + } => Value::ToRadix(ToRadix { + input: Self::encode_some(input), + radix: Self::encode_some(radix), + output_pointer: Self::encode_some(output_pointer), + num_limbs: Self::encode_some(num_limbs), + output_bits: Self::encode_some(output_bits), + }), + }; + BlackBoxOp { value: Some(value) } } - fn decode(value: &BlackBoxOp) -> eyre::Result { - todo!() + fn decode(_value: &BlackBoxOp) -> eyre::Result { + todo!("decode") } } From f96c33e908e55ebab386bad58cd93025fe20d612 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 15:52:36 +0000 Subject: [PATCH 15/24] Separate native. Work with IntoIterator --- acvm-repo/acir/src/proto/conv/acir.rs | 49 ++++++++++++++++++++++++- acvm-repo/acir/src/proto/conv/mod.rs | 12 +----- acvm-repo/acir/src/proto/conv/native.rs | 30 +++++++++++++++ utils/protobuf/src/lib.rs | 8 +++- 4 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 acvm-repo/acir/src/proto/conv/native.rs diff --git a/acvm-repo/acir/src/proto/conv/acir.rs b/acvm-repo/acir/src/proto/conv/acir.rs index 4a79426b736..8dfc7d9432d 100644 --- a/acvm-repo/acir/src/proto/conv/acir.rs +++ b/acvm-repo/acir/src/proto/conv/acir.rs @@ -1,4 +1,7 @@ -use crate::{circuit, proto::acir::circuit::Circuit}; +use crate::{ + circuit, + proto::acir::circuit::{AssertMessage, Circuit, ExpressionWidth, Opcode}, +}; use color_eyre::eyre; use noir_protobuf::ProtoCodec; @@ -6,10 +9,52 @@ use super::ProtoSchema; impl ProtoCodec, Circuit> for ProtoSchema { fn encode(value: &circuit::Circuit) -> Circuit { - todo!() + Circuit { + current_witness_index: value.current_witness_index, + opcodes: Self::encode_vec(&value.opcodes), + expression_width: Self::encode_some(&value.expression_width), + private_parameters: Self::encode_vec(value.private_parameters.iter()), + public_parameters: Self::encode_vec(value.public_parameters.0.iter()), + return_values: Self::encode_vec(value.return_values.0.iter()), + assert_messages: Self::encode_vec(&value.assert_messages), + } } fn decode(value: &Circuit) -> eyre::Result> { todo!() } } + +impl ProtoCodec, Opcode> for ProtoSchema { + fn encode(value: &circuit::Opcode) -> Opcode { + todo!() + } + + fn decode(value: &Opcode) -> eyre::Result> { + todo!() + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &circuit::ExpressionWidth) -> ExpressionWidth { + todo!() + } + + fn decode(value: &ExpressionWidth) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec<(circuit::OpcodeLocation, circuit::AssertionPayload), AssertMessage> + for ProtoSchema +{ + fn encode(value: &(circuit::OpcodeLocation, circuit::AssertionPayload)) -> AssertMessage { + todo!() + } + + fn decode( + value: &AssertMessage, + ) -> eyre::Result<(circuit::OpcodeLocation, circuit::AssertionPayload)> { + todo!() + } +} diff --git a/acvm-repo/acir/src/proto/conv/mod.rs b/acvm-repo/acir/src/proto/conv/mod.rs index a80a55ee24e..2cae6cce18b 100644 --- a/acvm-repo/acir/src/proto/conv/mod.rs +++ b/acvm-repo/acir/src/proto/conv/mod.rs @@ -5,11 +5,11 @@ use color_eyre::eyre::{self, Context}; use noir_protobuf::ProtoCodec; use crate::circuit; -use crate::proto::acir::native::Field; use crate::proto::program::Program; mod acir; mod brillig; +mod native; pub(crate) struct ProtoSchema { field: PhantomData, @@ -37,16 +37,6 @@ where } } -impl ProtoCodec for ProtoSchema { - fn encode(value: &F) -> Field { - Field { value: value.to_le_bytes() } - } - - fn decode(value: &Field) -> eyre::Result { - Ok(F::from_le_bytes_reduce(&value.value)) - } -} - impl ProtoCodec for ProtoSchema { fn encode(value: &usize) -> u64 { *value as u64 diff --git a/acvm-repo/acir/src/proto/conv/native.rs b/acvm-repo/acir/src/proto/conv/native.rs new file mode 100644 index 00000000000..d75c0de3dae --- /dev/null +++ b/acvm-repo/acir/src/proto/conv/native.rs @@ -0,0 +1,30 @@ +use acir_field::AcirField; +use color_eyre::eyre; +use noir_protobuf::ProtoCodec; + +use crate::{ + native_types, + proto::acir::native::{Field, Witness}, +}; + +use super::ProtoSchema; + +impl ProtoCodec for ProtoSchema { + fn encode(value: &F) -> Field { + Field { value: value.to_le_bytes() } + } + + fn decode(value: &Field) -> eyre::Result { + Ok(F::from_le_bytes_reduce(&value.value)) + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &native_types::Witness) -> Witness { + Witness { index: value.0 } + } + + fn decode(value: &Witness) -> eyre::Result { + Ok(native_types::Witness(value.index)) + } +} diff --git a/utils/protobuf/src/lib.rs b/utils/protobuf/src/lib.rs index d64529b43f8..7470cefed6e 100644 --- a/utils/protobuf/src/lib.rs +++ b/utils/protobuf/src/lib.rs @@ -20,8 +20,12 @@ pub trait ProtoCodec { Self::decode(value).wrap_err(msg) } /// Encode multiple values as a vector. - fn encode_vec(values: &[T]) -> Vec { - values.iter().map(Self::encode).collect() + fn encode_vec<'a, I>(values: I) -> Vec + where + I: IntoIterator, + T: 'a, + { + values.into_iter().map(Self::encode).collect() } /// Decode multiple values into a vector. fn decode_vec(values: &[R]) -> eyre::Result> { From d4e87455804dc402f841b7e9a7e5334114e79555 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 16:54:18 +0000 Subject: [PATCH 16/24] Move Expression to native --- acvm-repo/acir/src/proto/acir/circuit.proto | 37 ++--- acvm-repo/acir/src/proto/acir/native.proto | 18 +++ acvm-repo/acir/src/proto/conv/acir.rs | 148 ++++++++++++++++++-- acvm-repo/acir/src/proto/conv/native.rs | 35 ++++- 4 files changed, 196 insertions(+), 42 deletions(-) diff --git a/acvm-repo/acir/src/proto/acir/circuit.proto b/acvm-repo/acir/src/proto/acir/circuit.proto index e93060c3222..8f7f0add41e 100644 --- a/acvm-repo/acir/src/proto/acir/circuit.proto +++ b/acvm-repo/acir/src/proto/acir/circuit.proto @@ -46,31 +46,14 @@ message AssertionPayload { message ExpressionOrMemory { oneof value { - Expression expression = 1; + native.Expression expression = 1; uint32 memory = 2; } } -message Expression { - repeated MulTerm mul_terms = 1; - repeated LinearCombination linear_combinations = 2; - native.Field q_c = 3; - - message MulTerm { - native.Field q_m = 1; - native.Witness witness_left = 2; - native.Witness witness_right = 3; - } - - message LinearCombination { - native.Field q_l = 1; - native.Witness witness = 2; - } -} - message Opcode { oneof value { - Expression assert_zero = 1; + native.Expression assert_zero = 1; BlackBoxFuncCall blackbox_func_call = 2; MemoryOp memory_op = 3; MemoryInit memory_init = 4; @@ -80,7 +63,7 @@ message Opcode { message MemoryOp { uint32 block_id = 1; MemOp op = 2; - optional Expression predicate = 3; + optional native.Expression predicate = 3; } message MemoryInit { uint32 block_id = 1; @@ -91,13 +74,13 @@ message Opcode { uint32 id = 1; repeated BrilligInputs inputs = 2; repeated BrilligOutputs outputs = 3; - optional Expression predicate = 4; + optional native.Expression predicate = 4; } message Call { uint32 id = 1; repeated native.Witness inputs = 2; repeated native.Witness outputs = 3; - optional Expression predicate = 4; + optional native.Expression predicate = 4; } } @@ -238,9 +221,9 @@ message ConstantOrWitnessEnum { } message MemOp { - Expression operation = 1; - Expression index = 2; - Expression value = 3; + native.Expression operation = 1; + native.Expression index = 2; + native.Expression value = 3; } message BlockType { @@ -256,11 +239,11 @@ message BlockType { message BrilligInputs { oneof value { - Expression single = 1; + native.Expression single = 1; Array array = 2; uint32 memory_array = 3; } - message Array { repeated Expression values = 2; } + message Array { repeated native.Expression values = 2; } } message BrilligOutputs { diff --git a/acvm-repo/acir/src/proto/acir/native.proto b/acvm-repo/acir/src/proto/acir/native.proto index ddba25713c4..561a79c5701 100644 --- a/acvm-repo/acir/src/proto/acir/native.proto +++ b/acvm-repo/acir/src/proto/acir/native.proto @@ -3,4 +3,22 @@ syntax = "proto3"; package acvm.acir.native; message Field { bytes value = 1; } + message Witness { uint32 index = 1; } + +message Expression { + repeated MulTerm mul_terms = 1; + repeated LinearCombination linear_combinations = 2; + Field q_c = 3; + + message MulTerm { + Field q_m = 1; + Witness witness_left = 2; + Witness witness_right = 3; + } + + message LinearCombination { + Field q_l = 1; + Witness witness = 2; + } +} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/conv/acir.rs b/acvm-repo/acir/src/proto/conv/acir.rs index 8dfc7d9432d..59d1fe42ef5 100644 --- a/acvm-repo/acir/src/proto/conv/acir.rs +++ b/acvm-repo/acir/src/proto/conv/acir.rs @@ -1,13 +1,20 @@ use crate::{ circuit, - proto::acir::circuit::{AssertMessage, Circuit, ExpressionWidth, Opcode}, + proto::acir::circuit::{ + AssertMessage, AssertionPayload, BlackBoxFuncCall, Circuit, ExpressionOrMemory, + ExpressionWidth, MemOp, Opcode, OpcodeLocation, + }, }; +use acir_field::AcirField; use color_eyre::eyre; use noir_protobuf::ProtoCodec; use super::ProtoSchema; -impl ProtoCodec, Circuit> for ProtoSchema { +impl ProtoCodec, Circuit> for ProtoSchema +where + F: AcirField, +{ fn encode(value: &circuit::Circuit) -> Circuit { Circuit { current_witness_index: value.current_witness_index, @@ -25,19 +32,16 @@ impl ProtoCodec, Circuit> for ProtoSchema { } } -impl ProtoCodec, Opcode> for ProtoSchema { - fn encode(value: &circuit::Opcode) -> Opcode { - todo!() - } - - fn decode(value: &Opcode) -> eyre::Result> { - todo!() - } -} - impl ProtoCodec for ProtoSchema { fn encode(value: &circuit::ExpressionWidth) -> ExpressionWidth { - todo!() + use crate::proto::acir::circuit::expression_width::*; + let value = match value { + circuit::ExpressionWidth::Unbounded => Value::Unbounded(Unbounded {}), + circuit::ExpressionWidth::Bounded { width } => { + Value::Bounded(Bounded { width: Self::encode(width) }) + } + }; + ExpressionWidth { value: Some(value) } } fn decode(value: &ExpressionWidth) -> eyre::Result { @@ -47,9 +51,14 @@ impl ProtoCodec for ProtoSchema impl ProtoCodec<(circuit::OpcodeLocation, circuit::AssertionPayload), AssertMessage> for ProtoSchema +where + F: AcirField, { fn encode(value: &(circuit::OpcodeLocation, circuit::AssertionPayload)) -> AssertMessage { - todo!() + AssertMessage { + location: Self::encode_some(&value.0), + payload: Self::encode_some(&value.1), + } } fn decode( @@ -58,3 +67,114 @@ impl ProtoCodec<(circuit::OpcodeLocation, circuit::AssertionPayload), Asse todo!() } } + +impl ProtoCodec for ProtoSchema { + fn encode(value: &circuit::OpcodeLocation) -> OpcodeLocation { + use crate::proto::acir::circuit::opcode_location::*; + let value = match value { + circuit::OpcodeLocation::Acir(size) => Value::Acir(Self::encode(size)), + circuit::OpcodeLocation::Brillig { acir_index, brillig_index } => { + Value::Brillig(BrilligLocation { + acir_index: Self::encode(acir_index), + brillig_index: Self::encode(brillig_index), + }) + } + }; + OpcodeLocation { value: Some(value) } + } + + fn decode(value: &OpcodeLocation) -> eyre::Result { + todo!() + } +} + +impl ProtoCodec, AssertionPayload> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &circuit::AssertionPayload) -> AssertionPayload { + AssertionPayload { + error_selector: value.error_selector, + payload: Self::encode_vec(&value.payload), + } + } + + fn decode(value: &AssertionPayload) -> eyre::Result> { + todo!() + } +} + +impl ProtoCodec, ExpressionOrMemory> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &circuit::ExpressionOrMemory) -> ExpressionOrMemory { + use crate::proto::acir::circuit::expression_or_memory::*; + let value = match value { + circuit::ExpressionOrMemory::Expression(expression) => { + Value::Expression(Self::encode(expression)) + } + circuit::ExpressionOrMemory::Memory(block_id) => Value::Memory(block_id.0), + }; + ExpressionOrMemory { value: Some(value) } + } + + fn decode(value: &ExpressionOrMemory) -> eyre::Result> { + todo!() + } +} + +impl ProtoCodec, Opcode> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &circuit::Opcode) -> Opcode { + use crate::proto::acir::circuit::opcode::*; + let value = match value { + circuit::Opcode::AssertZero(expression) => Value::AssertZero(Self::encode(expression)), + circuit::Opcode::BlackBoxFuncCall(black_box_func_call) => { + Value::BlackboxFuncCall(Self::encode(black_box_func_call)) + } + circuit::Opcode::MemoryOp { block_id, op, predicate } => Value::MemoryOp(MemoryOp { + block_id: block_id.0, + op: Self::encode_some(op), + predicate: predicate.as_ref().map(Self::encode), + }), + circuit::Opcode::MemoryInit { block_id, init, block_type } => todo!(), + circuit::Opcode::BrilligCall { id, inputs, outputs, predicate } => todo!(), + circuit::Opcode::Call { id, inputs, outputs, predicate } => todo!(), + }; + Opcode { value: Some(value) } + } + + fn decode(value: &Opcode) -> eyre::Result> { + todo!() + } +} + +impl ProtoCodec, MemOp> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &circuit::opcodes::MemOp) -> MemOp { + MemOp { + operation: Self::encode_some(&value.operation), + index: Self::encode_some(&value.index), + value: Self::encode_some(&value.value), + } + } + + fn decode(value: &MemOp) -> eyre::Result> { + todo!() + } +} + +impl ProtoCodec, BlackBoxFuncCall> for ProtoSchema { + fn encode(value: &circuit::opcodes::BlackBoxFuncCall) -> BlackBoxFuncCall { + todo!() + } + + fn decode(value: &BlackBoxFuncCall) -> eyre::Result> { + todo!() + } +} diff --git a/acvm-repo/acir/src/proto/conv/native.rs b/acvm-repo/acir/src/proto/conv/native.rs index d75c0de3dae..bf48ee9b856 100644 --- a/acvm-repo/acir/src/proto/conv/native.rs +++ b/acvm-repo/acir/src/proto/conv/native.rs @@ -4,7 +4,7 @@ use noir_protobuf::ProtoCodec; use crate::{ native_types, - proto::acir::native::{Field, Witness}, + proto::acir::native::{Expression, Field, Witness}, }; use super::ProtoSchema; @@ -28,3 +28,36 @@ impl ProtoCodec for ProtoSchema { Ok(native_types::Witness(value.index)) } } + +impl ProtoCodec, Expression> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &native_types::Expression) -> Expression { + use crate::proto::acir::native::expression::*; + Expression { + mul_terms: value + .mul_terms + .iter() + .map(|(q_m, wl, wr)| MulTerm { + q_m: Self::encode_some(q_m), + witness_left: Self::encode_some(wl), + witness_right: Self::encode_some(wr), + }) + .collect(), + linear_combinations: value + .linear_combinations + .iter() + .map(|(q_l, w)| LinearCombination { + q_l: Self::encode_some(q_l), + witness: Self::encode_some(w), + }) + .collect(), + q_c: Self::encode_some(&value.q_c), + } + } + + fn decode(_value: &Expression) -> eyre::Result> { + todo!("decode") + } +} From 36701d82e1b53a68b5ef4e818268ef54a01d26f7 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Thu, 27 Feb 2025 20:51:49 +0000 Subject: [PATCH 17/24] Finish encoding acir --- acvm-repo/acir/src/proto/acir/circuit.proto | 18 +- acvm-repo/acir/src/proto/conv/acir.rs | 305 ++++++++++++++++++-- 2 files changed, 285 insertions(+), 38 deletions(-) diff --git a/acvm-repo/acir/src/proto/acir/circuit.proto b/acvm-repo/acir/src/proto/acir/circuit.proto index 8f7f0add41e..c0981d6e30c 100644 --- a/acvm-repo/acir/src/proto/acir/circuit.proto +++ b/acvm-repo/acir/src/proto/acir/circuit.proto @@ -98,12 +98,12 @@ message BlackBoxFuncCall { EmbeddedCurveAdd embedded_curve_add = 10; Keccakf1600 keccak_f1600 = 11; RecursiveAggregation recursive_aggregation = 12; - BigIntAdd bigint_add = 13; - BigIntSub bigint_sub = 14; - BigIntMul bigint_mul = 15; - BigIntDiv bigint_div = 16; - BigIntFromLeBytes bigint_from_le_bytes = 17; - BigIntToLeBytes bigint_to_le_bytes = 18; + BigIntAdd big_int_add = 13; + BigIntSub big_int_sub = 14; + BigIntMul big_int_mul = 15; + BigIntDiv big_int_div = 16; + BigIntFromLeBytes big_int_from_le_bytes = 17; + BigIntToLeBytes big_int_to_le_bytes = 18; Poseidon2Permutation poseidon2_permutation = 19; Sha256Compression sha256_compression = 20; } @@ -152,12 +152,12 @@ message BlackBoxFuncCall { repeated native.Witness outputs = 3; } message EmbeddedCurveAdd { - repeated FunctionInput points = 1; - repeated FunctionInput scalars = 2; + repeated FunctionInput input1 = 1; + repeated FunctionInput input2 = 2; repeated native.Witness outputs = 3; } message Keccakf1600 { - repeated FunctionInput points = 1; + repeated FunctionInput inputs = 1; repeated native.Witness outputs = 2; } message RecursiveAggregation { diff --git a/acvm-repo/acir/src/proto/conv/acir.rs b/acvm-repo/acir/src/proto/conv/acir.rs index 59d1fe42ef5..eb0d5c81109 100644 --- a/acvm-repo/acir/src/proto/conv/acir.rs +++ b/acvm-repo/acir/src/proto/conv/acir.rs @@ -1,8 +1,9 @@ use crate::{ - circuit, + circuit::{self, opcodes}, proto::acir::circuit::{ - AssertMessage, AssertionPayload, BlackBoxFuncCall, Circuit, ExpressionOrMemory, - ExpressionWidth, MemOp, Opcode, OpcodeLocation, + AssertMessage, AssertionPayload, BlackBoxFuncCall, BlockType, BrilligInputs, + BrilligOutputs, Circuit, ConstantOrWitnessEnum, ExpressionOrMemory, ExpressionWidth, + FunctionInput, MemOp, Opcode, OpcodeLocation, }, }; use acir_field::AcirField; @@ -27,8 +28,8 @@ where } } - fn decode(value: &Circuit) -> eyre::Result> { - todo!() + fn decode(_value: &Circuit) -> eyre::Result> { + todo!("decode") } } @@ -44,8 +45,8 @@ impl ProtoCodec for ProtoSchema ExpressionWidth { value: Some(value) } } - fn decode(value: &ExpressionWidth) -> eyre::Result { - todo!() + fn decode(_value: &ExpressionWidth) -> eyre::Result { + todo!("decode") } } @@ -62,9 +63,9 @@ where } fn decode( - value: &AssertMessage, + _value: &AssertMessage, ) -> eyre::Result<(circuit::OpcodeLocation, circuit::AssertionPayload)> { - todo!() + todo!("decode") } } @@ -83,8 +84,8 @@ impl ProtoCodec for ProtoSchema { OpcodeLocation { value: Some(value) } } - fn decode(value: &OpcodeLocation) -> eyre::Result { - todo!() + fn decode(_value: &OpcodeLocation) -> eyre::Result { + todo!("decode") } } @@ -99,8 +100,8 @@ where } } - fn decode(value: &AssertionPayload) -> eyre::Result> { - todo!() + fn decode(_value: &AssertionPayload) -> eyre::Result> { + todo!("decode") } } @@ -119,8 +120,8 @@ where ExpressionOrMemory { value: Some(value) } } - fn decode(value: &ExpressionOrMemory) -> eyre::Result> { - todo!() + fn decode(_value: &ExpressionOrMemory) -> eyre::Result> { + todo!("decode") } } @@ -140,23 +141,41 @@ where op: Self::encode_some(op), predicate: predicate.as_ref().map(Self::encode), }), - circuit::Opcode::MemoryInit { block_id, init, block_type } => todo!(), - circuit::Opcode::BrilligCall { id, inputs, outputs, predicate } => todo!(), - circuit::Opcode::Call { id, inputs, outputs, predicate } => todo!(), + circuit::Opcode::MemoryInit { block_id, init, block_type } => { + Value::MemoryInit(MemoryInit { + block_id: block_id.0, + init: Self::encode_vec(init), + block_type: Self::encode_some(block_type), + }) + } + circuit::Opcode::BrilligCall { id, inputs, outputs, predicate } => { + Value::BrilligCall(BrilligCall { + id: id.0, + inputs: Self::encode_vec(inputs), + outputs: Self::encode_vec(outputs), + predicate: predicate.as_ref().map(Self::encode), + }) + } + circuit::Opcode::Call { id, inputs, outputs, predicate } => Value::Call(Call { + id: id.0, + inputs: Self::encode_vec(inputs), + outputs: Self::encode_vec(outputs), + predicate: predicate.as_ref().map(Self::encode), + }), }; Opcode { value: Some(value) } } - fn decode(value: &Opcode) -> eyre::Result> { - todo!() + fn decode(_value: &Opcode) -> eyre::Result> { + todo!("decode") } } -impl ProtoCodec, MemOp> for ProtoSchema +impl ProtoCodec, MemOp> for ProtoSchema where F: AcirField, { - fn encode(value: &circuit::opcodes::MemOp) -> MemOp { + fn encode(value: &opcodes::MemOp) -> MemOp { MemOp { operation: Self::encode_some(&value.operation), index: Self::encode_some(&value.index), @@ -164,17 +183,245 @@ where } } - fn decode(value: &MemOp) -> eyre::Result> { - todo!() + fn decode(_value: &MemOp) -> eyre::Result> { + todo!("decode") + } +} + +impl ProtoCodec, BlackBoxFuncCall> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &opcodes::BlackBoxFuncCall) -> BlackBoxFuncCall { + use crate::proto::acir::circuit::black_box_func_call::*; + let value = match value { + opcodes::BlackBoxFuncCall::AES128Encrypt { inputs, iv, key, outputs } => { + Value::Aes128Encrypt(Aes128Encrypt { + inputs: Self::encode_vec(inputs), + iv: Self::encode_vec(iv.as_ref()), + key: Self::encode_vec(key.as_ref()), + outputs: Self::encode_vec(outputs), + }) + } + opcodes::BlackBoxFuncCall::AND { lhs, rhs, output } => Value::And(And { + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), + output: Self::encode_some(output), + }), + opcodes::BlackBoxFuncCall::XOR { lhs, rhs, output } => Value::Xor(Xor { + lhs: Self::encode_some(lhs), + rhs: Self::encode_some(rhs), + output: Self::encode_some(output), + }), + opcodes::BlackBoxFuncCall::RANGE { input } => { + Value::Range(Range { input: Self::encode_some(input) }) + } + opcodes::BlackBoxFuncCall::Blake2s { inputs, outputs } => Value::Blake2s(Blake2s { + inputs: Self::encode_vec(inputs), + outputs: Self::encode_vec(outputs.as_ref()), + }), + opcodes::BlackBoxFuncCall::Blake3 { inputs, outputs } => Value::Blake3(Blake3 { + inputs: Self::encode_vec(inputs), + outputs: Self::encode_vec(outputs.as_ref()), + }), + opcodes::BlackBoxFuncCall::EcdsaSecp256k1 { + public_key_x, + public_key_y, + signature, + hashed_message, + output, + } => Value::EcdsaSecp256k1(EcdsaSecp256k1 { + public_key_x: Self::encode_vec(public_key_x.as_ref()), + public_key_y: Self::encode_vec(public_key_y.as_ref()), + signature: Self::encode_vec(signature.as_ref()), + hashed_message: Self::encode_vec(hashed_message.as_ref()), + output: Self::encode_some(output), + }), + opcodes::BlackBoxFuncCall::EcdsaSecp256r1 { + public_key_x, + public_key_y, + signature, + hashed_message, + output, + } => Value::EcdsaSecp256r1(EcdsaSecp256r1 { + public_key_x: Self::encode_vec(public_key_x.as_ref()), + public_key_y: Self::encode_vec(public_key_y.as_ref()), + signature: Self::encode_vec(signature.as_ref()), + hashed_message: Self::encode_vec(hashed_message.as_ref()), + output: Self::encode_some(output), + }), + opcodes::BlackBoxFuncCall::MultiScalarMul { points, scalars, outputs } => { + let (o0, o1, o2) = outputs; + Value::MultiScalarMul(MultiScalarMul { + points: Self::encode_vec(points), + scalars: Self::encode_vec(scalars), + outputs: Self::encode_vec([o0, o1, o2]), + }) + } + opcodes::BlackBoxFuncCall::EmbeddedCurveAdd { input1, input2, outputs } => { + let (o0, o1, o2) = outputs; + Value::EmbeddedCurveAdd(EmbeddedCurveAdd { + input1: Self::encode_vec(input1.as_ref()), + input2: Self::encode_vec(input2.as_ref()), + outputs: Self::encode_vec([o0, o1, o2]), + }) + } + opcodes::BlackBoxFuncCall::Keccakf1600 { inputs, outputs } => { + Value::KeccakF1600(Keccakf1600 { + inputs: Self::encode_vec(inputs.as_ref()), + outputs: Self::encode_vec(outputs.as_ref()), + }) + } + opcodes::BlackBoxFuncCall::RecursiveAggregation { + verification_key, + proof, + public_inputs, + key_hash, + proof_type, + } => Value::RecursiveAggregation(RecursiveAggregation { + verification_key: Self::encode_vec(verification_key), + proof: Self::encode_vec(proof), + public_inputs: Self::encode_vec(public_inputs), + key_hash: Self::encode_some(key_hash), + proof_type: *proof_type, + }), + opcodes::BlackBoxFuncCall::BigIntAdd { lhs, rhs, output } => { + Value::BigIntAdd(BigIntAdd { lhs: *lhs, rhs: *rhs, output: *output }) + } + opcodes::BlackBoxFuncCall::BigIntSub { lhs, rhs, output } => { + Value::BigIntSub(BigIntSub { lhs: *lhs, rhs: *rhs, output: *output }) + } + opcodes::BlackBoxFuncCall::BigIntMul { lhs, rhs, output } => { + Value::BigIntMul(BigIntMul { lhs: *lhs, rhs: *rhs, output: *output }) + } + opcodes::BlackBoxFuncCall::BigIntDiv { lhs, rhs, output } => { + Value::BigIntDiv(BigIntDiv { lhs: *lhs, rhs: *rhs, output: *output }) + } + opcodes::BlackBoxFuncCall::BigIntFromLeBytes { inputs, modulus, output } => { + Value::BigIntFromLeBytes(BigIntFromLeBytes { + inputs: Self::encode_vec(inputs), + modulus: modulus.clone(), + output: *output, + }) + } + opcodes::BlackBoxFuncCall::BigIntToLeBytes { input, outputs } => { + Value::BigIntToLeBytes(BigIntToLeBytes { + input: *input, + outputs: Self::encode_vec(outputs), + }) + } + opcodes::BlackBoxFuncCall::Poseidon2Permutation { inputs, outputs, len } => { + Value::Poseidon2Permutation(Poseidon2Permutation { + inputs: Self::encode_vec(inputs), + outputs: Self::encode_vec(outputs), + len: *len, + }) + } + opcodes::BlackBoxFuncCall::Sha256Compression { inputs, hash_values, outputs } => { + Value::Sha256Compression(Sha256Compression { + inputs: Self::encode_vec(inputs.as_ref()), + hash_values: Self::encode_vec(hash_values.as_ref()), + outputs: Self::encode_vec(outputs.as_ref()), + }) + } + }; + BlackBoxFuncCall { value: Some(value) } + } + + fn decode(_value: &BlackBoxFuncCall) -> eyre::Result> { + todo!("decode") } } -impl ProtoCodec, BlackBoxFuncCall> for ProtoSchema { - fn encode(value: &circuit::opcodes::BlackBoxFuncCall) -> BlackBoxFuncCall { - todo!() +impl ProtoCodec, FunctionInput> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &opcodes::FunctionInput) -> FunctionInput { + FunctionInput { input: Self::encode_some(value.input_ref()), num_bits: value.num_bits() } + } + + fn decode(_value: &FunctionInput) -> eyre::Result> { + todo!("decode") + } +} + +impl ProtoCodec, ConstantOrWitnessEnum> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &opcodes::ConstantOrWitnessEnum) -> ConstantOrWitnessEnum { + use crate::proto::acir::circuit::constant_or_witness_enum::*; + let value = match value { + opcodes::ConstantOrWitnessEnum::Constant(field) => Value::Constant(Self::encode(field)), + opcodes::ConstantOrWitnessEnum::Witness(witness) => { + Value::Witness(Self::encode(witness)) + } + }; + ConstantOrWitnessEnum { value: Some(value) } + } + + fn decode(_value: &ConstantOrWitnessEnum) -> eyre::Result> { + todo!("decode") + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &opcodes::BlockType) -> BlockType { + use crate::proto::acir::circuit::block_type::*; + let value = match value { + opcodes::BlockType::Memory => Value::Memory(Memory {}), + opcodes::BlockType::CallData(value) => Value::CallData(CallData { value: *value }), + opcodes::BlockType::ReturnData => Value::ReturnData(ReturnData {}), + }; + BlockType { value: Some(value) } + } + + fn decode(_value: &BlockType) -> eyre::Result { + todo!("decode") + } +} + +impl ProtoCodec, BrilligInputs> for ProtoSchema +where + F: AcirField, +{ + fn encode(value: &circuit::brillig::BrilligInputs) -> BrilligInputs { + use crate::proto::acir::circuit::brillig_inputs::*; + let value = match value { + circuit::brillig::BrilligInputs::Single(expression) => { + Value::Single(Self::encode(expression)) + } + circuit::brillig::BrilligInputs::Array(expressions) => { + Value::Array(Array { values: Self::encode_vec(expressions) }) + } + circuit::brillig::BrilligInputs::MemoryArray(block_id) => { + Value::MemoryArray(block_id.0) + } + }; + BrilligInputs { value: Some(value) } + } + + fn decode(_value: &BrilligInputs) -> eyre::Result> { + todo!("decode") + } +} + +impl ProtoCodec for ProtoSchema { + fn encode(value: &circuit::brillig::BrilligOutputs) -> BrilligOutputs { + use crate::proto::acir::circuit::brillig_outputs::*; + let value = match value { + circuit::brillig::BrilligOutputs::Simple(witness) => { + Value::Simple(Self::encode(witness)) + } + circuit::brillig::BrilligOutputs::Array(witnesses) => { + Value::Array(Array { values: Self::encode_vec(witnesses) }) + } + }; + BrilligOutputs { value: Some(value) } } - fn decode(value: &BlackBoxFuncCall) -> eyre::Result> { - todo!() + fn decode(_value: &BrilligOutputs) -> eyre::Result { + todo!("decode") } } From 70deca7b1ca472cd0c474da7fccadb08053214d4 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Fri, 28 Feb 2025 11:46:50 +0000 Subject: [PATCH 18/24] WIP --- acvm-repo/acir/src/circuit/mod.rs | 11 +++++++---- acvm-repo/acir/src/proto/conv/mod.rs | 2 ++ acvm-repo/acir/src/proto/mod.rs | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/acvm-repo/acir/src/circuit/mod.rs b/acvm-repo/acir/src/circuit/mod.rs index 5545e88a294..31bdcc5bb60 100644 --- a/acvm-repo/acir/src/circuit/mod.rs +++ b/acvm-repo/acir/src/circuit/mod.rs @@ -237,7 +237,7 @@ impl Circuit { } } -impl Program { +impl Program { fn write(&self, writer: W) -> std::io::Result<()> { let buf = { // # Bincode @@ -249,9 +249,12 @@ impl Program { // buf // # FlexBuffers - let mut s = flexbuffers::FlexbufferSerializer::new(); - self.serialize(&mut s).map_err(std::io::Error::other)?; - s.take_buffer() + // let mut s = flexbuffers::FlexbufferSerializer::new(); + // self.serialize(&mut s).map_err(std::io::Error::other)?; + // s.take_buffer() + + // # Protobuf + let s = crate::proto::conv::ProtoSchema::; }; let mut encoder = flate2::write::GzEncoder::new(writer, Compression::default()); encoder.write_all(&buf)?; diff --git a/acvm-repo/acir/src/proto/conv/mod.rs b/acvm-repo/acir/src/proto/conv/mod.rs index 2cae6cce18b..136df6cebc8 100644 --- a/acvm-repo/acir/src/proto/conv/mod.rs +++ b/acvm-repo/acir/src/proto/conv/mod.rs @@ -15,6 +15,8 @@ pub(crate) struct ProtoSchema { field: PhantomData, } +impl ProtoSchema + impl ProtoCodec, Program> for ProtoSchema where F: AcirField, diff --git a/acvm-repo/acir/src/proto/mod.rs b/acvm-repo/acir/src/proto/mod.rs index 7ec5e94bcc9..f90a3720648 100644 --- a/acvm-repo/acir/src/proto/mod.rs +++ b/acvm-repo/acir/src/proto/mod.rs @@ -1,4 +1,4 @@ -mod conv; +pub(crate) mod conv; pub(crate) mod acir { From a66a9e78443e89b8bad454ad2fd2cc5bf9d1e58f Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Fri, 28 Feb 2025 12:22:39 +0000 Subject: [PATCH 19/24] Switch to protobuf serialization in Program --- Cargo.lock | 47 +------------------ Cargo.toml | 2 - acvm-repo/acir/Cargo.toml | 1 - acvm-repo/acir/build.rs | 5 +- acvm-repo/acir/src/circuit/mod.rs | 17 +++++-- acvm-repo/acir/src/proto/acir/witness.proto | 4 ++ .../acir/src/proto/{conv => convert}/acir.rs | 0 .../src/proto/{conv => convert}/brillig.rs | 0 .../acir/src/proto/{conv => convert}/mod.rs | 2 - .../src/proto/{conv => convert}/native.rs | 0 acvm-repo/acir/src/proto/mod.rs | 4 +- acvm-repo/brillig_vm/src/lib.rs | 2 +- utils/protobuf/src/lib.rs | 15 ++++++ 13 files changed, 39 insertions(+), 60 deletions(-) rename acvm-repo/acir/src/proto/{conv => convert}/acir.rs (100%) rename acvm-repo/acir/src/proto/{conv => convert}/brillig.rs (100%) rename acvm-repo/acir/src/proto/{conv => convert}/mod.rs (98%) rename acvm-repo/acir/src/proto/{conv => convert}/native.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 1fa53efe691..c781e60c1eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,7 +13,6 @@ dependencies = [ "color-eyre", "criterion", "flate2", - "flexbuffers", "fxhash", "noir_protobuf", "pprof", @@ -1748,19 +1747,6 @@ dependencies = [ "miniz_oxide 0.8.5", ] -[[package]] -name = "flexbuffers" -version = "25.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "935627e7bc8f083035d9faad09ffaed9128f73fb1f74a8798f115749c43378e8" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "num_enum", - "serde", - "serde_derive", -] - [[package]] name = "float-cmp" version = "0.9.0" @@ -2702,7 +2688,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fcae0c6c159e11541080f1f829873d8f374f81eda0abc67695a13fc8dc1a580" dependencies = [ "heck 0.5.0", - "proc-macro-crate 3.2.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.98", @@ -3657,27 +3643,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "numtoa" version = "0.1.0" @@ -4041,16 +4006,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - [[package]] name = "proc-macro-crate" version = "3.2.0" diff --git a/Cargo.toml b/Cargo.toml index 6f770b5c7af..0b28d9959c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -145,7 +145,6 @@ prost-build = "0.13" protoc-prebuilt = "0.3" cfg-if = "1.0.0" -ciborium = "0.2" dirs = "4" serde = { version = "1.0.136", features = ["derive"] } serde_json = "1.0" @@ -154,7 +153,6 @@ thiserror = "1.0.21" toml = "0.7.2" url = "2.5.4" base64 = "0.21.2" -flexbuffers = "25" fxhash = "0.2.1" build-data = "0.1.3" bincode = "1.3.3" diff --git a/acvm-repo/acir/Cargo.toml b/acvm-repo/acir/Cargo.toml index 6df19c19eb1..5dae59e953e 100644 --- a/acvm-repo/acir/Cargo.toml +++ b/acvm-repo/acir/Cargo.toml @@ -24,7 +24,6 @@ color-eyre.workspace = true serde.workspace = true thiserror.workspace = true flate2.workspace = true -flexbuffers.workspace = true bincode.workspace = true base64.workspace = true prost.workspace = true diff --git a/acvm-repo/acir/build.rs b/acvm-repo/acir/build.rs index dc822d3fd8c..31eecd5bf51 100644 --- a/acvm-repo/acir/build.rs +++ b/acvm-repo/acir/build.rs @@ -8,9 +8,12 @@ fn main() { prost_build::compile_protos( &[ + // DTOs for a `Program`, which work with the types in `acir.cpp` "./src/proto/program.proto", + // DTOs for the `WitnessStack`, which work with the types in `witness.cpp` + "./src/proto/acir/witness.proto", + // A pared down DTO for `Program`, so Barretenberg can ignore the Brillig part. // This is only included to make sure it compiles. - // A separate compilation is needed to turn it into C++ code. "./src/proto/acir/program.proto", ], &[Path::new("./src/proto"), include_dir.as_path()], diff --git a/acvm-repo/acir/src/circuit/mod.rs b/acvm-repo/acir/src/circuit/mod.rs index 31bdcc5bb60..4ad579b41da 100644 --- a/acvm-repo/acir/src/circuit/mod.rs +++ b/acvm-repo/acir/src/circuit/mod.rs @@ -2,8 +2,12 @@ pub mod black_box_functions; pub mod brillig; pub mod opcodes; -use crate::native_types::{Expression, Witness}; +use crate::{ + native_types::{Expression, Witness}, + proto::convert::ProtoSchema, +}; use acir_field::AcirField; +use noir_protobuf::ProtoCodec as _; pub use opcodes::Opcode; use thiserror::Error; @@ -254,7 +258,7 @@ impl Program { // s.take_buffer() // # Protobuf - let s = crate::proto::conv::ProtoSchema::; + ProtoSchema::::serialize_to_vec(self) }; let mut encoder = flate2::write::GzEncoder::new(writer, Compression::default()); encoder.write_all(&buf)?; @@ -279,7 +283,7 @@ impl Program { } } -impl Deserialize<'a>> Program { +impl Deserialize<'a>> Program { fn read(reader: R) -> std::io::Result { let mut gz_decoder = flate2::read::GzDecoder::new(reader); let mut buf = Vec::new(); @@ -292,8 +296,11 @@ impl Deserialize<'a>> Program { // ciborium::from_reader(buf.as_slice()) // # FlexBuffers - let r = flexbuffers::Reader::get_root(buf.as_slice()).map_err(std::io::Error::other)?; - Self::deserialize(r) + // let r = flexbuffers::Reader::get_root(buf.as_slice()).map_err(std::io::Error::other)?; + // Self::deserialize(r) + + // # Protobuf + ProtoSchema::::deserialize_from_vec(&buf) }; result.map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err)) } diff --git a/acvm-repo/acir/src/proto/acir/witness.proto b/acvm-repo/acir/src/proto/acir/witness.proto index 3d39d40a9df..0ac922f7e20 100644 --- a/acvm-repo/acir/src/proto/acir/witness.proto +++ b/acvm-repo/acir/src/proto/acir/witness.proto @@ -3,3 +3,7 @@ syntax = "proto3"; package acvm.acir.witness; import "acir/native.proto"; + +message WitnessStack { + // TODO +} \ No newline at end of file diff --git a/acvm-repo/acir/src/proto/conv/acir.rs b/acvm-repo/acir/src/proto/convert/acir.rs similarity index 100% rename from acvm-repo/acir/src/proto/conv/acir.rs rename to acvm-repo/acir/src/proto/convert/acir.rs diff --git a/acvm-repo/acir/src/proto/conv/brillig.rs b/acvm-repo/acir/src/proto/convert/brillig.rs similarity index 100% rename from acvm-repo/acir/src/proto/conv/brillig.rs rename to acvm-repo/acir/src/proto/convert/brillig.rs diff --git a/acvm-repo/acir/src/proto/conv/mod.rs b/acvm-repo/acir/src/proto/convert/mod.rs similarity index 98% rename from acvm-repo/acir/src/proto/conv/mod.rs rename to acvm-repo/acir/src/proto/convert/mod.rs index 136df6cebc8..2cae6cce18b 100644 --- a/acvm-repo/acir/src/proto/conv/mod.rs +++ b/acvm-repo/acir/src/proto/convert/mod.rs @@ -15,8 +15,6 @@ pub(crate) struct ProtoSchema { field: PhantomData, } -impl ProtoSchema - impl ProtoCodec, Program> for ProtoSchema where F: AcirField, diff --git a/acvm-repo/acir/src/proto/conv/native.rs b/acvm-repo/acir/src/proto/convert/native.rs similarity index 100% rename from acvm-repo/acir/src/proto/conv/native.rs rename to acvm-repo/acir/src/proto/convert/native.rs diff --git a/acvm-repo/acir/src/proto/mod.rs b/acvm-repo/acir/src/proto/mod.rs index f90a3720648..ba5bbc5108c 100644 --- a/acvm-repo/acir/src/proto/mod.rs +++ b/acvm-repo/acir/src/proto/mod.rs @@ -1,4 +1,4 @@ -pub(crate) mod conv; +pub(crate) mod convert; pub(crate) mod acir { @@ -18,7 +18,7 @@ pub(crate) mod acir { } } -#[allow(unreachable_pub)] +#[allow(unreachable_pub, clippy::enum_variant_names)] pub(crate) mod brillig { include!(concat!(env!("OUT_DIR"), "/acvm.brillig.rs")); } diff --git a/acvm-repo/brillig_vm/src/lib.rs b/acvm-repo/brillig_vm/src/lib.rs index 157ed9638ca..7d1fb3f67d3 100644 --- a/acvm-repo/brillig_vm/src/lib.rs +++ b/acvm-repo/brillig_vm/src/lib.rs @@ -1737,7 +1737,7 @@ mod tests { ) -> VM<'a, F, StubbedBlackBoxSolver> { let mut vm = VM::new(calldata, opcodes, solver, false); brillig_execute(&mut vm); - assert_eq!(vm.call_stack, vec![]); + assert!(vm.call_stack.is_empty()); vm } diff --git a/utils/protobuf/src/lib.rs b/utils/protobuf/src/lib.rs index 7470cefed6e..b0081df2100 100644 --- a/utils/protobuf/src/lib.rs +++ b/utils/protobuf/src/lib.rs @@ -46,4 +46,19 @@ pub trait ProtoCodec { { Self::encode(value).into() } + /// Encode a domain type to protobuf and serialize it to bytes. + fn serialize_to_vec(value: &T) -> Vec + where + R: prost::Message, + { + Self::encode(value).encode_to_vec() + } + /// Deserialize a buffer into protobuf and then decode into the domain type. + fn deserialize_from_vec(buf: &[u8]) -> eyre::Result + where + R: prost::Message + Default, + { + let repr = R::decode(buf).wrap_err("failed to decode into protobuf")?; + Self::decode(&repr).wrap_err("failed to decode protobuf into domain") + } } From e21fccc94786e7b0985e11219142fb6ccf0fd71d Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Fri, 28 Feb 2025 12:38:07 +0000 Subject: [PATCH 20/24] Bincode vs Protobuf --- acvm-repo/acir/src/circuit/mod.rs | 12 +- .../bytecode-sizes/bincode-vs-protobuf.jsonl | 645 ++++++++++++ .../bytecode-sizes/bincode-vs-protobuf.png | Bin 0 -> 24654 bytes scripts/bytecode-sizes/bincode.jsonl | 958 ++++++++---------- scripts/bytecode-sizes/protobuf.jsonl | 645 ++++++++++++ 5 files changed, 1734 insertions(+), 526 deletions(-) create mode 100644 scripts/bytecode-sizes/bincode-vs-protobuf.jsonl create mode 100644 scripts/bytecode-sizes/bincode-vs-protobuf.png create mode 100644 scripts/bytecode-sizes/protobuf.jsonl diff --git a/acvm-repo/acir/src/circuit/mod.rs b/acvm-repo/acir/src/circuit/mod.rs index 4ad579b41da..d15255e9da5 100644 --- a/acvm-repo/acir/src/circuit/mod.rs +++ b/acvm-repo/acir/src/circuit/mod.rs @@ -2,12 +2,8 @@ pub mod black_box_functions; pub mod brillig; pub mod opcodes; -use crate::{ - native_types::{Expression, Witness}, - proto::convert::ProtoSchema, -}; +use crate::native_types::{Expression, Witness}; use acir_field::AcirField; -use noir_protobuf::ProtoCodec as _; pub use opcodes::Opcode; use thiserror::Error; @@ -258,6 +254,8 @@ impl Program { // s.take_buffer() // # Protobuf + use crate::proto::convert::ProtoSchema; + use noir_protobuf::ProtoCodec; ProtoSchema::::serialize_to_vec(self) }; let mut encoder = flate2::write::GzEncoder::new(writer, Compression::default()); @@ -290,7 +288,7 @@ impl Deserialize<'a>> Program { gz_decoder.read_to_end(&mut buf)?; let result = { // # Bincode - //bincode::deserialize(&buf) + // bincode::deserialize(&buf) // # CBOR // ciborium::from_reader(buf.as_slice()) @@ -300,6 +298,8 @@ impl Deserialize<'a>> Program { // Self::deserialize(r) // # Protobuf + use crate::proto::convert::ProtoSchema; + use noir_protobuf::ProtoCodec; ProtoSchema::::deserialize_from_vec(&buf) }; result.map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidInput, err)) diff --git a/scripts/bytecode-sizes/bincode-vs-protobuf.jsonl b/scripts/bytecode-sizes/bincode-vs-protobuf.jsonl new file mode 100644 index 00000000000..f2bed3e08f5 --- /dev/null +++ b/scripts/bytecode-sizes/bincode-vs-protobuf.jsonl @@ -0,0 +1,645 @@ +{"name":"parity_base","base_size":38512,"alt_size":35233,"ratio":0.9148577066888243} +{"name":"parity_root","base_size":56652,"alt_size":53444,"ratio":0.9433735790439879} +{"name":"private_kernel_init","base_size":220749,"alt_size":202567,"ratio":0.9176349609737756} +{"name":"private_kernel_init_simulated","base_size":58621,"alt_size":57905,"ratio":0.9877859470155747} +{"name":"private_kernel_inner","base_size":359771,"alt_size":332017,"ratio":0.9228564837076918} +{"name":"private_kernel_inner_simulated","base_size":85524,"alt_size":82266,"ratio":0.9619054300547215} +{"name":"private_kernel_reset","base_size":900112,"alt_size":842107,"ratio":0.9355580194464689} +{"name":"private_kernel_reset_simulated","base_size":109029,"alt_size":96108,"ratio":0.8814902457144429} +{"name":"private_kernel_tail","base_size":119498,"alt_size":110310,"ratio":0.9231116838775545} +{"name":"private_kernel_tail_simulated","base_size":47093,"alt_size":43124,"ratio":0.9157199583802264} +{"name":"private_kernel_tail_to_public","base_size":213327,"alt_size":198582,"ratio":0.9308807605225781} +{"name":"private_kernel_tail_to_public_simulated","base_size":68973,"alt_size":64261,"ratio":0.93168341234976} +{"name":"rollup_base_private","base_size":1357393,"alt_size":1257801,"ratio":0.9266299443123693} +{"name":"rollup_base_private_simulated","base_size":81131,"alt_size":72339,"ratio":0.891632051866734} +{"name":"rollup_base_public","base_size":679496,"alt_size":626991,"ratio":0.9227294936246865} +{"name":"rollup_base_public_simulated","base_size":76651,"alt_size":67776,"ratio":0.8842154701178067} +{"name":"rollup_block_merge","base_size":109324,"alt_size":99872,"ratio":0.9135413998755991} +{"name":"rollup_block_root","base_size":15014428,"alt_size":12803649,"ratio":0.8527563620805269} +{"name":"rollup_block_root_empty","base_size":20689,"alt_size":20129,"ratio":0.9729324761950795} +{"name":"rollup_block_root_simulated","base_size":80510,"alt_size":72709,"ratio":0.9031052043224445} +{"name":"rollup_block_root_single_tx","base_size":14998279,"alt_size":12778106,"ratio":0.851971482861467} +{"name":"rollup_block_root_single_tx_simulated","base_size":75036,"alt_size":67606,"ratio":0.9009808625193241} +{"name":"rollup_merge","base_size":29269,"alt_size":27780,"ratio":0.9491270627626499} +{"name":"rollup_root","base_size":109168,"alt_size":99621,"ratio":0.912547633006009} +{"name":"amm_contract-AMM::_add_liquidity","base_size":7625,"alt_size":6831,"ratio":0.8958688524590164} +{"name":"amm_contract-AMM::_remove_liquidity","base_size":4889,"alt_size":4342,"ratio":0.888116179177746} +{"name":"amm_contract-AMM::_swap_exact_tokens_for_tokens","base_size":3868,"alt_size":3499,"ratio":0.9046018614270941} +{"name":"amm_contract-AMM::_swap_tokens_for_exact_tokens","base_size":4286,"alt_size":3855,"ratio":0.8994400373308447} +{"name":"amm_contract-AMM::add_liquidity","base_size":31680,"alt_size":28782,"ratio":0.9085227272727273} +{"name":"amm_contract-AMM::constructor","base_size":3706,"alt_size":3180,"ratio":0.8580679978413384} +{"name":"amm_contract-AMM::get_amount_in_for_exact_out","base_size":18139,"alt_size":15641,"ratio":0.8622856827829538} +{"name":"amm_contract-AMM::get_amount_out_for_exact_in","base_size":18109,"alt_size":15625,"ratio":0.8628306366999834} +{"name":"amm_contract-AMM::process_log","base_size":14990,"alt_size":12646,"ratio":0.8436290860573716} +{"name":"amm_contract-AMM::public_dispatch","base_size":20783,"alt_size":17230,"ratio":0.8290429678102296} +{"name":"amm_contract-AMM::remove_liquidity","base_size":29548,"alt_size":26900,"ratio":0.91038310545553} +{"name":"amm_contract-AMM::swap_exact_tokens_for_tokens","base_size":29442,"alt_size":26805,"ratio":0.9104340737721622} +{"name":"amm_contract-AMM::swap_tokens_for_exact_tokens","base_size":29711,"alt_size":27068,"ratio":0.9110430480293494} +{"name":"amm_contract-AMM::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"app_subscription_contract-AppSubscription::constructor","base_size":4391,"alt_size":3803,"ratio":0.8660897289911182} +{"name":"app_subscription_contract-AppSubscription::entrypoint","base_size":97890,"alt_size":89119,"ratio":0.9103994279293084} +{"name":"app_subscription_contract-AppSubscription::is_initialized","base_size":23855,"alt_size":19950,"ratio":0.836302661915741} +{"name":"app_subscription_contract-AppSubscription::process_log","base_size":21713,"alt_size":17982,"ratio":0.8281674572836549} +{"name":"app_subscription_contract-AppSubscription::public_dispatch","base_size":4867,"alt_size":4193,"ratio":0.8615163344976371} +{"name":"app_subscription_contract-AppSubscription::subscribe","base_size":94665,"alt_size":85415,"ratio":0.9022870120952834} +{"name":"app_subscription_contract-AppSubscription::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"auth_contract-Auth::constructor","base_size":2999,"alt_size":2606,"ratio":0.8689563187729243} +{"name":"auth_contract-Auth::do_private_authorized_thing","base_size":12981,"alt_size":12711,"ratio":0.9792003697712041} +{"name":"auth_contract-Auth::get_authorized","base_size":809,"alt_size":865,"ratio":1.069221260815822} +{"name":"auth_contract-Auth::get_authorized_delay","base_size":663,"alt_size":685,"ratio":1.0331825037707392} +{"name":"auth_contract-Auth::get_authorized_in_private","base_size":13312,"alt_size":13048,"ratio":0.9801682692307693} +{"name":"auth_contract-Auth::get_scheduled_authorized","base_size":728,"alt_size":767,"ratio":1.0535714285714286} +{"name":"auth_contract-Auth::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"auth_contract-Auth::public_dispatch","base_size":9711,"alt_size":8086,"ratio":0.8326639892904953} +{"name":"auth_contract-Auth::set_authorized","base_size":3456,"alt_size":3069,"ratio":0.8880208333333334} +{"name":"auth_contract-Auth::set_authorized_delay","base_size":3474,"alt_size":3040,"ratio":0.8750719631548647} +{"name":"auth_contract-Auth::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"auth_registry_contract-AuthRegistry::_set_authorized","base_size":1765,"alt_size":1629,"ratio":0.9229461756373938} +{"name":"auth_registry_contract-AuthRegistry::consume","base_size":3880,"alt_size":3308,"ratio":0.8525773195876288} +{"name":"auth_registry_contract-AuthRegistry::is_consumable","base_size":1755,"alt_size":1639,"ratio":0.933903133903134} +{"name":"auth_registry_contract-AuthRegistry::is_reject_all","base_size":1175,"alt_size":1141,"ratio":0.971063829787234} +{"name":"auth_registry_contract-AuthRegistry::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"auth_registry_contract-AuthRegistry::public_dispatch","base_size":7739,"alt_size":5978,"ratio":0.7724512210879959} +{"name":"auth_registry_contract-AuthRegistry::set_authorized","base_size":1700,"alt_size":1605,"ratio":0.9441176470588235} +{"name":"auth_registry_contract-AuthRegistry::set_authorized_private","base_size":5829,"alt_size":5918,"ratio":1.0152684851604048} +{"name":"auth_registry_contract-AuthRegistry::set_reject_all","base_size":1116,"alt_size":1113,"ratio":0.9973118279569892} +{"name":"auth_registry_contract-AuthRegistry::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"auth_registry_contract-AuthRegistry::unconstrained_is_consumable","base_size":1740,"alt_size":1656,"ratio":0.9517241379310345} +{"name":"auth_wit_test_contract-AuthWitTest::consume","base_size":5402,"alt_size":5406,"ratio":1.0007404664938913} +{"name":"auth_wit_test_contract-AuthWitTest::consume_public","base_size":750,"alt_size":765,"ratio":1.02} +{"name":"auth_wit_test_contract-AuthWitTest::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"auth_wit_test_contract-AuthWitTest::public_dispatch","base_size":1306,"alt_size":1266,"ratio":0.9693721286370597} +{"name":"auth_wit_test_contract-AuthWitTest::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::keccak_f1600","base_size":712,"alt_size":756,"ratio":1.0617977528089888} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::keccak_hash","base_size":2062,"alt_size":2008,"ratio":0.973811833171678} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::pedersen_hash","base_size":2741,"alt_size":2474,"ratio":0.9025902955125866} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::pedersen_hash_with_index","base_size":2716,"alt_size":2484,"ratio":0.914580265095729} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::poseidon2_hash","base_size":1631,"alt_size":1495,"ratio":0.9166155732679337} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::public_dispatch","base_size":38983,"alt_size":29848,"ratio":0.7656670856527205} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_10","base_size":2490,"alt_size":2340,"ratio":0.9397590361445783} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_100","base_size":3910,"alt_size":3592,"ratio":0.9186700767263427} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_20","base_size":2503,"alt_size":2388,"ratio":0.9540551338393928} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_2048","base_size":22473,"alt_size":20853,"ratio":0.9279134961954345} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_255","base_size":5854,"alt_size":5538,"ratio":0.9460198155107619} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_256","base_size":5530,"alt_size":5234,"ratio":0.9464737793851717} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_30","base_size":2673,"alt_size":2565,"ratio":0.9595959595959596} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_40","base_size":2761,"alt_size":2635,"ratio":0.9543643607388628} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_50","base_size":2931,"alt_size":2781,"ratio":0.9488229273285568} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_511","base_size":8537,"alt_size":8238,"ratio":0.9649759868806372} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_512","base_size":8154,"alt_size":7910,"ratio":0.9700760363012019} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_60","base_size":2998,"alt_size":2851,"ratio":0.9509673115410273} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_70","base_size":3666,"alt_size":3355,"ratio":0.9151663938897981} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_80","base_size":3610,"alt_size":3357,"ratio":0.9299168975069252} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sha256_hash_90","base_size":3789,"alt_size":3483,"ratio":0.9192399049881235} +{"name":"avm_gadgets_test_contract-AvmGadgetsTest::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"avm_initializer_test_contract-AvmInitializerTest::constructor","base_size":2460,"alt_size":2233,"ratio":0.9077235772357723} +{"name":"avm_initializer_test_contract-AvmInitializerTest::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"avm_initializer_test_contract-AvmInitializerTest::public_dispatch","base_size":3088,"alt_size":2829,"ratio":0.9161269430051814} +{"name":"avm_initializer_test_contract-AvmInitializerTest::read_storage_immutable","base_size":321,"alt_size":339,"ratio":1.0560747663551402} +{"name":"avm_initializer_test_contract-AvmInitializerTest::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"avm_test_contract-AvmTest::add_args_return","base_size":228,"alt_size":280,"ratio":1.2280701754385965} +{"name":"avm_test_contract-AvmTest::add_storage_map","base_size":2301,"alt_size":2053,"ratio":0.8922207735767058} +{"name":"avm_test_contract-AvmTest::add_u128","base_size":345,"alt_size":412,"ratio":1.1942028985507247} +{"name":"avm_test_contract-AvmTest::assert_calldata_copy","base_size":615,"alt_size":682,"ratio":1.1089430894308943} +{"name":"avm_test_contract-AvmTest::assert_nullifier_exists","base_size":286,"alt_size":323,"ratio":1.1293706293706294} +{"name":"avm_test_contract-AvmTest::assert_same","base_size":254,"alt_size":313,"ratio":1.2322834645669292} +{"name":"avm_test_contract-AvmTest::assertion_failure","base_size":213,"alt_size":242,"ratio":1.136150234741784} +{"name":"avm_test_contract-AvmTest::bulk_testing","base_size":18275,"alt_size":14924,"ratio":0.8166347469220246} +{"name":"avm_test_contract-AvmTest::create_different_nullifier_in_nested_call","base_size":737,"alt_size":743,"ratio":1.0081411126187245} +{"name":"avm_test_contract-AvmTest::create_same_nullifier_in_nested_call","base_size":706,"alt_size":724,"ratio":1.0254957507082152} +{"name":"avm_test_contract-AvmTest::debug_logging","base_size":1075,"alt_size":996,"ratio":0.9265116279069767} +{"name":"avm_test_contract-AvmTest::divide_by_zero","base_size":209,"alt_size":225,"ratio":1.076555023923445} +{"name":"avm_test_contract-AvmTest::elliptic_curve_add","base_size":646,"alt_size":685,"ratio":1.0603715170278638} +{"name":"avm_test_contract-AvmTest::elliptic_curve_add_and_double","base_size":323,"alt_size":350,"ratio":1.08359133126935} +{"name":"avm_test_contract-AvmTest::emit_nullifier_and_check","base_size":310,"alt_size":319,"ratio":1.0290322580645161} +{"name":"avm_test_contract-AvmTest::emit_public_log","base_size":2015,"alt_size":1873,"ratio":0.9295285359801488} +{"name":"avm_test_contract-AvmTest::enqueue_public_from_private","base_size":5008,"alt_size":5022,"ratio":1.0027955271565496} +{"name":"avm_test_contract-AvmTest::external_call_to_assertion_failure","base_size":663,"alt_size":660,"ratio":0.995475113122172} +{"name":"avm_test_contract-AvmTest::external_call_to_divide_by_zero","base_size":673,"alt_size":673,"ratio":1} +{"name":"avm_test_contract-AvmTest::external_call_to_divide_by_zero_recovers","base_size":2199,"alt_size":2003,"ratio":0.910868576625739} +{"name":"avm_test_contract-AvmTest::get_address","base_size":212,"alt_size":240,"ratio":1.1320754716981132} +{"name":"avm_test_contract-AvmTest::get_args_hash","base_size":1754,"alt_size":1633,"ratio":0.9310148232611174} +{"name":"avm_test_contract-AvmTest::get_block_number","base_size":216,"alt_size":248,"ratio":1.1481481481481481} +{"name":"avm_test_contract-AvmTest::get_chain_id","base_size":210,"alt_size":246,"ratio":1.1714285714285715} +{"name":"avm_test_contract-AvmTest::get_da_gas_left","base_size":216,"alt_size":248,"ratio":1.1481481481481481} +{"name":"avm_test_contract-AvmTest::get_fee_per_da_gas","base_size":218,"alt_size":248,"ratio":1.1376146788990826} +{"name":"avm_test_contract-AvmTest::get_fee_per_l2_gas","base_size":216,"alt_size":250,"ratio":1.1574074074074074} +{"name":"avm_test_contract-AvmTest::get_l2_gas_left","base_size":215,"alt_size":243,"ratio":1.130232558139535} +{"name":"avm_test_contract-AvmTest::get_sender","base_size":214,"alt_size":241,"ratio":1.1261682242990654} +{"name":"avm_test_contract-AvmTest::get_timestamp","base_size":220,"alt_size":244,"ratio":1.1090909090909091} +{"name":"avm_test_contract-AvmTest::get_transaction_fee","base_size":219,"alt_size":251,"ratio":1.1461187214611872} +{"name":"avm_test_contract-AvmTest::get_version","base_size":216,"alt_size":241,"ratio":1.1157407407407407} +{"name":"avm_test_contract-AvmTest::helper_with_failed_assertion","base_size":111,"alt_size":87,"ratio":0.7837837837837838} +{"name":"avm_test_contract-AvmTest::inner_helper_with_failed_assertion","base_size":111,"alt_size":87,"ratio":0.7837837837837838} +{"name":"avm_test_contract-AvmTest::l1_to_l2_msg_exists","base_size":266,"alt_size":316,"ratio":1.1879699248120301} +{"name":"avm_test_contract-AvmTest::modulo2","base_size":216,"alt_size":270,"ratio":1.25} +{"name":"avm_test_contract-AvmTest::n_new_l2_to_l1_msgs","base_size":279,"alt_size":314,"ratio":1.125448028673835} +{"name":"avm_test_contract-AvmTest::n_new_note_hashes","base_size":280,"alt_size":320,"ratio":1.1428571428571428} +{"name":"avm_test_contract-AvmTest::n_new_nullifiers","base_size":279,"alt_size":306,"ratio":1.096774193548387} +{"name":"avm_test_contract-AvmTest::n_new_public_logs","base_size":386,"alt_size":424,"ratio":1.0984455958549222} +{"name":"avm_test_contract-AvmTest::n_storage_writes","base_size":1170,"alt_size":1128,"ratio":0.9641025641025641} +{"name":"avm_test_contract-AvmTest::nested_call_to_add","base_size":731,"alt_size":759,"ratio":1.0383036935704515} +{"name":"avm_test_contract-AvmTest::nested_call_to_add_n_times_different_addresses","base_size":1092,"alt_size":1098,"ratio":1.0054945054945055} +{"name":"avm_test_contract-AvmTest::nested_call_to_add_with_gas","base_size":690,"alt_size":748,"ratio":1.0840579710144929} +{"name":"avm_test_contract-AvmTest::nested_call_to_assert_same","base_size":734,"alt_size":761,"ratio":1.0367847411444142} +{"name":"avm_test_contract-AvmTest::nested_call_to_nothing","base_size":667,"alt_size":658,"ratio":0.9865067466266867} +{"name":"avm_test_contract-AvmTest::nested_call_to_nothing_recovers","base_size":414,"alt_size":438,"ratio":1.0579710144927537} +{"name":"avm_test_contract-AvmTest::nested_static_call_to_add","base_size":751,"alt_size":763,"ratio":1.0159786950732357} +{"name":"avm_test_contract-AvmTest::nested_static_call_to_set_storage","base_size":698,"alt_size":691,"ratio":0.9899713467048711} +{"name":"avm_test_contract-AvmTest::new_note_hash","base_size":224,"alt_size":264,"ratio":1.1785714285714286} +{"name":"avm_test_contract-AvmTest::new_nullifier","base_size":216,"alt_size":265,"ratio":1.2268518518518519} +{"name":"avm_test_contract-AvmTest::note_hash_exists","base_size":266,"alt_size":318,"ratio":1.1954887218045114} +{"name":"avm_test_contract-AvmTest::nullifier_collision","base_size":230,"alt_size":266,"ratio":1.1565217391304348} +{"name":"avm_test_contract-AvmTest::nullifier_exists","base_size":265,"alt_size":313,"ratio":1.181132075471698} +{"name":"avm_test_contract-AvmTest::pedersen_commit","base_size":1176,"alt_size":1177,"ratio":1.0008503401360545} +{"name":"avm_test_contract-AvmTest::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"avm_test_contract-AvmTest::public_dispatch","base_size":39496,"alt_size":31688,"ratio":0.8023090945918574} +{"name":"avm_test_contract-AvmTest::read_assert_storage_single","base_size":266,"alt_size":296,"ratio":1.112781954887218} +{"name":"avm_test_contract-AvmTest::read_storage_list","base_size":392,"alt_size":431,"ratio":1.0994897959183674} +{"name":"avm_test_contract-AvmTest::read_storage_map","base_size":1126,"alt_size":1103,"ratio":0.9795737122557726} +{"name":"avm_test_contract-AvmTest::read_storage_single","base_size":231,"alt_size":258,"ratio":1.1168831168831168} +{"name":"avm_test_contract-AvmTest::return_oracle","base_size":510,"alt_size":540,"ratio":1.0588235294117647} +{"name":"avm_test_contract-AvmTest::returndata_copy_oracle","base_size":1359,"alt_size":1300,"ratio":0.9565857247976454} +{"name":"avm_test_contract-AvmTest::revert_oracle","base_size":496,"alt_size":541,"ratio":1.090725806451613} +{"name":"avm_test_contract-AvmTest::send_l2_to_l1_msg","base_size":244,"alt_size":287,"ratio":1.1762295081967213} +{"name":"avm_test_contract-AvmTest::set_opcode_big_field","base_size":214,"alt_size":235,"ratio":1.0981308411214954} +{"name":"avm_test_contract-AvmTest::set_opcode_really_big_field","base_size":211,"alt_size":231,"ratio":1.09478672985782} +{"name":"avm_test_contract-AvmTest::set_opcode_small_field","base_size":211,"alt_size":234,"ratio":1.1090047393364928} +{"name":"avm_test_contract-AvmTest::set_opcode_u32","base_size":196,"alt_size":216,"ratio":1.1020408163265305} +{"name":"avm_test_contract-AvmTest::set_opcode_u64","base_size":195,"alt_size":215,"ratio":1.1025641025641026} +{"name":"avm_test_contract-AvmTest::set_opcode_u8","base_size":187,"alt_size":220,"ratio":1.1764705882352942} +{"name":"avm_test_contract-AvmTest::set_read_storage_single","base_size":262,"alt_size":306,"ratio":1.16793893129771} +{"name":"avm_test_contract-AvmTest::set_storage_list","base_size":264,"alt_size":309,"ratio":1.1704545454545454} +{"name":"avm_test_contract-AvmTest::set_storage_map","base_size":1641,"alt_size":1558,"ratio":0.9494210847044485} +{"name":"avm_test_contract-AvmTest::set_storage_single","base_size":230,"alt_size":278,"ratio":1.208695652173913} +{"name":"avm_test_contract-AvmTest::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"avm_test_contract-AvmTest::test_get_contract_instance","base_size":540,"alt_size":536,"ratio":0.9925925925925926} +{"name":"avm_test_contract-AvmTest::test_get_contract_instance_matches","base_size":564,"alt_size":574,"ratio":1.0177304964539007} +{"name":"avm_test_contract-AvmTest::to_radix_le","base_size":472,"alt_size":554,"ratio":1.173728813559322} +{"name":"avm_test_contract-AvmTest::u128_addition_overflow","base_size":1031,"alt_size":999,"ratio":0.9689621726479146} +{"name":"avm_test_contract-AvmTest::u128_from_integer_overflow","base_size":606,"alt_size":625,"ratio":1.0313531353135315} +{"name":"avm_test_contract-AvmTest::variable_base_msm","base_size":552,"alt_size":590,"ratio":1.068840579710145} +{"name":"benchmarking_contract-Benchmarking::broadcast","base_size":1220,"alt_size":1181,"ratio":0.9680327868852459} +{"name":"benchmarking_contract-Benchmarking::create_note","base_size":70351,"alt_size":64442,"ratio":0.9160068797884892} +{"name":"benchmarking_contract-Benchmarking::increment_balance","base_size":2192,"alt_size":2007,"ratio":0.9156021897810219} +{"name":"benchmarking_contract-Benchmarking::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"benchmarking_contract-Benchmarking::public_dispatch","base_size":6088,"alt_size":5225,"ratio":0.8582457293035479} +{"name":"benchmarking_contract-Benchmarking::recreate_note","base_size":88826,"alt_size":80522,"ratio":0.9065138585549276} +{"name":"benchmarking_contract-Benchmarking::sha256_hash_2048","base_size":22473,"alt_size":20853,"ratio":0.9279134961954345} +{"name":"benchmarking_contract-Benchmarking::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"card_game_contract-CardGame::buy_pack","base_size":120474,"alt_size":109819,"ratio":0.9115576804953766} +{"name":"card_game_contract-CardGame::claim_cards","base_size":149592,"alt_size":137580,"ratio":0.9197015883202311} +{"name":"card_game_contract-CardGame::join_game","base_size":320433,"alt_size":294119,"ratio":0.9178798688025266} +{"name":"card_game_contract-CardGame::on_card_played","base_size":3419,"alt_size":3122,"ratio":0.9131324948815444} +{"name":"card_game_contract-CardGame::on_cards_claimed","base_size":4303,"alt_size":3864,"ratio":0.8979781547757378} +{"name":"card_game_contract-CardGame::on_game_joined","base_size":2520,"alt_size":2353,"ratio":0.9337301587301587} +{"name":"card_game_contract-CardGame::play_card","base_size":231201,"alt_size":210097,"ratio":0.9087201179925692} +{"name":"card_game_contract-CardGame::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"card_game_contract-CardGame::public_dispatch","base_size":12329,"alt_size":9744,"ratio":0.7903317381782788} +{"name":"card_game_contract-CardGame::start_game","base_size":3695,"alt_size":3299,"ratio":0.8928281461434371} +{"name":"card_game_contract-CardGame::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"card_game_contract-CardGame::view_collection_cards","base_size":19089,"alt_size":16166,"ratio":0.8468751637068469} +{"name":"card_game_contract-CardGame::view_game","base_size":17867,"alt_size":15144,"ratio":0.8475961269379303} +{"name":"card_game_contract-CardGame::view_game_cards","base_size":19604,"alt_size":16601,"ratio":0.846816976127321} +{"name":"child_contract-Child::private_get_value","base_size":44558,"alt_size":40012,"ratio":0.8979756721576372} +{"name":"child_contract-Child::private_set_value","base_size":70478,"alt_size":64666,"ratio":0.9175345497885865} +{"name":"child_contract-Child::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"child_contract-Child::pub_get_value","base_size":304,"alt_size":345,"ratio":1.1348684210526316} +{"name":"child_contract-Child::pub_inc_value","base_size":398,"alt_size":448,"ratio":1.1256281407035176} +{"name":"child_contract-Child::pub_inc_value_internal","base_size":457,"alt_size":510,"ratio":1.1159737417943107} +{"name":"child_contract-Child::pub_set_value","base_size":381,"alt_size":425,"ratio":1.1154855643044619} +{"name":"child_contract-Child::public_dispatch","base_size":2840,"alt_size":2480,"ratio":0.8732394366197183} +{"name":"child_contract-Child::set_value_twice_with_nested_first","base_size":838,"alt_size":811,"ratio":0.9677804295942721} +{"name":"child_contract-Child::set_value_twice_with_nested_last","base_size":847,"alt_size":811,"ratio":0.9574970484061394} +{"name":"child_contract-Child::set_value_with_two_nested_calls","base_size":1091,"alt_size":1033,"ratio":0.9468377635197067} +{"name":"child_contract-Child::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"child_contract-Child::value","base_size":21446,"alt_size":18902,"ratio":0.8813764804625571} +{"name":"child_contract-Child::value_internal","base_size":21571,"alt_size":18937,"ratio":0.8778916137406704} +{"name":"claim_contract-Claim::claim","base_size":40340,"alt_size":37161,"ratio":0.9211948438274665} +{"name":"claim_contract-Claim::constructor","base_size":3758,"alt_size":3255,"ratio":0.8661522086216072} +{"name":"claim_contract-Claim::process_log","base_size":14990,"alt_size":12646,"ratio":0.8436290860573716} +{"name":"claim_contract-Claim::public_dispatch","base_size":4157,"alt_size":3595,"ratio":0.8648063507337022} +{"name":"claim_contract-Claim::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::assert_class_id_is_registered","base_size":4047,"alt_size":4119,"ratio":1.0177909562638991} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::broadcast_private_function","base_size":20389,"alt_size":19446,"ratio":0.9537495708470254} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::broadcast_unconstrained_function","base_size":20346,"alt_size":19264,"ratio":0.9468200137619188} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::register","base_size":221551,"alt_size":202335,"ratio":0.9132660200134506} +{"name":"contract_class_registerer_contract-ContractClassRegisterer::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::deploy","base_size":7639,"alt_size":7661,"ratio":1.0028799581097003} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::get_update_delay","base_size":1468,"alt_size":1395,"ratio":0.9502724795640327} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::public_dispatch","base_size":8605,"alt_size":7120,"ratio":0.8274259151656014} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::set_update_delay","base_size":4056,"alt_size":3510,"ratio":0.8653846153846154} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"contract_instance_deployer_contract-ContractInstanceDeployer::update","base_size":4242,"alt_size":3684,"ratio":0.8684582743988685} +{"name":"counter_contract-Counter::decrement","base_size":225585,"alt_size":202694,"ratio":0.8985260544805728} +{"name":"counter_contract-Counter::get_counter","base_size":18915,"alt_size":15975,"ratio":0.8445678033306899} +{"name":"counter_contract-Counter::increment","base_size":66762,"alt_size":60801,"ratio":0.9107126808663611} +{"name":"counter_contract-Counter::increment_and_decrement","base_size":240819,"alt_size":216483,"ratio":0.8989448506969965} +{"name":"counter_contract-Counter::increment_twice","base_size":81927,"alt_size":74934,"ratio":0.9146435241129298} +{"name":"counter_contract-Counter::initialize","base_size":71829,"alt_size":65930,"ratio":0.9178743961352657} +{"name":"counter_contract-Counter::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"counter_contract-Counter::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"crowdfunding_contract-Crowdfunding::_publish_donation_receipts","base_size":532,"alt_size":563,"ratio":1.0582706766917294} +{"name":"crowdfunding_contract-Crowdfunding::donate","base_size":72839,"alt_size":67027,"ratio":0.9202075811035297} +{"name":"crowdfunding_contract-Crowdfunding::init","base_size":3739,"alt_size":3213,"ratio":0.8593206739769992} +{"name":"crowdfunding_contract-Crowdfunding::process_log","base_size":14990,"alt_size":12646,"ratio":0.8436290860573716} +{"name":"crowdfunding_contract-Crowdfunding::public_dispatch","base_size":4552,"alt_size":3976,"ratio":0.8734622144112478} +{"name":"crowdfunding_contract-Crowdfunding::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"crowdfunding_contract-Crowdfunding::withdraw","base_size":28753,"alt_size":26149,"ratio":0.9094355371613397} +{"name":"docs_example_contract-DocsExample::get_imm_card","base_size":23052,"alt_size":20391,"ratio":0.8845653305570016} +{"name":"docs_example_contract-DocsExample::get_leader","base_size":16334,"alt_size":13808,"ratio":0.8453532508877188} +{"name":"docs_example_contract-DocsExample::get_legendary_card","base_size":18029,"alt_size":15102,"ratio":0.8376504520494759} +{"name":"docs_example_contract-DocsExample::get_public_immutable","base_size":16281,"alt_size":13892,"ratio":0.8532645414900805} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_private","base_size":28315,"alt_size":25527,"ratio":0.9015362881864736} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_private_indirect","base_size":22294,"alt_size":19685,"ratio":0.8829729972189827} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public","base_size":345,"alt_size":377,"ratio":1.0927536231884059} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public_indirect","base_size":796,"alt_size":810,"ratio":1.0175879396984924} +{"name":"docs_example_contract-DocsExample::get_public_immutable_constrained_public_multiple","base_size":425,"alt_size":501,"ratio":1.1788235294117646} +{"name":"docs_example_contract-DocsExample::increase_legendary_points","base_size":73255,"alt_size":67029,"ratio":0.9150092143880963} +{"name":"docs_example_contract-DocsExample::initialize_private","base_size":66305,"alt_size":60777,"ratio":0.9166277053012594} +{"name":"docs_example_contract-DocsExample::initialize_private_immutable","base_size":66365,"alt_size":60739,"ratio":0.9152263994575454} +{"name":"docs_example_contract-DocsExample::initialize_public_immutable","base_size":1234,"alt_size":1220,"ratio":0.9886547811993517} +{"name":"docs_example_contract-DocsExample::insert_note","base_size":66297,"alt_size":60570,"ratio":0.9136160007240146} +{"name":"docs_example_contract-DocsExample::insert_notes","base_size":93012,"alt_size":85663,"ratio":0.9209886896314454} +{"name":"docs_example_contract-DocsExample::is_legendary_initialized","base_size":16998,"alt_size":14267,"ratio":0.8393340392987411} +{"name":"docs_example_contract-DocsExample::is_priv_imm_initialized","base_size":16949,"alt_size":14278,"ratio":0.8424095816862351} +{"name":"docs_example_contract-DocsExample::match_public_immutable","base_size":28092,"alt_size":25389,"ratio":0.9037804357112346} +{"name":"docs_example_contract-DocsExample::process_log","base_size":15194,"alt_size":12736,"ratio":0.8382256153744899} +{"name":"docs_example_contract-DocsExample::public_dispatch","base_size":3396,"alt_size":3009,"ratio":0.8860424028268551} +{"name":"docs_example_contract-DocsExample::read_note","base_size":18339,"alt_size":15572,"ratio":0.849119363105949} +{"name":"docs_example_contract-DocsExample::simple_macro_example","base_size":21432,"alt_size":18911,"ratio":0.8823721537887271} +{"name":"docs_example_contract-DocsExample::simple_macro_example_expanded","base_size":4637,"alt_size":4756,"ratio":1.0256631442743154} +{"name":"docs_example_contract-DocsExample::spend_public_authwit","base_size":197,"alt_size":255,"ratio":1.2944162436548223} +{"name":"docs_example_contract-DocsExample::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"docs_example_contract-DocsExample::update_leader","base_size":347,"alt_size":391,"ratio":1.1268011527377522} +{"name":"docs_example_contract-DocsExample::update_legendary_card","base_size":69920,"alt_size":63815,"ratio":0.9126859267734554} +{"name":"docs_example_contract-DocsExample::verify_private_authwit","base_size":21543,"alt_size":18922,"ratio":0.8783363505547045} +{"name":"docs_example_contract-DocsExample::view_imm_card","base_size":17928,"alt_size":15186,"ratio":0.8470548862115127} +{"name":"easy_private_token_contract-EasyPrivateToken::constructor","base_size":71829,"alt_size":65930,"ratio":0.9178743961352657} +{"name":"easy_private_token_contract-EasyPrivateToken::get_balance","base_size":18915,"alt_size":15975,"ratio":0.8445678033306899} +{"name":"easy_private_token_contract-EasyPrivateToken::mint","base_size":70288,"alt_size":64459,"ratio":0.9170697700887775} +{"name":"easy_private_token_contract-EasyPrivateToken::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"easy_private_token_contract-EasyPrivateToken::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"easy_private_token_contract-EasyPrivateToken::transfer","base_size":266118,"alt_size":240279,"ratio":0.9029039749284152} +{"name":"easy_private_voting_contract-EasyPrivateVoting::add_to_tally_public","base_size":1874,"alt_size":1760,"ratio":0.9391675560298826} +{"name":"easy_private_voting_contract-EasyPrivateVoting::cast_vote","base_size":7724,"alt_size":7706,"ratio":0.9976696012428793} +{"name":"easy_private_voting_contract-EasyPrivateVoting::constructor","base_size":3010,"alt_size":2647,"ratio":0.8794019933554817} +{"name":"easy_private_voting_contract-EasyPrivateVoting::end_vote","base_size":380,"alt_size":389,"ratio":1.0236842105263158} +{"name":"easy_private_voting_contract-EasyPrivateVoting::get_vote","base_size":1250,"alt_size":1213,"ratio":0.9704} +{"name":"easy_private_voting_contract-EasyPrivateVoting::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"easy_private_voting_contract-EasyPrivateVoting::public_dispatch","base_size":4819,"alt_size":4178,"ratio":0.8669848516289687} +{"name":"easy_private_voting_contract-EasyPrivateVoting::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::constructor","base_size":76386,"alt_size":69911,"ratio":0.9152331579085172} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::entrypoint","base_size":65077,"alt_size":58985,"ratio":0.90638781750849} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::process_log","base_size":16856,"alt_size":14178,"ratio":0.841124822021832} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"ecdsa_k_account_contract-EcdsaKAccount::verify_private_authwit","base_size":41083,"alt_size":36913,"ratio":0.8984981622568946} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::constructor","base_size":76386,"alt_size":69911,"ratio":0.9152331579085172} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::entrypoint","base_size":65012,"alt_size":59063,"ratio":0.9084938165261798} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::process_log","base_size":16856,"alt_size":14178,"ratio":0.841124822021832} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"ecdsa_r_account_contract-EcdsaRAccount::verify_private_authwit","base_size":41159,"alt_size":36799,"ratio":0.894069340848903} +{"name":"escrow_contract-Escrow::constructor","base_size":70295,"alt_size":63487,"ratio":0.9031510064727221} +{"name":"escrow_contract-Escrow::process_log","base_size":21724,"alt_size":17773,"ratio":0.8181274166820107} +{"name":"escrow_contract-Escrow::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"escrow_contract-Escrow::withdraw","base_size":29895,"alt_size":25928,"ratio":0.8673022244522496} +{"name":"fee_juice_contract-FeeJuice::_increase_public_balance","base_size":1971,"alt_size":1826,"ratio":0.9264332825976661} +{"name":"fee_juice_contract-FeeJuice::balance_of_public","base_size":1256,"alt_size":1224,"ratio":0.9745222929936306} +{"name":"fee_juice_contract-FeeJuice::check_balance","base_size":1470,"alt_size":1417,"ratio":0.9639455782312926} +{"name":"fee_juice_contract-FeeJuice::claim","base_size":73213,"alt_size":66784,"ratio":0.9121877262234849} +{"name":"fee_juice_contract-FeeJuice::initialize","base_size":5884,"alt_size":5914,"ratio":1.005098572399728} +{"name":"fee_juice_contract-FeeJuice::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"fee_juice_contract-FeeJuice::public_dispatch","base_size":4470,"alt_size":3917,"ratio":0.8762863534675616} +{"name":"fee_juice_contract-FeeJuice::set_portal","base_size":1132,"alt_size":1150,"ratio":1.0159010600706713} +{"name":"fee_juice_contract-FeeJuice::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"fpc_contract-FPC::complete_refund","base_size":1253,"alt_size":1248,"ratio":0.9960095770151636} +{"name":"fpc_contract-FPC::constructor","base_size":3470,"alt_size":3070,"ratio":0.8847262247838616} +{"name":"fpc_contract-FPC::fee_entrypoint_private","base_size":29614,"alt_size":26921,"ratio":0.9090632808806646} +{"name":"fpc_contract-FPC::fee_entrypoint_public","base_size":29279,"alt_size":26469,"ratio":0.9040267768707948} +{"name":"fpc_contract-FPC::get_accepted_asset","base_size":27995,"alt_size":25423,"ratio":0.9081264511519914} +{"name":"fpc_contract-FPC::pay_refund","base_size":1258,"alt_size":1263,"ratio":1.0039745627980923} +{"name":"fpc_contract-FPC::process_log","base_size":14990,"alt_size":12646,"ratio":0.8436290860573716} +{"name":"fpc_contract-FPC::public_dispatch","base_size":6698,"alt_size":5729,"ratio":0.8553299492385786} +{"name":"fpc_contract-FPC::pull_funds","base_size":1274,"alt_size":1220,"ratio":0.957613814756672} +{"name":"fpc_contract-FPC::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"import_test_contract-ImportTest::call_no_args","base_size":29353,"alt_size":25289,"ratio":0.8615473716485538} +{"name":"import_test_contract-ImportTest::call_public_fn","base_size":29081,"alt_size":24953,"ratio":0.8580516488428871} +{"name":"import_test_contract-ImportTest::main_contract","base_size":29560,"alt_size":25430,"ratio":0.8602841677943166} +{"name":"import_test_contract-ImportTest::process_log","base_size":22624,"alt_size":18652,"ratio":0.8244342291371994} +{"name":"import_test_contract-ImportTest::pub_call_public_fn","base_size":676,"alt_size":689,"ratio":1.0192307692307692} +{"name":"import_test_contract-ImportTest::public_dispatch","base_size":1193,"alt_size":1177,"ratio":0.9865884325230512} +{"name":"import_test_contract-ImportTest::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"inclusion_proofs_contract-InclusionProofs::constructor","base_size":2438,"alt_size":2226,"ratio":0.9130434782608695} +{"name":"inclusion_proofs_contract-InclusionProofs::create_note","base_size":70288,"alt_size":64477,"ratio":0.9173258593216481} +{"name":"inclusion_proofs_contract-InclusionProofs::nullify_note","base_size":40221,"alt_size":35932,"ratio":0.8933641629994281} +{"name":"inclusion_proofs_contract-InclusionProofs::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"inclusion_proofs_contract-InclusionProofs::public_dispatch","base_size":3191,"alt_size":2842,"ratio":0.8906298965841429} +{"name":"inclusion_proofs_contract-InclusionProofs::push_nullifier_public","base_size":309,"alt_size":340,"ratio":1.1003236245954693} +{"name":"inclusion_proofs_contract-InclusionProofs::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"inclusion_proofs_contract-InclusionProofs::test_contract_inclusion","base_size":34455,"alt_size":31376,"ratio":0.9106370628355827} +{"name":"inclusion_proofs_contract-InclusionProofs::test_contract_non_inclusion","base_size":38255,"alt_size":34877,"ratio":0.9116978172787871} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_inclusion","base_size":46528,"alt_size":42012,"ratio":0.9029401650618982} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_inclusion_fail_case","base_size":30784,"alt_size":27936,"ratio":0.9074844074844075} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_not_nullified","base_size":51153,"alt_size":46088,"ratio":0.9009833245361953} +{"name":"inclusion_proofs_contract-InclusionProofs::test_note_validity","base_size":54502,"alt_size":49261,"ratio":0.9038383912516972} +{"name":"inclusion_proofs_contract-InclusionProofs::test_nullifier_inclusion","base_size":31090,"alt_size":28147,"ratio":0.9053393374075266} +{"name":"inclusion_proofs_contract-InclusionProofs::test_nullifier_inclusion_from_public","base_size":313,"alt_size":335,"ratio":1.0702875399361023} +{"name":"inclusion_proofs_contract-InclusionProofs::test_storage_historical_read","base_size":33182,"alt_size":30282,"ratio":0.9126032186125007} +{"name":"inclusion_proofs_contract-InclusionProofs::test_storage_historical_read_unset_slot","base_size":33284,"alt_size":30401,"ratio":0.9133818050715058} +{"name":"lending_contract-Lending::_borrow","base_size":7859,"alt_size":6911,"ratio":0.8793739661534546} +{"name":"lending_contract-Lending::_deposit","base_size":2099,"alt_size":2003,"ratio":0.9542639352072415} +{"name":"lending_contract-Lending::_repay","base_size":5363,"alt_size":4904,"ratio":0.9144135744918889} +{"name":"lending_contract-Lending::_withdraw","base_size":7231,"alt_size":6338,"ratio":0.8765039413635735} +{"name":"lending_contract-Lending::borrow_private","base_size":22405,"alt_size":19737,"ratio":0.88091943762553} +{"name":"lending_contract-Lending::borrow_public","base_size":803,"alt_size":822,"ratio":1.0236612702366128} +{"name":"lending_contract-Lending::constructor","base_size":23175,"alt_size":20537,"ratio":0.8861704422869472} +{"name":"lending_contract-Lending::deposit_private","base_size":22852,"alt_size":20284,"ratio":0.8876247155610012} +{"name":"lending_contract-Lending::deposit_public","base_size":1111,"alt_size":1087,"ratio":0.9783978397839784} +{"name":"lending_contract-Lending::get_asset","base_size":1626,"alt_size":1580,"ratio":0.971709717097171} +{"name":"lending_contract-Lending::get_assets","base_size":522,"alt_size":569,"ratio":1.0900383141762453} +{"name":"lending_contract-Lending::get_position","base_size":4377,"alt_size":3942,"ratio":0.9006168608636053} +{"name":"lending_contract-Lending::init","base_size":1953,"alt_size":1891,"ratio":0.9682539682539683} +{"name":"lending_contract-Lending::process_log","base_size":14990,"alt_size":12646,"ratio":0.8436290860573716} +{"name":"lending_contract-Lending::public_dispatch","base_size":30559,"alt_size":24879,"ratio":0.8141300435223666} +{"name":"lending_contract-Lending::repay_private","base_size":22836,"alt_size":20168,"ratio":0.883166929409704} +{"name":"lending_contract-Lending::repay_public","base_size":1161,"alt_size":1134,"ratio":0.9767441860465116} +{"name":"lending_contract-Lending::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"lending_contract-Lending::update_accumulator","base_size":6414,"alt_size":5805,"ratio":0.9050514499532273} +{"name":"lending_contract-Lending::withdraw_private","base_size":22427,"alt_size":19653,"ratio":0.8763098051455834} +{"name":"lending_contract-Lending::withdraw_public","base_size":799,"alt_size":823,"ratio":1.0300375469336671} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::entrypoint","base_size":18038,"alt_size":17304,"ratio":0.9593081272868389} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"multi_call_entrypoint_contract-MultiCallEntrypoint::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"nft_contract-NFT::_finalize_transfer_to_private_unsafe","base_size":3569,"alt_size":3220,"ratio":0.9022135051835248} +{"name":"nft_contract-NFT::_finish_transfer_to_public","base_size":1257,"alt_size":1248,"ratio":0.9928400954653938} +{"name":"nft_contract-NFT::_store_payload_in_transient_storage_unsafe","base_size":1225,"alt_size":1239,"ratio":1.0114285714285713} +{"name":"nft_contract-NFT::cancel_authwit","base_size":21085,"alt_size":18532,"ratio":0.8789186625563197} +{"name":"nft_contract-NFT::constructor","base_size":5748,"alt_size":5046,"ratio":0.8778705636743215} +{"name":"nft_contract-NFT::finalize_transfer_to_private","base_size":3528,"alt_size":3184,"ratio":0.9024943310657596} +{"name":"nft_contract-NFT::get_admin","base_size":367,"alt_size":400,"ratio":1.0899182561307903} +{"name":"nft_contract-NFT::get_private_nfts","base_size":20050,"alt_size":16803,"ratio":0.8380548628428928} +{"name":"nft_contract-NFT::is_minter","base_size":1258,"alt_size":1250,"ratio":0.9936406995230525} +{"name":"nft_contract-NFT::mint","base_size":2560,"alt_size":2286,"ratio":0.89296875} +{"name":"nft_contract-NFT::owner_of","base_size":1822,"alt_size":1704,"ratio":0.9352360043907794} +{"name":"nft_contract-NFT::prepare_private_balance_increase","base_size":66456,"alt_size":60927,"ratio":0.916802094618996} +{"name":"nft_contract-NFT::private_get_name","base_size":27793,"alt_size":25377,"ratio":0.9130716367430648} +{"name":"nft_contract-NFT::private_get_symbol","base_size":27949,"alt_size":25440,"ratio":0.9102293463093492} +{"name":"nft_contract-NFT::process_log","base_size":14925,"alt_size":12592,"ratio":0.8436850921273031} +{"name":"nft_contract-NFT::public_dispatch","base_size":20493,"alt_size":16192,"ratio":0.7901234567901234} +{"name":"nft_contract-NFT::public_get_name","base_size":375,"alt_size":388,"ratio":1.0346666666666666} +{"name":"nft_contract-NFT::public_get_symbol","base_size":347,"alt_size":388,"ratio":1.1181556195965419} +{"name":"nft_contract-NFT::set_admin","base_size":376,"alt_size":423,"ratio":1.125} +{"name":"nft_contract-NFT::set_minter","base_size":1277,"alt_size":1275,"ratio":0.9984338292873923} +{"name":"nft_contract-NFT::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"nft_contract-NFT::transfer_in_private","base_size":98892,"alt_size":89597,"ratio":0.9060085750111232} +{"name":"nft_contract-NFT::transfer_in_public","base_size":3751,"alt_size":3300,"ratio":0.8797653958944281} +{"name":"nft_contract-NFT::transfer_to_private","base_size":66845,"alt_size":61062,"ratio":0.9134864238162914} +{"name":"nft_contract-NFT::transfer_to_public","base_size":50192,"alt_size":45141,"ratio":0.8993664328976729} +{"name":"parent_contract-Parent::enqueue_call_to_child","base_size":21821,"alt_size":19248,"ratio":0.882086063883415} +{"name":"parent_contract-Parent::enqueue_call_to_child_twice","base_size":21917,"alt_size":19369,"ratio":0.8837432130309805} +{"name":"parent_contract-Parent::enqueue_call_to_pub_entry_point","base_size":21770,"alt_size":19166,"ratio":0.8803858520900322} +{"name":"parent_contract-Parent::enqueue_calls_to_child_with_nested_first","base_size":22238,"alt_size":19585,"ratio":0.8806997032107204} +{"name":"parent_contract-Parent::enqueue_calls_to_child_with_nested_last","base_size":22298,"alt_size":19537,"ratio":0.8761772356265136} +{"name":"parent_contract-Parent::enqueue_calls_to_pub_entry_point","base_size":21848,"alt_size":19269,"ratio":0.8819571585499817} +{"name":"parent_contract-Parent::enqueue_static_call_to_pub_function","base_size":21816,"alt_size":19211,"ratio":0.8805922258892556} +{"name":"parent_contract-Parent::enqueue_static_nested_call_to_pub_function","base_size":21801,"alt_size":19204,"ratio":0.8808770239897252} +{"name":"parent_contract-Parent::entry_point","base_size":22184,"alt_size":19480,"ratio":0.8781103498016588} +{"name":"parent_contract-Parent::private_call","base_size":22203,"alt_size":19540,"ratio":0.880061252983831} +{"name":"parent_contract-Parent::private_nested_static_call","base_size":22182,"alt_size":19539,"ratio":0.880849337300514} +{"name":"parent_contract-Parent::private_static_call","base_size":22212,"alt_size":19558,"ratio":0.8805150369169819} +{"name":"parent_contract-Parent::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"parent_contract-Parent::pub_entry_point","base_size":764,"alt_size":788,"ratio":1.031413612565445} +{"name":"parent_contract-Parent::pub_entry_point_twice","base_size":1045,"alt_size":1011,"ratio":0.9674641148325359} +{"name":"parent_contract-Parent::public_dispatch","base_size":4044,"alt_size":3546,"ratio":0.8768545994065282} +{"name":"parent_contract-Parent::public_nested_static_call","base_size":2669,"alt_size":2476,"ratio":0.9276882727613338} +{"name":"parent_contract-Parent::public_static_call","base_size":1203,"alt_size":1208,"ratio":1.0041562759767249} +{"name":"parent_contract-Parent::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"pending_note_hashes_contract-PendingNoteHashes::dummy","base_size":21162,"alt_size":18561,"ratio":0.8770910121916643} +{"name":"pending_note_hashes_contract-PendingNoteHashes::get_note_zero_balance","base_size":55883,"alt_size":49602,"ratio":0.8876044593167869} +{"name":"pending_note_hashes_contract-PendingNoteHashes::get_then_nullify_note","base_size":40328,"alt_size":36188,"ratio":0.8973417972624479} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note","base_size":70375,"alt_size":64408,"ratio":0.9152113676731793} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note_extra_emit","base_size":81538,"alt_size":74657,"ratio":0.9156098996786775} +{"name":"pending_note_hashes_contract-PendingNoteHashes::insert_note_static_randomness","base_size":66298,"alt_size":60746,"ratio":0.9162569006606535} +{"name":"pending_note_hashes_contract-PendingNoteHashes::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"pending_note_hashes_contract-PendingNoteHashes::recursively_destroy_and_create_notes","base_size":422819,"alt_size":389816,"ratio":0.9219453241221421} +{"name":"pending_note_hashes_contract-PendingNoteHashes::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_bad_get_then_insert_flat","base_size":87596,"alt_size":74795,"ratio":0.8538631901000046} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_emit_bad_note_log","base_size":81383,"alt_size":74497,"ratio":0.9153877345391543} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert1_then_get2_then_nullify2_all_in_nested_calls","base_size":22210,"alt_size":19505,"ratio":0.8782080144079244} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert2_then_get2_then_nullify1_all_in_nested_calls","base_size":22217,"alt_size":19480,"ratio":0.8768060494216141} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert2_then_get2_then_nullify2_all_in_nested_calls","base_size":22276,"alt_size":19728,"ratio":0.8856168073262705} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert_then_get_then_nullify_all_in_nested_calls","base_size":22085,"alt_size":19553,"ratio":0.8853520489019696} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_insert_then_get_then_nullify_flat","base_size":224467,"alt_size":201481,"ratio":0.8975974196652514} +{"name":"pending_note_hashes_contract-PendingNoteHashes::test_recursively_create_notes","base_size":299229,"alt_size":277805,"ratio":0.928402661506739} +{"name":"price_feed_contract-PriceFeed::get_price","base_size":1230,"alt_size":1224,"ratio":0.9951219512195122} +{"name":"price_feed_contract-PriceFeed::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"price_feed_contract-PriceFeed::public_dispatch","base_size":2473,"alt_size":2288,"ratio":0.9251920744035584} +{"name":"price_feed_contract-PriceFeed::set_price","base_size":1137,"alt_size":1122,"ratio":0.9868073878627969} +{"name":"price_feed_contract-PriceFeed::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"router_contract-Router::_check_block_number","base_size":995,"alt_size":1043,"ratio":1.0482412060301507} +{"name":"router_contract-Router::_check_timestamp","base_size":1030,"alt_size":1069,"ratio":1.0378640776699029} +{"name":"router_contract-Router::check_block_number","base_size":4928,"alt_size":4912,"ratio":0.9967532467532467} +{"name":"router_contract-Router::check_timestamp","base_size":4944,"alt_size":4975,"ratio":1.0062702265372168} +{"name":"router_contract-Router::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"router_contract-Router::public_dispatch","base_size":1975,"alt_size":1895,"ratio":0.959493670886076} +{"name":"router_contract-Router::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"schnorr_account_contract-SchnorrAccount::constructor","base_size":63825,"alt_size":58436,"ratio":0.9155660007833921} +{"name":"schnorr_account_contract-SchnorrAccount::entrypoint","base_size":64808,"alt_size":59230,"ratio":0.9139303789655598} +{"name":"schnorr_account_contract-SchnorrAccount::lookup_validity","base_size":23596,"alt_size":19846,"ratio":0.8410747584336328} +{"name":"schnorr_account_contract-SchnorrAccount::process_log","base_size":15185,"alt_size":12741,"ratio":0.8390516957523872} +{"name":"schnorr_account_contract-SchnorrAccount::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"schnorr_account_contract-SchnorrAccount::verify_private_authwit","base_size":40735,"alt_size":37275,"ratio":0.9150607585614337} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::entrypoint","base_size":46838,"alt_size":43869,"ratio":0.9366112985182972} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"schnorr_hardcoded_account_contract-SchnorrHardcodedAccount::verify_private_authwit","base_size":22056,"alt_size":21162,"ratio":0.9594668117519043} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::entrypoint","base_size":43214,"alt_size":40261,"ratio":0.9316656639052159} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::process_log","base_size":1279,"alt_size":1232,"ratio":0.9632525410476935} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"schnorr_single_key_account_contract-SchnorrSingleKeyAccount::verify_private_authwit","base_size":18539,"alt_size":17960,"ratio":0.9687685419925562} +{"name":"spam_contract-Spam::process_log","base_size":21685,"alt_size":18058,"ratio":0.8327415264007378} +{"name":"spam_contract-Spam::public_dispatch","base_size":2383,"alt_size":2238,"ratio":0.9391523289970626} +{"name":"spam_contract-Spam::public_spam","base_size":1891,"alt_size":1756,"ratio":0.928609201480698} +{"name":"spam_contract-Spam::spam","base_size":93562,"alt_size":80116,"ratio":0.8562878091532887} +{"name":"spam_contract-Spam::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"stateful_test_contract-StatefulTest::constructor","base_size":23974,"alt_size":21468,"ratio":0.895470092600317} +{"name":"stateful_test_contract-StatefulTest::create_note","base_size":72352,"alt_size":66229,"ratio":0.9153720698805838} +{"name":"stateful_test_contract-StatefulTest::create_note_no_init_check","base_size":72428,"alt_size":66294,"ratio":0.9153089965206826} +{"name":"stateful_test_contract-StatefulTest::destroy_and_create","base_size":442159,"alt_size":408106,"ratio":0.9229847181669942} +{"name":"stateful_test_contract-StatefulTest::destroy_and_create_no_init_check","base_size":442509,"alt_size":408312,"ratio":0.9227202158600164} +{"name":"stateful_test_contract-StatefulTest::get_public_value","base_size":1168,"alt_size":1155,"ratio":0.9888698630136986} +{"name":"stateful_test_contract-StatefulTest::increment_public_value","base_size":1210,"alt_size":1214,"ratio":1.0033057851239668} +{"name":"stateful_test_contract-StatefulTest::increment_public_value_no_init_check","base_size":1124,"alt_size":1123,"ratio":0.9991103202846975} +{"name":"stateful_test_contract-StatefulTest::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"stateful_test_contract-StatefulTest::public_constructor","base_size":3302,"alt_size":2939,"ratio":0.8900666262870988} +{"name":"stateful_test_contract-StatefulTest::public_dispatch","base_size":5855,"alt_size":5030,"ratio":0.8590947907771136} +{"name":"stateful_test_contract-StatefulTest::summed_values","base_size":18915,"alt_size":15975,"ratio":0.8445678033306899} +{"name":"stateful_test_contract-StatefulTest::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"stateful_test_contract-StatefulTest::wrong_constructor","base_size":23814,"alt_size":21239,"ratio":0.8918703283782649} +{"name":"static_child_contract-StaticChild::private_get_value","base_size":51205,"alt_size":46225,"ratio":0.9027438726686847} +{"name":"static_child_contract-StaticChild::private_illegal_set_value","base_size":66528,"alt_size":60801,"ratio":0.9139159451659452} +{"name":"static_child_contract-StaticChild::private_set_value","base_size":66531,"alt_size":60856,"ratio":0.9147014173843772} +{"name":"static_child_contract-StaticChild::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"static_child_contract-StaticChild::pub_get_value","base_size":368,"alt_size":411,"ratio":1.1168478260869565} +{"name":"static_child_contract-StaticChild::pub_illegal_inc_value","base_size":452,"alt_size":506,"ratio":1.1194690265486726} +{"name":"static_child_contract-StaticChild::pub_inc_value","base_size":398,"alt_size":448,"ratio":1.1256281407035176} +{"name":"static_child_contract-StaticChild::pub_set_value","base_size":381,"alt_size":425,"ratio":1.1154855643044619} +{"name":"static_child_contract-StaticChild::public_dispatch","base_size":1380,"alt_size":1323,"ratio":0.9586956521739131} +{"name":"static_child_contract-StaticChild::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"static_parent_contract-StaticParent::enqueue_call","base_size":21794,"alt_size":19213,"ratio":0.8815729099752225} +{"name":"static_parent_contract-StaticParent::enqueue_public_get_value_from_child","base_size":21791,"alt_size":19129,"ratio":0.8778394750126199} +{"name":"static_parent_contract-StaticParent::enqueue_static_call_to_pub_function","base_size":21816,"alt_size":19211,"ratio":0.8805922258892556} +{"name":"static_parent_contract-StaticParent::enqueue_static_nested_call_to_pub_function","base_size":21761,"alt_size":19194,"ratio":0.8820366711088645} +{"name":"static_parent_contract-StaticParent::private_call","base_size":22203,"alt_size":19540,"ratio":0.880061252983831} +{"name":"static_parent_contract-StaticParent::private_call_3_args","base_size":22233,"alt_size":19699,"ratio":0.8860252777402959} +{"name":"static_parent_contract-StaticParent::private_get_value_from_child","base_size":22262,"alt_size":19575,"ratio":0.8793010511184979} +{"name":"static_parent_contract-StaticParent::private_nested_static_call","base_size":22196,"alt_size":19513,"ratio":0.8791223643899801} +{"name":"static_parent_contract-StaticParent::private_nested_static_call_3_args","base_size":22239,"alt_size":19594,"ratio":0.8810647960789604} +{"name":"static_parent_contract-StaticParent::private_static_call","base_size":22212,"alt_size":19558,"ratio":0.8805150369169819} +{"name":"static_parent_contract-StaticParent::private_static_call_3_args","base_size":22221,"alt_size":19656,"ratio":0.8845686512758202} +{"name":"static_parent_contract-StaticParent::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"static_parent_contract-StaticParent::public_call","base_size":764,"alt_size":788,"ratio":1.031413612565445} +{"name":"static_parent_contract-StaticParent::public_dispatch","base_size":2169,"alt_size":1900,"ratio":0.875979714153988} +{"name":"static_parent_contract-StaticParent::public_get_value_from_child","base_size":739,"alt_size":747,"ratio":1.0108254397834913} +{"name":"static_parent_contract-StaticParent::public_nested_static_call","base_size":907,"alt_size":941,"ratio":1.0374862183020948} +{"name":"static_parent_contract-StaticParent::public_static_call","base_size":1203,"alt_size":1208,"ratio":1.0041562759767249} +{"name":"static_parent_contract-StaticParent::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"test_contract-Test::assert_header_private","base_size":29006,"alt_size":25017,"ratio":0.8624767289526305} +{"name":"test_contract-Test::assert_private_global_vars","base_size":28622,"alt_size":24428,"ratio":0.8534693592341556} +{"name":"test_contract-Test::assert_public_global_vars","base_size":529,"alt_size":566,"ratio":1.0699432892249527} +{"name":"test_contract-Test::call_create_note","base_size":77804,"alt_size":70480,"ratio":0.9058660223124775} +{"name":"test_contract-Test::call_destroy_note","base_size":70138,"alt_size":62597,"ratio":0.8924833898885055} +{"name":"test_contract-Test::call_get_notes","base_size":63151,"alt_size":55740,"ratio":0.882646355560482} +{"name":"test_contract-Test::call_get_notes_many","base_size":63327,"alt_size":55662,"ratio":0.8789615803685632} +{"name":"test_contract-Test::call_view_notes","base_size":25455,"alt_size":21163,"ratio":0.8313887252013357} +{"name":"test_contract-Test::call_view_notes_many","base_size":25545,"alt_size":21273,"ratio":0.8327657075748679} +{"name":"test_contract-Test::consume_message_from_arbitrary_sender_private","base_size":76738,"alt_size":68935,"ratio":0.8983163491360213} +{"name":"test_contract-Test::consume_message_from_arbitrary_sender_public","base_size":5295,"alt_size":4594,"ratio":0.8676109537299339} +{"name":"test_contract-Test::consume_mint_to_private_message","base_size":83889,"alt_size":74977,"ratio":0.8937643791200277} +{"name":"test_contract-Test::consume_mint_to_public_message","base_size":7798,"alt_size":6634,"ratio":0.8507309566555527} +{"name":"test_contract-Test::consume_note_from_secret","base_size":49622,"alt_size":44218,"ratio":0.8910966909838378} +{"name":"test_contract-Test::create_l2_to_l1_message_arbitrary_recipient_private","base_size":28597,"alt_size":24520,"ratio":0.8574325978249466} +{"name":"test_contract-Test::create_l2_to_l1_message_arbitrary_recipient_public","base_size":244,"alt_size":287,"ratio":1.1762295081967213} +{"name":"test_contract-Test::create_l2_to_l1_message_public","base_size":1739,"alt_size":1597,"ratio":0.9183438757906843} +{"name":"test_contract-Test::deliver_note","base_size":42940,"alt_size":35213,"ratio":0.8200512342803913} +{"name":"test_contract-Test::deploy_contract","base_size":31511,"alt_size":27416,"ratio":0.8700453809780712} +{"name":"test_contract-Test::dummy_public_call","base_size":251,"alt_size":277,"ratio":1.1035856573705178} +{"name":"test_contract-Test::emit_array_as_encrypted_log","base_size":51242,"alt_size":44331,"ratio":0.8651301666601616} +{"name":"test_contract-Test::emit_encrypted_logs_nested","base_size":74253,"alt_size":67298,"ratio":0.9063337508248825} +{"name":"test_contract-Test::emit_nullifier","base_size":28690,"alt_size":24616,"ratio":0.8579993028929941} +{"name":"test_contract-Test::emit_nullifier_public","base_size":216,"alt_size":265,"ratio":1.2268518518518519} +{"name":"test_contract-Test::emit_public","base_size":1104,"alt_size":1097,"ratio":0.9936594202898551} +{"name":"test_contract-Test::get_constant","base_size":24841,"alt_size":20815,"ratio":0.8379292299021779} +{"name":"test_contract-Test::get_master_incoming_viewing_public_key","base_size":30637,"alt_size":26767,"ratio":0.87368214903548} +{"name":"test_contract-Test::get_ovsk_app","base_size":29335,"alt_size":25455,"ratio":0.867734787796148} +{"name":"test_contract-Test::get_this_address","base_size":28810,"alt_size":24849,"ratio":0.86251301631378} +{"name":"test_contract-Test::is_time_equal","base_size":263,"alt_size":308,"ratio":1.1711026615969582} +{"name":"test_contract-Test::process_log","base_size":22628,"alt_size":18662,"ratio":0.8247304224854163} +{"name":"test_contract-Test::public_dispatch","base_size":15395,"alt_size":12722,"ratio":0.826372198765833} +{"name":"test_contract-Test::set_constant","base_size":29956,"alt_size":25838,"ratio":0.8625317131793296} +{"name":"test_contract-Test::set_tx_max_block_number","base_size":29137,"alt_size":25141,"ratio":0.8628547894429763} +{"name":"test_contract-Test::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"test_contract-Test::test_code_gen","base_size":29130,"alt_size":25216,"ratio":0.865636800549262} +{"name":"test_contract-Test::test_nullifier_key_freshness","base_size":30545,"alt_size":26674,"ratio":0.8732689474545752} +{"name":"test_contract-Test::test_setting_fee_payer","base_size":29018,"alt_size":24972,"ratio":0.860569301812668} +{"name":"test_contract-Test::test_setting_teardown","base_size":28984,"alt_size":25007,"ratio":0.8627863648909744} +{"name":"test_log_contract-TestLog::emit_encrypted_events","base_size":100451,"alt_size":92770,"ratio":0.9235348577913609} +{"name":"test_log_contract-TestLog::emit_unencrypted_events","base_size":660,"alt_size":692,"ratio":1.0484848484848486} +{"name":"test_log_contract-TestLog::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"test_log_contract-TestLog::public_dispatch","base_size":1486,"alt_size":1465,"ratio":0.9858681022880216} +{"name":"test_log_contract-TestLog::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"token_blacklist_contract-TokenBlacklist::_increase_public_balance","base_size":2053,"alt_size":1910,"ratio":0.9303458353628836} +{"name":"token_blacklist_contract-TokenBlacklist::_reduce_total_supply","base_size":590,"alt_size":604,"ratio":1.023728813559322} +{"name":"token_blacklist_contract-TokenBlacklist::balance_of_private","base_size":23972,"alt_size":20185,"ratio":0.8420240280327048} +{"name":"token_blacklist_contract-TokenBlacklist::balance_of_public","base_size":1331,"alt_size":1336,"ratio":1.0037565740045078} +{"name":"token_blacklist_contract-TokenBlacklist::burn","base_size":242678,"alt_size":217041,"ratio":0.8943579558097562} +{"name":"token_blacklist_contract-TokenBlacklist::burn_public","base_size":5682,"alt_size":4849,"ratio":0.8533966913058783} +{"name":"token_blacklist_contract-TokenBlacklist::constructor","base_size":5728,"alt_size":4857,"ratio":0.8479399441340782} +{"name":"token_blacklist_contract-TokenBlacklist::deliver_transparent_note","base_size":36728,"alt_size":30492,"ratio":0.8302112829448922} +{"name":"token_blacklist_contract-TokenBlacklist::get_roles","base_size":1651,"alt_size":1609,"ratio":0.9745608721986675} +{"name":"token_blacklist_contract-TokenBlacklist::mint_private","base_size":2825,"alt_size":2531,"ratio":0.895929203539823} +{"name":"token_blacklist_contract-TokenBlacklist::mint_public","base_size":3773,"alt_size":3293,"ratio":0.8727802809435462} +{"name":"token_blacklist_contract-TokenBlacklist::process_log","base_size":18415,"alt_size":15328,"ratio":0.8323649199022536} +{"name":"token_blacklist_contract-TokenBlacklist::public_dispatch","base_size":47443,"alt_size":36679,"ratio":0.7731172143414202} +{"name":"token_blacklist_contract-TokenBlacklist::redeem_shield","base_size":111972,"alt_size":102713,"ratio":0.9173096845639982} +{"name":"token_blacklist_contract-TokenBlacklist::shield","base_size":6521,"alt_size":5532,"ratio":0.8483361447630732} +{"name":"token_blacklist_contract-TokenBlacklist::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"token_blacklist_contract-TokenBlacklist::total_supply","base_size":451,"alt_size":475,"ratio":1.0532150776053215} +{"name":"token_blacklist_contract-TokenBlacklist::transfer","base_size":232254,"alt_size":206522,"ratio":0.889207505575792} +{"name":"token_blacklist_contract-TokenBlacklist::transfer_public","base_size":7256,"alt_size":6120,"ratio":0.8434399117971334} +{"name":"token_blacklist_contract-TokenBlacklist::unshield","base_size":250684,"alt_size":223341,"ratio":0.8909264253003781} +{"name":"token_blacklist_contract-TokenBlacklist::update_roles","base_size":5149,"alt_size":4392,"ratio":0.8529811613905612} +{"name":"token_bridge_contract-TokenBridge::claim_private","base_size":83472,"alt_size":75695,"ratio":0.9068310331608204} +{"name":"token_bridge_contract-TokenBridge::claim_public","base_size":8503,"alt_size":7210,"ratio":0.8479360225802658} +{"name":"token_bridge_contract-TokenBridge::constructor","base_size":3470,"alt_size":3070,"ratio":0.8847262247838616} +{"name":"token_bridge_contract-TokenBridge::exit_to_l1_private","base_size":49518,"alt_size":44831,"ratio":0.9053475503857183} +{"name":"token_bridge_contract-TokenBridge::exit_to_l1_public","base_size":3936,"alt_size":3551,"ratio":0.9021849593495935} +{"name":"token_bridge_contract-TokenBridge::get_config","base_size":28069,"alt_size":25554,"ratio":0.9103993729737433} +{"name":"token_bridge_contract-TokenBridge::get_config_public","base_size":428,"alt_size":457,"ratio":1.0677570093457944} +{"name":"token_bridge_contract-TokenBridge::process_log","base_size":14990,"alt_size":12646,"ratio":0.8436290860573716} +{"name":"token_bridge_contract-TokenBridge::public_dispatch","base_size":14968,"alt_size":12379,"ratio":0.8270309994655265} +{"name":"token_bridge_contract-TokenBridge::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"token_contract-Token::_finalize_mint_to_private_unsafe","base_size":3657,"alt_size":3290,"ratio":0.8996445173639596} +{"name":"token_contract-Token::_finalize_transfer_to_private_unsafe","base_size":4160,"alt_size":3660,"ratio":0.8798076923076923} +{"name":"token_contract-Token::_increase_public_balance","base_size":1981,"alt_size":1852,"ratio":0.9348813730439172} +{"name":"token_contract-Token::_recurse_subtract_balance","base_size":104385,"alt_size":90525,"ratio":0.8672223020548929} +{"name":"token_contract-Token::_reduce_total_supply","base_size":559,"alt_size":598,"ratio":1.069767441860465} +{"name":"token_contract-Token::_store_payload_in_transient_storage_unsafe","base_size":1225,"alt_size":1239,"ratio":1.0114285714285713} +{"name":"token_contract-Token::balance_of_private","base_size":19090,"alt_size":16238,"ratio":0.8506024096385543} +{"name":"token_contract-Token::balance_of_public","base_size":1325,"alt_size":1309,"ratio":0.9879245283018868} +{"name":"token_contract-Token::burn_private","base_size":221529,"alt_size":193985,"ratio":0.8756641342668454} +{"name":"token_contract-Token::burn_public","base_size":4361,"alt_size":3810,"ratio":0.8736528319192846} +{"name":"token_contract-Token::cancel_authwit","base_size":21178,"alt_size":18608,"ratio":0.8786476532250449} +{"name":"token_contract-Token::constructor","base_size":6179,"alt_size":5329,"ratio":0.8624372875869882} +{"name":"token_contract-Token::finalize_mint_to_private","base_size":3663,"alt_size":3283,"ratio":0.8962598962598962} +{"name":"token_contract-Token::finalize_transfer_to_private","base_size":4149,"alt_size":3634,"ratio":0.8758737045071101} +{"name":"token_contract-Token::get_admin","base_size":357,"alt_size":385,"ratio":1.0784313725490196} +{"name":"token_contract-Token::is_minter","base_size":1250,"alt_size":1250,"ratio":1} +{"name":"token_contract-Token::mint_to_private","base_size":66807,"alt_size":61019,"ratio":0.9133623722065053} +{"name":"token_contract-Token::mint_to_public","base_size":2601,"alt_size":2338,"ratio":0.8988850442137639} +{"name":"token_contract-Token::prepare_private_balance_increase","base_size":66730,"alt_size":60897,"ratio":0.9125880413607074} +{"name":"token_contract-Token::private_get_decimals","base_size":28018,"alt_size":25380,"ratio":0.9058462417017632} +{"name":"token_contract-Token::private_get_name","base_size":28008,"alt_size":25425,"ratio":0.9077763496143959} +{"name":"token_contract-Token::private_get_symbol","base_size":28000,"alt_size":25493,"ratio":0.9104642857142857} +{"name":"token_contract-Token::process_log","base_size":14990,"alt_size":12646,"ratio":0.8436290860573716} +{"name":"token_contract-Token::public_dispatch","base_size":31918,"alt_size":23909,"ratio":0.7490757566263551} +{"name":"token_contract-Token::public_get_decimals","base_size":384,"alt_size":415,"ratio":1.0807291666666667} +{"name":"token_contract-Token::public_get_name","base_size":374,"alt_size":395,"ratio":1.0561497326203209} +{"name":"token_contract-Token::public_get_symbol","base_size":361,"alt_size":400,"ratio":1.10803324099723} +{"name":"token_contract-Token::set_admin","base_size":386,"alt_size":413,"ratio":1.0699481865284974} +{"name":"token_contract-Token::set_minter","base_size":1278,"alt_size":1266,"ratio":0.9906103286384976} +{"name":"token_contract-Token::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"token_contract-Token::total_supply","base_size":455,"alt_size":494,"ratio":1.0857142857142856} +{"name":"token_contract-Token::transfer","base_size":112636,"alt_size":99747,"ratio":0.8855694449376753} +{"name":"token_contract-Token::transfer_in_private","base_size":277827,"alt_size":248026,"ratio":0.8927354072858289} +{"name":"token_contract-Token::transfer_in_public","base_size":5481,"alt_size":4659,"ratio":0.8500273672687466} +{"name":"token_contract-Token::transfer_to_private","base_size":66934,"alt_size":61241,"ratio":0.9149460662742402} +{"name":"token_contract-Token::transfer_to_public","base_size":221536,"alt_size":194255,"ratio":0.8768552289469883} +{"name":"uniswap_contract-Uniswap::_approve_bridge_and_exit_input_asset_to_L1","base_size":5754,"alt_size":4983,"ratio":0.8660062565172054} +{"name":"uniswap_contract-Uniswap::constructor","base_size":2951,"alt_size":2602,"ratio":0.8817350050830227} +{"name":"uniswap_contract-Uniswap::process_log","base_size":14990,"alt_size":12646,"ratio":0.8436290860573716} +{"name":"uniswap_contract-Uniswap::public_dispatch","base_size":16402,"alt_size":13550,"ratio":0.8261187660041458} +{"name":"uniswap_contract-Uniswap::swap_private","base_size":73024,"alt_size":66303,"ratio":0.9079617659947414} +{"name":"uniswap_contract-Uniswap::swap_public","base_size":8205,"alt_size":6981,"ratio":0.8508226691042048} +{"name":"uniswap_contract-Uniswap::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"updatable_contract-Updatable::get_private_value","base_size":17948,"alt_size":15069,"ratio":0.839592155114776} +{"name":"updatable_contract-Updatable::get_public_value","base_size":16277,"alt_size":13802,"ratio":0.8479449530011673} +{"name":"updatable_contract-Updatable::get_update_delay","base_size":795,"alt_size":817,"ratio":1.0276729559748428} +{"name":"updatable_contract-Updatable::initialize","base_size":68404,"alt_size":62562,"ratio":0.9145956376820069} +{"name":"updatable_contract-Updatable::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"updatable_contract-Updatable::public_dispatch","base_size":1382,"alt_size":1341,"ratio":0.9703328509406657} +{"name":"updatable_contract-Updatable::set_public_value","base_size":327,"alt_size":353,"ratio":1.0795107033639144} +{"name":"updatable_contract-Updatable::set_update_delay","base_size":21724,"alt_size":18958,"ratio":0.8726753820659179} +{"name":"updatable_contract-Updatable::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} +{"name":"updatable_contract-Updatable::update_to","base_size":21742,"alt_size":19217,"ratio":0.8838653297764695} +{"name":"updated_contract-Updated::get_private_value","base_size":17948,"alt_size":15069,"ratio":0.839592155114776} +{"name":"updated_contract-Updated::get_public_value","base_size":16277,"alt_size":13802,"ratio":0.8479449530011673} +{"name":"updated_contract-Updated::get_update_delay","base_size":721,"alt_size":715,"ratio":0.9916782246879334} +{"name":"updated_contract-Updated::process_log","base_size":15217,"alt_size":12719,"ratio":0.8358414930669645} +{"name":"updated_contract-Updated::public_dispatch","base_size":1251,"alt_size":1233,"ratio":0.9856115107913669} +{"name":"updated_contract-Updated::set_private_value","base_size":65472,"alt_size":59871,"ratio":0.9144519794721407} +{"name":"updated_contract-Updated::set_public_value","base_size":231,"alt_size":258,"ratio":1.1168831168831168} +{"name":"updated_contract-Updated::sync_notes","base_size":194,"alt_size":214,"ratio":1.1030927835051547} diff --git a/scripts/bytecode-sizes/bincode-vs-protobuf.png b/scripts/bytecode-sizes/bincode-vs-protobuf.png new file mode 100644 index 0000000000000000000000000000000000000000..3af70eb04f2bad078cb4c7ac2e9e51701373bbf7 GIT binary patch literal 24654 zcmd?RbySsWyD$6@>O=*nf`JH3Ktd2uBm@*DA)(SO0!syH5G17$QBb5)N-JHUmnJ`Y{wRVVXMOyn{QT6+cxw)e zE8ofd)Z^Fn(L}59aTZ^yK$=zP(brOBe6QS3xZ58@*w{r2U$bBQ?kKXf`TA^5$yBW1 z>bq-G)!PG0OYgh-`(YS};*IA)7VsNsz+#9H<4Y@E8V;VmhHgCBZs`~HM!|F_piU%_kk z!VgyT?3RXf1|xD@*E7(^Fuc65(qdn^Dm=U`KX}+}@>-nWV)0mdQTf6C(!pAaC@txi z1H$mZ?j!o$pT9@G4ih$t4(blJ=nuBz4ocd~xT?M!{H7;-MMraErGAzWjV^Na*~%va zR&}(lTO-4}L!0L-!aL=K7Z%Hwbj$3_(^UI%4eqSk4^H1WLCrJ%jm9!_US$R^3}Zjd zp$-pWN>-lf(Y7>S<3j4+=_0S%KR)>Ci7TFrGSz)HlU%k~YC7HaUSQbysioyoeIQd# z$z;@u2$S^N`NhS`{f&P6rJ?;ci4)|sLTi1dIh<~Dqp!K?Za!N(;rjczPMKYnUX|GW#XnyvNPIzC72+y4PLQygBUVh9&hEB{*z1HNO)$BBp5Z z6-F4&sa@!_xkxK)_dQP3t=fysZ)giXE-Nh!(?+IN9($cxu3_Tpz~JD1L5@q7wO7g0DfO0bpgy~mn-w{=ttZ``L0MjP!x}wq ziPqX)>A1s9E9&ZO8Hc}a*b?0+l4sb;^)f76_gPv-#$4;cUaRTb?JgCCLt?+PEL}2k z4MwV8yri}JIaJ})G_vqkc#+L=xXSHdydk(ry1&w87v`2zI-A~@$5sBjy41(wfUrOI z%}+a5Uv|66G`r;S+I0Kw=F)Jn)gzerjTIRVOXuVBGmZjn4l(pUKitg&6k6-tVvQ z+_v-0IIC~e2MbmE zMf3+-b^Dde*IIAn?f5PI{4@q8;j){c2c-PzbR6%; zwykVW#pU!G{{HnPwC?#~@@K2f0?%i28@B0JLqB~PE@uCKL82v`hk zl~wJQaj0iHEIAE3bty@AzZuQAYB5k875p2vx;sC;!O3`EN25w|eR((55IHK3BgI*C z_kM`3+<9DHD)sgP^`29JY32Tlv$`11zq(SDCUB}T%j{*LaRrX6lTj_#==XjdIapIT z$PYR-yq;|jg5hz(`LC7n2Kyn$sVF{E7WwF{K!4{X=Kv=E8`j$^6R2HG^cQ&sQ{mG5 z_$!Vu6SpH$k$LKXU5;J4_{?wQkv;r~Y5CO6r4mr& z=QxL*nUpz^n;6fRbk9;(90p5m$LjoZBFpo)oya`@YKs@+T%_i`-U>>fY3n^dGc&WR zi?9Vmd}AlZTf)y0Xx3r!^Qy68Yh}ax7LNSwLn6VAs&t!`wz;j8JZ};;-_tWoPTQdr7LPjvK=ZA0ZOeaooqGm-y;|Iua2^hB+VS8PNkv~cc zuUFihnb4B5EL$jq&xgR~O1z}ttXf_XO#4pJw^tGEv{=&lL9YMPqq@bxvUf|p(>LOt zwg^(P$~%M1fpR*|B!^Sb-T0ZrgWO`l5@R!9{W*2Zw-V|1r$P5w6=KUD*7~k&oFN$@ z?C*wi=?Gbk)~s}%<<{K;%e}U-QMvq$=1$n<$m>=Q?d>=7jXT+2a*7%>1Tlk|pb@f} zULq_mwY(F^IpwjjH0;)`rXd%5!x1#5j?QVGTwtKBe7TO^Z7<}KN_x?N>+S+;^pk2> zac>IRXN{LqP&42cD{MVp-|D)NmlFGI_Q6Y9euKu4*D1$jjr@9n)pI8w+JCjU4_$v#Am%ZmxZ$C;UFx zi#xd1QV0(mSGY$!^2q-tKbU0};mh}npLD0IfiwSs3K7ipd$i!H9$`Z7p(!1L;0YJ$ zF()ouf6^%@;4&>ikD3;mh1Eum9OwNxJ-t$!8Kn7qlKvSIZbRV}%=A zY?ue#|N81p{u=hE+`$SqC5ZXX?BX@&t=}4YE(On;KvK`#nS(IPnq&Lu2&_E6<&bmj zX$>3Of)IH<=jGZ~m&K=ISX6XQ3Xns1*cz0BrL(FznYFZM=(b@fF!1E-YOAQ*a_w1# z=<8QY)zQi6uAHtW+6Kq}+wEZKU=ZYBwmU-&T~(pLPk7CZZ2OA2pgUYz70=e2xT~UV zwBh}^?Au(43z1hIRKK&VEO}J-7D5!>z7$pV+TM#0?8&TeY zNO@LvmG=I{tL2h3M;dBw@wC~o)E->tT%2K)-CowY*kB!)Uuh`0nVpsY1fSb(ur|2l zx(Ut(b$DQC=81N^F z(*BhbVcP0h_tsy!ZM~Eg05QUSi(BusW0lN=rCONOm&-=5Oj4qLfw{kueW4dB*s}_;-QiA6nCJ{>!fW8 zuAp}s45KA`mfv$x4?kwXUVdj#I$jr zCEK?SY~y}}VbCY^Cd1YDMuh&{G{MMl^6!^Slw8T0rvQQQh8Pz?yrllG#_<0a(}DkQ z9;IUFn8rH80xRCRHNg+lwWXDPMAr$BICBw(&< z`Q9Z7&BAMbD(_-C0ypu&XAngF=iQO>s=Wzs?5GbR$n>3XC3w0x(?6g7_tubk!54>^ z{|~-++`Xc#&>;u6=gR$aKW|r5RLB-FuqP{14C@TWCY)W9e_h24vK9>^6nt~{bjfkA z)2JBXV64(qMAG5y`PUqeBMA1S#}(U)c$gm@@dNc4Zb(^eQaNT0E9%+Cd|c7QK;9=F zGG(lh%a?XHaYjOpjs$YqcG3%{tMgNnM94s+UcJ2fujzbW_3?{3*da%|E&c$~%LMHYk4AYY_)n*Sua_2tB5Yuo|kIyz6j9Qssn z<O%>I=uq-V`oQi5_fUN{P1KTdo_180ZMS^Aiq*OQE-Ii{80VA&5+h z)Fqaqkz`(I=nB`Z3~g50ug`X8wK6kp!BcuW*lHzDQsuQ9*tEvpgg0M+e9^t*FRRPk z>lX)MEpSf%VeHpdnz-FIAryott<-AlTXuG~a%i}otKba(q{j_11gWJWC~wXvu}^Fd zs%h)amVlvERycwn53#pCH+(-QzLTCkuSWOU4%FoJ%6$nHhWSk`7lFoL1PPF5_wq^$ z+P48kc7J$#9bz&Bk(9=LCt1G<5D2*=oqES8aED58~W1x3>R75Ep17A<3+-47MgNN}?^PCr;{0tAg^jdtKUXlGKT54G3NcTm8yTjKYqz%)yCDb zj54Vg=V@W)YE(q5t$~+@Jw7ttMB_g9X~~mM&<*$x;Av$bEf@FaE5~?$y4Gzf!RuRGD`}S0Cj1frwf+oP+H_0WcNmo2dPhW|8hKU`zZHxbFP9 zocKQ-0`Y^{E}bXv0nX;%`)Qmc0}5D!Yh8Wv*fgxYl%eeuOa`w7^S={l9G`m{!_nBF zNCg8Tf`4aQ^{eJpBh&4 zIU?VwvLr-`%UuJ(5&TOzGMb~VuyJ@oR8{~av_304i3X1?FW}d7&CCRClH`08!+zxA zQyr=2Zmk~glf>?HlOXt5*gRECCtJu*b-`B;nLq`?|HDnZ4TbR7-9g_nL}!kN*Za!a zvTLaiC`HRTi3siPv3+8dDj3}-*tUeFMoJHTn7!nsYccHo0q?mIPt&Sn`sbddyMah1 zfeO?m@yv8QxWXY?v0}fiFqOsA3Sv7RgqNW`g@bMIxaw7F(8UP3=q1~dq3DOe8%?}no}|PKx1Hg)B1>q4yN&$vLuv`QQOG0U9_OTj zN)XJmXND(A=#%ZQ`?|B24$>S4q^{Wrft|Um%y2g+byuH#nFzsuA@iC!{q(Q7ccR)$ z!s+6$1X>rdA8xU(e^xy8XdA=Vp1o&~`23v)s1=VK?(S<+;V0@<_e%yew##Z+XKi4k zwDgrDj|UXMO0%V6A8Sh9ARodqrI3qWlUwZuZ((puIFjpW{ga;0Fn%%A`aU_&P}i*nd2lQ-sCiA4$4~Wo5J!> z@BA5P$ao!AK9a{^b+Y-Kq_48yI%v)T8#Ye7R6WJUgDP7I4-u6$}=R>C>GOXVNC zU3~zPRb+zf=az~QJ=LuV}%Rz26V zYCiTnje77B2E*y6e3#0a4%2yIj|<|BTbAFWZuD+^{A%5wen4?i7VLv=A{FH=#qW-| zyCpW08KqbGV&q^sg#u^s4!s89I&S;x0B~No`cSgN+~@wY9lIW?(|#Ah^pvwFm#7%L zyq)}}qD-Dxlgi*GiobU-`ML+s9%aay)Ay-9;}63hzx&O^h$JZV=!4?go2EUWd|YYR zNfnz~a8>RshnWWv@vtBn>RR9PAnL`cnAaJLKxul2GwO3)^>c8{czL+j?@737;_gE0KONL=e z;_>#N6Z(O8nTsK$LS+e})8-rYjQlI6o!OR4>HMf9GhjPJI={ha zK9G4OMKNCd<6AHL@&~D%pLO*O0AEAv@sTY(SPg3zD5pvSs=?C)FTjhXVOKapMIvV| z6oxy1al*NgRudavouMuSJ9LNv`$49Q=xzsm0fzHdcnd`W+;g0?I>A(#pXwM4WEebC ztzKgA8Y~PRcb7zB7ycos`7%H+@D@zX=-=*J<>Kslo%O$Nffe!y@UA8gu$@A!?5T^` zQ$^Dq@zG>Z%Xt{qzW4f})-lQi&}a&b*S0{L0ViDQ_ssWO-Y6KHHZQzP){`H%GDYqM zFWHH=z>aQUypH2vwr7+ZZu>ACE__0H87#?5ye4iWY*&&SwGw%6Iuwfob9RiXVNsGi z@G=7lcb;3bAjt7ocp2d!UtRU{@Eq*F6Nn%wb`MxBlDs!TM1Q_v!+1$%;eFC-fWgiB@{NCF>!4uHh!-V=;CO&T)UD}zX)6T+DR=gg zMQf!XvbdFpcK|E}kan}p#lZ>gm*g~s`VB!S!t;suO+bP2#Os7pnu2dJuxG}dSFl6R z=Ca&YSlz7KZ=D5L*c4DaZbeEB6;HtF}g8AECJ503eJ;_I*Lip>lxrSiemw8QJc>dc4RC zgDyBP&;As?-&|XRxQ zqgH{>q)V1H#^(Fgx|-hW@bUx|VfJMXz3tnM$zO7uCpi3KgF}-sa_qrMSHH8ER4aow zV12741$C?6XkBIEh+nMA5CiO9=IaOiN|a&5NWf`WhCZ&u(2wDvU9bgsr}Hg5r3Ou5 zl{B04y{rBQTmDL@I=M&iW(xLjN)txURz+O5N_a5?8u0K8B#s<8n}ecr+9`7XSQEc*gH$0e~pvva{y2R3YGF2O^2h_2#QXt5B7@i?2)g zMmo??uHNr@Sj_YfZny0w77pbkUo@>7m%8u>!=dZ4-c4gs`~cA6oQjQmj!h^+1>h?R zL9YMMJ5hA<3Qp-Vosk%9+|ksLT*~nK)(rq>UU{}QEluaBKU(7hcoy7ks-V!SrlE7% za2H1fF`ldd%ttxp0j_)wfNB`alFO1)XNrO-By|THmIrooJz0iOL3~RqJZeVY#rzAL z^3-`d@ta$}p2O>1>KR@-LmEVX!{N6^)lN4KQ)t#}4FLDSIIE~nQJ^`G_Z7og@6Ts; z9r=2TKU$VD2={%q|lw}_LO_+?cl~s z*`a6Drz#r9W?9wguf4FOhVZrf3brLicr!Dvs*H9GzR1oSt{7|d$cbR|GJ-m}qwUdF45o)W$)#j3tq}7GB^l`J54>>#( z!A{5HMk7=w(KHhc4_M=zbN43TWlL2D1OQa40Ki?HYOUH`EQ3V$l*O@lDGriDFTj#b z-(L{&f5Q>aITeHsG>32-xt;COuHS=MXvw1I}Lr68&s_7A;fC^5)8wzEQtp z_@i+$@yt7WYV#FIkk&XreHI5w&;&TsSrDXqD$dOn%85{Ss|Slgw`eNS-z2`~l7KGH zaaD8N095k69HGCzZCxM0AcoD3=`O^E@|%e#z>eJh zy{}+AE3egcnQiMG%(=bj#~5k%Ct_i5`wUp+Z?1Peu^;X|2$9aaGJrN|WyCaDwApVT-3*9zhxffSrY~~IjGMpX(MX$0V zC`XT7!h=>gq29jmq5KrLs$&8%j59yQPMKPU=2q3fZ^(83l-?m6-p?`Hf=Zy-aOFN) z9g4l_L~(Pi%^~Xa(PNz{T62TKrW;1Vslnc%%@SHQ`lzbMiS@lrXT!P&RJ?$v$&g^9qE2Pnp>IUmtk^=v4u9Nl2>18OG|S#t43%%Mbt>faI&{dgnh%!p4V+PAd;ep< zLs91Pb$VDCJHF#ylq`2O%j_1G_J@|#EbjwM1J%w%%hP*qeAGcUL6ls0C4FV#?vs?agwmRq?fDTkQ}ai{?Tf@`tfx(<{VyZ6A|*TEt7Hss-Stq6u zji4x_8d6qxmhx96AGhB}+}gUkZJRiYF4(k*h58+=R}p@oM%R)sX*p`5D}9$e_>rvN z#5KrY-IHpB(!N7{05y{PF^8YyG{FV}@bwi1pAa9gbY*2_DB}aPTGbM&htz`B`fFL9 zJ2r#gDJRqs_Zo7OH9yq!!t%Q9|8U!1jXQ7#lZYZwXtf7StNjEjTt^)WK2_oz{WZUe8oneX^KLe2$bufW_^P0h65-))D0J*j9dVMdcFV0kAGo_ z`u+H;Y7c#!VMRrF=Xsuizu4>6+wZ17Sf)pjv8t_F?xBssA{Pi@ph}fEYIa}G|K`Te zXu+pJ<|JKh>sI)+T~Idv$HzKRrb$y6XMcs0{X`S7LR7nlw)4n=C#X+o*0Q!h(DNj`idmZ$*H=SO&) z-frIy3n+Ce!0;!yLG|njJ(l}DXa#Y9{Riu*e?yO`iFFwBTdor7DhBvXkW&4Cw*Dn; z@IHc!c3r`WfYXC$A-mUMGSZNRuW9cV-YMD?L#MrOat9SC_Z=1IFG&f6|N(DdUW=1d#PN|RUxW=vP>^W#Qm;O$ioDT zZ*vbrITY2otM*oAv0Ej8x=y~cL_L#)<&m{enbC9_$+-<$avKX$1UGj6a5Wl=74}<{ z?X5IrKpb0a)thUex6=`xV0rFhVlAX}UMI;mLq5D8yNckWLeGaX{Skca;hi3oPBrVN zaAUbh?e8=u|?T6ui#+FtHB#H!!Tt;w503#vyM^SPh z;hdlsDStLLms2GI1z|L;ACQui#C=bdB$gQD?mg z7E1MwAkA+x%&|o_XINJosShJE_eEnAA=1Gv-%#) z7GFW>y45j2j~V>)LrW^QsSRv68z9g?y~Xm>f>-gS8OSJ|$fcQM?fQ&22krH~XOV@= z8ca*BKU{00TWuyr7<_G&BO#rtBFt5Z04)g!4yP9Hh&M8q9cA3c9VJF0+ny*#qU!{v z3R0bYG>!qLQdNJErCxNiXHv00D-|Hx90z2C{T-{*M93wuyoAjI!Z6rEtA6vM1<)1X zKGA_H(C>Yr-~0Vi^v084_~?b_5o*JAM=VA`KMTTy-dBPQ1C^#?p|BrFLU8rZ?bRtg za41U-b;1vg^jP08BvH!Uei743V?5a~`df%q3DKhVn{ z?$$1{(1COdat&8BY+V&SSY0R@b_D>Twpa00&8A#|E&p zVgxLQat?NKG~6~J7QF$KlmttH1YPZz0PhH&v7AYE2M`y7lR0%=@jw;%8AojyYyME`&)%Y6`UAP zOXo2f)1J)U0@EL;Uj(BBbWlEwCt9PMFvgCaZLe^ch*(^g2yE(1-8v3oGe6b>4EW^t zNQIm0s=zZs3vwxOt~*ht+0?MyK!RK>Uv25m(6AgRUcR~HsK99cBA;3@KlRcYdA>YG zZYzrjX^ZW{7e5)P2DdW^bwnU){m^w<00s~m=j6EU&jC-b4d{drD1Wq>>8RT8uaZm3 z!p4*qwU4Ol^c5S}KUL7-I*#Bj7sM#~16y@{?gzd7fRz|_Z{AS!9gjg{PnI^v9g07= z0Q`kMfVr*1hc^dH+bD?Q#WQ(`CsQ{G3&aUK7092wVyY#s#eDujnC zV_+MFFrE-YX;cb>*@e){yPvq;*LovE*1bDaVsq43JwQHG(A5;dQ<;#AK+f+7AaXc8 zJsKxgW!S$;F~B}AtXmJ=H0Hjywo66nr5JvU1i|Q-H-GwYw6};Y^1W*WwF&!sqa205 zI9g3Qw0LVK*k%ix7hI>)TTP@|pGdtUM{L+W7_hod*}JARga_PP7@W{BaS`iW`*~aT zqvac$AF<*hAQQfQ`0KzWgMBD%51-&fRa{|+1i{V0xF{8F1j-2GwES3($%TEU4$M69 ztw~XZ$UUTKl}-2&W=3&!Fvv0Xzf< zAcll#i3kaxL0Q*rcQu)4RIZEjkn^0KIkF?TGtggH-lalNSv`kXe|YfX2}FV@u+jYO zZ$xeeG~h{1mZy#JRsOE7#@%TL=YhERJ)8+evcA}%|%XZ0?qbmEv2inl2;%AzbRx39FdwolP9vSQtxGswNr z%)AOX%tyqY^ckmw(&N1)b5k;2qpJU_b0)RY)R!()K~p(z59!-5a4Z zg@nrU3u*cxk3{Yxf5pRE`w0yFTzU!=Y64r-H~dD|Wlj2>1qaO|A(Sf*;^PuqX%VAr zek>Qn!oyP-5Qle`K$1uXLi;-#ngnIE2pq_7zS(0s;bWU}#k`9te=#i$ z{;1XH1ps81PTu;QmW3sB0`uJWGzXBy-vX;zE|O;goaptb=%-SC=R-?)F|x+F4laEm ztnbqHVr-rQys2$ob2;=j%I^cG?D&n^5T%&sn0DOI0#Ry!&V>HWoOc@4#t-4Vi3y2Z`P0vcKDnfgjHq???!=mvYLM-)v4U zcXSMmZ90v-l3%!-2r-{OFbkK_7!FK+1fOY-k~FRDdbb8^2M>~ETk7<%Y~MC+P=@)+=6=|<9!a8{ zRN_hl#P{;st6nbT^dfuL;U4W!r27oUbY?#x@CTX_{cddkjIJ|H_81D6R}4GXk4umH4c7d zL*TgKo`mrVh$s!rNm%GVCVR^0#WXPEB-KQAW8k~XyfXOZ^JiU$$uxwezTN*M(2jzGooA> zoL5c0b#PxpmiD>@?NI8akNQ#lHt9Zfh${ zT20g~LY@$jV~b;9!Lu0Q#*@?3qA);wXcb1?O^pF-SZb?Lb^98wS2hbQh> zQOg1!%Nk9AY7Ax6({~h(L4<=8_cy073>am{x%=A(m3z3Gb89JPWcT2P$|G zn0|TXL0Qozebq2M3EBBJQFW62luNNx7fp!{UBrsJ^7;f?SowZWQIPU6M6P0C$OF!J z8|$ZT!{5r~j&4E4nZzsOf3iFz?VQ&l-t}8pv#4o2X7!ud9Z0RiewghlFpoc&=8JkP zxTX>qdrOZf>NQF?5Pz8PjsX|D8{s_gp7@jTGJVBQ>%WGXb`8nda30uGJwvyjr;VQR zowV-M<`J;GI5GPz@4}u6S%5rH4BBt2Z6^mS{(zCtw*01&AoW|6ko{Umj;|sWf2G}% zf@C?pJZjv-7MXM)&8?;-BxznA?l9yUE6;;}jn)d;Qh{8x5*JlRA|yU7XJSzFFWj`q zuL!YyVarh9azVrT_A8jTB7>K{{?6HhP=1ZaL#+eaIQj0gca=5n48GAA(kxPI?(bdF zmN_u`I(;vKut|aE^T0j~@_v`J##*#i6ks+})N{6d{mhP~v$&<<@w^MWR)_0J;gVB5 za>`X-tmEq}cik=4tuN22t)Hh&UmDv8o1ZHu5>wm%SdnPk5fmY7fzqVKs}Db;Kch48 zewc*6RL`D6R>yCW-h^tSy0q{}zM_~xoRo0UU_@q;7)r4Ko|S7I!e2X^$#V33{*y@ta6spG%p zd0PS=w<+D`)lx}Xiso>kPnpWgXh~4Y5N41YuA31QJgsHSia_SUz$(G%v>LGWjPKv_m z2xz1fUSOprrV7Ags5=|X4R$QoJBF*B=bUWUvy#?z3UU@jj8jGUW{9-y?@S%BG?)>8 zf6QI=B!=P9y-OBePIWVrq46`R<)y2+Nn#U*48C+9vq;PHV*;ddJLJ)_An|VwIc2@X z3!x>Kl?H!JR^6P@#?ZFCYi^5dkhE9-!|k!K_Ph*8;%;R{QZJEQ}fg4M!#hoU_rpsmKU4|fnJ2^{UtXyM)Sk<$x?Z5 zHaI=IGt;mZG$y*)e&>3|!fw%`;ynu;=1Q&;4QHZ_Y%LCm6fb0PB)Wjt9Ce>_ycJ`>}Ul56eazdcj z2lWd`x6t~;x&C9v-~0^Y^h@`Y?RL$mGV6%U^Kmup<8zUod&{0Fs7mBBiU@{1!9nkg zA(j;Q?-^#7M28AYHEeOw5H~o^$S6XNh1UpwTo`Yrfb$$2iKge55M)`ju)jWd_ic(M^M8lFLTSZHm~zzcUHf8!;`r3gF9r z+n1hpJ{5?J4NH>rWKB|%9<32gWXbEJ8XuhzZZeA3JQ^UfJt7gBTV^7jtc3wU68xMPY8d<0}IKc5eM;3RfbBTrLr`Zq#1?R59vM@0>} zZ}pPRg`w+Ld>g7r5J3p2)cHy{U#Ax7O9?-CoSN32c4;LkZ_FsECgMzi$e3v%ffk8B z>4D8{G^fsL8t6Xt%+++_c$Z5%;~l$D8Dx|JODxv*OTGBnqhbM1Eg$BRz#vLpl`o6- zt?^ZRXBOWz-Zy(2l1HS7C1x1cnk%xhH4HM!cYj|dQ6I^FI~N{a|58j=0GU=zDl!mi zG0>5#_#sz*P4UN}iq1wi6FQOrrx9-3IJ#uz*kM}9q~VfD;S#w_r@Nam?F|!Ttpo2G z)x(?23eLnE{mr|!R4O@}xp@72&&>oSSsykxPq9)JmAQms-}?awRTv)ArDV@+W&fSJ z!#NB`&+J#skN86W!fgHM?NL?9_CbNCr>cyyoH2NozvJ7soJoP^NSe%Bw^n=IeSb3) zp29FyRL{x(Jch&o`SF!nGXL~jeun__pO`o&-vxFx^coQ=CoFwMj2aFOseH3eeXVNIYm&3hN3Q5Qn95KTc zMDF%$B~{u%8QNuy~2b>jX>f;k!Ze6(0yrw}N982G$SbSzv$%4=an*$Bh+&2?;H9 zz@Nlp@)JubRC>>;hu0RqzHvw)NUp_gTf0{9bbi7wQEnvUUmR9PS9>azL16;F#jifh zz2;5Jt4AsF)66wkD3`b*GG9%GUfR-Xj{8WsNrdB90w%wBeNaT5G#@ukwdj4W-L3U+ zvz)n-jO;NoG0r=;TOID8yeDFEX4k4|mI8D2)Fa3}2CTS;q>z4ULuxfqmf1;*N4}S! z?>UJYK%Q9XUTO)9pAC=q$8{@dmok5f^5o;1HY8uuHSE`niSc{DXlHC++ILyEHz*HT zB_cwyXhLjA+%NDvBS&zQq~dG|4o9VJ=X~W}1HvF714jqm8f_> z=I)seS$jzx>amkMvOUzNkrip2*XYrGg2>to+adp&G8&wRT|g+2A-{ip=XXV)L^pfAOiUv+w@Y zsIvdw-88`G`0Pt?gV$t8IN$Hx7)yKmpxuqbQ5#GN^el*E zb1o(RdSlTHKvcV)8=-~7RL#um?W%e*`?{)^0tsh`@qDMn<7s0C*40^J-`igO(RjX@ zjRYBggU5J%uoRiO@~LZ~ICbtXJ={y+1dR2 z^N{<}DPv}cFVaP1Xo4G&v^KjV)f7)--oE~1Y?FS-8mXs-4&QsWhHppVr4y3J;-K@YJ$tr;Q7^e_n3-1_)sEm9VV{CjuT2?7 z3)F+kMb79*lFhIM2CweP2SHW zCGrFq6BZJ{uATeH``vW3=LTI1Co=vHkNK=UUbZ8IlRt!%gikqMZ{|7LPG<0}z2|I{ zrSb=>&m?P3#~fJRcftP6q)2g%8z zxx}bxB-T><*`@kZfC5jmR~R@+DvsmadHZ8_uPVFr(Pz)^Z;xa|2i)Fea$)Kf5)8Cv zN9s8|u+uVZ0*!o4ch>xF($Wd03V2`XtYXWGj?1h%iQu$|83L{fvaJ=QDD#n5ziLFN zGRDcFrw*yRQ4D|u>J!`t`PXmo zxLIC6WPk&eq>WsB^LjbZEIHCrb1r9NeBT#w!$GjUPVL( zB~l#Jh2263PV{fl_sBF--7&2Y|M_tF1ux8m(=&7 zNsw1j@b(Dx!$-V>de8gGkpAhCPUZF{zUNe1+QUkfHLt$;0@&{{Sj5*%v4b3mSCb3U zrg<+5{MRefE_dC}ipT z2>vLD>#dN!fnz96LF#+w%uyYVW5x(F1KzOftiqc#uMU3oupB}8!Mdv|4y0)F15t-j zyhr+D+b>adBiR~6&^?F8P{}Wr@%4mUpuBvJ7`eoXC4Ld?ZQ*AtVI13GOff_ZBy*UQ zd*%E5J)nkW98erSmwoXn5^oD@@9U*q@!eqIB!X#=PohBr&dp#Dw&H(Mu#b#uzZ#>- zLWq!UXiHIIAeBjEl)T;jHnjG&{8l%qk^@hzCb*Th&JSq5LS~gZ_yhJb}FOG+;$mWTAq*lPr$G zUo)Q0I*Ldp{S&Pqs<~^ahRCR+ZDPm z{aU@fT0l*6st7wMziO!5(JO2@GW5Zg*i*VT7&Z_UDBS~vk~C=b2nuH1soW%T@m zP)?Ln2)xtXMU-GTi&AQUDRA0x7r`|AtL@H&`G1u(@j0P<0{CwVC}l-}TWVWY*h0fM zl)Wr6&0*E*!?X4ETp_g;!ybo2CUTSa9DqxU=2}Bffp-F3%55_#ak>O+I0phf1mTg{ zC17U`K~gd7yxLrcmeB9gm_?04KXaTLkLoMhjw5_>}GtrZI{tAxU8}C#Q zt$=zE)PwUs1Yq##s=31}%KjHHh;i`mbJb|KG{zIs8TCRlNOIxW4me#TX9ztxh1~O3 z#gdDqK@()`LueTiN};?9aQSnyS7=Z`8gC^_}m&HV5D1hKkMJ{uH02VG1e?As--Q?|E)D{4*eZ4zk9TbfqN2`1vnCgSg79NRg?0}>AJOe*%h|D;;K$SIXy0XA%(yoN z!m0c1^$a~ZL<|b^o!vVZ{kKhY5#$$bc?5L8!$0`{etjDopJn>|0*#uT8u}*8bu+X* z3qgwEPV_hLZ3%5DM;>ALr~BtxQ&u|iO|;_*Q6yhv_%qc1yzsTQ6#591EC8?+MTr4B$NT^3p+n-84(kDh9$_GCzP>*(r54mJ z4LmtK<-kF@)4}`BwC!1BEv+slf%N!6k%C539VvphhoyCvz~Bo)6vaNnt*I!60+4;jEtX$bPrDoQ+USPB`Kw9r*cl z7uk+vV7vkqnRE4~$8P{sni?DX0GU%!=>*@35+>1ZUY#8{^g?AeDLJ|J;U|54eV~7S zV>Jc!LXgvKvO(khr*EuxsWdb+KwUD_%>~$cqobohAsrnL0erKks|)P|hW=yu(ixk| zDxobwUs9I@nO{d|(O+$>@YjlD;MNvR^*gYnmCk~Kf?CG1va)HZsZXpMfkkrX_HCe( zjNCwb5D_GL)e4uHkwGb5Q&-2q`RUWA=H_N#&dx4`fT?@~WJOldZ6AT2DaY8M%Zp*l zy8`u0F%!29r(7zVltiaq)Vgh6B2JKrwvU%7zj90T@OznoS8i7K=Vb%8wzsH!ER`;1 zZypahSePBd|Lo~u@w)P^`S$C*yynMqpAKLJm9(@XV`3I!pi2$J+;{sr*3QOe?PtP| z&GL_Mrb}e=By>wSIvb!Pjkgn_@H%<&r1-0i4ZGx91i{OfGwTQj1_o(qXat^V_Q+I81v=ngUj8KS|CgTaQEOk{z2F93 z>v0+GoIfUAwV`ekdz2yUvX-)<;z#37me;k)>gwvcx+1Q74%=i$V$idz!lz3ly zdy9Z@!2vh(LtplDO2O@Yw%-Jf_~*Z_fL|2g<6~xKroH*h2KY^tx>S2z5F$oJN8eXb zNp#L5u7~w3gSL2RK?w^Bn;akS`tjq$dEV5gM^GEk57_V z@hC9!j4do$8XA_@#edn0OGvQFM{BC8+5r0pVn6AeA3#yczC+JPS`Ej{*|}XC31pJ~ z_J*4B!i5`v2y?wNh`HbyRs88nDs}g7c{Rl=9`#cNV!fmZbWI=VQ`WX-V773iiWxLQ zjf{*yaOg0XRWy)ioON1cbcXTL<;$1Z*g$?GBO?zTI;6Al z`Y3}J)i0D*o0`fN+|X5mQluFe7+{n}=H`Qi=Iqm(NTq%v>YXC_G#GDVVN=%69YNQXg;?E7AXV`*sYOJt|7RF;%=q?5=& zCR;+vPE;6)RER@3*)=5l@?Ot3-+$lx{`LOTALpEo=RD8vzVGY4@9VlODI4-R6-E(2 zAewX^z*7pXu(GnxopRd3;_1qPA&0wCdzjpp8(w#H4L|mO7OP}Sj*E-K`Pb0UxKLG7 zU9EKV=rq!bEi3!bujAhG3?SF|`1qGEUrI$JG&MB=Au-=$_i_}=^$s=T9TmK+$LZfP z3cmYJ^x?9OhcV@Unss^?Mv@uI8<#F!dh$d*X9Fbn*?x}jSBe_K0G8Iex-nI!IE&{D z6S#SJz;)1Yi2$AO(W6I|?ELlCnr^PHl(78sYw&!NwyV8!=T1Rcc6PS8xw*Uw%Uf?R z2jgRtL*)-L?Z3UD(#`6$*E?8(Mz9kU(q};;o-Zayp?(Sj=uxIdxy3Rzaq~PVw60li zd8GgiZ^h5t(bLGd={JRq1Mh3=i@w=dTS~c5L-mq9P*p&_xb0(-k+PMYU0u)@XWXNw zHAO{+Y~KqC7MC?We@>B;8?5wiYZ3A)JRmT}Xv}o(Zg8_uZD2VVk%xOfv~Y?-TnS($ zwg;;)_=7?X_G%9324L#s;~SG?6!EUWYG14q@Ha@Vn^SgMXU?2~_GLC@>M}pBXVi|+ z5J5%LHIm8_@Wn78J2#giD?1Id32@uNKrunaUD`_AuU;P$9X(M}Q&?!g=0KsP>{~fU zYyUKA92odS>-4T-pMQ6o_=TFVXnGOHf7;Tr2No$kJ(gBh6YJb#8R0=eE1;ibWn}@v z+gMu4pMB0AKxI{GantZcxAX4ZyU0kEfFc3v$8=#n<${#(*I zq#cb6zkibKR61-B`-apuB-mXw2l}Zz+}B+LODRYAkMqg=rX3!>iNB?wpaAOo4|U6J zJI69Mu@3-|S8cZ>Pwg;6cqb?4AAx^9nS4^A4Px0G+~eebvAwd@qpq&bCe-)g1Agt; z!-qeKU8}Cq4Yb|*?(%IDxr)=Y`{VhmDJhjQh)YMTXO;=ZURPNZ-$jBqbpZ$E<#7ByV z6V|kgIAKQy-{GuhRwf&SgskP6(9zEfd&?i>e1YRVGCVwep(@FYtQ=NON2Si-jaJxp zkF0}$o|~H!O>${X{_*YGw^9QCHfu>aCDCYZvIh`rN4J6}x#t@g< z5vwjXXD>`tp4Vg^h8h}wz~Alv*Dm}Qxb1H?QT1J1F4E9;;MRJ&j-Fl;Stl{OD&X_oU(V;=yXSzB1lrcWJAw%N zmBnc*qvFCrxCYWue6cXZeJd|7KZG^kJhP41(ZVY8aO5)9STHI*9?i*Dt{*!^6XMbz9L*5*y*6 zp`n%}vDD;bo4W9t?ChqQ^Byo|R8$P9zxa)(pcNs;1F3JOxAcYD$TpG^MpdL`Lw457 z4fgvf?zgyxVK+%gQDCnX{mnL3{svSyS^nd>yTVS;esObnAUn?8f z_+DU&pRljLh>hPCxYOe=s=*81zm-7N&C}`9HjWbOH*h4@$EnB&o@A)isP18#4r|qupx!=jYEs%< z9zhPZf(#3fH<^yN;b?hU*^l%q31V~aw70Gnk3AI*-T({}1=NuD{?*f}HuULR*BW1D zOm+S-85v*H_e659`{SsnD8yv%%p$-BQW$ErzOobKPtK)J%gVYvE3obD|6P`FIW-xp z37pH~$|@+(-+b#_$`|)MF>#MhVpms}shL@dPcThNOiWB%d=h%0hrRCb*eS6*3X*R; z*#&&U&d$!1lob40t(yYJ)AUzXR_2W{sdBWj>4$RVHjM@oG@(dsUESd9*hI1mu5LcM zxw%D)OZ8l|v8#f8_fC>VbOxEg@M18AnT zbrMIN z#|PN2A{0v7vi<%2Pe!5ANk{_ouDPEBbu(+Sc z$8!lqQj0TWUAiFP{?OMqNLMbL2XysJO-;|99YKtEy&p@t z>HOPo$tfurmQld$u&5K9@SN^7Ho`@QF(cJQX6<+ zm1SC5TDyeYDb`DB2?+_W&iVM70OsnYN}WK*VP zKZ=VhL~O1j!DT>5f{2$G(1cql^aKP&26oYy&RUl^HWPZ0s3Rvt7n^-&~ z?FzOiY;FGp!1f&ng5%@kb1q#$@(iPzEIkz#7Pk4z#jvQ)u>@Er6gs(q;xnCneSIfH zz9p^iBjz;eP?KjC6-oX4vq^2CVQ=j+Zu%}>DSX^-0=YLrMMcGq%?A_3i8uH8*{{aL ze8(Ke;rJeN#I;3__hS}kWMpK-B_s&Z0$4_HD%1Dup4!^7t7PPso+)I#tO_klFDw-! zxzg88o15Qi{}jDf3^{M&>nhL)Grl^yyXEMB^dwv*-%t2`u34g{E&{zH`utt`A33$5 zoC0YmM5vCf+Tf%C{5NhlEP}u@gR-9;VkA>e|4l2514f4#=A?^u-W`QeB$CJYJUQ{x zr%%kbRGNM+elVhRKl|1Gew(TR#_QMdX=y*!hOwY&&S|heA}Q$sgBmwCYYY?sH4)xq zoz~XYnCsV%N=TG`m_b^^DM=Sh7;dfB9l_hEWn5X09+|p?t}s&zPr2#o#SVA|$P9o6 zMyJ#B^YbxbwYIi)D?dZzO#fg;Zo6|*M#Y~>Oc4o*HpdbOE_2Jvk-kp*1-ItK@`~t~ zVjK-HdQa`zDzc<2d&BS@-iM84i2J-%9e2JR^FYS?rw5qUQyAkk0t4%ATh8NP#wD;Hu-fG1qBqQ zBR6+TN=X@NYqRa#siUoJiTQq!Z52?cn_E6v=Njjs+pu8hb?3yphK9A?A1{T*Jp0&F z8x|58THX1(zP5Hx={X~nPZnr))U~t}4|3)(fjJNjn)H&~+~+NRoY&5xsly}Fr2nj} z9FC)pNp>oE0-!!9C-ZCX+)zNgfHjGfM-#rS1=Yb6KNzuUxqT zf)yTx?0$Bn$ya~Q44q5WFlWr1hhsPW? z3#o2r*k`sYbiR041GZj{7ooFI;$BoH}y< zvDYBg+?-sOMvs74n~$5j46qF9p#gjn4Ij=Dj$-o7yMQWyQz-uz-UNR`Vi4(sMX74Q zv&7QZ*Y}3N2?b(wApOFq{U41mfcJ)gkf>-bo^fSmFuF9{4JmPPL>>*NDbx@6ANgkY u?%e_Z`+fDqz6l8UNbNsk@c%g9+}h#gnftkCj>n4lypD#UdeKSyOaB5q Date: Fri, 28 Feb 2025 13:55:43 +0000 Subject: [PATCH 21/24] Decode native types --- acvm-repo/acir/src/proto/convert/native.rs | 23 +++++++++++++++++++--- utils/protobuf/src/lib.rs | 19 ++++++++++++++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/acvm-repo/acir/src/proto/convert/native.rs b/acvm-repo/acir/src/proto/convert/native.rs index bf48ee9b856..d5439d3f98d 100644 --- a/acvm-repo/acir/src/proto/convert/native.rs +++ b/acvm-repo/acir/src/proto/convert/native.rs @@ -1,6 +1,6 @@ use acir_field::AcirField; use color_eyre::eyre; -use noir_protobuf::ProtoCodec; +use noir_protobuf::{decode_vec_msg_map, ProtoCodec}; use crate::{ native_types, @@ -57,7 +57,24 @@ where } } - fn decode(_value: &Expression) -> eyre::Result> { - todo!("decode") + fn decode(value: &Expression) -> eyre::Result> { + Ok(native_types::Expression { + mul_terms: decode_vec_msg_map(&value.mul_terms, "mul_terms", |mt| { + let q_m = Self::decode_some_msg(&mt.q_m, "q_m")?; + let wl = Self::decode_some_msg(&mt.witness_left, "witness_left")?; + let wr = Self::decode_some_msg(&mt.witness_right, "witness_right")?; + Ok((q_m, wl, wr)) + })?, + linear_combinations: decode_vec_msg_map( + &value.linear_combinations, + "linear_combinations", + |lc| { + let q_l = Self::decode_some_msg(&lc.q_l, "q_l")?; + let w = Self::decode_some_msg(&lc.witness, "witness")?; + Ok((q_l, w)) + }, + )?, + q_c: Self::decode_some_msg(&value.q_c, "q_c")?, + }) } } diff --git a/utils/protobuf/src/lib.rs b/utils/protobuf/src/lib.rs index b0081df2100..df5684d2418 100644 --- a/utils/protobuf/src/lib.rs +++ b/utils/protobuf/src/lib.rs @@ -1,4 +1,4 @@ -use color_eyre::eyre::{self, Context}; +use color_eyre::eyre::{self, eyre, Context}; /// A protobuf codec to convert between a domain type `T` /// and its protobuf representation `R`. @@ -35,7 +35,14 @@ pub trait ProtoCodec { fn decode_vec_msg(values: &[R], msg: &'static str) -> eyre::Result> { Self::decode_vec(values).wrap_err(msg) } - /// Encode an optional `message` field as `Some`. + /// Decode an optional field as a required one; fails if it's `None`. + fn decode_some_msg(value: &Option, msg: &'static str) -> eyre::Result { + match value { + Some(value) => Self::decode_msg(value, msg), + None => Err(eyre!("missing field").wrap_err(msg)), + } + } + /// Encode a field as `Some`. fn encode_some(value: &T) -> Option { Some(Self::encode(value)) } @@ -62,3 +69,11 @@ pub trait ProtoCodec { Self::decode(&repr).wrap_err("failed to decode protobuf into domain") } } + +/// Decode repeated items by mapping a function over them, attaching an error message if it fails. +pub fn decode_vec_msg_map(rs: &[R], msg: &'static str, f: F) -> eyre::Result> +where + F: Fn(&R) -> eyre::Result, +{ + rs.iter().map(f).collect::>>().wrap_err(msg) +} From 856afe35418a0e77be5eb3ca7991b9e7500e20d7 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Fri, 28 Feb 2025 15:44:21 +0000 Subject: [PATCH 22/24] Decoding brillig enums --- acvm-repo/acir/src/proto/brillig.proto | 17 ++- acvm-repo/acir/src/proto/convert/brillig.rs | 119 ++++++++++++++++---- utils/protobuf/src/lib.rs | 79 ++++++++++--- 3 files changed, 169 insertions(+), 46 deletions(-) diff --git a/acvm-repo/acir/src/proto/brillig.proto b/acvm-repo/acir/src/proto/brillig.proto index dec3df6559d..cba8c797889 100644 --- a/acvm-repo/acir/src/proto/brillig.proto +++ b/acvm-repo/acir/src/proto/brillig.proto @@ -164,15 +164,14 @@ enum BinaryIntOpKind { BIO_SUB = 2; BIO_MUL = 3; BIO_DIV = 4; - BIO_INTEGER_DIV = 5; - BIO_EQUALS = 6; - BIO_LESS_THAN = 7; - BIO_LESS_THAN_EQUALS = 8; - BIO_AND = 9; - BIO_OR = 10; - BIO_XOR = 11; - BIO_SHL = 12; - BIO_SHR = 13; + BIO_EQUALS = 5; + BIO_LESS_THAN = 6; + BIO_LESS_THAN_EQUALS = 7; + BIO_AND = 8; + BIO_OR = 9; + BIO_XOR = 10; + BIO_SHL = 11; + BIO_SHR = 12; } enum IntegerBitSize { diff --git a/acvm-repo/acir/src/proto/convert/brillig.rs b/acvm-repo/acir/src/proto/convert/brillig.rs index d04269fea8f..1c4b1bdffc1 100644 --- a/acvm-repo/acir/src/proto/convert/brillig.rs +++ b/acvm-repo/acir/src/proto/convert/brillig.rs @@ -3,8 +3,8 @@ use crate::{ proto::brillig::{BitSize, BlackBoxOp, HeapArray, HeapValueType, HeapVector, ValueOrArray}, }; use acir_field::AcirField; -use color_eyre::eyre; -use noir_protobuf::ProtoCodec; +use color_eyre::eyre::{self, bail}; +use noir_protobuf::{decode_oneof_map, ProtoCodec}; use crate::proto::brillig::{ brillig_opcode, BinaryFieldOpKind, BinaryIntOpKind, BrilligBytecode, BrilligOpcode, @@ -21,8 +21,10 @@ where BrilligBytecode { bytecode: Self::encode_vec(&value.bytecode) } } - fn decode(_value: &BrilligBytecode) -> eyre::Result> { - todo!("decode") + fn decode(value: &BrilligBytecode) -> eyre::Result> { + Ok(circuit::brillig::BrilligBytecode { + bytecode: Self::decode_vec_msg(&value.bytecode, "bytecode")?, + }) } } @@ -156,8 +158,14 @@ impl ProtoCodec for ProtoSchema { MemoryAddress { value: Some(value) } } - fn decode(_value: &MemoryAddress) -> eyre::Result { - todo!("decode") + fn decode(value: &MemoryAddress) -> eyre::Result { + use crate::proto::brillig::memory_address::*; + decode_oneof_map(&value.value, |value| match value { + Value::Direct(v) => Self::decode_msg(v, "direct").map(brillig::MemoryAddress::Direct), + Value::Relative(v) => { + Self::decode_msg(v, "relative").map(brillig::MemoryAddress::Relative) + } + }) } } @@ -175,8 +183,18 @@ impl ProtoCodec for ProtoSchema } } - fn decode(_value: &BinaryFieldOpKind) -> eyre::Result { - todo!("decode") + fn decode(value: &BinaryFieldOpKind) -> eyre::Result { + match value { + BinaryFieldOpKind::BfoUnspecified => bail!("unspecified BinaryFieldOp"), + BinaryFieldOpKind::BfoAdd => Ok(brillig::BinaryFieldOp::Add), + BinaryFieldOpKind::BfoSub => Ok(brillig::BinaryFieldOp::Sub), + BinaryFieldOpKind::BfoMul => Ok(brillig::BinaryFieldOp::Mul), + BinaryFieldOpKind::BfoDiv => Ok(brillig::BinaryFieldOp::Div), + BinaryFieldOpKind::BfoIntegerDiv => Ok(brillig::BinaryFieldOp::IntegerDiv), + BinaryFieldOpKind::BfoEquals => Ok(brillig::BinaryFieldOp::Equals), + BinaryFieldOpKind::BfoLessThan => Ok(brillig::BinaryFieldOp::LessThan), + BinaryFieldOpKind::BfoLessThanEquals => Ok(brillig::BinaryFieldOp::LessThanEquals), + } } } @@ -198,8 +216,22 @@ impl ProtoCodec for ProtoSchema { } } - fn decode(_value: &BinaryIntOpKind) -> eyre::Result { - todo!("decode") + fn decode(value: &BinaryIntOpKind) -> eyre::Result { + match value { + BinaryIntOpKind::BioUnspecified => bail!("unspecified BinaryIntOp"), + BinaryIntOpKind::BioAdd => Ok(brillig::BinaryIntOp::Add), + BinaryIntOpKind::BioSub => Ok(brillig::BinaryIntOp::Sub), + BinaryIntOpKind::BioMul => Ok(brillig::BinaryIntOp::Mul), + BinaryIntOpKind::BioDiv => Ok(brillig::BinaryIntOp::Div), + BinaryIntOpKind::BioEquals => Ok(brillig::BinaryIntOp::Equals), + BinaryIntOpKind::BioLessThan => Ok(brillig::BinaryIntOp::LessThan), + BinaryIntOpKind::BioLessThanEquals => Ok(brillig::BinaryIntOp::LessThanEquals), + BinaryIntOpKind::BioAnd => Ok(brillig::BinaryIntOp::And), + BinaryIntOpKind::BioOr => Ok(brillig::BinaryIntOp::Or), + BinaryIntOpKind::BioXor => Ok(brillig::BinaryIntOp::Xor), + BinaryIntOpKind::BioShl => Ok(brillig::BinaryIntOp::Shl), + BinaryIntOpKind::BioShr => Ok(brillig::BinaryIntOp::Shr), + } } } @@ -215,8 +247,16 @@ impl ProtoCodec for ProtoSchema { } } - fn decode(_value: &IntegerBitSize) -> eyre::Result { - todo!("decode") + fn decode(value: &IntegerBitSize) -> eyre::Result { + match value { + IntegerBitSize::IbsUnspecified => bail!("unspecified IntegerBitSize"), + IntegerBitSize::IbsU1 => Ok(brillig::IntegerBitSize::U1), + IntegerBitSize::IbsU8 => Ok(brillig::IntegerBitSize::U8), + IntegerBitSize::IbsU16 => Ok(brillig::IntegerBitSize::U16), + IntegerBitSize::IbsU32 => Ok(brillig::IntegerBitSize::U32), + IntegerBitSize::IbsU64 => Ok(brillig::IntegerBitSize::U64), + IntegerBitSize::IbsU128 => Ok(brillig::IntegerBitSize::U128), + } } } @@ -232,8 +272,14 @@ impl ProtoCodec for ProtoSchema { BitSize { value: Some(value) } } - fn decode(_value: &BitSize) -> eyre::Result { - todo!("decode") + fn decode(value: &BitSize) -> eyre::Result { + use crate::proto::brillig::bit_size::*; + decode_oneof_map(&value.value, |value| match value { + Value::Field(_) => Ok(brillig::BitSize::Field), + Value::Integer(size) => { + Ok(brillig::BitSize::Integer(Self::decode_enum_msg(*size, "size")?)) + } + }) } } @@ -254,8 +300,19 @@ impl ProtoCodec for ProtoSchema { ValueOrArray { value: Some(value) } } - fn decode(_value: &ValueOrArray) -> eyre::Result { - todo!("decode") + fn decode(value: &ValueOrArray) -> eyre::Result { + use crate::proto::brillig::value_or_array::*; + decode_oneof_map(&value.value, |value| match value { + Value::MemoryAddress(memory_address) => Ok(brillig::ValueOrArray::MemoryAddress( + Self::decode_msg(memory_address, "memory_address")?, + )), + Value::HeapArray(heap_array) => { + Ok(brillig::ValueOrArray::HeapArray(Self::decode_msg(heap_array, "heap_array")?)) + } + Value::HeapVector(heap_vector) => { + Ok(brillig::ValueOrArray::HeapVector(Self::decode_msg(heap_vector, "heap_vector")?)) + } + }) } } @@ -275,8 +332,20 @@ impl ProtoCodec for ProtoSchema { HeapValueType { value: Some(value) } } - fn decode(_value: &HeapValueType) -> eyre::Result { - todo!("decode") + fn decode(value: &HeapValueType) -> eyre::Result { + use crate::proto::brillig::heap_value_type::*; + decode_oneof_map(&value.value, |value| match value { + Value::Simple(bit_size) => { + Ok(brillig::HeapValueType::Simple(Self::decode_msg(bit_size, "simple")?)) + } + Value::Array(array) => Ok(brillig::HeapValueType::Array { + value_types: Self::decode_vec_msg(&array.value_types, "value_types")?, + size: Self::decode_msg(&array.size, "size")?, + }), + Value::Vector(vector) => Ok(brillig::HeapValueType::Vector { + value_types: Self::decode_vec_msg(&vector.value_types, "value_types")?, + }), + }) } } @@ -285,8 +354,11 @@ impl ProtoCodec for ProtoSchema { HeapArray { pointer: Self::encode_some(&value.pointer), size: Self::encode(&value.size) } } - fn decode(_value: &HeapArray) -> eyre::Result { - todo!("decode") + fn decode(value: &HeapArray) -> eyre::Result { + Ok(brillig::HeapArray { + pointer: Self::decode_some_msg(&value.pointer, "pointer")?, + size: Self::decode_msg(&value.size, "size")?, + }) } } @@ -298,8 +370,11 @@ impl ProtoCodec for ProtoSchema { } } - fn decode(_value: &HeapVector) -> eyre::Result { - todo!("decode") + fn decode(value: &HeapVector) -> eyre::Result { + Ok(brillig::HeapVector { + pointer: Self::decode_some_msg(&value.pointer, "pointer")?, + size: Self::decode_some_msg(&value.size, "size")?, + }) } } diff --git a/utils/protobuf/src/lib.rs b/utils/protobuf/src/lib.rs index df5684d2418..f8221917f31 100644 --- a/utils/protobuf/src/lib.rs +++ b/utils/protobuf/src/lib.rs @@ -13,11 +13,16 @@ use color_eyre::eyre::{self, eyre, Context}; pub trait ProtoCodec { /// Convert domain type `T` to protobuf representation `R`. fn encode(value: &T) -> R; - /// Try to convert protobuf representation `R` to domain type `T`. - fn decode(value: &R) -> eyre::Result; - /// Decode a field and attach the name of the field if it fails. - fn decode_msg(value: &R, msg: &'static str) -> eyre::Result { - Self::decode(value).wrap_err(msg) + /// Encode a field as `Some`. + fn encode_some(value: &T) -> Option { + Some(Self::encode(value)) + } + /// Encode an `enum` to the `i32` value that `prost` represents it with. + fn encode_enum(value: &T) -> i32 + where + R: Into, + { + Self::encode(value).into() } /// Encode multiple values as a vector. fn encode_vec<'a, I>(values: I) -> Vec @@ -27,6 +32,13 @@ pub trait ProtoCodec { { values.into_iter().map(Self::encode).collect() } + + /// Try to convert protobuf representation `R` to domain type `T`. + fn decode(value: &R) -> eyre::Result; + /// Decode a field and attach the name of the field if it fails. + fn decode_msg(value: &R, msg: &'static str) -> eyre::Result { + Self::decode(value).wrap_err(msg) + } /// Decode multiple values into a vector. fn decode_vec(values: &[R]) -> eyre::Result> { values.iter().map(Self::decode).collect() @@ -36,23 +48,33 @@ pub trait ProtoCodec { Self::decode_vec(values).wrap_err(msg) } /// Decode an optional field as a required one; fails if it's `None`. - fn decode_some_msg(value: &Option, msg: &'static str) -> eyre::Result { + fn decode_some(value: &Option) -> eyre::Result { match value { - Some(value) => Self::decode_msg(value, msg), - None => Err(eyre!("missing field").wrap_err(msg)), + Some(value) => Self::decode(value), + None => Err(eyre!("missing field")), } } - /// Encode a field as `Some`. - fn encode_some(value: &T) -> Option { - Some(Self::encode(value)) + /// Decode an optional field as a required one, attaching a field name to any errors. + fn decode_some_msg(value: &Option, msg: &'static str) -> eyre::Result { + Self::decode_some(value).wrap_err(msg) } - /// Encode an `enum` to the `i32` value that `prost` represents it with. - fn encode_enum(value: &T) -> i32 + /// Decode the numeric representation of an enum into the domain type. + /// Return an error if the value cannot be recognized. + fn decode_enum(value: i32) -> eyre::Result where - R: Into, + R: TryFrom, { - Self::encode(value).into() + let r = R::try_from(value)?; + Self::decode(&r) } + /// Decode the numeric representation of an enum, attaching the field name to any errors. + fn decode_enum_msg(value: i32, msg: &'static str) -> eyre::Result + where + R: TryFrom, + { + Self::decode_enum(value).wrap_err(msg) + } + /// Encode a domain type to protobuf and serialize it to bytes. fn serialize_to_vec(value: &T) -> Vec where @@ -77,3 +99,30 @@ where { rs.iter().map(f).collect::>>().wrap_err(msg) } + +/// Decode an optional item, returning an error if it's `None`. +pub fn decode_some_map(r: &Option, f: F) -> eyre::Result +where + F: Fn(&R) -> eyre::Result, +{ + match r { + Some(r) => f(r), + None => Err(eyre!("missing field")), + } +} + +/// Decode an optional item, attaching a field name to any errors. +pub fn decode_some_msg_map(r: &Option, msg: &'static str, f: F) -> eyre::Result +where + F: Fn(&R) -> eyre::Result, +{ + decode_some_map(r, f).wrap_err(msg) +} + +/// Decode a `oneof` field, returning an error if it's missing. +pub fn decode_oneof_map(r: &Option, f: F) -> eyre::Result +where + F: Fn(&R) -> eyre::Result, +{ + decode_some_msg_map(r, "oneof value", f) +} From db5f5ed6116f67728ddedeb4c316dff3e23105fe Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Fri, 28 Feb 2025 16:32:54 +0000 Subject: [PATCH 23/24] Decoding brillig --- acvm-repo/acir/src/proto/convert/brillig.rs | 229 +++++++++++++++++++- 1 file changed, 225 insertions(+), 4 deletions(-) diff --git a/acvm-repo/acir/src/proto/convert/brillig.rs b/acvm-repo/acir/src/proto/convert/brillig.rs index 1c4b1bdffc1..cc036360777 100644 --- a/acvm-repo/acir/src/proto/convert/brillig.rs +++ b/acvm-repo/acir/src/proto/convert/brillig.rs @@ -143,8 +143,116 @@ where BrilligOpcode { value: Some(value) } } - fn decode(_value: &BrilligOpcode) -> eyre::Result> { - todo!("decode") + fn decode(value: &BrilligOpcode) -> eyre::Result> { + use brillig_opcode::*; + + decode_oneof_map(&value.value, |value| match value { + Value::BinaryFieldOp(binary_field_op) => Ok(brillig::Opcode::BinaryFieldOp { + destination: Self::decode_some_msg(&binary_field_op.destination, "destination")?, + op: Self::decode_enum_msg(binary_field_op.op, "op")?, + lhs: Self::decode_some_msg(&binary_field_op.lhs, "lhs")?, + rhs: Self::decode_some_msg(&binary_field_op.rhs, "rhs")?, + }), + Value::BinaryIntOp(binary_int_op) => Ok(brillig::Opcode::BinaryIntOp { + destination: Self::decode_some_msg(&binary_int_op.destination, "destination")?, + op: Self::decode_enum_msg(binary_int_op.op, "op")?, + bit_size: Self::decode_enum_msg(binary_int_op.bit_size, "bit_size")?, + lhs: Self::decode_some_msg(&binary_int_op.lhs, "lhs")?, + rhs: Self::decode_some_msg(&binary_int_op.rhs, "rhs")?, + }), + Value::Not(not) => Ok(brillig::Opcode::Not { + destination: Self::decode_some_msg(¬.destination, "destination")?, + source: Self::decode_some_msg(¬.source, "source")?, + bit_size: Self::decode_enum_msg(not.bit_size, "bit_size")?, + }), + Value::Cast(cast) => Ok(brillig::Opcode::Cast { + destination: Self::decode_some_msg(&cast.destination, "destination")?, + source: Self::decode_some_msg(&cast.source, "source")?, + bit_size: Self::decode_some_msg(&cast.bit_size, "bit_size")?, + }), + Value::JumpIfNot(jump_if_not) => Ok(brillig::Opcode::JumpIfNot { + condition: Self::decode_some_msg(&jump_if_not.condition, "condition")?, + location: Self::decode_msg(&jump_if_not.location, "location")?, + }), + Value::JumpIf(jump_if) => Ok(brillig::Opcode::JumpIf { + condition: Self::decode_some_msg(&jump_if.condition, "condition")?, + location: Self::decode_msg(&jump_if.location, "location")?, + }), + Value::Jump(jump) => Ok(brillig::Opcode::Jump { + location: Self::decode_msg(&jump.location, "location")?, + }), + Value::CalldataCopy(calldata_copy) => Ok(brillig::Opcode::CalldataCopy { + destination_address: Self::decode_some_msg( + &calldata_copy.destination_address, + "destination_address", + )?, + size_address: Self::decode_some_msg(&calldata_copy.size_address, "size_address")?, + offset_address: Self::decode_some_msg( + &calldata_copy.offset_address, + "offset_address", + )?, + }), + Value::Call(call) => Ok(brillig::Opcode::Call { + location: Self::decode_msg(&call.location, "location")?, + }), + Value::Const(constant) => Ok(brillig::Opcode::Const { + destination: Self::decode_some_msg(&constant.destination, "destination")?, + bit_size: Self::decode_some_msg(&constant.bit_size, "bit_size")?, + value: Self::decode_some_msg(&constant.value, "value")?, + }), + Value::IndirectConst(indirect_const) => Ok(brillig::Opcode::IndirectConst { + destination_pointer: Self::decode_some_msg( + &indirect_const.destination_pointer, + "destination_pointer", + )?, + bit_size: Self::decode_some_msg(&indirect_const.bit_size, "bit_size")?, + value: Self::decode_some_msg(&indirect_const.value, "value")?, + }), + Value::Return(_) => Ok(brillig::Opcode::Return), + Value::ForeignCall(foreign_call) => Ok(brillig::Opcode::ForeignCall { + function: foreign_call.function.clone(), + destinations: Self::decode_vec_msg(&foreign_call.destinations, "destinations")?, + destination_value_types: Self::decode_vec_msg( + &foreign_call.destination_value_types, + "destination_value_types", + )?, + inputs: Self::decode_vec_msg(&foreign_call.inputs, "inputs")?, + input_value_types: Self::decode_vec_msg( + &foreign_call.input_value_types, + "input_value_types", + )?, + }), + Value::Mov(mov) => Ok(brillig::Opcode::Mov { + destination: Self::decode_some_msg(&mov.destination, "destination")?, + source: Self::decode_some_msg(&mov.source, "source")?, + }), + Value::ConditionalMov(conditional_mov) => Ok(brillig::Opcode::ConditionalMov { + destination: Self::decode_some_msg(&conditional_mov.destination, "destination")?, + source_a: Self::decode_some_msg(&conditional_mov.source_a, "source_a")?, + source_b: Self::decode_some_msg(&conditional_mov.source_b, "source_b")?, + condition: Self::decode_some_msg(&conditional_mov.condition, "condition")?, + }), + Value::Load(load) => Ok(brillig::Opcode::Load { + destination: Self::decode_some_msg(&load.destination, "destination")?, + source_pointer: Self::decode_some_msg(&load.source_pointer, "source_pointer")?, + }), + Value::Store(store) => Ok(brillig::Opcode::Store { + destination_pointer: Self::decode_some_msg( + &store.destination_pointer, + "destination_pointer", + )?, + source: Self::decode_some_msg(&store.source, "source")?, + }), + Value::BlackBox(black_box) => { + Ok(brillig::Opcode::BlackBox(Self::decode_some_msg(&black_box.op, "black_box")?)) + } + Value::Trap(trap) => Ok(brillig::Opcode::Trap { + revert_data: Self::decode_some_msg(&trap.revert_data, "revert_data")?, + }), + Value::Stop(stop) => Ok(brillig::Opcode::Stop { + return_data: Self::decode_some_msg(&stop.return_data, "return_data")?, + }), + }) } } @@ -516,7 +624,120 @@ impl ProtoCodec for ProtoSchema { BlackBoxOp { value: Some(value) } } - fn decode(_value: &BlackBoxOp) -> eyre::Result { - todo!("decode") + fn decode(value: &BlackBoxOp) -> eyre::Result { + use crate::proto::brillig::black_box_op::*; + decode_oneof_map(&value.value, |value| match value { + Value::Aes128Encrypt(aes128_encrypt) => Ok(brillig::BlackBoxOp::AES128Encrypt { + inputs: Self::decode_some_msg(&aes128_encrypt.inputs, "inputs")?, + iv: Self::decode_some_msg(&aes128_encrypt.iv, "iv")?, + key: Self::decode_some_msg(&aes128_encrypt.key, "key")?, + outputs: Self::decode_some_msg(&aes128_encrypt.outputs, "outputs")?, + }), + Value::Blake2s(blake2s) => Ok(brillig::BlackBoxOp::Blake2s { + message: Self::decode_some_msg(&blake2s.message, "message")?, + output: Self::decode_some_msg(&blake2s.output, "output")?, + }), + Value::Blake3(blake3) => Ok(brillig::BlackBoxOp::Blake3 { + message: Self::decode_some_msg(&blake3.message, "message")?, + output: Self::decode_some_msg(&blake3.output, "output")?, + }), + Value::KeccakF1600(keccakf1600) => Ok(brillig::BlackBoxOp::Keccakf1600 { + input: Self::decode_some_msg(&keccakf1600.input, "input")?, + output: Self::decode_some_msg(&keccakf1600.output, "output")?, + }), + Value::EcdsaSecp256k1(ecdsa_secp256k1) => Ok(brillig::BlackBoxOp::EcdsaSecp256k1 { + hashed_msg: Self::decode_some_msg(&ecdsa_secp256k1.hashed_msg, "hashed_msg")?, + public_key_x: Self::decode_some_msg(&ecdsa_secp256k1.public_key_x, "public_key_x")?, + public_key_y: Self::decode_some_msg(&ecdsa_secp256k1.public_key_y, "public_key_y")?, + signature: Self::decode_some_msg(&ecdsa_secp256k1.signature, "signature")?, + result: Self::decode_some_msg(&ecdsa_secp256k1.result, "result")?, + }), + Value::EcdsaSecp256r1(ecdsa_secp256r1) => Ok(brillig::BlackBoxOp::EcdsaSecp256r1 { + hashed_msg: Self::decode_some_msg(&ecdsa_secp256r1.hashed_msg, "hashed_msg")?, + public_key_x: Self::decode_some_msg(&ecdsa_secp256r1.public_key_x, "public_key_x")?, + public_key_y: Self::decode_some_msg(&ecdsa_secp256r1.public_key_y, "public_key_y")?, + signature: Self::decode_some_msg(&ecdsa_secp256r1.signature, "signature")?, + result: Self::decode_some_msg(&ecdsa_secp256r1.result, "result")?, + }), + Value::MultiScalarMul(multi_scalar_mul) => Ok(brillig::BlackBoxOp::MultiScalarMul { + points: Self::decode_some_msg(&multi_scalar_mul.points, "points")?, + scalars: Self::decode_some_msg(&multi_scalar_mul.scalars, "scalars")?, + outputs: Self::decode_some_msg(&multi_scalar_mul.outputs, "outputs")?, + }), + Value::EmbeddedCurveAdd(embedded_curve_add) => { + Ok(brillig::BlackBoxOp::EmbeddedCurveAdd { + input1_x: Self::decode_some_msg(&embedded_curve_add.input1_x, "input1_x")?, + input1_y: Self::decode_some_msg(&embedded_curve_add.input1_y, "input1_y")?, + input1_infinite: Self::decode_some_msg( + &embedded_curve_add.input1_infinite, + "input1_infinite", + )?, + input2_x: Self::decode_some_msg(&embedded_curve_add.input2_x, "input2_x")?, + input2_y: Self::decode_some_msg(&embedded_curve_add.input2_y, "input2_y")?, + input2_infinite: Self::decode_some_msg( + &embedded_curve_add.input2_infinite, + "input2_infinite", + )?, + result: Self::decode_some_msg(&embedded_curve_add.result, "result")?, + }) + } + Value::BigIntAdd(big_int_add) => Ok(brillig::BlackBoxOp::BigIntAdd { + lhs: Self::decode_some_msg(&big_int_add.lhs, "lhs")?, + rhs: Self::decode_some_msg(&big_int_add.rhs, "rhs")?, + output: Self::decode_some_msg(&big_int_add.output, "output")?, + }), + Value::BigIntSub(big_int_sub) => Ok(brillig::BlackBoxOp::BigIntSub { + lhs: Self::decode_some_msg(&big_int_sub.lhs, "lhs")?, + rhs: Self::decode_some_msg(&big_int_sub.rhs, "rhs")?, + output: Self::decode_some_msg(&big_int_sub.output, "output")?, + }), + Value::BigIntMul(big_int_mul) => Ok(brillig::BlackBoxOp::BigIntMul { + lhs: Self::decode_some_msg(&big_int_mul.lhs, "lhs")?, + rhs: Self::decode_some_msg(&big_int_mul.rhs, "rhs")?, + output: Self::decode_some_msg(&big_int_mul.output, "output")?, + }), + Value::BigIntDiv(big_int_div) => Ok(brillig::BlackBoxOp::BigIntDiv { + lhs: Self::decode_some_msg(&big_int_div.lhs, "lhs")?, + rhs: Self::decode_some_msg(&big_int_div.rhs, "rhs")?, + output: Self::decode_some_msg(&big_int_div.output, "output")?, + }), + Value::BigIntFromLeBytes(big_int_from_le_bytes) => { + Ok(brillig::BlackBoxOp::BigIntFromLeBytes { + inputs: Self::decode_some_msg(&big_int_from_le_bytes.inputs, "inputs")?, + modulus: Self::decode_some_msg(&big_int_from_le_bytes.modulus, "modulus")?, + output: Self::decode_some_msg(&big_int_from_le_bytes.output, "output")?, + }) + } + Value::BigIntToLeBytes(big_int_to_le_bytes) => { + Ok(brillig::BlackBoxOp::BigIntToLeBytes { + input: Self::decode_some_msg(&big_int_to_le_bytes.input, "input")?, + output: Self::decode_some_msg(&big_int_to_le_bytes.output, "output")?, + }) + } + Value::Poseidon2Permutation(poseidon2_permutation) => { + Ok(brillig::BlackBoxOp::Poseidon2Permutation { + message: Self::decode_some_msg(&poseidon2_permutation.message, "message")?, + output: Self::decode_some_msg(&poseidon2_permutation.output, "output")?, + len: Self::decode_some_msg(&poseidon2_permutation.len, "len")?, + }) + } + Value::Sha256Compression(sha256_compression) => { + Ok(brillig::BlackBoxOp::Sha256Compression { + input: Self::decode_some_msg(&sha256_compression.input, "input")?, + hash_values: Self::decode_some_msg( + &sha256_compression.hash_values, + "hash_values", + )?, + output: Self::decode_some_msg(&sha256_compression.output, "output")?, + }) + } + Value::ToRadix(to_radix) => Ok(brillig::BlackBoxOp::ToRadix { + input: Self::decode_some_msg(&to_radix.input, "input")?, + radix: Self::decode_some_msg(&to_radix.radix, "radix")?, + output_pointer: Self::decode_some_msg(&to_radix.output_pointer, "output_pointer")?, + num_limbs: Self::decode_some_msg(&to_radix.num_limbs, "num_limbs")?, + output_bits: Self::decode_some_msg(&to_radix.output_bits, "output_bits")?, + }), + }) } } From c32d67c93490ac235b432e158faa33c1bda8585e Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Fri, 28 Feb 2025 17:29:09 +0000 Subject: [PATCH 24/24] Decoding acir WIP --- acvm-repo/acir/src/proto/convert/acir.rs | 126 ++++++++++++++++++----- 1 file changed, 103 insertions(+), 23 deletions(-) diff --git a/acvm-repo/acir/src/proto/convert/acir.rs b/acvm-repo/acir/src/proto/convert/acir.rs index eb0d5c81109..9f40d3f50c8 100644 --- a/acvm-repo/acir/src/proto/convert/acir.rs +++ b/acvm-repo/acir/src/proto/convert/acir.rs @@ -1,5 +1,8 @@ use crate::{ - circuit::{self, opcodes}, + circuit::{ + self, + opcodes::{self, BlockId}, + }, proto::acir::circuit::{ AssertMessage, AssertionPayload, BlackBoxFuncCall, BlockType, BrilligInputs, BrilligOutputs, Circuit, ConstantOrWitnessEnum, ExpressionOrMemory, ExpressionWidth, @@ -7,8 +10,8 @@ use crate::{ }, }; use acir_field::AcirField; -use color_eyre::eyre; -use noir_protobuf::ProtoCodec; +use color_eyre::eyre::{self, Context}; +use noir_protobuf::{decode_oneof_map, ProtoCodec}; use super::ProtoSchema; @@ -28,8 +31,27 @@ where } } - fn decode(_value: &Circuit) -> eyre::Result> { - todo!("decode") + fn decode(value: &Circuit) -> eyre::Result> { + Ok(circuit::Circuit { + current_witness_index: value.current_witness_index, + opcodes: Self::decode_vec_msg(&value.opcodes, "opcodes")?, + expression_width: Self::decode_some_msg(&value.expression_width, "expression_width")?, + private_parameters: Self::decode_vec_msg( + &value.private_parameters, + "private_parameters", + )? + .into_iter() + .collect(), + public_parameters: circuit::PublicInputs( + Self::decode_vec_msg(&value.public_parameters, "public_parameters")? + .into_iter() + .collect(), + ), + return_values: circuit::PublicInputs( + Self::decode_vec_msg(&value.return_values, "return_values")?.into_iter().collect(), + ), + assert_messages: Self::decode_vec_msg(&value.assert_messages, "assert_messages")?, + }) } } @@ -45,8 +67,14 @@ impl ProtoCodec for ProtoSchema ExpressionWidth { value: Some(value) } } - fn decode(_value: &ExpressionWidth) -> eyre::Result { - todo!("decode") + fn decode(value: &ExpressionWidth) -> eyre::Result { + use crate::proto::acir::circuit::expression_width::*; + decode_oneof_map(&value.value, |value| match value { + Value::Unbounded(_) => Ok(circuit::ExpressionWidth::Unbounded), + Value::Bounded(bounded) => Ok(circuit::ExpressionWidth::Bounded { + width: Self::decode_msg(&bounded.width, "width")?, + }), + }) } } @@ -63,9 +91,11 @@ where } fn decode( - _value: &AssertMessage, + value: &AssertMessage, ) -> eyre::Result<(circuit::OpcodeLocation, circuit::AssertionPayload)> { - todo!("decode") + let location = Self::decode_some_msg(&value.location, "location")?; + let payload = Self::decode_some_msg(&value.payload, "payload")?; + Ok((location, payload)) } } @@ -84,8 +114,17 @@ impl ProtoCodec for ProtoSchema { OpcodeLocation { value: Some(value) } } - fn decode(_value: &OpcodeLocation) -> eyre::Result { - todo!("decode") + fn decode(value: &OpcodeLocation) -> eyre::Result { + use crate::proto::acir::circuit::opcode_location::*; + decode_oneof_map(&value.value, |value| match value { + Value::Acir(location) => { + Ok(circuit::OpcodeLocation::Acir(Self::decode_msg(location, "location")?)) + } + Value::Brillig(brillig_location) => Ok(circuit::OpcodeLocation::Brillig { + acir_index: Self::decode_msg(&brillig_location.acir_index, "acir_index")?, + brillig_index: Self::decode_msg(&brillig_location.brillig_index, "brillig_index")?, + }), + }) } } @@ -100,8 +139,11 @@ where } } - fn decode(_value: &AssertionPayload) -> eyre::Result> { - todo!("decode") + fn decode(value: &AssertionPayload) -> eyre::Result> { + Ok(circuit::AssertionPayload { + error_selector: value.error_selector, + payload: Self::decode_vec_msg(&value.payload, "payload")?, + }) } } @@ -120,8 +162,14 @@ where ExpressionOrMemory { value: Some(value) } } - fn decode(_value: &ExpressionOrMemory) -> eyre::Result> { - todo!("decode") + fn decode(value: &ExpressionOrMemory) -> eyre::Result> { + use crate::proto::acir::circuit::expression_or_memory::*; + decode_oneof_map(&value.value, |value| match value { + Value::Expression(expression) => Ok(circuit::ExpressionOrMemory::Expression( + Self::decode_msg(expression, "expression")?, + )), + Value::Memory(id) => Ok(circuit::ExpressionOrMemory::Memory(BlockId(*id))), + }) } } @@ -183,8 +231,12 @@ where } } - fn decode(_value: &MemOp) -> eyre::Result> { - todo!("decode") + fn decode(value: &MemOp) -> eyre::Result> { + Ok(opcodes::MemOp { + operation: Self::decode_some_msg(&value.operation, "operation")?, + index: Self::decode_some_msg(&value.index, "index")?, + value: Self::decode_some_msg(&value.value, "value")?, + }) } } @@ -341,8 +393,17 @@ where FunctionInput { input: Self::encode_some(value.input_ref()), num_bits: value.num_bits() } } - fn decode(_value: &FunctionInput) -> eyre::Result> { - todo!("decode") + fn decode(value: &FunctionInput) -> eyre::Result> { + let input = Self::decode_some_msg(&value.input, "input")?; + + match input { + opcodes::ConstantOrWitnessEnum::Constant(c) => { + opcodes::FunctionInput::constant(c, value.num_bits).wrap_err("constant") + } + opcodes::ConstantOrWitnessEnum::Witness(w) => { + Ok(opcodes::FunctionInput::witness(w, value.num_bits)) + } + } } } @@ -361,8 +422,16 @@ where ConstantOrWitnessEnum { value: Some(value) } } - fn decode(_value: &ConstantOrWitnessEnum) -> eyre::Result> { - todo!("decode") + fn decode(value: &ConstantOrWitnessEnum) -> eyre::Result> { + use crate::proto::acir::circuit::constant_or_witness_enum::*; + decode_oneof_map(&value.value, |value| match value { + Value::Constant(field) => { + Ok(opcodes::ConstantOrWitnessEnum::Constant(Self::decode_msg(field, "constant")?)) + } + Value::Witness(witness) => { + Ok(opcodes::ConstantOrWitnessEnum::Witness(Self::decode_msg(witness, "witness")?)) + } + }) } } @@ -402,8 +471,19 @@ where BrilligInputs { value: Some(value) } } - fn decode(_value: &BrilligInputs) -> eyre::Result> { - todo!("decode") + fn decode(value: &BrilligInputs) -> eyre::Result> { + use crate::proto::acir::circuit::brillig_inputs::*; + decode_oneof_map(&value.value, |value| match value { + Value::Single(expression) => { + Ok(circuit::brillig::BrilligInputs::Single(Self::decode_msg(expression, "single")?)) + } + Value::Array(array) => Ok(circuit::brillig::BrilligInputs::Array( + Self::decode_vec_msg(&array.values, "array")?, + )), + Value::MemoryArray(id) => { + Ok(circuit::brillig::BrilligInputs::MemoryArray(BlockId(*id))) + } + }) } }