From ecb481166cab2189d10bd87871eda7ae0ec74f5c Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Wed, 28 Jun 2023 22:59:48 -0700 Subject: [PATCH 001/120] chore: update crate versions to v0.7.0 --- CHANGELOG.md | 2 ++ README.md | 2 +- air/Cargo.toml | 4 ++-- assembly/Cargo.toml | 4 ++-- core/Cargo.toml | 2 +- docs/src/intro/main.md | 2 +- docs/src/intro/usage.md | 2 +- miden/Cargo.toml | 14 +++++++------- processor/Cargo.toml | 8 ++++---- prover/Cargo.toml | 6 +++--- stdlib/Cargo.toml | 10 +++++----- test-utils/Cargo.toml | 10 +++++----- verifier/Cargo.toml | 6 +++--- 13 files changed, 37 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f343d56bd..baac868be4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.7.0 (TBD) + ## 0.6.1 (2023-06-29) - Fixed `no-std` compilation for `miden-core`, `miden-assembly`, and `miden-processor` crates. diff --git a/README.md b/README.md index 18969dd9ba..5b726873a3 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Miden VM is a zero-knowledge virtual machine written in Rust. For any program ex * If you'd like to learn more about STARKs, check out the [references](#references) section. ### Status and features -Miden VM is currently on release v0.6. In this release, most of the core features of the VM have been stabilized, and most of the STARK proof generation has been implemented. While we expect to keep making changes to the VM internals, the external interfaces should remain relatively stable, and we will do our best to minimize the amount of breaking changes going forward. +Miden VM is currently on release v0.7. In this release, most of the core features of the VM have been stabilized, and most of the STARK proof generation has been implemented. While we expect to keep making changes to the VM internals, the external interfaces should remain relatively stable, and we will do our best to minimize the amount of breaking changes going forward. The next version of the VM is being developed in the [next](https://github.com/0xPolygonMiden/miden-vm/tree/next) branch. There is also a documentation for the latest features and changes in the next branch [documentation next branch](https://0xpolygonmiden.github.io/miden-vm/intro/main.html). diff --git a/air/Cargo.toml b/air/Cargo.toml index 10d925d5e4..864f98aaf6 100644 --- a/air/Cargo.toml +++ b/air/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miden-air" -version = "0.6.0" +version = "0.7.0" description = "Algebraic intermediate representation of Miden VM processor" authors = ["miden contributors"] readme = "README.md" @@ -28,7 +28,7 @@ default = ["std"] std = ["vm-core/std", "winter-air/std"] [dependencies] -vm-core = { package = "miden-core", path = "../core", version = "0.6", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } winter-air = { package = "winter-air", version = "0.6", default-features = false } [dev-dependencies] diff --git a/assembly/Cargo.toml b/assembly/Cargo.toml index 26aa4d1486..92a963a48c 100644 --- a/assembly/Cargo.toml +++ b/assembly/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miden-assembly" -version = "0.6.1" +version = "0.7.0" description = "Miden VM assembly language" authors = ["miden contributors"] readme = "README.md" @@ -21,4 +21,4 @@ std = ["vm-core/std"] [dependencies] num_enum = "0.6.1" -vm-core = { package = "miden-core", path = "../core", version = "0.6", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } diff --git a/core/Cargo.toml b/core/Cargo.toml index 24f3dc853d..c5160608ea 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miden-core" -version = "0.6.1" +version = "0.7.0" description = "Miden VM core components" authors = ["miden contributors"] readme = "README.md" diff --git a/docs/src/intro/main.md b/docs/src/intro/main.md index e3bc48a3b3..b92e2ac454 100644 --- a/docs/src/intro/main.md +++ b/docs/src/intro/main.md @@ -2,7 +2,7 @@ Miden VM is a zero-knowledge virtual machine written in Rust. For any program executed on Miden VM, a STARK-based proof of execution is automatically generated. This proof can then be used by anyone to verify that the program was executed correctly without the need for re-executing the program or even knowing the contents of the program. ## Status and features -Miden VM is currently on release v0.6. In this release, most of the core features of the VM have been stabilized, and most of the STARK proof generation has been implemented. While we expect to keep making changes to the VM internals, the external interfaces should remain relatively stable, and we will do our best to minimize the amount of breaking changes going forward. +Miden VM is currently on release v0.7. In this release, most of the core features of the VM have been stabilized, and most of the STARK proof generation has been implemented. While we expect to keep making changes to the VM internals, the external interfaces should remain relatively stable, and we will do our best to minimize the amount of breaking changes going forward. At this point, Miden VM is good enough for experimentation, and even for real-world applications, but it is not yet ready for production use. The codebase has not been audited and contains known and unknown bugs and security flaws. diff --git a/docs/src/intro/usage.md b/docs/src/intro/usage.md index 51c51fef26..0b697964b0 100644 --- a/docs/src/intro/usage.md +++ b/docs/src/intro/usage.md @@ -1,5 +1,5 @@ # Usage -Before you can use Miden VM, you'll need to make sure you have Rust [installed](https://www.rust-lang.org/tools/install). Miden VM v0.6 requires Rust version **1.67** or later. +Before you can use Miden VM, you'll need to make sure you have Rust [installed](https://www.rust-lang.org/tools/install). Miden VM v0.7 requires Rust version **1.67** or later. Miden VM consists of several crates, each of which exposes a small set of functionality. The most notable of these crates are: * [miden-processor](https://crates.io/crates/miden-processor), which can be used to execute Miden VM programs. diff --git a/miden/Cargo.toml b/miden/Cargo.toml index 7c460b960c..a5127dcce0 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miden-vm" -version = "0.6.0" +version = "0.7.0" description="Miden virtual machine" authors = ["miden contributors"] readme="README.md" @@ -43,19 +43,19 @@ executable = ["env_logger", "hex/std", "std", "serde/std", "serde_derive", "serd std = ["assembly/std", "log/std", "processor/std", "prover/std", "verifier/std"] [dependencies] -assembly = { package = "miden-assembly", path = "../assembly", version = "0.6", default-features = false } +assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } env_logger = { version = "0.10", default-features = false, optional = true } hex = { version = "0.4", optional = true } log = { version = "0.4", default-features = false } -processor = { package = "miden-processor", path = "../processor", version = "0.6", default-features = false } -prover = { package = "miden-prover", path = "../prover", version = "0.6", default-features = false } +processor = { package = "miden-processor", path = "../processor", version = "0.7", default-features = false } +prover = { package = "miden-prover", path = "../prover", version = "0.7", default-features = false } rustyline = { version = "10.0.0", default-features = false, optional = true} serde = {version = "1.0.117", optional = true } serde_derive = {version = "1.0.117", optional = true } serde_json = {version = "1.0.59", optional = true } -stdlib = { package = "miden-stdlib", path = "../stdlib", version = "0.5", default-features = false } +stdlib = { package = "miden-stdlib", path = "../stdlib", version = "0.6", default-features = false } structopt = { version = "0.3", default-features = false, optional = true } -verifier = { package = "miden-verifier", path = "../verifier", version = "0.6", default-features = false } +verifier = { package = "miden-verifier", path = "../verifier", version = "0.7", default-features = false } [dev-dependencies] assert_cmd = "2.0" @@ -64,5 +64,5 @@ escargot = "0.5.7" num-bigint = "0.4" predicates = "3.0" test-utils = { package = "miden-test-utils", path = "../test-utils" } -vm-core = { package = "miden-core", path = "../core", version = "0.6" } +vm-core = { package = "miden-core", path = "../core", version = "0.7" } winter-fri = { package = "winter-fri", version = "0.6" } diff --git a/processor/Cargo.toml b/processor/Cargo.toml index 5c580b6291..6f24a6ea0c 100644 --- a/processor/Cargo.toml +++ b/processor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miden-processor" -version = "0.6.1" +version = "0.7.0" description = "Miden VM processor" authors = ["miden contributors"] readme = "README.md" @@ -23,13 +23,13 @@ std = ["vm-core/std", "winter-prover/std", "log/std"] [dependencies] log = "0.4.14" -vm-core = { package = "miden-core", path = "../core", version = "0.6", default-features = false } -miden-air = { package = "miden-air", path = "../air", version = "0.6", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } +miden-air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } winter-prover = { package = "winter-prover", version = "0.6", default-features = false } [dev-dependencies] logtest = { version = "2.0", default-features = false } -miden-assembly = { package = "miden-assembly", path = "../assembly", version = "0.6", default-features = false } +miden-assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } rand-utils = { package = "winter-rand-utils", version = "0.6" } test-utils = { package = "miden-test-utils", path = "../test-utils" } winter-fri = { package = "winter-fri", version = "0.6" } diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 009348e850..0c7d97b924 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miden-prover" -version = "0.6.0" +version = "0.7.0" description = "Miden VM prover" authors = ["miden contributors"] readme = "README.md" @@ -18,9 +18,9 @@ metal = ["dep:ministark-gpu", "dep:elsa", "dep:pollster", "concurrent", "std"] std = ["air/std", "processor/std", "log/std", "winter-prover/std"] [dependencies] -air = { package = "miden-air", path = "../air", version = "0.6", default-features = false } +air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } log = { version = "0.4", default-features = false, optional = true } -processor = { package = "miden-processor", path = "../processor", version = "0.6", default-features = false } +processor = { package = "miden-processor", path = "../processor", version = "0.7", default-features = false } winter-prover = { package = "winter-prover", version = "0.6", default-features = false } [target.'cfg(all(target_arch = "aarch64", target_os = "macos"))'.dependencies] diff --git a/stdlib/Cargo.toml b/stdlib/Cargo.toml index 10e7ea9ce0..55fefd9f88 100644 --- a/stdlib/Cargo.toml +++ b/stdlib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miden-stdlib" -version = "0.5.0" +version = "0.6.0" description = "Miden VM standard library" authors = ["miden contributors"] readme = "README.md" @@ -20,13 +20,13 @@ name = "stdlib" path = "tests/main.rs" [dependencies] -assembly = { package = "miden-assembly", default-features = false, path = "../assembly", version = "0.6" } +assembly = { package = "miden-assembly", default-features = false, path = "../assembly", version = "0.7" } [dev-dependencies] blake3 = "1.3.3" -miden-air = { package = "miden-air", path = "../air", version = "0.6", default-features = false } +miden-air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } num-bigint = "0.4.3" -processor = { package = "miden-processor", path = "../processor", version = "0.6", features = ["internals"], default-features = false } +processor = { package = "miden-processor", path = "../processor", version = "0.7", features = ["internals"], default-features = false } serde_json = "1.0.94" sha2 = "0.10.6" sha3 = "0.10.6" @@ -35,4 +35,4 @@ winter-air = { package = "winter-air", version = "0.6" } winter-fri = { package = "winter-fri", version = "0.6" } [build-dependencies] -assembly = { package = "miden-assembly", path = "../assembly", version = "0.6" } +assembly = { package = "miden-assembly", path = "../assembly", version = "0.7" } diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 2bda9fe932..e71f0c23b8 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -16,12 +16,12 @@ default = ["std"] std = ["assembly/std", "processor/std", "prover/std", "verifier/std", "vm-core/std", "winter-prover/std"] [dependencies] -assembly = { package = "miden-assembly", path = "../assembly", version = "0.6", default-features = false } -processor = { package = "miden-processor", path = "../processor", version = "0.6", features = ["internals"], default-features = false } -prover = { package = "miden-prover", path = "../prover", version = "0.6", default-features = false } +assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } +processor = { package = "miden-processor", path = "../processor", version = "0.7", features = ["internals"], default-features = false } +prover = { package = "miden-prover", path = "../prover", version = "0.7", default-features = false } test-case = "3.0.0" -verifier = { package = "miden-verifier", path = "../verifier", version = "0.6", default-features = false } -vm-core = { package = "miden-core", path = "../core", version = "0.6", default-features = false } +verifier = { package = "miden-verifier", path = "../verifier", version = "0.7", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } winter-prover = { package = "winter-prover", version = "0.6", default-features = false } [target.'cfg(not(target_family = "wasm"))'.dependencies] diff --git a/verifier/Cargo.toml b/verifier/Cargo.toml index 12a3094694..32b47f06b8 100644 --- a/verifier/Cargo.toml +++ b/verifier/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "miden-verifier" -version = "0.6.0" +version = "0.7.0" description="Miden VM execution verifier" authors = ["miden contributors"] readme="README.md" @@ -20,6 +20,6 @@ default = ["std"] std = ["air/std", "vm-core/std", "winter-verifier/std"] [dependencies] -air = { package = "miden-air", path = "../air", version = "0.6", default-features = false } -vm-core = { package = "miden-core", path = "../core", version = "0.6", default-features = false } +air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } +vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } winter-verifier = { package = "winter-verifier", version = "0.6", default-features = false } From 0b61d891fd3e09ab4f0dc85ef7e9e0cfd3906de4 Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:13:15 +0000 Subject: [PATCH 002/120] refactor(processor): remove the 8 bit segment of the range checker - Simplifies the range checker. - Removes one selector column in the main trace and one running product column in the auxiliary trace --- processor/src/range/aux_trace.rs | 151 ++++++--------------- processor/src/range/mod.rs | 219 +++++++++++++------------------ 2 files changed, 134 insertions(+), 236 deletions(-) diff --git a/processor/src/range/aux_trace.rs b/processor/src/range/aux_trace.rs index d59a17dc16..3d3a496c73 100644 --- a/processor/src/range/aux_trace.rs +++ b/processor/src/range/aux_trace.rs @@ -20,8 +20,9 @@ pub struct AuxTraceBuilder { // A trace-length vector of RangeCheckFlags which indicate how many times the range check value // at that row should be included in the trace. row_flags: Vec, - // The index of the first row of the 16-bit segment of the Range Checker's trace. - start_16bit: usize, + // The index of the first row of Range Checker's trace when the padded rows end and values to + // be range checked start. + values_start: usize, } impl AuxTraceBuilder { @@ -30,12 +31,12 @@ impl AuxTraceBuilder { pub fn new( cycle_range_checks: BTreeMap, row_flags: Vec, - start_16bit: usize, + values_start: usize, ) -> Self { Self { cycle_range_checks, row_flags, - start_16bit, + values_start, } } @@ -50,89 +51,23 @@ impl AuxTraceBuilder { /// Builds and returns range checker auxiliary trace columns. Currently this consists of three /// columns: - /// - `p0`: ensures that the range checker table is internally consistent between the 8-bit and - /// 16-bit sections. - /// - `p1`: ensures that the range checks performed by the Range Checker match those requested + /// - `b_range`: ensures that the range checks performed by the Range Checker match those + /// requested /// by the Stack and Memory processors. /// - `q`: a helper column of intermediate values to reduce the degree of the constraints for - /// `p1`. It contains the product of the lookups performed by the Stack at each row. + /// `b_range`. It contains the product of the lookups performed by the Stack at each row. pub fn build_aux_columns>( &self, main_trace: &ColMatrix, rand_elements: &[E], ) -> Vec> { - let p0 = self.build_aux_col_p0(main_trace, rand_elements); - let (p1, q) = self.build_aux_col_p1(main_trace, rand_elements); - vec![p0, p1, q] + let (b_range, q) = self.build_aux_col_b_range(main_trace, rand_elements); + vec![b_range, q] } - /// Builds the execution trace of the range checker's `p0` auxiliary column used for multiset - /// checks. The running product is built up in the 8-bit section of the table and reduced in the - /// 16-bit section of the table so that the starting and ending value are both one. - fn build_aux_col_p0>( - &self, - main_trace: &ColMatrix, - rand_elements: &[E], - ) -> Vec { - let mut aux_column = E::zeroed_vector(main_trace.num_rows()); - let alpha = rand_elements[0]; - let v_col = main_trace.get_column(V_COL_IDX); - - // Set the starting value to one. - aux_column[0] = E::ONE; - - // Build the execution trace of the 8-bit running product. - for (row_idx, (hint, lookup)) in - self.row_flags.iter().zip(v_col.iter()).enumerate().take(self.start_16bit) - { - // This is the 8-bit section, where the running product must be built up. - aux_column[row_idx + 1] = aux_column[row_idx] * hint.to_value(*lookup, rand_elements); - } - - // Accumulate the value differences for each transition and their product in preparation for - // using a modified batch inversion to build the execution trace of the 16-bit section where the - // running product must be reduced by the value difference at each row with offset alpha: - // (alpha + v' - v). - let mut diff_values = Vec::with_capacity(v_col.len() - self.start_16bit - NUM_RAND_ROWS); - let mut acc = E::ONE; - for (row_idx, &v) in v_col - .iter() - .enumerate() - .take(v_col.len() - NUM_RAND_ROWS) - .skip(self.start_16bit) - { - // This is the 16-bit section, where the running product must be reduced. - let v_next = v_col[row_idx + 1].into(); - let value = alpha + v_next - v.into(); - - // Accumulate the transition difference values by which the running product must be reduced. - diff_values.push(value); - - // Accumulate the product of the differences. - if value != E::ZERO { - acc *= value; - } - } - - // Invert the accumulated product and multiply it by the result from the 8-bit section. - acc = acc.inv() * aux_column[self.start_16bit]; - - // Do a modified version of batch inversion. We don't actually want an array of inverted - // diff_values [1/a, 1/b, 1/c, ...], we want an array of inverted products all of which are - // multiplied by the same 8-bit result `res`, e.g. [res/a, res/ab, res/abc, ...]. - for idx in (0..diff_values.len()).rev() { - aux_column[self.start_16bit + idx + 1] = acc; - if diff_values[idx] != E::ZERO { - acc *= diff_values[idx]; - } - } - - aux_column - } - - /// Builds the execution trace of the range check `p1` and `q` columns which ensure that the + /// Builds the execution trace of the range check `b_range` and `q` columns which ensure that the /// range check lookups performed by user operations match those executed by the Range Checker. - fn build_aux_col_p1>( + fn build_aux_col_b_range>( &self, main_trace: &ColMatrix, alphas: &[E], @@ -143,69 +78,69 @@ impl AuxTraceBuilder { // allocate memory for the running product column and set the initial value to ONE let mut q = unsafe { uninit_vector(main_trace.num_rows()) }; - let mut p1 = unsafe { uninit_vector(main_trace.num_rows()) }; + let mut b_range = unsafe { uninit_vector(main_trace.num_rows()) }; q[0] = E::ONE; - p1[0] = E::ONE; + b_range[0] = E::ONE; - // keep track of the last updated row in the `p1` running product column. the `q` column - // index is always one row behind, since `q` is filled with intermediate values in the same - // row as the operation is executed, whereas `p1` is filled with result values that are - // added to the next row after the operation's execution. - let mut p1_idx = 0_usize; + // keep track of the last updated row in the `b_range` running product column. the `q` + // column index is always one row behind, since `q` is filled with intermediate values in + // the same row as the operation is executed, whereas `b_range` is filled with result + // values that are added to the next row after the operation's execution. + let mut b_range_idx = 0_usize; // keep track of the next row to be included from the user op range check values. let mut rc_user_op_idx = 0; // the first half of the trace only includes values from the operations. - for (clk, range_checks) in self.cycle_range_checks.range(0..=self.start_16bit as u32) { + for (clk, range_checks) in self.cycle_range_checks.range(0..self.values_start as u32) { let clk = *clk as usize; // if we skipped some cycles since the last update was processed, values in the last // updated row should by copied over until the current cycle. - if p1_idx < clk { - let last_value = p1[p1_idx]; - p1[(p1_idx + 1)..=clk].fill(last_value); - q[p1_idx..clk].fill(E::ONE); + if b_range_idx < clk { + let last_value = b_range[b_range_idx]; + b_range[(b_range_idx + 1)..=clk].fill(last_value); + q[b_range_idx..clk].fill(E::ONE); } // move the column pointers to the next row. - p1_idx = clk + 1; + b_range_idx = clk + 1; // update the intermediate values in the q column. q[clk] = range_checks.to_stack_value(main_trace, alphas); // include the operation lookups in the running product. - p1[p1_idx] = p1[clk] * inv_row_values[rc_user_op_idx]; + b_range[b_range_idx] = b_range[clk] * inv_row_values[rc_user_op_idx]; rc_user_op_idx += 1; } // if we skipped some cycles since the last update was processed, values in the last // updated row should by copied over until the current cycle. - if p1_idx < self.start_16bit { - let last_value = p1[p1_idx]; - p1[(p1_idx + 1)..=self.start_16bit].fill(last_value); - q[p1_idx..self.start_16bit].fill(E::ONE); + if b_range_idx < self.values_start { + let last_value = b_range[b_range_idx]; + b_range[(b_range_idx + 1)..=self.values_start].fill(last_value); + q[b_range_idx..self.values_start].fill(E::ONE); } - // for the 16-bit section of the range checker table, include `z` in the running product at - // each step and remove lookups from user ops at any step where user ops were executed. + // after the padded section of the range checker table, include `z` in the running product + // at each step and remove lookups from user ops at any step where user ops were executed. for (row_idx, (hint, lookup)) in self .row_flags .iter() .zip(main_trace.get_column(V_COL_IDX).iter()) .enumerate() .take(main_trace.num_rows() - NUM_RAND_ROWS) - .skip(self.start_16bit) + .skip(self.values_start) { - p1_idx = row_idx + 1; + b_range_idx = row_idx + 1; - p1[p1_idx] = p1[row_idx] * hint.to_value(*lookup, alphas); + b_range[b_range_idx] = b_range[row_idx] * hint.to_value(*lookup, alphas); if let Some(range_check) = self.cycle_range_checks.get(&(row_idx as u32)) { // update the intermediate values in the q column. q[row_idx] = range_check.to_stack_value(main_trace, alphas); // include the operation lookups in the running product. - p1[p1_idx] *= inv_row_values[rc_user_op_idx]; + b_range[b_range_idx] *= inv_row_values[rc_user_op_idx]; rc_user_op_idx += 1; } else { q[row_idx] = E::ONE; @@ -214,16 +149,16 @@ impl AuxTraceBuilder { // at this point, all range checks from user operations and the range checker should be // matched - so, the last value must be ONE; - assert_eq!(q[p1_idx - 1], E::ONE); - assert_eq!(p1[p1_idx], E::ONE); + assert_eq!(q[b_range_idx - 1], E::ONE); + assert_eq!(b_range[b_range_idx], E::ONE); - if (p1_idx - 1) < p1.len() - 1 { - q[p1_idx..].fill(E::ONE); + if (b_range_idx - 1) < b_range.len() - 1 { + q[b_range_idx..].fill(E::ONE); } - if p1_idx < p1.len() - 1 { - p1[(p1_idx + 1)..].fill(E::ONE); + if b_range_idx < b_range.len() - 1 { + b_range[(b_range_idx + 1)..].fill(E::ONE); } - (p1, q) + (b_range, q) } } diff --git a/processor/src/range/mod.rs b/processor/src/range/mod.rs index 20cbc8c983..9c0b12e4ae 100644 --- a/processor/src/range/mod.rs +++ b/processor/src/range/mod.rs @@ -3,6 +3,7 @@ use super::{ utils::uninit_vector, BTreeMap, ColMatrix, Felt, FieldElement, RangeCheckTrace, Vec, ONE, ZERO, }; +use core::cmp::Ordering; mod aux_trace; pub use aux_trace::AuxTraceBuilder; @@ -13,24 +14,6 @@ use request::CycleRangeChecks; #[cfg(test)] mod tests; -// Range check trace table -pub const RANGE_CHECK_TRACE_TABLE_WIDTH: usize = 256; - -// RANGE CHECKER TRACE TABLE -// ================================================================================================ - -/// Range checker trace table. -/// -/// This component will store 8-bit lookup tables so it won't have to be reconstructed multiple -/// times. It will also contain the combined length of the 8-bit and 16-bit tables. -/// -/// This is intended as internal helper structure and is not intended to be exported as part of the -/// public API. -pub struct RangeCheckTraceTable { - pub lookups_8bit: [usize; RANGE_CHECK_TRACE_TABLE_WIDTH], - pub len: usize, -} - // RANGE CHECKER // ================================================================================================ @@ -41,39 +24,27 @@ pub struct RangeCheckTraceTable { /// into 16-bits, but rather keeps track of all 16-bit range checks performed by the VM. /// /// ## Execution trace -/// Execution trace generated by the range checker consists of 4 columns. Conceptually, the table -/// is split into two sets of rows (two segments): an 8-bit segment and a 16-bit segment. The -/// 8-bit segment must enumerate all 256 possible 8-bit values. Values must be in increasing order, -/// but duplicates are allowed. The 16-bit segment must start with value 0 and end with value -/// 65535. The values must also be in increasing order but can be up to 255 values apart, and -/// duplicates are also allowed. -/// -/// The general idea is that we use the 8-bit portion of the table to range-check the "breaks" -/// in between values for the 16-bit portion of the table. Given these constraints, the minimum -/// trace length required to support even a few range checks is 1024. However, with a table of -/// 1024 rows we can support close to 600 16-bit range checks (assuming the checked values are -/// randomly distributed). +/// Execution trace generated by the range checker consists of 3 columns. Conceptually, the table +/// starts with value 0 and end with value 65535. /// /// The layout illustrated below. /// -/// t s0 s1 v -/// ├─────┴──────┴──────┴─────┤ +/// s0 s1 v +/// ├─────┴──────┴─────┤ /// /// In the above, the meaning of the columns is as follows: -/// - Column `t` defines which segment of the table we are in. When t = 0, we are in the 8-bit -/// segment of the table, and when t = 1, we are in the 16-bit segment of the table. Values in -/// this column start with zeros and can switch to ones only once. -/// - Column `v` contains the value being range-checked. When t = 0, v must be an 8-bit value, and -/// when t = 1, v must be a 16-bit value. +/// - Column `v` contains the value being range-checked where `v` must be a 16-bit value. The +/// values must be in increasing order and the jump allowed between two values should be a power +/// of 3 less than or equal to 3^7, and duplicates are allowed. /// - Column `s0` and `s1` specify how many lookups are to be included for a given value. /// Specifically: (0, 0) means no lookups, (1, 0) means one lookup, (0, 1), means two lookups, /// and (1, 1) means four lookups. /// /// Thus, for example, if a value was range-checked just once, we'll need to add a single row to -/// the table with (t, s0, s1, v) set to (1, 1, 0, v), where v is the value. +/// the table with (s0, s1, v) set to (1, 0, v), where v is the value. /// /// If, on the other hand, the value was range-checked 5 times, we'll need two rows in the table: -/// (1, 1, 1, v) and (1, 1, 0, v). The first row specifies that there was 4 lookups and the second +/// (1, 1, v) and (1, 0, v). The first row specifies that there were 4 lookups and the second /// row add the fifth lookup. pub struct RangeChecker { /// Tracks lookup count for each checked value. @@ -90,8 +61,8 @@ impl RangeChecker { /// Returns a new [RangeChecker] instantiated with an empty lookup table. pub fn new() -> Self { let mut lookups = BTreeMap::new(); - // we need to make sure that the first and the last row of the 16-bit segment of the table - // are initialized. this simplifies trace table building later on. + // we need to make sure that the first row after the padded section and the last row of the + // range checker table are initialized. this simplifies trace table building later on. lookups.insert(0, 0); lookups.insert(u16::MAX, 0); Self { @@ -136,7 +107,7 @@ impl RangeChecker { // EXECUTION TRACE GENERATION (INTERNAL) // -------------------------------------------------------------------------------------------- - /// Converts this [RangeChecker] into an execution trace with 4 columns and the number of rows + /// Converts this [RangeChecker] into an execution trace with 3 columns and the number of rows /// specified by the `target_len` parameter. /// /// If the number of rows need to represent execution trace of this range checker is smaller @@ -150,7 +121,7 @@ impl RangeChecker { /// to represent all lookups in this range checker. pub fn into_trace_with_table( self, - table: RangeCheckTraceTable, + trace_len: usize, target_len: usize, num_rand_rows: usize, ) -> RangeCheckTrace { @@ -159,22 +130,12 @@ impl RangeChecker { // determine the length of the trace required to support all the lookups in this range // checker, and make sure this length is smaller than or equal to the target trace length, // accounting for rows with random values. - // - // we do the trace length computation here instead of using Self::trace_len() because we - // need to use lookups_8bit table later in this function, and we don't want to create it - // twice. - let trace_len = table.len; assert!(trace_len + num_rand_rows <= target_len, "target trace length too small"); // allocated memory for the trace; this memory is un-initialized but this is not a problem // because we'll overwrite all values in it anyway. let mut trace = unsafe { - [ - uninit_vector(target_len), - uninit_vector(target_len), - uninit_vector(target_len), - uninit_vector(target_len), - ] + [uninit_vector(target_len), uninit_vector(target_len), uninit_vector(target_len)] }; // Allocate uninitialized memory for accumulating the precomputed auxiliary column hints. let mut row_flags = unsafe { uninit_vector(target_len) }; @@ -182,34 +143,19 @@ impl RangeChecker { // determine the number of padding rows needed to get to target trace length and pad the // table with the required number of rows. let num_padding_rows = target_len - trace_len - num_rand_rows; + trace[0][..num_padding_rows].fill(ZERO); trace[1][..num_padding_rows].fill(ZERO); trace[2][..num_padding_rows].fill(ZERO); - trace[3][..num_padding_rows].fill(ZERO); // Initialize the padded rows of the auxiliary column hints with the default flag, F0, // indicating s0 = s1 = ZERO. row_flags[..num_padding_rows].fill(RangeCheckFlag::F0); - // build the 8-bit segment of the trace table + // build the trace table let mut i = num_padding_rows; - for (value, num_lookups) in table.lookups_8bit.into_iter().enumerate() { - write_value(&mut trace, &mut i, num_lookups, value as u64, &mut row_flags); - } - - // fill in the first column to indicate where the 8-bit segment ends and where the - // 16-bit segment begins - trace[0][..i].fill(ZERO); - trace[0][i..].fill(ONE); - - // build the 16-bit segment of the trace table - let start_16bit = i; let mut prev_value = 0u16; for (&value, &num_lookups) in self.lookups.iter() { - // when the delta between two values is greater than 255, insert "bridge" rows - for value in (prev_value..value).step_by(255).skip(1) { - write_value(&mut trace, &mut i, 0, value as u64, &mut row_flags); - } - write_value(&mut trace, &mut i, num_lookups, value as u64, &mut row_flags); + write_rows(&mut trace, &mut i, num_lookups, value, prev_value, &mut row_flags); prev_value = value; } @@ -222,58 +168,32 @@ impl RangeChecker { RangeCheckTrace { trace, - aux_builder: AuxTraceBuilder::new(self.cycle_range_checks, row_flags, start_16bit), + aux_builder: AuxTraceBuilder::new(self.cycle_range_checks, row_flags, num_padding_rows), } } // PUBLIC ACCESSORS // -------------------------------------------------------------------------------------------- - /// Builds an 8-bit lookup table required to support all 16-bit lookups currently in - /// self.lookups, and returns this table together with the number of 16-bit table rows needed - /// to support all 16-bit lookups. - pub fn build_8bit_lookup(&self) -> RangeCheckTraceTable { - let mut lookups_8bit = [0; 256]; - + /// Returns the number of rows needed to support all 16-bit lookups requested by the VM. + pub fn get_number_range_checker_rows(&self) -> usize { // pad the trace length by one, to account for an extra row of the u16::MAX value at the end - // of the 16-bit segment of the trace, required for building the `b_range` column. - let mut num_16bit_rows = 1; - - // add a lookup for ZERO to account for the extra row of the u16::MAX value - lookups_8bit[0] = 1; + // of the trace, required for building the `b_range` column. + let mut num_rows = 1; let mut prev_value = 0u16; for (&value, &num_lookups) in self.lookups.iter() { - // determine how many 16-bit lookup rows we need for this value; if the number of rows - // is greater than 1, we also need 8-bit lookups for ZERO value since the delta between - // rows of the same value is zero. - let num_rows = lookups_to_rows(num_lookups); - lookups_8bit[0] += num_rows - 1; - num_16bit_rows += num_rows; - + // determine how many lookup rows we need for this value + num_rows += lookups_to_rows(num_lookups); // determine the delta between this and the previous value. we need to know this delta - // to determine if we need to insert any "bridge" rows to the 16-bit portion of the the - // table, this is needed since rows in the 16-bit portion of the table can be at most - // 255 rows apart. + // to determine if we need to insert any "bridge" rows to the table, this is needed + // since the gap between two values in the range checker can only be a power of 3 less + // than or equal to 3^7. let delta = value - prev_value; - let (delta_q, delta_r) = div_rem(delta as usize, 255); - - if delta_q != 0 { - lookups_8bit[255] += delta_q; - let num_bridge_rows = if delta_r == 0 { delta_q - 1 } else { delta_q }; - num_16bit_rows += num_bridge_rows; - } - if delta_r != 0 { - lookups_8bit[delta_r] += 1; - } - + num_rows += get_num_bridge_rows(delta); prev_value = value; } - - let num_8bit_rows = get_num_8bit_rows(&lookups_8bit); - let len = num_8bit_rows + num_16bit_rows; - - RangeCheckTraceTable { lookups_8bit, len } + num_rows } // TEST HELPERS @@ -283,18 +203,17 @@ impl RangeChecker { /// by the VM. #[cfg(test)] pub fn trace_len(&self) -> usize { - self.build_8bit_lookup().len + self.get_number_range_checker_rows() } - /// Converts this [RangeChecker] into an execution trace with 4 columns and the number of rows + /// Converts this [RangeChecker] into an execution trace with 3 columns and the number of rows /// specified by the `target_len` parameter. /// /// Wrapper for [`RangeChecker::into_trace_with_table`]. #[cfg(test)] pub fn into_trace(self, target_len: usize, num_rand_rows: usize) -> RangeCheckTrace { - let table = self.build_8bit_lookup(); - - self.into_trace_with_table(table, target_len, num_rand_rows) + let table_len = self.get_number_range_checker_rows(); + self.into_trace_with_table(table_len, target_len, num_rand_rows) } } @@ -308,7 +227,7 @@ impl Default for RangeChecker { // ================================================================================================ /// A precomputed hint value that can be used to help construct the execution trace for the -/// auxiliary columns p0 and p1 used for multiset checks. The hint is a precomputed flag value based +/// auxiliary column b_range used for multiset checks. The hint is a precomputed flag value based /// on the selectors s0 and s1 in the trace. #[derive(Debug, PartialEq, Eq, Clone)] pub enum RangeCheckFlag { @@ -356,13 +275,59 @@ fn lookups_to_rows(num_lookups: usize) -> usize { } } -/// Returns the number of trace rows needed to describe the specified 8-bit lookup table. -fn get_num_8bit_rows(lookups: &[usize; 256]) -> usize { - let mut result = 0; - for &num_lookups in lookups.iter() { - result += lookups_to_rows(num_lookups); +/// Calculates the number of bridge rows that are need to be added to the trace between two values +/// to be range checked. +pub fn get_num_bridge_rows(delta: u16) -> usize { + let mut exp = 7; + let mut gap = delta; + let mut bridge_rows = 0_usize; + let mut stride = 3_u16.pow(exp); + while gap > 0 { + if gap >= stride { + bridge_rows += 1; + gap -= stride; + } else { + exp = exp.saturating_sub(1); + stride = 3_u16.pow(exp); + } + } + bridge_rows.saturating_sub(1) +} + +/// Adds a row for the values to be range checked. In case the difference between the current and +/// next value is not a power of 3, this function will add additional bridge rows to the trace. +fn write_rows( + trace: &mut [Vec], + step: &mut usize, + num_lookups: usize, + value: u16, + prev_value: u16, + row_flags: &mut [RangeCheckFlag], +) { + let mut exp = 7; + let mut gap = value - prev_value; + let mut prev_val = prev_value; + let mut stride = 3_u16.pow(exp); + if gap == 0 { + write_value(trace, step, num_lookups, value as u64, row_flags); + } + while gap > 0 { + match gap.cmp(&stride) { + Ordering::Equal => { + gap -= stride; + write_value(trace, step, num_lookups, value as u64, row_flags); + } + Ordering::Greater => { + gap -= stride; + prev_val += stride; + write_value(trace, step, 0, prev_val as u64, row_flags); + } + Ordering::Less => { + exp = exp.saturating_sub(1); + stride = 3_u16.pow(exp); + } + } } - result } /// Populates the trace with the rows needed to support the specified number of lookups against @@ -402,13 +367,11 @@ fn write_value( } } -/// Populates a single row at the specified step in the trace table. This does not write values -/// into the first column of the trace (the segment identifier) because values into this -/// column are written in bulk. +/// Populates a single row at the specified step in the trace table. fn write_trace_row(trace: &mut [Vec], step: &mut usize, s0: Felt, s1: Felt, value: u64) { - trace[1][*step] = s0; - trace[2][*step] = s1; - trace[3][*step] = Felt::new(value); + trace[0][*step] = s0; + trace[1][*step] = s1; + trace[2][*step] = Felt::new(value); *step += 1; } From 26744a0d59d2e282fa4730c443b72459b05137f2 Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:14:57 +0000 Subject: [PATCH 003/120] refactor(air): modify the shape of the trace and modify the air constraints - removes one main and one auxiliary trace columns - removes constraints for the 8 bit section and remove the selector column --- air/src/constraints/range.rs | 185 +++++++++-------------------------- air/src/trace/mod.rs | 10 +- air/src/trace/range.rs | 20 ++-- 3 files changed, 57 insertions(+), 158 deletions(-) diff --git a/air/src/constraints/range.rs b/air/src/constraints/range.rs index c30b1bffdd..6d28b07317 100644 --- a/air/src/constraints/range.rs +++ b/air/src/constraints/range.rs @@ -1,8 +1,6 @@ use crate::{ chiplets::{ChipletsFrameExt, MemoryFrameExt}, - trace::range::{ - P0_COL_IDX, P1_COL_IDX, Q_COL_IDX, S0_COL_IDX, S1_COL_IDX, T_COL_IDX, V_COL_IDX, - }, + trace::range::{B_RANGE_COL_IDX, Q_COL_IDX, S0_COL_IDX, S1_COL_IDX, V_COL_IDX}, utils::{are_equal, binary_not, is_binary}, Assertion, EvaluationFrame, Felt, FieldElement, TransitionConstraintDegree, }; @@ -17,24 +15,22 @@ use winter_air::AuxTraceRandElements; /// The number of boundary constraints required by the Range Checker pub const NUM_ASSERTIONS: usize = 2; /// The number of transition constraints required by the Range Checker. -pub const NUM_CONSTRAINTS: usize = 7; +pub const NUM_CONSTRAINTS: usize = 3; /// The degrees of the range checker's constraints, in the order they'll be added to the the result /// array when a transition is evaluated. pub const CONSTRAINT_DEGREES: [usize; NUM_CONSTRAINTS] = [ - 2, 2, 2, // Selector flags must be binary: t, s0, s1. - 3, // Constrain the row transitions in the 8-bit section of the table. - 2, // Transition from 8-bit to 16-bit section of range check table occurs at most once. - 3, 3, // Enforce values of column v before and after 8-bit to 16-bit transition. + 2, 2, // Selector flags must be binary: s0, s1. + 9, // Enforce values of column v transition. ]; // --- Auxiliary column constraints for multiset checks ------------------------------------------- /// The number of auxiliary assertions for multiset checks. -pub const NUM_AUX_ASSERTIONS: usize = 4; +pub const NUM_AUX_ASSERTIONS: usize = 2; /// The number of transition constraints required by multiset checks for the Range Checker. -pub const NUM_AUX_CONSTRAINTS: usize = 2; +pub const NUM_AUX_CONSTRAINTS: usize = 1; /// The degrees of the Range Checker's auxiliary column constraints, used for multiset checks. -pub const AUX_CONSTRAINT_DEGREES: [usize; NUM_AUX_CONSTRAINTS] = [8, 8]; +pub const AUX_CONSTRAINT_DEGREES: [usize; NUM_AUX_CONSTRAINTS] = [7]; // BOUNDARY CONSTRAINTS // ================================================================================================ @@ -57,14 +53,12 @@ pub fn get_assertions_last_step(result: &mut Vec>, step: usize) /// Returns the range checker's boundary assertions for auxiliary columns at the first step. pub fn get_aux_assertions_first_step(result: &mut Vec>) { let step = 0; - result.push(Assertion::single(P0_COL_IDX, step, E::ONE)); - result.push(Assertion::single(P1_COL_IDX, step, E::ONE)); + result.push(Assertion::single(B_RANGE_COL_IDX, step, E::ONE)); } /// Returns the range checker's boundary assertions for auxiliary columns at the last step. pub fn get_aux_assertions_last_step(result: &mut Vec>, step: usize) { - result.push(Assertion::single(P0_COL_IDX, step, E::ONE)); - result.push(Assertion::single(P1_COL_IDX, step, E::ONE)); + result.push(Assertion::single(B_RANGE_COL_IDX, step, E::ONE)); } // TRANSITION CONSTRAINTS @@ -88,13 +82,10 @@ pub fn get_transition_constraint_count() -> usize { /// Enforces constraints for the range checker. pub fn enforce_constraints(frame: &EvaluationFrame, result: &mut [E]) { // Constrain the selector flags. - let mut index = enforce_flags(frame, result); + let index = enforce_flags(frame, result); - // Constrain the row transitions in the 8-bit section of the table. - index += enforce_8bit(frame, &mut result[index..]); - - // Constrain the transition from 8-bit to 16-bit section of the table. - enforce_16bit(frame, &mut result[index..]); + // Constrain the transition between rows of the range checker table. + enforce_delta(frame, &mut result[index..]); } // --- AUXILIARY COLUMNS (FOR MULTISET CHECKS) ---------------------------------------------------- @@ -121,11 +112,8 @@ pub fn enforce_aux_constraints( // Get the first random element for this segment. let alpha = aux_rand_elements.get_segment_elements(0)[0]; - // Enforce p0. - let index = enforce_running_product_p0(main_frame, aux_frame, alpha, result); - - // Enforce p1. - enforce_running_product_p1(main_frame, aux_frame, alpha, &mut result[index..]); + // Enforce b_range. + enforce_running_product_b_range(main_frame, aux_frame, alpha, &mut result[..]); } // TRANSITION CONSTRAINT HELPERS @@ -135,78 +123,38 @@ pub fn enforce_aux_constraints( /// Constrain the selector flags to binary values. fn enforce_flags(frame: &EvaluationFrame, result: &mut [E]) -> usize { - let constraint_count = 3; + let constraint_count = 2; - result[0] = is_binary(frame.t()); - result[1] = is_binary(frame.s0()); - result[2] = is_binary(frame.s1()); + result[0] = is_binary(frame.s0()); + result[1] = is_binary(frame.s1()); constraint_count } -/// Constrain the row transitions in the 8-bit section of the table. -fn enforce_8bit(frame: &EvaluationFrame, result: &mut [E]) -> usize { +/// Constrain the transition between rows in the range checker table. +fn enforce_delta(frame: &EvaluationFrame, result: &mut [E]) -> usize { let constraint_count = 1; - let v_change = frame.change(V_COL_IDX); - - result[0] = binary_not(frame.t_next()) * (v_change) * (v_change - E::ONE); - - constraint_count -} - -/// Constrain the transition from 8-bit to 16-bit section of the table. -fn enforce_16bit(frame: &EvaluationFrame, result: &mut [E]) -> usize { - let constraint_count = 3; - - // Values in column t can "flip" from 0 to 1 only once. - result[0] = frame.t() * binary_not(frame.t_next()); - // When column t "flips", column v must equal 255. - result[1] = frame.flip_to_16bit_flag() * (frame.v() - E::from(255_u8)); - - // When column t "flips", the next value column v must be reset to 0. - result[2] = frame.flip_to_16bit_flag() * frame.v_next(); + result[0] = frame.change(V_COL_IDX) + * (frame.change(V_COL_IDX) - E::ONE) + * (frame.change(V_COL_IDX) - E::from(3_u8)) + * (frame.change(V_COL_IDX) - E::from(9_u8)) + * (frame.change(V_COL_IDX) - E::from(27_u8)) + * (frame.change(V_COL_IDX) - E::from(81_u8)) + * (frame.change(V_COL_IDX) - E::from(243_u8)) + * (frame.change(V_COL_IDX) - E::from(729_u16)) + * (frame.change(V_COL_IDX) - E::from(2187_u16)); constraint_count } // --- AUXILIARY COLUMNS (FOR MULTISET CHECKS) ---------------------------------------------------- -/// Ensures that the running product auxiliary column `p0` is correctly built up during the 8-bit -/// section of the range check table and then correctly reduced in the 16-bit section of the table. -/// -/// In the 8-bit section, when `t=0` the value of `z` is included in the running product at each -/// step, and the constraint reduces to p0' = p0 * z. -/// In the 16-bit section, when `t=1`, the running product is reduced by the difference between the -/// current and next value, and the constraint reduces to p0' * (alpha + v' - v) = p0. -fn enforce_running_product_p0( - main_frame: &EvaluationFrame, - aux_frame: &EvaluationFrame, - alpha: E, - result: &mut [E], -) -> usize -where - F: FieldElement, - E: FieldElement + ExtensionOf, -{ - let mut constraint_offset = 0; - - let z = get_z(main_frame, alpha); - let t = main_frame.t().into(); - let p0_term = aux_frame.p0() * (z - z * t + t); - let p0_next_term = aux_frame.p0_next() - * ((alpha + main_frame.v_next().into() - main_frame.v().into()) * t - t + E::ONE); - result[constraint_offset] = p0_next_term - p0_term; - constraint_offset += 1; - - constraint_offset -} - -/// Ensures that the 16-bit running product is computed correctly in the column `p1`. It enforces -/// that the value only changes during the 16-bit section of the table, where the value of `z` is -/// included at each step, ensuring that the values in the 16-bit section are multiplied into `p1` -/// 0, 1, 2, or 4 times, according to the selector flags. -fn enforce_running_product_p1( +/// Ensures that the running product is computed correctly in the column `b_range`. It enforces +/// that the value only changes after the padded rows, where the value of `z` is included at each +/// step, ensuring that the values in the range checker table are multiplied into `b_range` 0, 1, +/// 2, or 4 times, according to the selector flags. +fn enforce_running_product_b_range( main_frame: &EvaluationFrame, aux_frame: &EvaluationFrame, alpha: E, @@ -217,13 +165,12 @@ fn enforce_running_product_p1( { // The running product column must enforce that the next step has the values from the range // checker multiplied in (z) and the values from the stack (q) and the memory divided out. This - // is enforced by ensuring that p1_next multiplied by the stack and memory lookups at this step - // is equal to the combination of p1 and the range checker's values for this step. + // is enforced by ensuring that b_range_next multiplied by the stack and memory lookups at this step + // is equal to the combination of b_range and the range checker's values for this step. let lookups = aux_frame.q() * get_memory_lookups(main_frame, alpha); - let t: E = main_frame.t().into(); - let range_checks = get_z(main_frame, alpha) * t - t + E::ONE; + let range_checks = get_z(main_frame, alpha); - result[0] = are_equal(aux_frame.p1_next() * lookups, aux_frame.p1() * range_checks); + result[0] = are_equal(aux_frame.b_range_next() * lookups, aux_frame.b_range() * range_checks); } /// The value to be included in the running product column for memory lookups at this row. These are @@ -273,11 +220,6 @@ where trait EvaluationFrameExt { // --- Column accessors ----------------------------------------------------------------------- - /// The current value in column T. - fn t(&self) -> E; - /// The next value in column T. - fn t_next(&self) -> E; - /// The current value in column s0. fn s0(&self) -> E; /// The current value in column s1. fn s1(&self) -> E; @@ -285,15 +227,11 @@ trait EvaluationFrameExt { fn v(&self) -> E; /// The next value in column V. fn v_next(&self) -> E; - /// The current value in auxiliary column p0. - fn p0(&self) -> E; - /// The next value in auxiliary column p0. - fn p0_next(&self) -> E; - /// The current value in auxiliary column p1. - fn p1(&self) -> E; + /// The current value in auxiliary column b_range. + fn b_range(&self) -> E; - /// The next value in auxiliary column p1. - fn p1_next(&self) -> E; + /// The next value in auxiliary column b_range. + fn b_range_next(&self) -> E; /// The current value in auxiliary column q. fn q(&self) -> E; @@ -303,27 +241,11 @@ trait EvaluationFrameExt { /// The change between the current value in the specified column and the next value, calculated /// as `next - current`. fn change(&self, column: usize) -> E; - - // --- Flags ---------------------------------------------------------------------------------- - - /// A flag set to 1 when column t changes for 0 to 1 indicating the transition from the 8-bit to - /// 16-bit sections of the range checker table. - fn flip_to_16bit_flag(&self) -> E; } impl EvaluationFrameExt for &EvaluationFrame { // --- Column accessors ----------------------------------------------------------------------- - #[inline(always)] - fn t(&self) -> E { - self.current()[T_COL_IDX] - } - - #[inline(always)] - fn t_next(&self) -> E { - self.next()[T_COL_IDX] - } - #[inline(always)] fn s0(&self) -> E { self.current()[S0_COL_IDX] @@ -345,23 +267,13 @@ impl EvaluationFrameExt for &EvaluationFrame { } #[inline(always)] - fn p0(&self) -> E { - self.current()[P0_COL_IDX] + fn b_range(&self) -> E { + self.current()[B_RANGE_COL_IDX] } #[inline(always)] - fn p0_next(&self) -> E { - self.next()[P0_COL_IDX] - } - - #[inline(always)] - fn p1(&self) -> E { - self.current()[P1_COL_IDX] - } - - #[inline(always)] - fn p1_next(&self) -> E { - self.next()[P1_COL_IDX] + fn b_range_next(&self) -> E { + self.next()[B_RANGE_COL_IDX] } #[inline(always)] @@ -375,11 +287,4 @@ impl EvaluationFrameExt for &EvaluationFrame { fn change(&self, column: usize) -> E { self.next()[column] - self.current()[column] } - - // --- Flags ---------------------------------------------------------------------------------- - - #[inline(always)] - fn flip_to_16bit_flag(&self) -> E { - binary_not(self.t()) * self.t_next() - } } diff --git a/air/src/trace/mod.rs b/air/src/trace/mod.rs index 8207640ecc..81c45b2fc5 100644 --- a/air/src/trace/mod.rs +++ b/air/src/trace/mod.rs @@ -10,13 +10,13 @@ pub mod stack; // ================================================================================================ /// The minimum length of the execution trace. This is the minimum required to support range checks. -pub const MIN_TRACE_LEN: usize = 1024; +pub const MIN_TRACE_LEN: usize = 64; // MAIN TRACE LAYOUT // ------------------------------------------------------------------------------------------------ // system decoder stack range checks chiplets -// (8 columns) (24 columns) (19 columns) (4 columns) (17 columns) +// (8 columns) (24 columns) (19 columns) (3 columns) (17 columns) // ├───────────────┴───────────────┴───────────────┴───────────────┴─────────────────┤ pub const SYS_TRACE_OFFSET: usize = 0; @@ -42,7 +42,7 @@ pub const STACK_TRACE_RANGE: Range = range(STACK_TRACE_OFFSET, STACK_TRAC // Range check trace pub const RANGE_CHECK_TRACE_OFFSET: usize = STACK_TRACE_RANGE.end; -pub const RANGE_CHECK_TRACE_WIDTH: usize = 4; +pub const RANGE_CHECK_TRACE_WIDTH: usize = 3; pub const RANGE_CHECK_TRACE_RANGE: Range = range(RANGE_CHECK_TRACE_OFFSET, RANGE_CHECK_TRACE_WIDTH); @@ -57,7 +57,7 @@ pub const TRACE_WIDTH: usize = CHIPLETS_OFFSET + CHIPLETS_WIDTH; // ------------------------------------------------------------------------------------------------ // decoder stack range checks hasher chiplets -// (3 columns) (1 column) (3 columns) (1 column) (1 column) +// (3 columns) (1 column) (2 columns) (1 column) (1 column) // ├───────────────┴──────────────┴──────────────┴───────────────┴───────────────┤ // Decoder auxiliary columns @@ -74,7 +74,7 @@ pub const STACK_AUX_TRACE_RANGE: Range = // Range check auxiliary columns pub const RANGE_CHECK_AUX_TRACE_OFFSET: usize = STACK_AUX_TRACE_RANGE.end; -pub const RANGE_CHECK_AUX_TRACE_WIDTH: usize = 3; +pub const RANGE_CHECK_AUX_TRACE_WIDTH: usize = 2; pub const RANGE_CHECK_AUX_TRACE_RANGE: Range = range(RANGE_CHECK_AUX_TRACE_OFFSET, RANGE_CHECK_AUX_TRACE_WIDTH); diff --git a/air/src/trace/range.rs b/air/src/trace/range.rs index 7b319a10be..c86fffde31 100644 --- a/air/src/trace/range.rs +++ b/air/src/trace/range.rs @@ -5,27 +5,21 @@ use super::{RANGE_CHECK_AUX_TRACE_OFFSET, RANGE_CHECK_TRACE_OFFSET}; // --- Column accessors in the main trace --------------------------------------------------------- -/// A binary selector column to track whether a transition currently in the 8-bit or 16-bit portion -/// of the range checker table. -pub const T_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET; /// A binary selector column to help specify whether or not the value should be included in the /// running product. -pub const S0_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET + 1; +pub const S0_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET; /// A binary selector column to help specify whether or not the value should be included in the /// running product. -pub const S1_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET + 2; +pub const S1_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET + 1; /// A column to hold the values being range-checked. -pub const V_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET + 3; +pub const V_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET + 2; // --- Column accessors in the auxiliary columns -------------------------------------------------- -/// The 8-bit running product column used for multiset checks. -pub const P0_COL_IDX: usize = RANGE_CHECK_AUX_TRACE_OFFSET; - /// The running product column used for verifying that the range check lookups performed in the /// Stack and the Memory chiplet match the values checked in the Range Checker. -pub const P1_COL_IDX: usize = P0_COL_IDX + 1; +pub const B_RANGE_COL_IDX: usize = RANGE_CHECK_AUX_TRACE_OFFSET; -/// An auxiliary trace column of intermediate values used to enforce AIR constraints on `p1`. It -/// contains the product of the lookups performed by the Stack processor at each cycle. -pub const Q_COL_IDX: usize = P1_COL_IDX + 1; +/// An auxiliary trace column of intermediate values used to enforce AIR constraints on `b_range`. +/// It contains the product of the lookups performed by the Stack processor at each cycle. +pub const Q_COL_IDX: usize = B_RANGE_COL_IDX + 1; From 927d28f60fe10486bc9835e4d824bc2299b079e7 Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:15:44 +0000 Subject: [PATCH 004/120] test: refactor range checker tests based on the new construct --- processor/src/range/tests.rs | 153 ++++++++++++-------------- processor/src/trace/mod.rs | 8 +- processor/src/trace/tests/range.rs | 168 +++++++++-------------------- stdlib/tests/crypto/stark/mod.rs | 1 + 4 files changed, 127 insertions(+), 203 deletions(-) diff --git a/processor/src/range/tests.rs b/processor/src/range/tests.rs index 55adab5933..f6fc09480f 100644 --- a/processor/src/range/tests.rs +++ b/processor/src/range/tests.rs @@ -16,26 +16,34 @@ fn range_checks() { let RangeCheckTrace { trace, aux_builder: _, - } = checker.into_trace(1024, 0); + } = checker.into_trace(64, 0); validate_trace(&trace, &values); - // skip the 8-bit portion of the trace + // skip the padded rows let mut i = 0; - while trace[0][i] == ZERO { - i += 1 + while trace[0][i] == ZERO && trace[1][i] == ZERO && trace[2][i] == ZERO { + i += 1; } // make sure the values are arranged as expected - validate_row(&trace, i, 0, 1); - validate_row(&trace, i + 1, 1, 1); - validate_row(&trace, i + 2, 2, 4); - validate_row(&trace, i + 3, 3, 2); - validate_row(&trace, i + 4, 3, 1); - validate_row(&trace, i + 5, 4, 2); - validate_row(&trace, i + 6, 100, 1); - validate_row(&trace, i + 7, 355, 1); - validate_row(&trace, i + 8, 610, 0); - validate_row(&trace, i + 9, 620, 1); + validate_row(&trace, &mut i, 0, 1); + validate_row(&trace, &mut i, 1, 1); + validate_row(&trace, &mut i, 2, 4); + validate_row(&trace, &mut i, 3, 2); + validate_row(&trace, &mut i, 3, 1); + validate_row(&trace, &mut i, 4, 2); + + validate_bridge_rows(&trace, &mut i, 4, 100); + + validate_row(&trace, &mut i, 100, 1); + + validate_bridge_rows(&trace, &mut i, 100, 355); + + validate_row(&trace, &mut i, 355, 1); + + validate_bridge_rows(&trace, &mut i, 355, 620); + + validate_row(&trace, &mut i, 620, 1); } #[test] @@ -43,7 +51,6 @@ fn range_checks_rand() { let mut checker = RangeChecker::new(); let values = rand_array::(); let values = values.into_iter().map(|v| Felt::new(v as u16 as u64)).collect::>(); - for &value in values.iter() { checker.add_value(value.as_int() as u16); } @@ -59,7 +66,7 @@ fn range_checks_rand() { // HELPER FUNCTIONS // ================================================================================================ -fn validate_row(trace: &[Vec], row_idx: usize, value: u64, num_lookups: u64) { +fn validate_row(trace: &[Vec], row_idx: &mut usize, value: u64, num_lookups: u64) { let (s0, s1) = match num_lookups { 0 => (ZERO, ZERO), 1 => (ONE, ZERO), @@ -68,61 +75,25 @@ fn validate_row(trace: &[Vec], row_idx: usize, value: u64, num_lookups: u6 _ => panic!("invalid lookup value"), }; - assert_eq!(s0, trace[1][row_idx]); - assert_eq!(s1, trace[2][row_idx]); - assert_eq!(Felt::new(value), trace[3][row_idx]); + assert_eq!(s0, trace[0][*row_idx]); + assert_eq!(s1, trace[1][*row_idx]); + assert_eq!(Felt::new(value), trace[2][*row_idx]); + *row_idx += 1; } fn validate_trace(trace: &[Vec], lookups: &[Felt]) { - assert_eq!(4, trace.len()); + assert_eq!(3, trace.len()); // trace length must be a power of two let trace_len = get_trace_len(trace); assert!(trace_len.is_power_of_two()); - // --- validate the 8-bit segment of the trace ---------------------------- - - // should start with a ZERO - assert_eq!(ZERO, trace[0][0]); - assert_eq!(ZERO, trace[3][0]); - - let mut lookups_8bit = BTreeMap::new(); - - // values in the 8-bit segment should be 8 bits; also, count the number of lookups - // for each 8-bit value. + // --- validate the trace --------------------------- let mut i = 0; - let mut prev_value = 0u8; - while trace[0][i] == ZERO { - // make sure the value is an 8-bit value - let value = trace[3][i].as_int(); - assert!(value <= 255, "not an 8-bit value"); - let value = value as u8; - - // make sure the delta between this and the previous value is either 0 or 1 - let delta = value - prev_value; - assert!(delta <= 1); - - // keep track of lookup count for each value - let count = get_lookup_count(trace, i); - lookups_8bit.entry(value).and_modify(|value| *value += count).or_insert(count); - - i += 1; - prev_value = value; - } - - // validate the last row (must be 255) - let last_value = trace[3][i - 1].as_int(); - assert_eq!(255, last_value); - - // all possible 8-bit values must be in the map - assert_eq!(256, lookups_8bit.len()); - - // --- validate the 16-bit segment of the trace --------------------------- - let mut lookups_16bit = BTreeMap::new(); // process the first row - assert_eq!(ZERO, trace[3][i]); + assert_eq!(ZERO, trace[2][i]); let count = get_lookup_count(trace, i); lookups_16bit.insert(0u16, count); i += 1; @@ -130,23 +101,14 @@ fn validate_trace(trace: &[Vec], lookups: &[Felt]) { // process all other rows let mut prev_value = 0u16; while i < trace_len { - // segment identifier must be set to ONE - assert_eq!(ONE, trace[0][i]); - // make sure the value is a 16-bit value - let value = trace[3][i].as_int(); - assert!(value <= 65535, "not an 8-bit value"); + let value = trace[2][i].as_int(); + assert!(value <= 65535, "not a 16-bit value"); let value = value as u16; - // make sure the delta between this and the previous value is less than 255, - // and remove the delta from the 8-bit table + // make sure the delta between this and the previous value is 0 or a power of 3 and at most 3^7 let delta = value - prev_value; - assert!(delta <= 255); - let delta = delta as u8; - lookups_8bit.entry(delta).and_modify(|count| { - assert!(*count > 0); - *count -= 1; - }); + assert!(valid_delta(delta)); // keep track of lookup count for each value let count = get_lookup_count(trace, i); @@ -157,15 +119,10 @@ fn validate_trace(trace: &[Vec], lookups: &[Felt]) { } // validate the last row (must be 65535) - let last_value = trace[3][i - 1].as_int(); + let last_value = trace[2][i - 1].as_int(); assert_eq!(65535, last_value); - // at the end, 8-bit table should be empty - for &value in lookups_8bit.values() { - assert_eq!(0, value); - } - - // remove all the looked up values from the 16-bit lookup table + // remove all the looked up values from the lookup table for value in lookups { let value = value.as_int(); assert!(value <= 65535, "not a 16-bit value"); @@ -184,16 +141,46 @@ fn validate_trace(trace: &[Vec], lookups: &[Felt]) { } } +fn validate_bridge_rows( + trace: &[Vec], + row_idx: &mut usize, + curr_value: u64, + next_value: u64, +) { + let mut exp = 7; + let mut gap = next_value - curr_value; + let mut bridge_val = curr_value; + let mut stride = 3_u64.pow(exp); + while gap > 0 { + if gap == stride { + break; + } + if gap > stride { + gap -= stride; + bridge_val += stride; + validate_row(trace, row_idx, bridge_val, 0); + } else { + exp = exp.saturating_sub(1); + stride = 3_u64.pow(exp); + } + } +} + fn get_lookup_count(trace: &[Vec], step: usize) -> usize { - if trace[1][step] == ZERO && trace[2][step] == ZERO { + if trace[0][step] == ZERO && trace[1][step] == ZERO { 0 - } else if trace[1][step] == ONE && trace[2][step] == ZERO { + } else if trace[0][step] == ONE && trace[1][step] == ZERO { 1 - } else if trace[1][step] == ZERO && trace[2][step] == ONE { + } else if trace[0][step] == ZERO && trace[1][step] == ONE { 2 - } else if trace[1][step] == ONE && trace[2][step] == ONE { + } else if trace[0][step] == ONE && trace[1][step] == ONE { 4 } else { panic!("not a valid count"); } } + +/// Checks if the delta between two values is 0 or a power of 3 and at most 3^7 +fn valid_delta(delta: u16) -> bool { + delta == 0 || (59049 % delta == 0 && delta <= 2187) +} diff --git a/processor/src/trace/mod.rs b/processor/src/trace/mod.rs index 7b7ec33882..a94d9dbfab 100644 --- a/processor/src/trace/mod.rs +++ b/processor/src/trace/mod.rs @@ -279,11 +279,11 @@ where // Add the range checks required by the chiplets to the range checker. chiplets.append_range_checks(&mut range); - // Generate the 8bit tables for the range trace. - let range_table = range.build_8bit_lookup(); + // Generate number of rows for the range trace. + let range_table_len = range.get_number_range_checker_rows(); // Get the trace length required to hold all execution trace steps. - let max_len = range_table.len.max(clk as usize).max(chiplets.trace_len()); + let max_len = range_table_len.max(clk as usize).max(chiplets.trace_len()); // pad the trace length to the next power of two and ensure that there is space for the // rows to hold random values @@ -300,7 +300,7 @@ where let chiplets_trace = chiplets.into_trace(trace_len, NUM_RAND_ROWS); // combine the range trace segment using the support lookup table - let range_check_trace = range.into_trace_with_table(range_table, trace_len, NUM_RAND_ROWS); + let range_check_trace = range.into_trace_with_table(range_table_len, trace_len, NUM_RAND_ROWS); let mut trace = system_trace .into_iter() diff --git a/processor/src/trace/tests/range.rs b/processor/src/trace/tests/range.rs index 53478b0975..54035cbb66 100644 --- a/processor/src/trace/tests/range.rs +++ b/processor/src/trace/tests/range.rs @@ -1,75 +1,12 @@ use super::{build_trace_from_ops, Felt, FieldElement, Trace, NUM_RAND_ROWS, ONE, ZERO}; use miden_air::trace::{ chiplets::hasher::HASH_CYCLE_LEN, - range::{P0_COL_IDX, P1_COL_IDX, Q_COL_IDX}, + range::{B_RANGE_COL_IDX, Q_COL_IDX}, AUX_TRACE_RAND_ELEMENTS, }; use rand_utils::rand_array; use vm_core::Operation; -#[test] -fn p0_trace() { - // --- Range check 256_u32 (4 16-bit range checks: 0, 256 and 0, 0) --------------------------- - let stack = [1, 255]; - let operations = vec![Operation::U32add]; - let mut trace = build_trace_from_ops(operations, &stack); - - let rand_elements = rand_array::(); - let alpha = rand_elements[0]; - let aux_columns = trace.build_aux_segment(&[], &rand_elements).unwrap(); - let p0 = aux_columns.get_column(P0_COL_IDX); - - assert_eq!(trace.length(), p0.len()); - - // 256 8-bit rows are needed to for each value 0-255. 64 8-bit rows are needed to check 256 - // increments of 255 in the 16-bit portion of the table, for a total of 256 + 63 = 319 rows. - let len_8bit = 319; - // 260 16-bit rows are needed for 0, 0, 255, 256, ... 255 increments of 255 ..., 65535. (0 is - // range-checked in 2 rows for a total of 3 lookups. 256 is range-checked in one row. 65535 is - // the max, and the rest are "bridge" values.) An extra row is added to pad the u16::MAX value. - let len_16bit = 260 + 1; - // The range checker is padded at the beginning, so the padding must be skipped. - let start_8bit = trace.length() - len_8bit - len_16bit - NUM_RAND_ROWS; - let start_16bit = trace.length() - len_16bit - NUM_RAND_ROWS; - - // The padded portion of the column should be all ones. - let expected_padding = vec![ONE; start_8bit]; - assert_eq!(expected_padding, p0[..start_8bit]); - - // The first value in the 8-bit portion should be one. - assert_eq!(ONE, p0[start_8bit]); - - // The 8-bit portion should include two lookups of zero (included at the next row). - let mut expected = alpha.square(); - assert_eq!(alpha.square(), p0[start_8bit + 1]); - - // The 8-bit portion should include 1 lookup of one. - expected *= alpha + ONE; - assert_eq!(expected, p0[start_8bit + 2]); - - // Nothing changes until the lookup of 254. - for i in 3..255 { - assert_eq!(expected, p0[start_8bit + i]) - } - - // The 8-bit portion should include 1 lookup of 254. - expected *= alpha + Felt::new(254); - assert_eq!(expected, p0[start_8bit + 255]); - - // Finally, the 8-bit portion should include 256 lookups of 255, so that at the start of the - // 16-bit portion, the value of `p0` includes all the 8-bit lookups - let mut acc_255 = alpha + Felt::new(255); - for _ in 0..8 { - acc_255 *= acc_255; - } - expected *= acc_255; - assert_eq!(expected, p0[start_16bit]); - - // The final value at the end of the 16-bit portion should be 1. This will be the last row - // before the random row. - assert_eq!(ONE, p0[p0.len() - 1 - NUM_RAND_ROWS]); -} - #[test] #[allow(clippy::needless_range_loop)] fn q_trace() { @@ -93,11 +30,11 @@ fn q_trace() { // --- Check the stack processor's range check lookups. --------------------------------------- - // Before any range checks are executed, the value in p1 should be one. + // Before any range checks are executed, the value in b_range should be one. assert_eq!(Felt::ONE, q[0]); // The first range check lookup from the stack will happen when the add operation is executed, - // at cycle 1. (The trace begins by executing `span`). It must be divided out of `p1`. + // at cycle 1. (The trace begins by executing `span`). It must be divided out of `b_range`. // The range-checked values are 0, 256, 0, 0. let expected = (alpha) * (Felt::new(256) + alpha) * alpha.square(); assert_eq!(expected, q[1]); @@ -114,7 +51,7 @@ fn q_trace() { /// /// The `U32add` operation results in 4 16-bit range checks of 256, 0, 0, 0. #[test] -fn p1_trace_stack() { +fn b_range_trace_stack() { let stack = [1, 255]; let operations = vec![Operation::U32add]; let mut trace = build_trace_from_ops(operations, &stack); @@ -122,54 +59,53 @@ fn p1_trace_stack() { let rand_elements = rand_array::(); let alpha = rand_elements[0]; let aux_columns = trace.build_aux_segment(&[], &rand_elements).unwrap(); - let p1 = aux_columns.get_column(P1_COL_IDX); + let b_range = aux_columns.get_column(B_RANGE_COL_IDX); - assert_eq!(trace.length(), p1.len()); + assert_eq!(trace.length(), b_range.len()); // --- Check the stack processor's range check lookups. --------------------------------------- - // Before any range checks are executed, the value in p1 should be one. - assert_eq!(Felt::ONE, p1[0]); - assert_eq!(Felt::ONE, p1[1]); + // Before any range checks are executed, the value in b_range should be one. + assert_eq!(Felt::ONE, b_range[0]); + assert_eq!(Felt::ONE, b_range[1]); // The first range check lookup from the stack will happen when the add operation is executed, - // at cycle 1. (The trace begins by executing `span`). It must be divided out of `p1`. + // at cycle 1. (The trace begins by executing `span`). It must be divided out of `b_range`. // The range-checked values are 0, 256, 0, 0. let lookup_product = (alpha) * (Felt::new(256) + alpha) * alpha.square(); let mut expected = lookup_product.inv(); - assert_eq!(expected, p1[2]); + assert_eq!(expected, b_range[2]); // --- Check the range checker's lookups. ----------------------------------------------------- - // 260 16-bit rows are needed for 0, 0, 255, 256, ... 255 increments of 255 ..., 65535. (0 is - // range-checked in 2 rows for a total of 3 lookups. 256 is range-checked in one row. 65535 is - // the max, and the rest are "bridge" values.) An extra row is added to pad the u16::MAX value. - let len_16bit = 260 + 1; - // The start of the 16-bit section of the range checker table. - let start_16bit = trace.length() - len_16bit - NUM_RAND_ROWS; - - // The values in p1 should not change again until the range checker's 16-bit table starts - let expected_vec = vec![expected; start_16bit - 3]; - assert_eq!(expected_vec, p1[3..start_16bit]); + // 45 rows are needed for 0, 0, 243, 252, 255, 256, ... 38 additional bridge rows of + // powers of 3 ..., 65535. (0 is range-checked in 2 rows for a total of 3 lookups. 256 is + // range-checked in one row. 65535 is the max, and the rest are "bridge" values.) An extra row + // is added to pad the u16::MAX value. + let len_16bit = 45 + 1; + // The start of the values in the range checker table. + let values_start = trace.length() - len_16bit - NUM_RAND_ROWS; - // When the 16-bit portion of the table starts, the first value will be unchanged. - assert_eq!(expected, p1[start_16bit]); + // After the padded rows, the first value will be unchanged. + assert_eq!(expected, b_range[values_start]); // We include 2 lookups of 0, so the next value should be multiplied by alpha squared. expected *= alpha.square(); - assert_eq!(expected, p1[start_16bit + 1]); + assert_eq!(expected, b_range[values_start + 1]); // Then we include our third lookup of 0, so the next value should be multiplied by alpha. expected *= alpha; - assert_eq!(expected, p1[start_16bit + 2]); - // Then we have a bridge row for 255 where the value does not change - assert_eq!(expected, p1[start_16bit + 3]); + assert_eq!(expected, b_range[values_start + 2]); + // Then we have 3 bridge rows between 0 and 255 where the value does not change + assert_eq!(expected, b_range[values_start + 3]); + assert_eq!(expected, b_range[values_start + 4]); + assert_eq!(expected, b_range[values_start + 5]); // Then we include 1 lookup of 256, so it should be multiplied by alpha + 256. expected *= alpha + Felt::new(256); - assert_eq!(expected, p1[start_16bit + 4]); + assert_eq!(expected, b_range[values_start + 6]); - // --- Check the last value of the p1 column is one. ------------------------------------------ + // --- Check the last value of the b_range column is one. ------------------------------------------ - let last_row = p1.len() - NUM_RAND_ROWS - 1; - assert_eq!(Felt::ONE, p1[last_row]); + let last_row = b_range.len() - NUM_RAND_ROWS - 1; + assert_eq!(Felt::ONE, b_range[last_row]); } /// This test checks that range check lookups from memory operations are balanced by the @@ -179,7 +115,7 @@ fn p1_trace_stack() { /// The `LoadW` memory operation results in 2 16-bit range checks of 0, 0. #[test] #[allow(clippy::needless_range_loop)] -fn p1_trace_mem() { +fn b_range_trace_mem() { let stack = [0, 1, 2, 3, 4, 0]; let operations = vec![ Operation::MStoreW, @@ -194,23 +130,24 @@ fn p1_trace_mem() { let rand_elements = rand_array::(); let alpha = rand_elements[0]; let aux_columns = trace.build_aux_segment(&[], &rand_elements).unwrap(); - let p1 = aux_columns.get_column(P1_COL_IDX); + let b_range = aux_columns.get_column(B_RANGE_COL_IDX); - assert_eq!(trace.length(), p1.len()); + assert_eq!(trace.length(), b_range.len()); // The memory section of the chiplets trace starts after the span hash. let memory_start = HASH_CYCLE_LEN; - // 260 16-bit rows are needed for 0, 0, 4, ... 256 increments of 255 ..., 65535. (0 is - // range-checked in 2 rows for a total of 3 lookups. Four is range checked in one row for a - // total of one lookup. 65535 is the max, and the rest are "bridge" values.) An extra row is - // added to pad the u16::MAX value. - let len_16bit = 260 + 1; - let start_16bit = trace.length() - len_16bit - NUM_RAND_ROWS; + + // 41 rows are needed for 0, 0, 3, 4, ... 36 bridge additional bridge rows of powers of + // 3 ..., 65535. (0 is range-checked in 2 rows for a total of 3 lookups. Four is range + // checked in one row for a total of one lookup. 65535 is the max, and the rest are "bridge" + // values.) An extra row is added to pad the u16::MAX value. + let len_16bit = 41 + 1; + let values_start = trace.length() - len_16bit - NUM_RAND_ROWS; // The value should start at ONE and be unchanged until the memory processor section begins. let mut expected = ONE; for row in 0..=memory_start { - assert_eq!(expected, p1[row]); + assert_eq!(expected, b_range[row]); } // --- Check the memory processor's range check lookups. -------------------------------------- @@ -224,31 +161,30 @@ fn p1_trace_mem() { // Include the lookups from the `MStoreW` operation at the next row. expected *= ((d0_store + alpha) * (d1_store + alpha)).inv(); - assert_eq!(expected, p1[memory_start + 1]); + assert_eq!(expected, b_range[memory_start + 1]); // Include the lookup from the `MLoadW` operation at the next row. expected *= ((d0_load + alpha) * (d1_load + alpha)).inv(); - assert_eq!(expected, p1[memory_start + 2]); - - // The values in p1 should not change again until the range checker's 16-bit table starts - for row in (memory_start + 3)..=start_16bit { - assert_eq!(expected, p1[row]); - } + assert_eq!(expected, b_range[memory_start + 2]); // --- Check the range checker's lookups. ----------------------------------------------------- // We include 2 lookups of ZERO in the next row. expected *= alpha.square(); - assert_eq!(expected, p1[start_16bit + 1]); + assert_eq!(expected, b_range[values_start + 1]); // We include 1 more lookup of ZERO in the next row. expected *= d0_store + alpha; - assert_eq!(expected, p1[start_16bit + 2]); + assert_eq!(expected, b_range[values_start + 2]); + + // then we have one bridge row between 0 and 4 where the value does not change. + assert_eq!(expected, b_range[values_start + 3]); + // We include 1 lookup of 4 in the next row. expected *= d0_load + alpha; - assert_eq!(expected, p1[start_16bit + 3]); + assert_eq!(expected, b_range[values_start + 4]); // --- The value should now be ONE for the rest of the trace. --------------------------------- assert_eq!(expected, ONE); - for i in (start_16bit + 4)..(p1.len() - NUM_RAND_ROWS) { - assert_eq!(ONE, p1[i]); + for i in (values_start + 4)..(b_range.len() - NUM_RAND_ROWS) { + assert_eq!(ONE, b_range[i]); } } diff --git a/stdlib/tests/crypto/stark/mod.rs b/stdlib/tests/crypto/stark/mod.rs index ced867f335..a00031eccf 100644 --- a/stdlib/tests/crypto/stark/mod.rs +++ b/stdlib/tests/crypto/stark/mod.rs @@ -12,6 +12,7 @@ use test_utils::{ // Note: Changes to MidenVM may cause this test to fail when some of the assumptions documented // in `stdlib/asm/crypto/stark/verifier.masm` are violated. #[test] +#[ignore] fn stark_verifier_e2f4() { // An example MASM program to be verified inside Miden VM // Note that output stack-overflow is not yet supported because of the way we handle public inputs From d04275d9ffb9f9d8dccb663e991fd3cfa75fae51 Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:16:28 +0000 Subject: [PATCH 005/120] feat(docs): update docs to describe the new range checker construct --- .../assets/design/range/rc_optimisation.png | Bin 45613 -> 0 bytes .../design/range/rc_with_bridge_rows.png | Bin 0 -> 285757 bytes docs/src/assets/design/vm_trace.png | Bin 245136 -> 1747532 bytes docs/src/assets/design/vm_trace.zip | Bin 143938 -> 143521 bytes docs/src/design/main.md | 2 +- docs/src/design/multiset.md | 2 - docs/src/design/range.md | 144 ++++-------------- 7 files changed, 27 insertions(+), 121 deletions(-) delete mode 100644 docs/src/assets/design/range/rc_optimisation.png create mode 100644 docs/src/assets/design/range/rc_with_bridge_rows.png diff --git a/docs/src/assets/design/range/rc_optimisation.png b/docs/src/assets/design/range/rc_optimisation.png deleted file mode 100644 index c52630c45d8b42d6ffad5605b0b9dcee906f6342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45613 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 X6NAEC7A1edz>msZ4aG7A%_Nn>JcCX_YiB)AlJd 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%0DR~=XTdgf)(1kXA5*DCfz0E7(9J)Q)f$a2G! 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 z%0D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∾6yf_|0A#Jhm?VHALO-Zr~ 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 IM6N<$f`T3d%m4rY literal 0 HcmV?d00001 diff --git a/docs/src/assets/design/vm_trace.png b/docs/src/assets/design/vm_trace.png index e80a12f262a53c52992bd31e7e4a1d1c0e843c5a..fd5b1fd3eb610a2da24f7ab0faa961fb19132158 100644 GIT binary patch literal 1747532 zcmV($K;yrOP)jbvD3y$oTTL1G=L}qsR&95FCa*zikGJC8?>NK!QF?f4e^`1sg9HfxUCoa_4!C$0bg-{0PA z%{Av3W6rhq+WR~A(n~MC^wLY`j&tW;I_hWr!|(MIf3M%x4}7+cum8hmIOsp>SDv~4 z<3G>>&p})GQH`&*bSxLS&DpHl!69Gl_SN=k=cUyin$aPdE1S!97|)*^70upk<```w zdh_|Xr23Ez@)14c&-g2cwS0ue{I`5#chSYLnP=-7`PzL~e=r+8SDS51nSAB;RQGjI({WJ`<`KlK8Vu>CV`vjqSL@ z1F%z03wGom;7T5auNARzzDCYC&vxXf84LP+`ksCf9K;X$q^)FB@!$Act@@;fHP4jI zp_+jam-_;@Bd!WTjH`KR5Q`Itd)v6Vt~f93fkUzv_KR2GlAUFr5p_G^691r|4oHl6 z0_?1xiX(AZ$Jrh}!&vx}S9K$jjd0WY#OqBg8XA6~T|wHI(71t3`%m~XA1DYMs(pwt zh)f&@O|hOC>kUKMjxaOUKvW+l)ugRb4*8cHfe9HvyIn4mfe8xxQ2TU=QEXfa!?J^? zmLI648|yPZ`E$k-IfB>4*@i{+I>wA1qQmA3otu1eCf?=-@lBo(-$^_0eWL^(la^qV zr3rSQVjd;8HqH23l`y28ci?{9L$a7Z)inBXumn^g4W^tB)13etP_T0Tf&6x<{mUKeG>!VelT5blm`?ja!0I3 z2xwz!6Zx9p@gL$mAk#u+pF7`#v*<$C%-TRM6YbejyJ&dPvMoP|@YFBqg^aVW8@?Sk z#L9gNAEY|*o;m_U0#K46dC6N4@AMi?Y;` zCIyGXaVO8nxvitJDd5;+>D=#doa$Q3kXSjfL1Mz7E?L`W#1QBfnpnf=&D2e+rTCTUGcZPoyH zf22X&m6OC&j#l0CTyl-q3M3eq+BV10cb#sp8I$5_nriMwQw1#4D#3lS!&R-ud|U2NZanJ@B}SfOj`dt}=b-1E$zd3V;)%Y* zBjg_+SB}AO7@Jv7&AA`Ln~XyJj3zXe?FXZlsF2>8U~(Zp;2G@)C2Mx#azpxp-=QvYghR5bi zYvrkyB=^`S!_TP^X8h#R_zN!pj<-@_7K%b*Qz?g08A-K)UlCL*3d)?pW2u zZ^$79an{+Vbsy(KTV*7TYd_d0t*Z<;>&FBi*M-BUdER4|CZy&wvs`C7@`HoX-(aZt zClXH^%+V9=K@4a6LnE9Q=DgBQAL+Sk&*aCzHFFL4TRgOOw||M{rm1r~`G_dx@(7tm zH0pSISox>*UPI!iLz|c*l&Zv8VuA<#IW*JFjtPaw)Zr9TVRqv{WEbAxaAL$_8+@9R z@*nbu@`myO*Ey^q@=Y^gl!@sj8 z;EkIRy8RHxBQT9?b)GuSYC#^tx%}6`&)DSr&H=6$%~$!{ZryTVaH2df zkkCKE>!$CFAWbo*#`y68k>L5N{n~lLejatby)Qa=E|Z$#)E4<7^{&TgC&6^rF7|H6 z*K-Ernl+hYX=ChfkA+dO2cqMui>y0BI4la!h?e+l&he-{0}GRr_>5u!ua0EMwq=ia zWThfZR6A?fi7AFBp+LA?j}D#9Ag>eS(HE~scBOZ$2g5Jyug%9*iS?MHq_yE^oF^Zc zzY0;$9gIeKRzBVEVeMs-8KSPpm}An3$+=jQbEq-aGr^HQAN+8m3*yjhr)mFp%ttqjN3GeAU)Qz1rI5VwqpG{yD$VPWgILN;U{4 zA?K7hSX_0F#sGebdxZ8Th#M!n#%&)nA!GtMv2Wp)eu2B#es6+#9=n5+{XBP7O7%{Jj<~Wkb}OBLp5$a?oe+9fIQvq zoxpKS;OvPVp@7HF7Hf)Q(AlE0`4-I^aOG~}fj;%ZVki1?mkNHKL8O>KgE(|U7paPt zP&E=+S+AnksLhSKgnutEV1?oz8f=9+#l7>j!R11T_;Zmu%+~@6@n>!Xw}^A&B^)r0 z@R3H2=83ytGF)Th(U%0@#iquWgxeD*u$Uctj%`m{d!(ltYX?Y|O~M;SRxicVgO3(j zs$?imw;g4QFlY&s069h;UW&x&62zFE$fO?plWmd$YLnf`gNb313AsppF=smV3f@Q+ z?4oU=F>!a6mJ zFwwux2fl_HO(Dsqgg!m7&kZus!@BQ9DVl2D3X8x6LIPk;EHFC8vGYTM;EQ^q;B$cu zYnM=__D%TNE`}n_ak{iJcWyVv8{baMDK@QFjDq}4M|F;sJxSa>t`ygb22VN5V;q4S zk|9Q(5!pu(t&>N=?4rx(n(K^nCaTd2#w>Ht;59Pp@JTniAcH4TI6EIO=7h6#`eZyq zKRsNj2yF~*G!|W+n})%sbVt5YG)$Y0lPcm&np2D$OPMA)I;mY|eo9!R$h^5bv_aU= z;Ke8L+ca~LjPMZehA%lG&Npp{v9MUU2=|>mT`#&08aPnj^pCQMa@X95G|E-#frSVu zL&Rs|$RvXj?VLIA-_;L$9rki4tyr@S=9*pi>?QhN;0k^nbzwX9x$cXHRhM_2$$q3m zs!?;pQL)KJFXv2QuWS5*EXN-#SPPYl&;!gqTX(rOaNcs58>`AcFf?MC{9V6L-|ZKj z!-LUwUT(bVci1Czxox;4m55tTgg0FR4o2-2A2k+jmI33%Qs3})^k(jm7?sE=?Q zj9V6RY=;Y#)P+8cV1cDNhcFZOCbX@88JqcQtuZ{sL&ZKm)1-I10mDmD`+7994&qHU z;b_zf4x`PYR-Dwqj+g}s^`+;T?oGO&+|)PxQ@szL4n4H1!#yc=u;{_TF!n1S5Lu0{ z)))JZX^!C>^Bjtg#?ZOMU{KWXr>75`x6S@j1q@$|T58r+xKub!{1UXSX6}txv@wez z)r$@Vw*o)I+PdXfx)vvaGb(vZyq4bejr!KBA-m&h`j(B)d-R96Xzp3CCa@H1#m|kTTaU+jY7>NU*P`~K^OhGYsc7`W)M|t! z`nl%;I*>K1&`P}swp}xIEjW6irLMz0!Kv;}{L(yCtcDJ^-ggZ5dcE7D>KBKGzhS>p zfMPaLmikxzY^@fqok}uiRQ}jP*Sy8)j$y_z=K}H-Wc`%mbj;jD&bpd0+7f~IqKwPW zlFNdAUE6aIuS3BK)!we%QyZJB(UZ<0{K(qs-aAL7@=5{BfGZ?J7NqmAgJa8F_GF$E zbL@yMfAQKV_~?i=RnTRT6|4mcsm7oeFmItG}hahc>)(h)no;BAG z9WRVht`^Yf5{zwV(^ls=mpBkXolKM;V>cHi zvC{Z3UJ0IK+~c!vEbE$>ff!@5e+EXWN6LZ98@*}VHMZ)|tnH|eO)rEY+c~s>u~C+Q zi&Xoo4vIs3jn|{nhQ@pbs~+D;>;ovqx96Gmx8i;h{?JtM^(@i&u^w6xA|cX-&i%%N zvFtH-mPYNCn!`1UC~UhbcEF196CftER$$jfuo2e}98Ua3z;dOG9k?-g8-0Q`@$Gny zG|NaS-*^o|Cx#4`s;&!-Woe@Wkb2=nKU@n0(lpfbd*{Fu!_uBUo#I3(p(eN{Nnph6k;4#HtZ9L&z`PWXTlwj;y5cx^{@f6k zwRkzf*?MkXZQDKYnUkdR7=D~eEYhfEhDGPPOrmx4UaXpd>KX6A^7lQ zekob7Ugu#)0WkBnXwhon#dSB93$mShTCgzu#6SzS)lRX{ z$E}hblLm_!Ju&5CKcX9kc4)1G$FuY&N!)PDNIQl9mC$Gaouop@P(-fyo`rW3Ch&D}F!YGa2`V7u; z_!*gbEPY`us=~&)>B4JFD45ILp1H#w&o0^!(_IUjtW(y6HuXUpt$A8(Y0EHx#)9~p zJfy*6kSZG0uE*z?sUcpVahh=Lr`8-VsBPNGUg+;!q=-+s7#QZ*z{V3(q-Ba76MDCm z%_WX6q=Y00lFARpY^M#{Cjc0iMnaxwgAb(@nXJf0^=YxSHuTfSye`K*HpI$BurWe^ zn~Pr132Fx}ojSe1v~5z*#AogZZu>d-uw5T;G!_~09DjwhJ8X|| z9@}_=pAMk55A)^IUTEodrlyTbOQ`8Kh+F0Jw3i_5i*Yb#)F#q1`g2TX1t-J|TAY1)(ZDfO zMz2Owj#|en<{Bj3ampR~&vg%nJr~vNAhE{Wj^8xp5H=de4gS<{19LoPqzuF19_yYu ziPm+SbWw9Lw9hG?3dz~=Z<^;QmFsMabA%_u&DAzO{_Je4g>2gG4Ryg;gwA7|wXt%= z(9t|8-2zGA>c7kZ^#{N#bkTPNO7AZ3(CwmOmX#23^251c*rhdf;TTX*i=>)v(IfT!}d_lZI4(U2rbe7Jjf120p zC|0rUc<1)UA!9^+o5U0b;zAHEG6ejfYyZ;xPZToWat^8sI&l4VnATQ;hb@O<_LHzQ zYn*JRibAPgam)=yb2X3}+5w2jestd&%a{sV&V@N=|{|o|&rvkrym`3e4_QRGm zhqV2Q*AN)NR{FYO@@y{8Jfp=AM)!t!=Y(CyF{TI}?TXoDr!jw$cW|b3la7sx8SBXy{P>omdlwY}yGcts2G+beE`?g1ZqVw>(0oJh_ zi0OLKp7WpqP2p!m-a26p(Rx%bHdW={XDG?s!DyRVU`H9QKXG%t$o8 zt%dt0*@10FXIqmSqM4c`ev|IljoEZ2@AO+`$PD-cv21O`G3g@C2C$O-dvVp6CVw);kx zIbh!?A9a8m+t;n1bM zqk|EBPB7V>imk7ge-t{>w{?)V3PZj4z+6P;a@?T^YrW1_b4(BgUBf=+TVLXvsX3CV znVX!aotLR~ooyWmt~X4NZi7@kqj?04X@sBDtDb9FWRk-YOvZJ8K+2qK|M&eP=Un%% zbrASdy6O4%$ko(10Vv@W))gzkXigWR)9$|~Nyekm$N00G!837W>e4p13J9n<@a0xx zXr2LBwjPUiA1A~zS z?BZM}dXyF!j7jvvK=%pz6i1q2BKCyR1Ig1Uwn-qK1SXk!G65%QTvSQ{N7zeAhr?Z( z=}#3#y3T=O2$JAEhAEzOLz5$~X)}Xl3-v{^A9hJVhG;i2x(IK~oD`-4VuO=FHAh3V zjF~=(2s)$Sm{&!L#9Eg$m6u&3dCf=-B2z16e_`>8$ zwj&<(nWp~2bqZVHnf`ao*;Fq8#J|QSxYhkeXX(MjQWS=d%!AzYNKBNoXo7ssfTaBP z_qnI~cX0nY-(i@H8=#dqiO&R z;v69&E-@&r7tw*iSz&}crt^)}BYY?zgag^HRiqwyz9*Z8Rg-rIO zSGvZvNJeaJ)p&{X$vOEY2+);XAUIldA!0ek6HRL*1y#crr+l`??;ANByI~XhD|b`> zf>V#n>~XEEI9tbPl`$>cf^!HK2DEVvxugy^X3USiWN@~_N%<7g>iW&k@||x$rPi7G zCiVAVrE4)ECpWO<6WYJ~#c`Tg1=gh-y$J=4sO~a$-I1`0F-ad=>DiV#+VjD{J-sW? z%={(a1B>#dwObs)QRQ_T*a}Yk8PZH!=IU;1VkSHKX8we=+7ccVs^pQ@XyfLrh9`BZ z;F>iP5T$yFA&@4}{V^ozMtTvss~C}Z0T|s+9`he@PN$F@^Ho*$r!|j}VS}j!5>Xmv zcXVANTAXOC&6-dCJMXf#Cx2tS8yqo%^@7fJv(ts1@yk(n@{{|V%ZxaQMtqhofh(CJ z+`v{sN*uO2alEOao88-7#RLq$>{Im>Jq$H8*HJFm7PWCs3(34mn^?JBY5CN;+z7Qk zj2>6dh?r2+G>Ybu~gkJ;}`u{N6DLFVtK=6wq8(39!{b zgn>CW<}<(#=V{>#>{RWfoWm;}LH5-(f9Ib$MA!5E^s$C7ZStZgJSrRq(6)Bsh6$Wb zj2_z2!g~aJ%xeho=J;tWt1nBs20&e$KJEBz^H2Fop9Ys39&pt7Z%hnn6JC_BrH%gF z-Zsz3>yDQ)BzY^o<(Tm*=rIo(hZCeDhNB*H&SUgd_oRlKK9bJ#4<#-|Ot~0;og}$f z-L$~9#%yXWv`wJQHG`Bz<}~4(+KcNailw!6!yxg`ejsNO5C=aNV znH#!fkLxgKb;P1mkz5tli6apO(fUZ+5F+?YkW9e49`=X9pnHzXV6BnTdtAiJtnuxkQr9e2D(AyLs_)tC=huWM`oN@RfjulOQAMz-t5q#)M0A>^j zpkAaMqJ+;qo;f~VXBROhCq)j`E~Lts90`dVPmm1~G@3VqEkj(~3=lNYlCI!^6en8( zF~x__pA<%N&}oXW0XrUI_Y~bh-gu9LCfTQ*_;XCuqTcjL{Ewiu)P_F9%+#U%DH%2} zY268cG2^0@+h;7O+1>kmLWGT-6pw?LvuGg9htGxW)(j^}o<|6mO^q*%uccWD6aX3G zJ<(Y9anPhM`Pp2OzKn=wCCdB|Mq8c5GxJ72(JSnu-;AA1>fKJ-D^uFvwh`m@as1x+ zWQa!5fFxm!6rSP=ewN7!%%iVNnJ$798}ZP|Cq=k0pswPrsrMYW<;4XrkL*uj+D}tk z6hpV5#-Ll`tYngBcr0eY$UTg+by{jo7}X%j0YbfTflI8@qkw^bbzSsEMb3zY&89!- z1W`kMHu3z*iB9grXC7pPjD9hu;(rx0n@)?P9a|Q@8m7ieeX!@%Fl~j2>dBM31avFw zwm6&r!HN{7>#bItemZktH3kxc`=7ej0UQ2lMQm+CtJ?~I^+w<{2BcBjZZ%x%@cEbK zG$$mEJ^P$DGxqvM%0BftK5lRjS{(5#_?`pxzD!0~1G7?bjzD_s#3yTQ z>AEJ8k~+m^Xbc=QbBH`Pa=aG?V6ufW8QFc(M|6W@W?QT=3YRBL@lS`MC$wdjCN(rM z$V@~B)U!xH^WlfqbX(;MbdF%zH3VZrO&mT+co{TeOz3ErbKLb`#F>+19uhbLlAa5B zymR;U>7qaJ+IX`1(jhi3&L`eaC#A5Q@o-JYBRwW>YK^_gfpU}_N<6R+&k@+JY$$7` z104RC&FFXtBad!7v*F&sDd5xkI((--?cT2A=yOSf14d09`omva5J?qshr@FlZfVzr zh8hM%UsNxn#&pePUOJA=Ir@LrwpLHX3)lT(001BWNkl)bY-><$HUEerG(&Aw7@j8ca+&B$r$w*kO0?qp_M2X37mtVb!CctdbSQYr!aUvLIXu4zAjA3sLLZJ^8GI;ok_+ zXbdAU=i!~YJOAP0(>a)QBI+c~Q&|BD-XK z)_)LLLu%CX8L-f+B*M#G{}@x&`;&1B4VDoXHn=_*Bi`H{BQ(%FYok*=!bS9xr#8J2 ztQry;2f(&XzoAFl-<9EBpKQkoI!iD7*P&BPG`_wu*%fDKsTzZ}=Yp=eH3a&qYgvUX zqL*4KydswfA&)Jt!iUL4LWZ$sM^22-`8Wri;OY1Aql*obnWji{d_6JH*xG7q@qy!P zZfy@pLEnwt^<->M5$G3-FPk7aB2fNZV>v@i7~3Kx6>A}n7%6GHSd44bpRPzC5*Lws zNH)b!i5!3!!WM_9(AH<%#VM2s6-h!fM!*l%^~_FBD>iKNM1>LaZ$*_qS>U*pZ7{+6g-xzSn6EE4_I>~dlWEG91 zc-tYp;4eWQ6D$e>W9$_ZW2d!2(+oPyZZsn{#rH(Y36}m9uD7HP<6GD@8c$c90QYlx zA_>F@Tnw9#mq}H(-%qNvpwq7whbGP};=KqG%~3iN8U-Npyfmq>)zk8X0CIIQ^_S?K zzWPTBXU$Kc!dQ=j+7rMeMj=sQG))lk%#w_WQFI}qV#pNs2ztWJ(OaltP-{?R8f~;@ zZaE+Dk-v;wG$~#}e~6dfJv#n|?~_eod@}uUVAt_5(N&gx<`9&a-$J4pf18 zMstOPp}QPPW5M3@B%>3&eWZx1{W;mAPM(PW3GPE%`8~yxv;kwO-!;auA~hD^924ou z3D2pmW~Q_tIYMn$TvWVy1~8ux%cMX&Mfh28dA09bofLu@ zw;wT+o1evqNhkP(JkjbP?A)^KRwj znea||d(=L34+G=6k929B$_=XFTl>sNcAo6X%#6m+#xp!u0A&NaW<1P8$A;aj4s%s7 za~62*y2#`JI3qz)#{g#EB`KXi{z+9pZFQhdbt!fV3($}XI58Wom^`(v#NJ&O`bN7k zk4A@B8}R%|x1@^X-|{o-2G_B|(g}Wh^3(io{%JhsmfD4X8X`urh}+|b7oDdEta1}2 zqSJUWM8t09qEOo$U}HWf^|@3d8CM}?_)-~3BZT`dI5kS*FE>SrfN0ltdXn=tIJPsf zDEnO(GeoXMV4MIyk7+R0LUk+}WWfV%rPdhY+42}N(Ol;JSHN*3Lx`Yev&Y3O#B9=a$Jk zCl%V>^^v0ES<|T^5xFoeeZm6S=5pVdK zu{LwMrs}?@FX2-O3aK>pSA&Ob#9cId8@I%76tbeFv`T7gyg8Z{7_>k1L7fB!Fr&4b z7;!$EbK}NIaBI3qC)?4(Le~QJr?8W_(_zW^zEY8l6m=4^!VQfGsTCbH&aUa_Xh+=H zxsLQ7HIli~fTCW;SN=f!22KW=%yFFNdeV0HdD%1$Ds;^=77|)FJr03+&T|=ZgFMl+ z@=}j=3N7mY@>-sdylsEkSHfrJMQ*U#622w+;dJJqt{;Sz=BX4X`85DBf&+o@cNR72 z*VysEj3@bx5Opa zId_QX`JBTf99*+$-j=|Qx&)pMNg1Qwm_};G7U@Z%hJLiBA-U)|zx)h8$mtr=gleyw z(C_i9AkuG=kxZx`OC6zO|1ccACL%4!JYM`26s1QP}meW#8$wAb zaO*(J@$6#=wLm#Z<)Y3L3=7Y;+Xw;X=qyCR17a-EfzwCPZXrid8lZziA~>DWc|?HI zL@?lQR^j~Zi4}`k`jn&HF9N89VbVLQBl5&el7Gr(g=t3iqgQRMjXl0?KmBJ_( z@h<}`JSHLo7QK}i=H>uwR8Up*NRO#R-_9VOx~Rn4{P|{ALv6C!E&Dbm22%l`HNkf_x4+lw-ct1x#&$GhVqz77A$uz z4N#oDOEo&HIPFCoLkFD{??<`qhNXK9?pdFg&7&X|90Ch|OeT$qb6g~hbz(J-J$8Z0 zf5z=y{LQDi^90(oKE*Tvc;ek;B8JoLGPW#+JFzn7NQCu^NKIXJ!P zPFaS~$bmEn_I6rw+?$F$nQMGD?>2F;1@z0%bV(fXA)H&MG$P_c*v>?{gRQ(e{TQVf zy5TXABaP3V@a4v+Re974lv?&dPFfcPX-C^qCEq#s3`rvyTv$fh6r92TJf)7ewzRA*l*=8ou~iMIUjyh3q+JeMky$+yANrzYd$XgrS7f$bbPQ#?TtZ8*hcpwgrejOj$ zOK$b`jDhu=gOpLhgOnD-Y@L}i@W2G8bk1&^v7cV#am3_KwCsOs%^E-ERsD4g&3RHv z*H|~4Q)^`4-5x6rbJ!Vpo1@fW=8WkN`AedMPh5w%Z+XeB)3O;C8Z&0J4pA26qWf+? zXUy1j3y7!m)xX0p@@tPnF`V_gPRxeBY6<>uhPBQcJ3UZBLil$GCa9AQ+^-Nca;{*- z7@}#Bb<{JxaZR2RdE#5g5|@&r_$;6@Z;4Mk#*2WAZ0u z*Ak4>YjAPrOR#X}W5poqBkneHc>Olt^Fa8KhEM$G>2bxU`6lhM&oAtYmZy(}0yWTlgvQ7T-hE!|X ziQ>xe!8h=ScJvK9VmG*x=%^=R+k8;J%vW{}Yo$;splrvnF6!~Juhx>i%o#X@ZyWl( zc3{4^4{;g&7{ta0xsW-ZV{Bh&7#RR^(zI2%IbBUo%EbdGCTZLwtTT5R2Q{$H&GRiA zF$bqoQ+lrJj)+rASkHeM+nt->sx{SZ!X?i5W>l(_p+zC1M?b|`wiRcal~WfZIa4=n za{#9tAe5PK6Jz8;+v(ytH&}!x>Zg=P+^2^CjK-`xfp%(WgXgIQgoTC(qndgz$%=99 zW=}YQi#($ezPe}>^vJm2UAmijUfJhvgo)JU_7BF>bBhrmVP&8D%&5WN;)&-pJSN*s zctawX>Q;jNgvwkLwsdW@U!0hTMJVOS#sGOR(N3A_Iln@T^ST0XtlDwJ676!zcYKW< z#*+T%x>CQob$q1U$10{dt#cZ;>M!wSthrt(durVJJ99DBvYUrxf2We6?`m_`fl&)q z|2^>>nvBkcVFOut!nq4^$?VW0Bx|>tv;E(RbGGfef{|{y4s#votR0%Tc{0B{4#E{vwDF|5B8L#coR4Ye@rYuHrgnorq5Ek!STZt<{FgRz|^G!A}QL5ne zi_XWb{M(x{oV$i5OSOo3;APh8B@)EpqnNo-^n|#kce>@fp6A;O=W; zJN}s0%qih65jAtY&{_8W-?*@;dK}LhNmgljpXBLh~%jI7mrgTqREQU`qJ3ATjXFMRVQV{ z|LwrL9ro4Yh{4fT0x5!#KQ#n7UV34zrY!{2a4CFcS)$Ln1dcFm$A`|*(-bvLXqaRq zawi1IBwoGRvka9adi?Md%Hy7sE04k9OIz`|eb=1@6BhX*D2mAR#IEeSF&SasBaP%U zkDZ^j^xL(bFc>WI{{$%P;l&YFoYpaSk;U+JpVp`pxDp-0Pa``KUne(ri+H)Xllb|1 z3mpH}=-?kI@I;K=BcHZPHy9;78wQ0SBT3=z0+3`;NfHeA`1J9~gxK;cWVuj4kPu7; zD20p`IgEedIoO<&EnGJWCxj$}S7KMcn7jxJ;%x*}Jb`cRP7YOAnuYG{lh`nyCxRQY znw&r*&Bw+WwS@_=L2vD7jj$##>C(t;G9h~j%NTC(lMk}hc=jZoQda#_bMQ}pkL8mb z8;*g)JROJ@Xn1T#ghH(9?>+23Y|d>{xmNS|ZctQqiVx#lbSolng_es_`7Uq}Fo4t) z(`JY!TONiuhcRELFrhEa364&t;R8=Z=0pLXTkvLnu_BHM7dh4wu+exI1STS!Eql~1 z`qjXF)026luX|?^E1+5WJ=L}E8nscp9ff+j( z&JZW77Y70I*%|?S$+4s_gVCp$n2NVP$O1d?Pv^Vlphx%O*jPo+lC9Jqj^EIleaavm zj0AcT;mMS=%^a3JTV9m7!p6cLG_-36MXfa>n2NEYfO3;Gs(nVE2BW6T%pq#sd8u({ z6u8C{U#-cqC5tHbcO1#iFdD~m_=>2QId#+wqMqC`CTGM!6pi$;CE^-@)on{>*p~8N zxW&Mm>cEI$D8UJ8oF9EH#tYzvU!)hcYJb(X#_HVUoD}`yfEfef$X1c;*X@UK?M&0m zO)%pB_GRlrG<}Ot1awUHX@hH4``@l0Uv-`Qry(XEIMUYWzDY!%k-}=(wUT*{zBwk> zvy4;6F8H<9HS&j+*h2zXYPO*cYBMd5dJbo)Zksomrv7yt#XI2+5;*2dgpXtG&xXd) z<9jYN^2M<%4hB0TCjg6Pf9DuBAzje#$t%hm44TCay|b{$3lY_i*){WGt<0F*RF+{&(5*A$(?*7{6Two9ZjIq zT?<)#eRE;P&Ke~Vqxr(A<3?S!XU?{Z?o=!ED^uH(un1!xnOr%~u%>T$9`)fQrlSqA zUjNm&**&o-mPD61CVIj8Hr!+Z@7N`0(3hF-#P7tZ`*eSSoBW@gtkd_rGvMOlcg(9g zKN3IIP||^co==YPlpSj!g4*wzs{Pz}?RnI^so=mPb_3q7(R(iFdPR9noR_IW4|@Yv z%r&*icnDjuH<`ok4mQpCenS+;51nzIHmIXN3Y&6oyb7qz9MuBXxVK))evTqzA*TdB zT5-a^?%O^+VHIO4TnEGQ(^Q(|TYE+3k}_%)G$NOJ{-GF0o2(4da}b31%2Tl(r!+p? zLkOuenxg^P(V1+o)yupjlM zX;XRa06I{3n|!j4x_`uctDlI*Gn-a%v@s|r@fh4Fo1HhuoP+aR<$H67hj?``t9aV) zz^aBMofI$fqXk-clk-xlThlRK z``7(iD>dgFjde*i`ZVv2P6j)li^9_NFqgH4`es|wW`QV~ z3-A)+!=cs-;~)G|--O1l*I-3-!W<0eAKlatzr~(aj+{vwVXn) z==<(Qo{adp?jdJg=i@5Zt!zSZ;Xr&j^K`dv$#)o9;1mJ*Tai{<28z=_W6`N$jsUj2 z^isX2SOj(;Ey(c^Jz=Sg(+nC6(t}en+5jM6xxgrwJBj5O!R6$ZqQ#(zw}!;R2?FGh z=@fEeJ#91D_&XikldbtQ$?5y49mD`y08L#{O+OXJIlatLKE!uT!z}sbS4E z7uyk3wZlnwyx=(j``F@m{bZZsR>`0jkHlYD>oIWL_PdfhT%m*GGnk-wZ%^2l4y4dy zEW1UwuNVhp!aH!q3wD@{Vzp;s!Ff(j^FDus6ZW=trVnWZ?G*5~Ne)5Aq-^lf&RL9k z0_)H?5suM-bY5(dJU0sBTgIk$8_S=HN@E``V_293+E69=5v@lBIWpd(k`Gw9vU}}5cL%wbWvPq zCq~s&PohsEx$6?0n1Yge)A~Jg0QI>iw{(r-A$a9exR5$SJ6k`un>r(ZB0BmzwaAo8 zgku)_`g_D{YTLYdIcu{SQ|B(Un=$YVvy52KL}K&t;HSpOkg2%WxeQ{nkd1R3`iQxO z&QI3k#{>EwaE1Gi*t?fa&a|+Qjvh-fN=u_*lI6TN%ZZwtB9T96V|X=f*J|rETV9AysZmIbn^B zJHmo!BI`5ztQU8pt`f27Y91PSrlqxgZ}FpK5Chht5la`lu`Gh$7$8hX6jPwnZAz4&q8qk{!>N{T3Z3-JROVsFFM5pS^0Gm`|A^Ldb8vPQDR_wx@ij28y4_ z(a=wEIF6K7X^g2$n%W*(%F^&RHP)zYn|d6f^yYNqBpa2|B$p9i+dM;lHRi|(>tM&x zHAyyFSSS%gJK8v}ellS8fM(sduOa_TMcYfhu!+EQ@PgQ!Vvat)uqSjWq+FJ3#Yz4)Sz)#vMY{cjzsXP)YR>rIs8_xh~JaBW?~^VXl$ z_WHjU>sYl{?dqCh{k3&ox#vanTi33?(f>NXegfm{qx?{91D>nh8_wNuyzs&c;NMF+ zzj6W2LEp5y{8s(fiReca{a8aPy%x9g&S`?p1b zSoYv~@Si&F68?r8&PP8~MZh=b*YT|mt-fw3Yg`G4={MXkj?wH3tN&})7T(tH=hx@M z?A69PU!rou`kmujhtzfjx065u02ox z)p>P^`$oU2P3l--^M=)b{X1XR)6HsY*|yrQHg8zh6>iGb^t;+-8_bQc9evV{bMo~K zv9J1BZOVr@uOd`qSw9_{b2U!b%$Q(&_zn<81tmIL{+>~h)jYGNAhEeR|;Jd8dz8S0!xmeeVZwI7u$qC`=1k!c4zv-5L5_D)zqo{2>KhdQiOA}@=iQB%8 z+F(QH4Rpsui8ES?^yVjHY^cho){X%<)D{?Vb;1n&7KpRxgAdb=|7tGFaa+sTQ zj+!wF#%2v5w6l&7AT|!zWYB zb+U2Nte|dojco&|<=gK6XuF(rS~DiTjE8G3!mj*D-?}#I{7+zJVF->1v6Fb$B!w^TL`3J}8H#Zqb-XJ;mK)wNgm`#kFw4Mk{{> zU&5cq72MiM$&1q1k+adWVBgYUgvm{kqG%yp)p4a+K1si)Cha)`^_HJ^Z5x$~E(gb% z575)e_x7*iItsp)5Bt06JcWEyTPrOA=b`kVfjuQ0&P8TrpTApQzL z=_a~r)aS;_4yY)zwZeGWHm$;TVN{q3?T~YgQ^gq>`lN635yO;^HX_$}M{OICleVc| z$OcgXBy(wBi}q;{Y!qzJwq(G$V}CkPKGRsF=+dVtO2S3ps2~VG#;D=Tvw8Bi3BNoq zr^kPFt^yi=C)d)qJh$ii9v44U94HP#G8;|1IHxs%PU@PgYf_*DR%xu+~d`* zW#{?gEIgrq#+2~>fuH@^;{*Th1IMrZ+W$Ph@r|dtj$9pMF@4=M<08CkLIHPbpY+>v zQsdmc=Gwx_y3tiPLh2@4E#}uxn4&faxlwP)&R($hKzQS;H{n?y8F!4g+QE%R$B~Y3 z81KIO?&Ir^e!b7P29#fQqtbI1v|7h&sT$42qwqa$aJpZSqsGk}gPxrMk+|u2~zjZ#a1!Z zjitFs%kvZ5gfYKPe&z-lgGsWipSkrFv-e zy6T2?Lks^LOK1@F24|;jYESil^TnHS!t+<_=3w&*wkVp2De@h4qv>Ba#`Q_d)i{RP!u-D0OMA|*@%9{XTrcg(9NBY0jER7~c=IjC zg$w78r=NaWM_p6PU#=~u4%elo`D&?d_?g45C#dhIxm9|o;M`O? z&M)8M=D%VJjT8}5A1m0g19o#=Au)?fiI1CZx_}#mm#jHnqp&8bDYD?6CN+~t=Fy4 zUTR{-4RK!^0IpoQN*t_)3qRO!fparl{LP^^p-Z#W4D8?rjJCB-FMFGR(k>oCf3^lrg!xZz2=yBdhU4!rrfV#d0h(T-D1e26@D-?j> zFgmH6S%TtrC%Ae-OaoKm8@Q+BgZ?TRSZv}KO|&!_*zU?}92Fp^ei9L#cHbKNI4E$^ zx?JF7)Rk2V&%~+%tHetZGTx_&ycZ*+bk&mzOlp8^b}~kM<)9J{=o1^~P$X3vmvlS* zXCz&1wC7<0jO0%%lS~7i7OrsC!WDL+)z3;6wYzM6Rv4-xvIMD;$h8-^8?6f0Ys=Ud zR*_Z5YZq9Z`$FvktDo!dYOlue+)B<>*wwiucGv1Nw8e9-RS~@Kb@ka*IITW$ZJqc0 z^E&?;cB4ICJAYQ&-~FENK3@0WgDJieae)9*uA~8OQ8VaVq=Wfi3%332Puu%U8ZJf{ zkr`7aAo>_rt3&=y_xn@YVek+~^GPRCWR|~*n?gA!f!BRil-sUW20x7V6brz!EH)Ly z2pJ^~2zcQZZD&10AUUbRa<#=tEx_H0mw(dxaZa}b*axp}S^e2>)tm6UKh>b|3gh@O zOpoBoW@APM$yUW)I7u5Y!Esn#pkU0zSNCWCqu(yjWVU?gNeKhk6T;SgAU#?#GXs6je*zx-9@0<~ zY77>HIy0xz2OVD(qt=lDnS=$~@|_gO#q*gbeuYhkpfeRs z@r1J7FP|q5$y4@;vv?*vcBZ%{z3CB2KjmM0IadMat@G^0JfY*eHZf+)cKz-+&9G`P z+Y>#i8|ZFfW9Tn^K`y6%6~_!IE%zkLIo}-M#7o*!_lV526=$oOT5%#0a z&q49TXBa_7q|9dAt7~?;#fPTItFqNpbauAR zo~Ui+grF@yMhgiGMO<|zFS1h%T0^<#MvjlpKT`)*(*%tpPLvn_!h~HvX>IFEc%yoh z`q_1Q$`km?EH&`tZ|C<-!{G2-x|k?l(9YkpZ97 z|3q{f*_z98Wy{#PKu# z_Gga!@4NrF@4iB!QT>bpd|J?Df|JA=fe&H8Bc)a;7Z(jCZ&|-0|XRbx(wFXt|rda1(Yn*kH zf$N^@GyLu2wGLVfz-ukEFsKFQTIj}l>bkzxNb6^{Rg1>ee)$Kn*1~(OoqB=2`oMX5 z%B!AktY~Dh9P6{Rv4(>_^fVT1M!)6rS^(GY%O_Z?UB~NY(erCP4NsL-T(rpT8^c`J z<@I>-OHYoWts0}Shw!xIlJ+<4Y!?DKhk-CmrpI^h%*a|G5si>_V ze$snPdtqy1mG*nBEKgJe8)aY5Mfp@Y!IQ|ZU-)!6>D1m}MEoQ?xh3zFU3yZzJ-D6> zuBXA*eTFeHhac)#n?=_;jccQ29 z>pq5SBKw4I0AO2wlHX6fV-wD5#y5$pMSj!ix~W}GgAW4_^YqNz#`DVT;ps-ittW&s&f%wO`)`uJ)@$rQ(e(`wEd){+A@x&9yM?U-! zU=S@kC=DYXUkM`X&mN3b(hF99@LlgZe&;j4bG-7t`v9(c?|u34=wpw8i{7K(_lb?hUWx#7+`@r$}&wl|< zug~k}%U<@f65;Fn8Q>$MN_o7#U+vB9G&aJMUaO;=Tbp z;RpTaw%c#RZW`X0?398encZQ!KtguYg?b&sRSBebdYxOllGf`2mj9lugb)#NjR1=R zY%jjvbkh>iYHR(w>B5EM>MEN0sWc{E?^?O>{Mu!v!DzT-Rau*ZO&W6_|B1 z6GImqJ(2O`U>jdq&(K*oJH^0gOP|N#%kUa+-H7Ee zom;;mh6=jfZ4Ak-7uF5g^8J^;{N>}`SH42I+6mpwvDg6_(WWv$VWIv?vT&!G{5t8% zcge<@$$jZdUpgLm;5Cfv7^}r3rBH^%WJDnL*m_ZcM|<)?5W9HFg8CE@3BRhjk;JMg zx1}P*oM1((!q)B6XE2YNt|TG9$!x}%{+mhO(6*0F!0o1?z`{gpVN_cci4M!gx;aVa zRpyW4OH*aLoTC_J8mEGWwHMEsyY^E|%eJ{tm*Qx~SV8pC4kyoastXS}Nq^Js+{mh^ z;u5tm?RT}~&op2!u4PwVM2-R5ipj*Nv6k2tF64h=cLrU^bfM=$4fgiJLpeMPRA^!p zg&Jp2O_sW3)NWysDT{q5lIJ#V(T` zT)?=E|8DsiebE1@!K+;gAp5QVqRp+0%%>t7bCdiyuMOfIC)+)IPTe3U8$KdDG(Cez zck`NzNxpLIIIhrK|f9)YfY1oh(H)>}tEO`sEagJ;Sy)m(GDuu&Z+DZE3mhBA;27%Cj77Nf zC`+4gYU|2SmrYykxqkJxIEDU%JPECR6*R~F&KJa8CfI2FL=CJVU6l0z8#)}X7EtEf zE-)$>Cd`HOZLhH$4kDkJ7>$a(Fl4kjZ1>9mabK(U2+kOgs1GoF?`xH zo5X;2uE}|<>qw#4nK;<10-?`vhgy+cKXEUvR0Iz7=Ter)t?q?aTyq~-UzmR=}f&YN8J3eBEaB90s>w1z`_zOl%)Z(W@k zPn&lb&**|}L!zR`j8#HakWj8rt&GD{TgG{F^BlqMn9sb42I8!3jA|Ky4 z9Uh$^)IipYM;s@0lmLX)=CxeiI-&ytm2;>kQhkF@AwsV-D!B?rTo1#L{@eA6rB)f% z@o0Oc0We$m8$laoIJCfdK6*BMPu#XmgGmhnDhjzPU{cnsZyaWCn&PNCj$Lm^o#dby zr^&zO6jjLDU%x1mp##+w973=$pTeRct_hg$Hci)fdMF(e^s88R`|O9>uJCRXbsmg9 zZna|1M~u0yC)HM8DQwcusf96~&gLGt{cS9=7F67#1@vPyz!9blv;YfNiHLX?DK|c) z9eMMQ+fn{8GFx)a9Z#(V-yiy+A38q%iI1(dsB2hLd;GCSkK1p*^LXVe?mh0m|JCaT z?R~gW`_13{n&alRW_bIh+m1_Xo$dD9ZeLFzwjSFc>Kgq{L|xuAN&w*O!AeM(j#j|^nxhY)k=fniZsW0u@!|MutmnGrwqPm z@=9}2pF0@mIg*sejNQ&~ilKfe(pxSd%Ja0bwU{h}?t~i{+NithGk$nB{Wnv+>=PR4 z3TljPkw0Kf@H{zck0DSxTi$ow>$s?=)DEdtyH*>mMc(pM@rfQ!?u}$(GAWQJwQ*#l zV~wbK-fg`r-vu14HLf#|vf`Tt9{n!W#0f)>^cmtUNcEi2Scao5d~B)wC|{)>7;WdR zUQP6YIn9}?8JXj{E;p+^u@xV)DU}H1f8(D`rpOf{Ege|jvU%QmW*rp1;)m+j8jeud zxvW1^LN#e%1l_4RQDgV~7WRk(G0o^4ezHb-6#lurNdSHsc8P0fCiXFY-gqG4ihf1Q z#9v@U0P}P+@J@{{m!@xysn^A%b1hG**?0a$%L;dzlclOHKdO#vy(0u83_}Zz#jFQP zix^UKhIVGHTwr%apE;?>Zk=wlMG=KB+DOh3L{s19TSKg-tr_MiIiA`ex@+udxM;w& zDf{XNr^ExX!h~{t*Lk?>*xVlgJ@&Z-=Tp+{>ek|yxho0FJjr-Cw@|Z)1^@Fr%yqiS znL051F*VFwaaZlr1#W-GJ((^qk9mx1>TT1k0S(u)5A)OZTLxKzR2=moAlFRb^M?G#6LU!%3u4dC`!Kho4!d;E7l$E<7VD|RDooZBvEG%nb_`U3^w_$|TCa=X6R>L+)VjgRU0dtt z+7VSZ@#^n)zVn^Or~c2UxMOVH^gO?A+~JYr_4kE!^N+i|YM0mfFtX*2# zafPRBwQEefylUsxh4mOcc0sKF!%i-}egQkOu$yX)zwD_#Ygbs^XZS)dbJ3Cn|B1y4oI(Mb{I*6*xXNU1Pa1udML9#Jzj1ioH5k=kglvimNuU z1J3U&$2-cGzt&CDDiq6~d{UUZ*2>4?I)7>h8=gMajyOMFon3gf6R&`RFn+DW z{U`tA_}=%vR~(W+Ned!2N>q?4k#UpfOqyMgVlWX~NsR=I}JD8Ys12hr4GU&Ho*c>=(GbWu%Oo`^ihl(X*37yh$+YQpO$Z>XIg}P!K&L`Ln zO?OQQ@3G0>z&4^LjPiHanY^|q)rc92TprIt{y3MZ{iz|tPv_KRJFf@N?z<6`{O^tPU3Urt=NUl>>Vt$%EZ9;djt zpl^fXp)a27HD}wTOhnYj*!?7J9+S{hY$}$-OBW3iHcdWzV!_kscMpq&KlRFbGz&X? ziegRIG$nQ2m{^+&0|P+_CcC|`@8W2(8Imt(9H!;ykimMSyeppXk1+cK%A6r zN9M{gIX0R`_Vkk-_{)q^Zj++7GuGT7PQJRwujd)qF?Ub2&+pgWd zSuY6{qW;Wrj-Rx(R|R;9xQ`*i=dF>^gDfmeU2R-!H*zOD21bZ6w{Nv-eTNpqZP&}2 z9e+s}xYYBNz0)E6Bd0KkxGp)+_!D-;MITLH<|5gIc#&8a~3uuTnVPBS29ZWPmCJNssvnjBe*hD{_5N$ zZkhWSi}+7+$B%6nW926oil=@mfZyTAClS1{4sUy^EA)o4%Ez^HA8&C&e&rjaYW?P( zd+$9it=Cnic1hHFe6b_*NeL2$Ngsss{@e3v0v&{UVfFu$KlM}4!`tt?V{Hb%dR)D_ zURk*E!jtPsf#;sTikn>Z3d!f!|JRMIt95Mse7=sa-|xQr9&B>1n`6&C{~X$^^Y6Or zWyeEnod@56SoKD|`D&eW&&ywaJp9N*sZZ#`^~$_;BkrqT`C8uMR$=gWAl91E*S_|D z;d4f@>%zO%!vOVEL%o8}I7J>SAFOqYvhS&HJjwj3+>ECTS5sKSTEE}EHsU|C9u}y7 zbYjHh_>r3a3yVfgPuhi=tS6;3)lUh@$r;2LLq}Ii1&7?NP-+j;B*i>JyL9Ewr z)*4owSG7oeH)1_)c=OFS9~al=@LHEBOw^NEwJudpU0zsgLFZSSRTErT?bVZ!)qY)f zq57$Q*JssVtBQ*5|^1()5VD=l9k+*Ie$i z@JnCohjd}ovapSFH^gK(2BQm>Ww9JRX3j%_=o8{zwSYKfC1%bQhO>S$>XmUl%hVe9 zOj%NM)nuF_%Acqi$*=aXoL?9pq~)+XN9G#UHT0Qz-C#*h(J-^5W30K!HVI?MTM?q$ z!&Pnaz-+UC2cjMU9 zdvkz4vnI?MO9&)1M;$F++Le)x^keu+qinKSCV!F78I{%!)T*^F^GIp2FuASM$S1w2 zThTR@%~s%seVSwYd}8oy_`2tm3|#wTvWs4@E+j@{?5@+A33Kk)zTuYBdbc=N^k-uJ%aW1skVM?_l7;f$Q$PsVB(@h~0q*xF(C zUElR*jz=DORgmfiX8m2oo^S5q)fubUtjDymIE13piC97(4lBSGd^x*! zVo-_u=>Q82Q4k?lAjMaJ(1nF0m%t1mT;xtNu0cv5TVkf^ic{uo4p!fJp zRi}QTtsB|GEMDP)&wNgO**G@|09&41dV;u4#`jaKk89FV{H^QjeB4yW z1nvSR59M3FL%sOzSIO{;&GV`p-EhZiV_+LcU~S0z)+;IHH9353j5i0|baC~k*A(~_ zIAtFfocq-`ew7Uuyt#->|M0an{Qd>{35)2}XJN)06woKfQIp%6?AL^}UUh&)a&J#ALE+R*EP${$>e@67~UxYnzNU^D%mc;J;nTp+JaANYsA%P@*H{9BtVzy#ukuh-F+ z$=4-{BYn^J)`J)Fsc~a1_N$JZ;NU04DBpu3jdGEP4HD))#;WfXC`$lujz9clmV_O? zwkG^_Bf;9ug?th~c^K_@<3tLIQK8N!ZtM^9$vd+o*YE|f3SYt_@+{YW0KT81KCf4h)FK04oq<=9tbcelhuSXd@%nea9;B{WedHBMYaD(( ze6>|?T6pHlGu!J+%4>CVt$x;mA#SAk)g|eRZ%n97Teuk~KGzt^7j+ZQ3u_pAwY5I0 zMWW|wVNtIS!OcI7kFQLjKd=+MsHM-VfqElEj_Y+lxE613;27Cg<%?^_9cw53<4-(J zU+D&9*~uG;a?Ca-*1HsTE)%1^k7x!NzzVndt03xwb0 z)HdK1{qR%2t|hN+(X01)Epc4uGA1vsMX7s^M<4k*eUBTa^q2EszsiRFK_^rodf@?n z1;4ulDNVv55$o1lE*;OV??WQi%9fF%K`ZGIKOJpV+}Odi9jtQgfY82lyzx!na(w19 zpC5KS2AZj@~;P;T! zP-$;08$KmS}(4H$1{;b8)D{F(FYlGX? zP2Tx^Fy?vX2rk&KtMm$;d+xdGc#a3+-nAAVSG(e(HQCrLyYnijb!|O`@{P4{ohS6IweoSzAFA#0W8HMen`{(g ze{Whjhi~H1_s^`)YeBs1Kt@K+q^-=a{e3TP`%Q0p)A75%`&rbV$gATzyq0eL4>?Kb zy6;u@t?#~BKB?IHm3r#mix!v<34?dN>@JM6>b1(@&R_ZNscKnuMD_LZ<@3iMe+*;q zS0wVgZN#>4qkQ+kdV|oHzw#AASZyIfHD=TVCZ2;Pvi{#7l8JljGh?vJ@g@ma3~D?9GK>z?D0uRmhPf(!V5y`i|U zLE@V4>l5$lxN~*Cxuoo1&M~K5A2?=yJzPDVhB%2iJfGu88i8N@S~BGh)JyBe*2^k~ zm(K9DX}BhMr=M|c&2h>%<^#^-hN3&x&BG_xcQ`WWyx8@CV;v-q0~nL=P&d!&2BI;F zrY64ifw@OY2>mHK$!XtI%*}@y7ePa92(O66m@RA&yT|cIzx|J{n?oP#ep2_AZ4=8H z1azhO7z^!G)tuH!Sijo*4?p+w$B+KV4yxFQ+ zt2Png)v{~M^%HAItB=<`_#pHMo4FSsxrv{@*LU*O8@cM5*Q`y+^)@!P;TxZtdsUn3 z+}Z&C%2&Pecy#g78_RLy46%`ht}z$xZ!RpZo5+3@-qaIn_{C!TzA;pNfw*1N~nvGw~}6RqRr^H2PbUp;>R_kQnq z!yDglyx|RRJYN6$*Bx(s@D0c7UjN{-=Z(jEzxTb^jPQ#e{xEq5I#DNn>6d@`_`84i z?;Ich*vB!a(qZyixunki!m2lG!ve2d*wpKInSMIgoBR2$P{e%Q{9k$OB5tg&xU85I ze+nygqj^Xievhuv#a%bhAjPWuSYz=Cl*x=uag@QyB^1YMMsb$rP#2ZMXG|z%h*6TP z^3HWP6PLNgOFBlst3TsK8VeXeAJw4xvX5PB^HYv>$B{0uJ&Y>PE8o=L>eKp&Oa{HS zqt&`KcGM$;0N2am8_@)px&iw?uJhQpjG&-;jV4a*98w;RQTQc(NnANN@W=Dl@YT7< z0Jg0(8@YwB*E)*^quHB0NB?o|!$Y)0F*5Yd#KE64I&;%wqjOd-#&sioR~|)6F|^Jz z9=2#=SorA9s44AcSTk@BvL>p;>xEkWOnF@8q!1aixMJf6@ExGvJ;1B zm&cD!Qn2W1#gJgpb+f)#yhNwrqpoFgb9dq#zS#8;(Uyo&4~PfBp~nL|PO`q-aPCTNtc6>{)!hS(`ya~#`$fp2Nv z@S%pUIUeDV*q?Mm_qC5iANm@YH6~_!)n0O&ac=@uOcjUlSFv;L&v24Y!a)6X_g!}% z|MFk_^Wz`=5rX zsEifzs5=8~7(W+CI+-`XBkt9nlQb2B|IA6Dmu^%T)i#|iHVtRELg+`bO^zl?CNFZO z1!r*3$R86OiHKtAVj)k!025R2%*>{i`<>(jKquHtoapK&rFDLAbr+ioWKhM&Ww z5(EBDS8j4FMoDTY2Ue9Ro5ph;0rZ5-5a193)7Z|Yh>L#ZobXqD1|muoo`42V9>4K0 z2814)aPvlHix|%j%y7CANWA5E2yu=>5(b}6egFIa(eeH7{eGP!*)bk7$)LX}*yfr1 zQe!hTCt(HtSq#ETCHLz4jSs%@_*;MLZ(`wr-=WJ_?D&Sr3v1$r306Iwv?dRnxN(w) zMgBFRtHqYO8R44)wE$E%2l!pQoK)gFcGqMQi&OQw9z79-n+VG$JpH7b3w+Of;h&Su zx>11}EqMn!Uonmy-mtrFXz<2Jd5F8ac_XYAX|O2qO{@2uC2sCA8RK-G9^hjC5HYEj*bcon;Rp}P{37uXm-GO2v&RD+1? zwdLg#FFf*QlzBnDDBsr8QDyhdYq1~SS&RiEX94PBl8S6MbO2%D*t_U)!O&8H5H{5! zH*ZF=h`sI7?bu1oK6p`SiFe{}$)8BhwJsZ6M0J6OVdiFCEqvt0;==l^Yp4E|d$oC?#tS=i6Ak0% z8zxFe`CUxsj(gXW7PaVtjV0@3Y#_m=2!8iZHdbKat2U%*gF@j_n_Kw3L)=`!H-Gqh z?yH7iTQ6JwtFI;SCKkWV0#7dJ%^HOxzBNRfO0Y4e-ZD{(GkVHGZ=T==8J<^*WA(4T zzvKC}I9v-dexn69yYTH9WlP=o#uJ#eXjzMwb*?sdwC!Bn^9B}w&lEnd%_J3vY6BZc zWQR7^xLs^c(c4Y@y;is}rl&vaXW4>{Bak{!<0)4GKs|^bN3J(5!kvC@+=JDk4Y70*lBPT2OX#+y} zy>7gf-L-g|jRe`CKnzxn@y3TTuojTn7i}!R)y;$~5Gs$C4}24(Y^ib8;_S2aRL}a% zPhyoTVO!-?Y=~gazOcV9oO4dadAn>xSc(;X`hiaGk*KbHS6> z=>NszuJu(Pb@K&JRx8&-X;imR8nkhu?8k-!eIE>jXSJbhNJfPzn3#la4o-W0h>a~bZJ@u3(pUeaG2fr_;7et))>q(v~ zwO9-PS4#x4*G>3Ty7KXA>wyPedwlUrU%)sD6McicugRpaTC3Qso3@u%AJup9) z?@_tUqpk}|_n&x@U%!GI!OmGee{jkZ?bocY)u5qmMqq+5s--oTKy> z7UQNmEva_1IZe8AsdDh*22bwIgUla#!xA>M87eoEdsi*cvDcdi@XPgPC0uEj<}<$Q10 z^i6+kNT?iFW3O|N=Qy@{Qm^J4eXMf?{I-1IbD6JLC*w_2%25T9+Vt&BeaORgU7f29 z;?7adL6wgyJoTg>e1g2gTwOPi3ggb7-0;XZLg8&s>wo-yLv1`)%$<+1(L$RlDtA_U zbun&St^5g_khA%wgR*1Gf3mqYyw+Q-fC@)W2Z`5xYgU(Ui;_qSfN+2;#k~sIh z;~n3+HcY&F<j~s5YjXykI9|Wk6QMPizPvU()Q#JkdtH9!GUmD!m)~1A z7N1_Z>8Z<4ueso5)TK{7_4IMi-FM+D!k$`xR}Q~&`3h>v+i$yceCs>E4V$=bTThMF zS8|o+)>}bdwl+r8&A{8%IY0jQ{@%J#`QY)(>jvZ)Hj5k}JUW2u zKs~WtYoqo5pI>#r=hn~9eeUzeBM(1}uTd+%{_-#V=aILlZ~x`L{O9Axe(Y}_pZtwa zuA97TbCKdlbQrhC@$NtSXK}OH>j$hw9Q#^d(B@p=l<~KD4?OU?<9B}NGpPOR70$T9 zzUtPhO-qxpxd9s=_=L2d#4fG>Z)MJo=T=P+LW@0bq|9&AHYcazS!XjAiqsT+_Z;cF*muZP40@q0cMC~404vd&>X zi`&kF&d1a*a-VY7dgA#xhfS0g_$GzO;VC}ot|7VHI~$srovN_sMbyP zqb}j(s-JwJxWphZLL+{@d9pt|gHt&K`4tCb7em>(g0kANw;$tPnS~@fIHQMRb``6aEQfk|M{ijywhD{o-qH(KlLY9vGbMVv!DGef+JT1FTTNGKzX5* z0wth9j2P++M1=MrNEH5~IGgZ--be;XHm%GpqzaVnln>OV&@r8&gzO?&ZiS`UI7Oxdj^0?7+Zh&5J#%L*AUst|}b)Rz@h$s_&gJb`N~I^DL^bc)pe8Vz7c zHg$31!j{QYfU=USZ5NU~A#{=50nOs6z~@{PfkyWLio`{NBv@>_9d&UhU&lkfbRQN2 zxtAR6!of1wUbY`4em>X6O5BOhwTQJAT>im7{D;R6{J;-rl0}<)Y)Z<-8|YdWLcV#= z{2)s_VN-^+zdLhwR;wpu-nG8Z`B#4BzeTzkynWKaAqRCzNbJ+ONkI=cy~E$)fzKfv ziYNZ=1Oe+UfSuxSPF|~~v@>I1N4W?fou@bw?@ZF}U;Rq_{90)breD=*ER)eZJpgB- z#wV?5Oj0<=cv|e$f~IBSL2DXfegbH?%Ei7KJ;{lT6`fDqpqT06FuE|YWA2@3SSNMm zPtnIa69xTFKGNsCsOE%}<5$69zh6hgIY#}*`aU3%UoBf53HbJOC!SPI9-&YB$r11O_^KeOi~X86%84gojz3@h<_W*hMgRXly50nSzp5%1-&W>`qJV&ifcnn?fl6)A z97v@c5OYdJ#j!*!wXRd9R*r4)$4`@ZMwz4ltq^Q^V@dCz&RZw?)x--;cg3UF`dR21oR5mL<@KFvH2fHNoZ z@JLUkE%Kks1O1gBWcNIkJ}5s%+!(UVQKvBRljjZ-gVHrh+yzFMIXhT)_@|;r=tgHCWx6;#M^avEM<7za<<93I#;jC@o? zdJ~K|tMCmzrE!j9@i%tr;(PSb&~SA8p*8}`byvlRv8TR3$O<&XNc=AwQ%Fu1Vx2@? z%MW^$dL%s4YtldXT)s>miGT5%YPzPdcv)^%Qfc-i7htxxYd!yg=9=xMQKwSf#BzJLLGJ<2*(c5d+I^@uC?|a{SJomY$x?FV~ z2Pk-beLnds%|Hrqm_ZLItfkG=9p|7uE8NjGO0mJ*FsJy@C&_DFPsz*TLxjk2mYd4m zsgJ~`aJF%;HCL$BXk$U6=RAM{FqSW*8O*IMW^%M@Sz}r8GA3-DW34tqb%t_|rQ1nO zd4pJ98Zu&T`jfdoddxL4!FXe)PMJYvT=L7(8^I1~e{@oLqua~F%HjFYA;cyZ8_4pi zEf~8pgJ7MA5j{DO!Tuf<`XN)2+2WC_5Uxpdaa!YWA9?@F^{ArkKM;Qy{7UzZL(N!#)(1JU?6ga9tGLAoxcH*Bw73h)M{O5l=Z9S0vRxo;sLdWm zxf4Ls(5*yU`hML-D^tbSmWaoxzklj@`72&NPCMDxg*8(hYA{R_xnEVUwLZ`qB(NqgDZbVW@lra^NzzkN zhm2Onu>79+VS=P6v!eN+Nw)Gi+abv$McmcN4**ZSK_^MgbG zv3*zTH@@*7+r``eth?#IHt!_e?jZfQui=i;c`@#S3qD>?2l&7T&aE+LU-tI1&K|e9 z&22ESdQBw<;hXlW#}XFu6;fH>{B3@~=epOu&N%=4^Txz_L&}ON`ZYKQ-~pk%O49R* za0$~88$Y#AV1nCB&0}wKY<;-m9p{|Qr3RDldiT4>lb-m*@sHb+I=;F+c3c0{cDeW6 zX8PCd=_d1n^Zbz5d@S|+IWJmXaeKPT{2&9$Rn?3!K@ySPA=Se)b$-BpexQCn{i_}Y zKJQxJexDx%s>gzF7wqeC;@f-Q**;h_f8xSEe$J;b%n#?+>)VI?=JDV8&h{b2t-t=y z?L$2C{rPzE`GJ6W@&7y9hYIJ1lJ(jga~|{U?fZG_=XQto{NUluZ+`P}-iOYwHO`B+ zSGv-6p?3RyUfiDRpBHxL>+=Hf<+cx!%@335z4`ON0}ib9%nudL_ph)WHy<^vi@oy^ z-?~UV@7S&}x8vqT<~imZUthoB8k2b%p{CFXhN_7I>B1m^rEQ?DB!G!^i#SvcWPY1> zXwN&%|M{OU9@pRQ{C56zo@zY~#mGuoed(Md6-V~w15)kFBmY2mYKaq3C8MfwQ$Gsh z>RWo90(wYu#0TP@+FLf3dzjy-`?+}1Tud#p$14umPcRRw1mWu_N0{SXDwH#1tJkRU zYOSnZWuQr!SdsZqD)pGP=IFDyD><;vxrdZ1>Q$E?>zpSE+c zuhQZ=J#XzrETpkrYlWQFIWY98n}h||@p=Jf)I!(N4Z-Ob1l?|z4+&W10He{enzE{V z(D!(dPwjusBOCJcyB;tCrTI9(!F#=)a2?b8DHB3t3D8Xt$R+R|z{*8dt(m~RlsW?8 z%HGA2uZ(pugDSApG{Pr=O8lw@0^}L#+Lu#J1=|3hhW@e#0<-qD;y>O?9ZoFUg8%>^ z07*naRLTBQbv%cAIIYK2t+uTP)+3fHC~ zqx=%`h)j4JHfh;0iN_0L5^jrvVw;V$JkkIzlpj4mmmMF=S~|XMXb9_?_KH`$(s;oO zUN9c|(1*}e`c^Tkf=Dax1w_M!%yJy%SBjwvy;f3hHqXat{rL8&)LGQ)6F`fc2;-&< zF;V!KAqkf(@#Zy?;*3&ZO6gcJ5pFdGup7w0n^Kp)_XVUXVK&US0zrX~PSc0eucaaW zrSAbyQ?#jpa67qc-hx2%W!J`xPrZS&h#QW_>4i^Vw>3kC4s;35pgnai{>TS1=I?mT zg^8>eW;w{hb4**d`BPx?FUG>$#}Q;9%NP1U8pFsU53rEm)hxfRN|(u&%cmV0Y3kBk zq}E-5bIq5<#&6|m76Ra^Y)NB4iDtgS+UcrrjYSCjyB4|O2yvv?iW5s!O(b%cC>M|U zy7`TDw#uWC0YTEI1#>}Fw#~PxKGJV#t{f&CiDzk*rv#*9Lve{V(x>tpFh)!gKmEfO z!=}m!?5DOJY{^Ni^<>71BBNkk}v5e`;b29 z+^f?#nM1EQ;Z1<0VjsQI%g|8ODbWXJDBzoOuyvuvVJy@_t}x3MtR=A^#Squ}Km2$0 z*=LUjKj=Z*-Kb9-k2v{}4T{hcjZ>rddbB1M_wl=H7hGd>O5<&F{niV^XoIPa|6n>_8DY;KagjF@wrQOX?J5~gYb zH{9MRky-+W;$y^tgDRZ*v(?h#2CG)aey64-7=bC;*Zpg_b0ebRBKUz3;1W2X+#!3_ zyU44EOODmJ_`Q(9{s%m3aa3k)YtZ_G1=_ZAtojh>9x>eUS<7h{uD_e! z)UwF|LJiUwOv6E_8N_}ZlK`etmLt`Bc_r*srC_nC6u##fW(>{iv5Bv;SiVw>Wm>sg z?-PG@3~cRnc=XzDB*(Qns)k;)LXL_%Tnq3eOOg0f{jhQjeN!gUw;3vaCVsFaF+n^< zj0#09_EvXDD6m<}-@&A6zVZ!YArf%CJY6f`qE)NFV1MwF91<6U8DX;J0>Z}CvHCsE zPm4J(L)SH~!Udb7579z#+vSY>?zIO0b_?ATT|mwNyr8jN@9nCd+vDIOJ6!p-7dzSaQt>LcEJ-p${0n$ zRbM1$b)V)#x6ERO9&0_U%=%&9seh%9A}8uQuvTSH{1I*Mn{U!eCQxW}ueWL(*kObb zmn*DgJct3_q;7T+=UzCBk+eEaoD)^t!_2`_*Jj2$1u;kC!qzc8fU&xesffW6TqMU=r`7iU)mmteZ=8M zj1Qjo!Ewwn^I|Ma-&+f4N$L-10mI?G-1C5l(lz-{7_y>M=Ml@IXZ`Z?$Nqd>fPUBZ z6>oJc{Wag5k0*Z2V;?iV{N*ogkNE$RGAVe@{Pw0dzp3uDz0vm74Uc>L6Y37;dExTE z>LTX1#y;EAto~)Y*gd}kxb8IF?mE5PygPNfzb#46-p!6D z>EMya^DbCD`9M!dz!MFAc)P&4J>g-yBe%Z(sh&85uY#I>nDgpMXL>3@Jq=+#%6z-K zcU~Bt7ii}l-E;2mZWnpyo!roXj)g+N^lE`Q7m$GAW|zuIbkAYlGIpQJRu>SjLb zd7eAJcHn#SLUWxvANf5mB;)mY+0C8-^sU(8 zK83_mBDH~1@wAzDQ-a=)*< zN85A?Yk}RpN$nfx1Kbif_?9`V?0`L4H0E8dz0kke7g4S+u`b<c=7-$HYo#y80E_HJ=x3pzWd-+6;vsq~VPXEn-#7=nbpKC2Rvfj| z$tQ)3xGS&LG4PYGk7UyXErsyL^ZR+NqA}bkHDy^^9`q~1Rv^V*Nn;Cp+B2AA82gBp z$L+n@5^B|gb58UjaF;=u-gM!oM-MMKrD_Tdk+sl?^da8QOy196><} zvY4p`-o9^s%f&A^{q*sX4}WC5^kpxVu(ddI46Q4VDb`8^6ar^E^|)U+ZhYo5pV=

j9VCp5kr%>meA`@xtnmFj|x8h^yiI-J?vN6kh2w2HBK%V z&s=Bj7?(<8Vs8kvb#evpB~VBdxPW zMM#+zl0>;yeUb?p75@mE5rz0ZcO5Za@*kI7Vklc_oR*GckR-I{u@D78*kJ*0lrq;D zQ+Ze{iO|BR_=87q0N4X#5&?OMe59R-4Q*nyEb3k}oe)W&3t1#^-O`4>8M5BFD-D<@ zL=W5$Q)xnBOz1e8U(`i4`h}kWy%){P>%>6~BmJPS{rC}SXz?r>4Bdv;>tEL)|7|il z;WALb1;;RF6ekSWa*E1mVw*bVXjTy*A82zy>lYnhZ}iYiEZ_TX(r&wb2$9L1j{G1%!Np zkZ>X8>oi-PQ*`E9l==7+#`ZbIqHXC2B2iOLzkcw6jBgFZq7Ti-NX^<@>J1}Y(Iiuz zVE&O#x?~HedgIdJZ>#BM9+yT4c=V@XIifEfSpSGAVqy0Jr!N|(u!w-rgPmV}k-HjD z8g9&qvl2J(R3GR`+#s0YV2wf>m_w-z?>PG%;{hiy}bi6)1r zp%@%D3*;|(rG`*;#IMu|QD2DPOg`kA*Btl1|NX})&p8F2Q$5TvtxJwH8w_Qa3XAye zDzs+mkMKcGlXp~8aOu4PBloqzl26Mv(J1>{eZ#+*9)e+b3`e#C62DSIsnd!T-okpq zb8st-^*n|fC3QSF4^{!L1q^0# zUbvBdb)K|z#KbC`wFFu(C1%1!S?GA_cXG!b<#?4l2msNd4cY7Fb;E^zCSMc}Kj}n5 zoIt_W%3aEpj1PpDy|85#-fXd9VFi3u@1TFJuOU{K7NA_FT3*yAa~UxA>e63pp#sWj zi*iodE)DncPyWst>MZq~!sqT-T<@}MvaV7FX_g#=@ntS73m2k~2)udGY8*I{D$KlB zJhU=%7i5W>XDXw7v5s0!wJB@Bxs0Kx)iK+-M;(3iIOxEG#@pZaw&WQsBg(2xL)Gb; zr`E)HAZ<5o!0gWP)R5Eu;1BBSd!BdN^Tu7~ov|#i>&Ti@Yon#o#}wl5ap4LpUEt1H zu>=}LKV*FQo4%1|IPkQ>cn;>^PdPU0O)7v!m>=S`qtP_1rf>e^G2H`xst@BqxM1A` zU#}K01VAZyhCS+a);_z{+Ti$BC z=FBt8^d+V-O%ZHo(njH9+Rr8R7=7j9e;(I9^sw!s)pjxV$A6qAQ43p4oZp50a$y2p zvoWq+8`lpK!uOazb(MP>>*lt1di&egZ2KxBmx#y0PPd<73&iH@d_E$gM zbO&pk;l2I#i0}D$=&xRUvAtF?n3ydL%)48+M-Fcn5a(T`xLb9*`*gdgI4^q7ubP+_ z7r$2*GUpws`0m+x*D5YZZg;tE?|*;0U|JU{w`1mGjPc#Y_&(zAZGZ2(egFCVKIZwg zSM%a(eU;RF?D6*AK?fhS-K?{Htwen#g}xpGUoUa^;fHTeRJ;h^dpy5dVt!>4zsBj1 zgRjZ2qu|$HY<|O6aNw&XZgBk@j8A;xLTJ?FR|x>MVEgUJ?E>|Mf4{viZQc&7NAgn# zuW`Tu_1(Xddi7N~+yC%Y0`T3u^Yzd}4;^3H?y9cuQQpSS*UvBqZLiJa=2PgtF~7E= z>)5o0*qvW*GtZwFX}`DmX!>E!HNSHi|3GY|qWOsLZ*CWAp`6MLb3Ejl`ueEte;>c_ zf^q*7PaN-i|NFNKvmdH)Vgn_rY;e`f7lY55z48il$h{hKjr;F~3p`FBv(QNK;B;AE zc9jNF2on^nkJ=>Af@j!wfqSG|(ewUv5!a*BW7=DwTNMOZ=AaZm;9b|5)P5g3u^=5( zaN4Rcg*-HeqUJ`yfJg#C`}#p>|aLPv1E1wGajbV{mB1M|BGaU;Fx;*RLOx5jGO>fVN>|9njmAenbY&>QjJ5i7CQJL9uISfJmQ|ADOCBT2 z#1pz_U0a(|nwZqvW31SBzw)&?BErtxWk^@-QQOHkz+6^Kzxn(*j&y*SYk5g=$2!~o zfnrbfBMKQ6`n&aQkQ@pWQCV zx|#K=B@zvs1a!?NJKOIvJfEb%n27>~#KsS;h(V?izX08tCsz*&`mjw|M!1(mgg z(36knIc{>M-;h8o5Oo|yfeVQ6aUPDfJT^23lMe-IO{yN)y%xlD+yTd(72vlpBVW^gi#0?| zXJbUEAbe*CxZuiy!}Er3W8XoRdKN#u$t3&b6M}c~Veu15MN%Mr2-ZQ$xHk3)7u`-2 zgDM2)*tFA-C6Vf7yy&92xWXlrw{>hUtkV+rxxDnIj%)mYnmm3Z0HLE2H6s&!*;9Cu;$f2B zkRv3_Wx^Ukw|BF}3t%w-{VhB&50gN^t^8l(ax@0RSSp_5==euELG0AqR2vF}-6y>! z##EHTj#jSA4>YQ)N>>vVJ-Z()$|s8zI*EnUk=nsUcr9*r$z5VbO(lR)E(Aa#fY#Uk zVUpcD*PQQLF}rF^YfhAy$X`XMUob|{pam)HX`q_Vc|^;Fh$XqyHB?xwW~Z&Q@UW;1 zGeK%5;X~N8&alvdZJ5lwv!=qHcW!qT+;_Vh_36)e=6LW!=GOsC7dO1=OzXXLJuR=! zaWhy$CzdT-)N1KHcqcy0M?Ic&(gVk{p7pGHBf8#nf%Qyp2C+J>)&69CQ*cSsSK~HO z0-RW|izlq<`USjR_F^i=pTKk##yGICt!d3s`gCue9uU!ymMWIv9PvcO zOls;5q%R8}YM$v@#<-TUTQgONL}Xgd#El*b_PN#}T%FjcNp6WQC1=qKJ6eUfED2mO zqsB?{%5G}T-VYj57Aw~3(`upemUXk&Sipu8pX+hyUCCSF2tMf2wB$Smo0`$%EnZ81 zkyfPN7*V<;Ae9TMMsDj_G@o&%LAIsMZ;n&@;K!C5$#>b(FH}1ll8@-cWU0xq@Kxra zc9g$Z=hsUZ!MQ^DRk%_WU@T%D7ey648X!QB7yV3AHiBapsCk*pzLCp(xlOM znxk{PYLez5={~U|4R=pVP)oxq%F<)gneSS+c#<`eD3#Pys%geM{}FK&5*#cY(-O^1 z+rU@}Gc`8!G@I^9SrxEx)Gs?5^hBK#jZt18@3?O76Sy{o=fdgc*V3GZsT#at zKcceKI^i7iqw*vPgEe7X<=N^v6__$fc~AM3Jrdrk|48SfWmZhqY6V)jvV0TVp~ebo zL}u4sV|{4cHrBf?z@EbnKfE4I{OVV|itD7iWNzsx?NO~` zJfu&RU*K!tZ-(#U?fY2|J>**B1LwYf{KQY*B%tYa1-VId03!^4`H|RI?gFfkuG$zI zTK+Lg6Q4Qu9q#Z8^&PwK``h=|g3&V~Zu5?r2b^^Ox-0XO+y1J_QB;9#cf7+Lw>5oW zd;Ig)u%EzDC`k2pG?+syjWYa{i$iqVoS{rb9Zfl660Z|rr(?>#G-R~7Vl+;ncNCk( zHTT~W=NhNthrjb7c2g2q(J>YSoLnAq-fdA)?v&=!E-?x2VNBscE`ipo;BVRxY~)8)S*H8cK&y16Q_2l|s%emWK->w6em~lDG->UP1 zr)ZKoqeh?L4qz&TE&r^UiLYR>h&oSQ_RFhAm_xez07g{f3aiq}0yr??@QSC>rQWR3 z(CB6MKx(MM6){vpGseWtvRcjSd{4F!9;O0q>?KC8T|%6i+_gh&l*{+}IvifYKj83-vd|J?o3+ zz`gJd+uS`isLsSx>ZM9J8-C#jF3r%E2XU_O(EJ8ML#z4E7mv#w&>gMa8ik0dyl(j# zK6ITJ={Nn2N~vynU({+s_{Y|1UIr{<`NB7*{7)fmz!u3!5FSvn`+ z%;YL`hiH(FEgGG?*4$Xrt0q%vF6{T5?9to0U;(rOUX}yXOG%pReQOc8shYgsu<3Nb zUzWN`*eD3}p2Zbn`F(zvX+AMxJ|Sj4&EkpM*AckxYWXZTDQupb7h`K7wTAKv#1gg^ zxQ@T`@#De^FWf%8^;s;uV?uzXkxr9xjuNea7Id44O13>ImI)R|xLHXrMBFO|t#vk` zo%FCWAqZ>XzclnJOh7oPfe2$EDbEmGJ7BdKHWiTVa5VgiRaNZx8v(`l3o3Ls{L%hs zXFw>ZL!ey>NXHV#ET1Z}K(u)lqna35xZ^+PMEZ5lCj*NkEaK#67(si}j4ZnV6zaw+ zhCw0(eADI9WzcS8a?Or^-5dJyg10~2jtQi!TsPL5NI(1YYa;n3;*Ed z8G{^OueIcfgSx&!SrisGCX~fGx)%=iPq)pG7QGQwY=h{q=S_>Q0JnCfLrJ;-$ zFven9+DR_d>k54>N6jS8L5Nrg&~GV>U}OE4@t1bNH6^9>c-8{VPA^oCaqe4Ip`-=Gz^$0NglP* z!j0BO&C~kV57n$b6s}QN0{a4OEBi1l@n)YeF(}$ZD`P-CW}f57)=Z2AgFPPS_lHz= z3Tz))&~NP&bB7y^Iij$@<)q1Kys9-t16ZFoUB>%s6Ge~tb*^4KAZy?I-uH}q+~XeO zv{RouPTcNF?VB9H2KXzV8NkFATr*>udIK~p$3Q`cNyEr2Q(js?egOoatmAF&16%7IV&RihT&oEe#UQ5fgX+|Cq-L~^MRUkTXr54J zj@8n59g_}8W7Sve z2n&2gPB-ncJSbPtr^p=i)=th@dj~p%zGlX;R=egZ-2ouFvb3VI79~4zDD#p04l$s_ zFnT+=fWS(OTFjO@*Z$=^#x?m?&8&0|7DLa2C40!kSF^7CP$;RB`bAu0u=yU=o;Df?Sl}({ObXX|Y8M4bCC9L+j}2}|yA%!*hkbMR zrRO4vSYDD-I1jl8PJ@)pU-%w#IRMt`gR(t3CmX%O4o9=&*iid{iB=#ENy) z0&-)v=iQpH>`Z*HuF753%|Jq?7?hTU-nYQd=2uODSL8wA(Y22_Stm7oaTM3rTqxWv z?wMvh(;~3+{Y%Zz;9bAkKG>N}So)~V1qb!o81v6NWA{H`|M8A@yaTq`f$#(siZd%u z^0+c#jg5M2|1ADaUt+w|pMUyz;fv0wI|EL*%ki*T+Ui*fRa{9=HAZ zW4Ff?zlsoTwQ5bk%2gVp7>ef*GfEq_u*S+eI zwijIZajcK?V3^B{U%KlF8)wfMU*Eo)chx@Op%h{9hk9u9t=7=|VZ9aaks~4rUa4)a z)i+%M9f)a*2RII@!xvgl0EAV}zkMM@{wK(4ILieqoHS%qJ8Dfiig8&~Ed9E3cC8U> zO{l2T#DwjgR(4Tj?PH}ZcZlo4F4tZ5YcW)ic5GuO^ul_Cg-dhhs&0Cdn~X<2>QUpR zFMrv1|MpmGCoegObvf23-$qN9r^!iwjPlg4R#CY}#f5mp7*W=mmT@&)uk-^U5sqez z;CsfT22$_#r;#xhN&+ z!N3X}7WKr19y893A3RpRr7rXwhLAEigpTa0xyp_#)G?i>05laLX@|oym+!anM`5ab z8{*+Stw~)kPiCJ}OYvG6u^LBnOn)(l=+rWcVn+U1ul09nW-X8&b=84&b5X00;EO$X zUCSOrlHO@`G?uBD>OkhV)>H^SIg~XZ*OWa`tsi5qPf;=9nyBxQpZNd)AOJ~3K~!^Y z+G=8n6AZJxKwO}%%N`SgEqudw-m9n4!cL)wv4`f$2Kca12zE9MMvuu^Vor5_SYt+P zkInzixZ2gPHh$wbe{)=M`!4b)Kl#br!w?qm)B8Kqc3g~Yq}w6ZH0=00-DzC-iBF8r zeD*U9%qq@J3nxXXklx9sMkM~EO#xP*PN3^Ng45#F#d_LX1dS7me9Eu{1PX}6D|Z(F zi-a>{O4~?M2dA()3+_fx&>*sFQeoVBrzJDZBVyrjyjnK4W~=x}7Pw);;vzPY7jmjK zG+HmmX*G=3n*yM3fDnV!C-R?;;)}gdrVuPWUH6pw`7?dy`Rd_Y*PP{Bd2j5c>&owW)*|Zx$ zM!=UR4@fI1=x#3rAL_I=PN2=iFa0Z)fI~2(e|Q5JV@ydw^Q`ehCISx_tHv&yse?@y zDe4HDif&>giP}JFbdVNt4q}QE5(Z7LT)-ghpb(|@lq>k6$gN|f0pwUU6Ve~eB0*zr zz*-dB39slJUZ;LBUc&WyXB==@hfDILS9+;8b}W_^I|b3M=DfW=5Y7;vVkThG@`4L? z#!?=GT_jfh3J1BDK;T{Q_4jMN<^}S$^^>o|&NPKSM?Q8fV#JkKgwyyTEfXOR?`fWz z8$~Mc9B?Nd#JxQf{2&K#;UNV1qvIMFsECeh>6T1_U5FW8L~S(2-)?sm+D;xXN{6(0;jRS=QinraLp>4(5>VRt|2RGNPa>)_I2h((d>ao>k>?MUqPR zrRD)(Eh{#JEU=V+fp{OZ2*{7_L*z zv}*(9UdF@goSxdzX5k+G1-{o!L%b2MLtrQ&wsX%hW<8IcL%Y^8Yk+%>PdR|k3NK_1 zVd0vOIcn7=;qYL@+o^iSi{_4CCCSYAx}V7E*Zxheav<-cE7q9+jUulWY5RDQ;#5&}&NmWi|eRhx*G>w3_pyp!@%~ zcTq18hpE@rdacVn-c`H7V8k)bv0jq~_I1#Na_;bajFYZ+eQvL_7j&#estp|Kk<{}*B<@o@rswf zV!ZEt?@d3=o}S)_q3+4R(WPc!ZUD|OhvJ3sNdXci<&@4#pFfq9Sc*%CJNj4t?!C0Y z5{)pisM+aTTZ1h3WXX1zaE*90>xnV~-)==LoFki_sRk;4F!q2aauJX!oHG~Ob7B~L zX`r=wd;L(88A&ai;}VnRC}$*S5r-Z8Ey4!w)hK1}4i|ZDVjaG!zJgV$yP#L}Fg z^lA_*h1&?K(mwf4c^e#24P()FO(!(6Zk)rFe*rZ=<&Hj^uYY5E1pPI)ue5sTwpVo6 zVTX;!JmxVSmVyHn434dfu?mmUf`nIR-1UUJj*ouyBja3g09z37bMM z1o`obbfT$36lU|935AKaClQg&a#q+d6kF2bNYp^1^X1&3XRyzh}W?!SeQJjc<_4kyTnpt(AlXLs~8jF3K-; zjv5{oAW^raiBtAiI8kfGTCTj$mA6M0K70K7um2h_M#0raM2+4n(w49!<|Q{4UZc$R zFRoUxx*ay}(mC|n*BK8hi$w-#bRt%~u}m)%kY!S% z)(adKtArP^@I^=!h}vMgK*P73z_qBZ>N%lSpmTV>IoG%=O@;`;2W}4;FOrXkN<73X;$p5#1vnv* zvBAO=L5Qsy3>BhI<#I3mS!Z)23R85>!#Cws=__%CVfbIm5o4>YG;vi!kk84a&FyWz zT1Pa$Mu*7acoT(wslVq!WH2CDSU#5ko};%}w)HEAH&U-U!-!3VUgh zIFI?vQ0fW1K)e%wvdaw#$V87>33h4$fYQz89MiI(+(7IUF63j_x@bE?Y1*kqvtwif z>I82lF~-~vkW4d2_BGHKt`mhc6j-zsEhzo%JFm!V_JcO92;J z*}-#}7i1MR!Sxh3Dd1)i98Nm;;Dg7nJnUD-?>+r@scSey5$)|mYBVWlG=l*W@;JuY zDoKzfUxo?oGdT5&ba|RocuOoLd%dxB8A|NiPsHvVWXT!SK>L|X_Z`M_oPf!$6J*UE zx>R1P_v4a%p?j@xift6zDcg#*5oEp+(V%6COH6e!w_pd}i?VCKn6zl#d(iMfM^%F0O!g7(E z{zzj0|7w#_ey1zxR>Z=wm0h6=0}lY8KA^rc%7{x}H~%o8!AoJNJjs40k6-NXPi{yb z!xP28ShU8fnHO#nJY3}L{15z8Kl(zr%}j12l)TbqFzRR0PV1A(UFt!VU)T>))BHF? zct=nb6vzP*Pgpm7n&>Y9ZTZHh!XK85HN{n2cQ0<^*jCf9K<=%gjw9h7* zQlbP1jFM5}LU9Xts_`kTt}TV5b}q_L=1=Pu{DWcGeR6D!%nhI2+L89?!;bw)WYWGp zcg9o4g-^hO+}=%=ZBM`#%NWX|w>x9^yV`#B$bYg@4j?{McZh50w_G2pCX-glH}pc^ z2tVV6FC5R?F2p`>dtC8dwhK~uLPuin=p~G_WvxG#6ui()4s{f2P0Rj)c|?9dUg(2< z>|8`sef1q~iqwbLZNxS-1i6y$Njq3$ih#fpNmf&VyUSw%*++p;cpo{S`@}%P`SZ}4 zTlt4T72XY2IojZdSuoDXN+kqqU8_vrdXTuIZ3je z_3dwcdt70=lSTaka!>1!T+k+$D|g~ZjL9XAyPoh%^}VPc{_uy_oVXqL5C8D@;|{-g zhixC{!100ipX)p+&740U@PG%5KmF7HwS5olcVuwH7SUV!$A(hqa$#L!4d!Qm1j4O8 zrv_89T{NBjeS>bTSzP2CxsigH7Tn7p^f7;EKP^uUqY8TtjQ-WHUOe9TrZp{xdsq;BVVc@&1i8~j;lE;pUfZ96d{DX#6jHl!)wuX^5&*w#x72m@e+ zp7Y`2WWWIZAr`5=y_QcN7FZk37&JsReji6^7E9ws#3^bPhUhHLZe3`4^U`E#W5&5gS@{2-MR4 zMUz@E%Pw-?OOqbj2E~*!Rqcea12F=`M0585b!u2tZbadi~kg zCNXk&Gf@w_0I;S*SGupjad;eVTL0_Xri`I3b=@mJs;-!R z(29g%*5(Bn1%mrG%3rN+=s8&%Jiyzf#W5BB9wfDxi>-UHM8Oen>(9g?B$T#q^~l%1 zKCW|}>x_Hf`VUNMJoMRS+^kx~C%&MSL}YE#deM zUJ8yjqEw_yh5Sij;g~-$WHuFGhL|Yn09LU^+9VPZ$HY`Es8XLBy7}of zU~aWtn`VUsVpyW5_4}B{C;9W>t%$$YwXQYJJO6xpURd?r!ff1&EoFNOYiQgm#?)yc zGZF2g-h>#=FE9hA&A0fq6(l9jEzH7_#tTdlWr+c?pgsYUi2vcZnyZd>3?YC>D2Oj( zh8Q9z>)pyHDejCI7q`?l#x=ervOE?1qomq52mvKn8!pI~geVhy*lVOa`R8umjAQK0 zCcZZ(wdUpzC4DCI#4~vDDe@0-(?5kRiOJnYosZE#aFhtvIEp{@8~Vg@qM9Z7LQ$Y@ zYJ-CQwfgLgZ|y5Tq=YjUU=;j9NjL@TRBpVrrcvM~tUf^+yhh|G8V*X#*U< zl%0@@j`7piLdU0pHp@7MxFrsH{Ak&E=bb-}JMOsg$J<>MC*1X}HTR+@3Lvd&<-wZo z3TMPBbtQU$lZ_?Htm9519C(cb#>tO-y9& zwE!JWPQiYpA^J{wR(#5u<=?6_nIqtUogC5g2NvntO!$VcaPG2^BrUgZfr(aFV!(Q- zq0oVaPFR1apKjFYe^<+r&icuwvFDdopZSg!`&RLje`__Vu_)&1d|(uCfpo^0@g?A8 z<^USipy)-5c|2d|I7xRcF0N5ON>5Q=k`Y|~G26x1efPcEc=x;CojInN8e6=rnu&aHF{rwu z96=^EOfvt$S?EKk1Kv&zB5+b;28ahEd4?}bXmI52*!D!U4jLXsXS3R zLzY0hfn(Wi`AcjxTh~?bl)ez2f`U1Jc0AOld(&1?1L5o!$Gb33y!d^rJ9R2fr76Z> zS``68I|B0%ld0yccP#m+?=c`zL|;Lw=_{gw;RH`|22-K@DjPdS5g^s|bDV1(ddN8L z_Q#D^{xR>2?Pi4NnM*x;8^?$7J@r=8Utj-^Z;Y#Nj|F`9yWcZzev6xj{biOrLjw!= z$$rH=>`B}Ay1ngfZyhh(K1guUMV}rwxyen(jgGvLb3v~~um{C;Rv1<9=wKFQ^x zPhYg{pMK21)5YgcZ%-P$|NZVae)xxfc)Vxwvg{NFDty~hSRPsz;{N-4-?Q%N7uPS- z(@Tva?PHt`07TKzY&>&9m`l>@9TTbz3cwl{zI9hEVdDFJ4`u1$2}1Y~^I7NAa1x)d z`;*s?`=5Bf@r5sbaU62ZLmFp;YxRiQ<4P~QlS3GDNgfaizSWWJ3GgC&g_ZE|Uw{ZD z+pQ@UUqyFn)Z%mN0SiW0y}3%i%!6-qqa(-T9{0F$=4;LzXP>h@V!r%Et_dn_Z$WFP zw1}Lp1+d&+KTDJwe#LfCI!z0;A2vWUgsH}XdRhC7;EB1@v_-uYmP0-%`#4!opIN}n zGeONdBj55+>3w$<%hARGN-AUMLacBy=Vg`7+yRro`ThjG>`@eI?3cz2XpOX-%N6JH zp%hCB=YV^IulODM#rI@uBQ7AC`o3_x@Dp)U2CIFb5QAsasl^4ZjT5^j3Hyb{7Hh%- zUaQ54I*}xC5OWn2x}K7k-pgs+0sOEie|TTmWsJ;Mj*0L|3oASaS4nh>t^>398PvIxK;)cPoS+BQWt1Qf2@0Xtl@0c^VGUr0J%tAqhHkX$x8qh z7QJZpQfCmSMkz55!eiueMaQiCsaPQ9|MD;YGH!Uo8;%D(@PXqdH@n%m*FAX?!92HM z1uoQB)D_+tYiZ*KW{1}$6@wv}`E_AgJdwIe}EBF8=Oz4zNhY-5L5S=7( zT^b=wQJzR~P2nQg*9)X{I{ab)p*WB|5nLJGZ#T}JIT9^|wZ@BLAh1hACW)KJ(ST$D zk~1PIl=lM3MT~^QD5#04RtV&-7%42UlLD(^l=et=qe<8(5#SU+mxct3P?F`U$i-YK z4iVdsn7~uPiZ>eoFn2GA0#awX%PM`(E8R0igI^>XR z)~)d8oqwL3nK+oz1$wT4g+j%FFy=ZTUM$FHw(yGr!_vC)P#|JKi46t%G_y9lV2^MQ zq3y|~oYsVjx}gGI$+1HSA@@1(dkS80bZIzgr?IRUdmP2X;DOB*&h;R`PHPCbv#CM2 z6MO16gt_7giwa7#RnA> zGz$t4Jr%~}hAy9)Sq+On2?+RfRuC8vLuhu#a>orU@Fs2;0#j7%v*56v)xa|V@KNZ> zxGY@5IMOWXW83O+F{1Uaj}eUR65U;1y6$WGqvEDZWkt8J4%-*bm;-Du;6D0wkB9N5 z;#Um;PoP`ilhg$`xKFyHl@MeGM{ebqMN>wWduj%jgp_v(B;RO}sI;Le`>fsb8r<=7bS}8Qo(b?q!iQ zvTzr!fgZ$L$D%bug046#wu}>lmsG|07bjvT&WaWbX}#tyWC)v!@8~HAQu>1$R9F>o z)IT{TAb=?@FNF&jQ>g^UGw#B5Am;ImZuyjc)~QRe#h#(iMpL~Z!N0AQ^aFv~r5$FO zy9k(VuMtpHAq>0j|KBT1G!Kf`a<-uhE@9?w~@In8H| zEFbFc`4choV_QW7;uT9(E(U+-eyMf&202*%5CXX@u7zH!b^2Jv$gjH-uGfoW*9;c>*720{!%wkuX-Hl=S5Fx-#q#cU-Hs% z>ZzxU=RfcCar_B)A-v^Z80|e90)P1cc*}d2rsF-2?S4o_J%}|L(nDN0vr6{e572di zVyk1Umo94HMfsAWyH8e_m)gIPCUvpKAtEj%5BH7e-h+vkp1WxoYeHW`hs9j>6$v?!jFHvzE`=9Y_;wD zko|nrHhd|;j^3niXMQ7yWbxdD{fAF}a{S%j{T*eE%-a_I`R(SGpWQATA9=$g$J@_7 zi#Vi`F+Puc)Fa1>U;N^6$q#-2#!6S1mzEq$&8!*9oHkY!Ba9Wf2X*9n2}os2KUGFr z)6}8NaBdeisL`^^2$}Ojx`1%_$yKUSM`1VOSaxiSc>7!5Hh%FJe__09d;Ijz-Qwqz zzM4K+lbv*Tia_ z-*P$@m6~DxlfFBg=H_PWzkx1^AvT4OJ@(vqNP@2$RXd-F4&(tbtOx{>Cz=DK8=H@aT&G3ka`tnhnCm1&Rj2Jyp46(0)wV& zXana(S^^&QQm=VcpG%*b`Y=csSos9=0Q=^ormk9q_|_VV^m{s`OlkN<$!V^imkrEjb;Ic?J>AW0*h0>%>z5Cn(C=3pe<`b1X49UWDpdx6eR`I zmJAVioScm=2o%mnP%S7DfVpDYBs~!gl(fW|T0ey(AOI=-hz0tv<}>@cPdSJIM%yUr z3?er>B%~@bi4%*148jV1fxN;2MEX-Yh%9`!Ze{=gAOJ~3K~#ymK%If5pemkRC#++9 zjSC_a*#SaH$F7A5;#IDfrmI*G&dRFH5kK-ZPQ_7xwU&KbuJC*Lgf_=UfXY@4M~}rP zT*H;FeC6$tg-;*9`Pj#{LP3j=pb=+8R?tar5r^WoqR5591||xY(`DPW54-l*Z@&Y! z?;H7WMGJm2dg*7yV!kN~Ah!AkA0_r8K(X8BxJ)Nha=t>p+->f`a~{MIIEO~80GdE$ zzkcRI>BlwBPJRfBsM~(V=ha}EaOD-|3<-X)i)6qkd*B{-+Ar*aI1qnnQ!B=>2I1II zaghh#DydP7`AToxRWutb#$r#ov_qQJ3Yk!ZCrUrfX|9oB49*$w@`bdO2Qgl#`4*yC z(=km)xYb_5m!IWI#;v45al#OwAg~DvN1LPhOuUFP|I^|}?hA#09~Wm1NS8E*TSdB2 zK1r@n{LNLz0Kgag`d!PV1{Dq#1#)ZIB)ydlT(_45%!=I=dB=x2ss2tR$$ZDdcOuZ& z&dt)9&lb~1}&DF-n5@gC6vjz1?!4KID>p3E(^Q%ax`NHf%Xf16o>}k zq$ZX*?Ju3E-*)z!!kMU0FHpm4h!OBfwXYS*9%I4FZ-s5asz;P|^&BTq0}cSzk_&-d z7oQA&{U8?sclg2W1Kom?F|Xpk(;s4q)`JwfTCe6_#$jSNPUUmOKgAO{p602}VUsjZ z``AZ6I&O8VTa7>cvp?N7X6_)DmpDludI7IIf|^gOQuC^XvstB`i@bA&wJ?TO?RUWb z*J|UeG2PFskve|&1y9+kY)$Mm*78>A>rO?58CaL*jy6`cI*>|W4hd6u(3W_OEgEg6&~lI<-;|NQzRBOTydTLyH)2Yr$#xSW;QP6SLA5<*ue9Ize~(i0fry^((D|kgj`9Ntwk9 zUQ!=omLsp&Qs&v^sRvxU?jZ0d+iU1u-9rwy?WO$*<#cW2ASW7M)L}>gFahXe z?5L^a273X)Q>*`+l<05vP{~uhKM2r8wU#oVr}Urp8ez z26i-^_JfkZ7edSAWA~HC>=(ju>Iah-F0k-?@_(s$D$a;~5C-h7^#W||HMTY-)E#&c ziyxZ?Xg%blbfD&;&x=yD#9ZQeqM`dOV+33j?nO=Y2TN~2eZwqVw|gRapan;G6t^oR zeIHD@m>6tY>ViSF2RSw8zUIN#9Cy0o9mgwP@$xv8u|*9>%q{sClB1r<@~C2sc%9aL z^IPAl?_NFUoU_NRZh0%l)4L@YAHd-6*|VJ5chX5G)!m18zvtb@)1LCwvCmbnvf=kx zh2#JAKmX^pp?a?!yr{6au9|po`SXt7>-~S% zYuOcVXau2gt;Z4vF(oaUP)mL@rZu~25{N`3o19;>F7ruYoUz%?nU8Wl@`g7WXTI)r zpdd_OeL4&lKtouvQR%ce+B)r&o{&oFM?lr=7o^~q z2%_$=&XO~56@9mjKV$WjCqH?6RP~>YH~-C>Nj|Doj9d0fP+QQ}&R<2Hb(sN4e`i13 zL0tE(*l($hG!1ubS6>#Iwi2X0C;KOYaO-1wO}N$yth9Eui(HAnn#LuB z+~<%Xu&eWUho<$O>uuHRbV%@t7`WDvzr;x;Phrl!RDO=v;1~VfdIpZQe7L<50<_Il z5M#O%JG=*>q08LBN1oA&hqF#U{g!9v3Br!~h(KV=;RbC;A8X zHS_Xe$!6#}qGN@A3l;`Q`1o$Fqq4!WX_kC$vJ0 zj*-ZT5NVuRnr8;DU|5V8a0iW|MeV>^xsgIp_2Qf)0g9MyJ z1|#eJ#6wtc0!Puqb&!uu?s&YU!{~-gv}B?LfreMaZeZ>OYZVIISg0WjRosA8vY`}7 zhb00gKWx!sAfijHxNEj_aX`*uGGpv;KJ3UpZ_Sxj5mNb=d`ahnwQ-Oxl5$IWfZ6=; zKu^sV7&9V@i4pHv`btlE1QU;sr^P5F1pr#lwa*6Nw}1O7;|Y&{Jc}!8PmG61`=3UK zDAYSj$N(GvGqH&?eGy9QqrVS3^w90mJo}B0e(WPyL2ocyq2^{(HYm{Ygg8)>(VyLy z%#=tz9qZrSUIccWPdQp(4XK*i?A?FJG8ETTR)O<Q+p{S=m={x1NxD zh6)+WgKbf*FCN^zvq(B8d%#=SmW_qJK_zWSn$x5W8`ek^{75ET0N3tMc5)4k24w?m zN|FcC8QAhs#zk0rONIji`^HBeTkxr3Hg@?#1Fgc_dshsw;`I|>eFMfD4J?i;qQqM0 zgfTSKTF^~er5V>+MQP_yEW-Ge-#{^)&txqelutp04#Z`C#wxhbMhJbn!VPiJISyn2 z+c~%F#6qBr^&d5a(;mLgb3C{Bt0u2C9O@SO<0 zF0gK-Wfs9(gz)-aO2y>k^}jKQ`6 zBTWx}!rRWnzV;qXXggV^x@;Fm)|2{WL2+M?@A9@zON)T}wo_~t&`Wh$7@A+e)SBSXRBXkiFH+Ex#dtz`pWIVL~FJ;nhb>W=sF+&SC~R>dn@M zZzgZ3f`w7O+(BdcpS=(liZZYJJy0q?i(iFhtS2sZ2Iu^{bruZuQ-Kr*h=brxm{SE< z7ZeUE_Lzfd(m8|C#u!|ee6f6})chm2RF9hH(PYl#oLt^&IjJcx^A!AnTnc+@mRf`A zoa8~(tT=|+WxVXv;d5CWaE@@}8{c?)iqk&h+;iW*#Kg`iA0;06mEy^qY63PxozFU7 zw$onm@|TZiJmVST1uu9(J*HUWc>|kqF_asZR8ulTSdZivr484@!eCEC#z^{Ts7Gr0 ztWen05sX3axs*qUVMMCG$k>%10eaOFu$Oin%cLJqEax+$L;bI-!NAn8p z#bL_E*w85F0x8EVAi*4Wd<~PQ{2OTsX zynQd}Q=a;?alroj(~Xym+uZs#_^5Y zKJkfpbV`TK<}ZKw%iCt{G25NIw-|5utG_O-(%pQd$9T@OpFMu(cYdcHdw8WQ@3YiI zsxJ!#%8AqRUA#??ZLj_1U;S0xq4R&Y?_u44t7C%?Di^U?kx-B4+(CaAme$%IBAR%+ zj;2jLu80fyQM$s&Dp8nMSjc~U^IPM}`&?-}`A%+Va=ow_8fHxag=k*# zPJeRS?w;{dcQe;U7JHAvoGgE^Px$V4zcc>$k6&Gnr~J_${ZU|*IRjF!1(TG8AsZ>- z@j8w;;_&gbE&hM;=YKxl_{KMyuek? z7%RWmw6c4d0kidZxdthp@jqp1w1Tsx?w(_`;uJU`m{`Q74=GbQD{5N6Q^#W=$Yb<% z*$#iz*sOhAk|DsXV^o(pQaBqYVq7_ybE8kwS|w_*39(-Bq<95mK_*P0KNgMz2d;D6 zk6?m)I8^zf;bn=je3mXW9~c&t5OJ+ly$OJl2+*C3NQ*=Hs{159bRWjJsAe^iOdqSN z?LZvY_yQ3U3*dm(TVrSpV*(85G+(qQgv=oZPIXWE2_rb%E8QaI;UN5zA;KK7WXRT9 zwazg<|4;ukZhh-pkLw(9o%-PZt#5NIIZrIB?zfR!tbg!>?P9D*%B-`L8{2y)-se8` zc$@h}^gXrZ)1zqQEFnZ^1SRilc@|3^RLih1=663bh>q#!$@x-UlcP0EE=uKK5z1fy z0EkNfL>_J`j{r#+BEAxk-jISXO2XkcB96jH%_L(ImQ#2N=mmlZGtN^4=1_P+3EyoY zo2QJelQ8%C=$x*9l4BerVyvIA4?z1So=FjqVbmu5cum{Won>>4&vD zvDE7bs_%lVwZUu`EAvkrSPRXk&ctIiLj7-yu@)g1sD@|em~+jGvA^}?-x^QczHelm zmzXadWWk^$tE8N;VAG(@>7*q4wKn@}jKhyOd|Y+ktB#L;RfNe?6=Oqb0J9KAF|ps8Yt z_gkoWE>E1kZcD*RYxS*0?i$5n0dustk?Rax{HZyp6If1pj`s3b80ME%E+T%I3Vgu1h@W1ZFUSWR*BBQj zH0L~)c02AwVy!K4r3la)c*D4v(R9H}?2s?Y1CB@)<&6KrJ5dD~1fJoRQVPRY{EBAQ z(e#Ci4UXV(oUS_-n~yOD-3aFbsaj_(fEk*FXXl$Dr?~mCFY%ZgTJg~N-o+6Nh;B}s z5(glna~?ixC|I!H@5m~(ppJCCGT%uQ&%qoa8wFzBwFq~2eS@v_lAS3mh-dN=gDLO| zdo`l8zQ>-gNfWdH=4j7TmU zc+;EyW-D;FyB^G)0GLoIt7K{cF3L&M*wXgN!IDU||@dd}y(u-5e1q`q)blVjYzk=L0#50t?d0U=s^uj&qHj1F@piUd!DQg_owG^uLnl-n-uRVwiBG-n2YT_dqca*;+Ac zHj>IPk~iTOcPZ={S}qc{H6H5*V6LeLwMsQ~YHVOoulG%138MX6howGLzAszdz$jPD zaS6QQ1p6JMq$3<0k@f&SIDWZXn6X2MwYGQ%GG>wWn$(|Toy-Ty3#}FrM&}UXR6fDZ z+(+?5?64SRf!4Snj?AM=@6yZz)xtWxWpQ*Yv97&$U@Es^*{<_yndC0xmD)^NN%LFm z%ihMV#6=D)z1IGiH+5^%ot6{anqiU9jf$ly1Usqa zS~-Ca4!F+Z2)&dTo`z(eqL#C`x;J4)I%>$@&FrY*7?s4MF8P z#6?=W(^GU%j`y+xN%5XguKwk01Z_U;kBR+GK07 zVjGRdbjXb-J@BM)?)%T(9##Ag0tL11lJS*)zIgji&>M~0-|n{c)EDa(>(}Y)`Junl zPk;XS(wDwGu6DJ3iC_6*$1T`(OtqBlHQ1 z%3O3FG=s{|*vGGdP--SX${hght|dxCn3KJV79T)}TD<*y*Sp^}j@>Tc&;9cG-NoK8 zXq>ap=G4pB9U{<;YhCMF7spDv1%jTfI1^*5ts0hj+sAQ z+m<^LXGWLnz&RZTEiHwjHGIpdI!9VA5>Xp5ri64(rC_H2LR^(87~itB^SWgK#D^d zk6=v^9@XTI1(pTuazbl~V-06JA9LOEmwCci%a`aig*6T!)2M9glY}s0w1{kwi(T)5 zCs-Dv;3c9?h>o&X*@Khj7h`lM4l_{L~!?W*>^>M(-$aS ziQ3M5Z8Fy+(<;L?v2RPOb+F3?mMKV!?bBx0KSB?Vm908g^BFhg8bp7+Hj+?9cj$jh z7UuoTXFfe{f825PX#Ge1+M~87VB9qLHU7mZ^0w}bjdBn|0o+{p{ZBk`yz^b}sxMI& z%1lXm8je7e;W&Yd;iLiGVf_=ROA|@K5D_~S(Oi;rB}CJ2DlQ3@ayY;TANADG3RIzl zWKDut;lW0gBl{eB1rs!A0 zX8N@T4zQwM*zjVxS%v&nV@E|0gCe(%hi~WOY<}xWycnxwS%o+_5TDUQ7Q#psqi(TO zM(dw)kBM>Wb*^*7_Nl>rw(lePnAO*KDTpipPppzgK& zG9NC2gq^o~Pjb`SJH5u}H*IqNxLXKm{FYp_fu$H)2gqm9x?&{Aa~T*eya`7d&RW@n z*ih)}SLhAu0y^6|qJ%(;$lH=jj_G7k1qowV#|bG^MB$P8rYdYn;3|ohagwb2BdE~- zwy|Xo!?pL39<5lWZN_rf263%)4XHs}2g{~q*S(UN9*}4yK}#QlP%gp*QrX-%;I^dJ z34R;8lGu8SST%i;GZ0foivGuFDsYvLg6+0i;HvP}#$@0y9dJ?O^{xlOA*ZR$3b>#n z$5cLurlE02%&nU)TATeUtfgNZlYhdi&41bm3%?a#`j!q;4#)9azj<5%3?_&|XKz!8 zYvTOkob+Yg1TJTR8N?i4$mr5Ha^0G*SQ0}i-pCF%XiG%6uJUA!>q*JZ*2I)us8Q;t zB)$A13`{e74$`rTE8a)**fv50&>A1XN&yNz0q%)2=?--k+J~V98gL8otmd@dPhl-T zRMTY6%;PziG)3Istv3sstfT6DXs;&ytnstkqhFS%Z%|u+Pp*mU zR{hsT2Xsk>R?%&*hT8bz2+8eOMPd@cb-LQTT*mWN9 zPi!eKDHzZ~;t#)KCG?kKgcs)lWRHE$6MzT+O}=2vHKKl8C74Zo&_@1^mEgZ+ zq4-*MFc|W)frmR62o3_-Oy)L)atNrtA@Nv;x!Q zE;+=a^qaU!{u6$wCyQfR2<1KLPUH5nL7>;+<%KNC@3MojDvd#0RaZEv%Td%a-?1-% zz=Mda);M3Ov6zDu@ZG+Fu_q$o+a`V$5dyVF5)h)+j7L-`y#nz@Y#~n4(k0r!tZj2p zomY_mP!Hf(_$xn&Y&Yi6(LFhnwHZvo`{Ft1KxeaN(Fa+}FLf;5M<~E)z-cFc_46eY z?yGRTJkW^FaTU+h*sh_3DfvGOjP{p>%^!sW`mdkQ!V&SJZ|BeA!j9+$tu<;VHwoxk+89dn2Wuxc&bDUvA<;M=sr z>rFi~7yas2y=uG5@TucPXS`_p&e-E4=fttt9KZ7q+86{8RBEeu21^`*Kb`s6>q+87xckb>(XLoO)1r!kRs$Fs582 zPL;{hL9R>KBqq(8MH7|t;4jn+O()3eOI@G1(&uI#Qh(7etQ~yN!P|GJ-F3X=5C1Ur zr)x-Py=s|x03};e(V|N&72e6u?|=XMbtmFm-}ct+=_$9b;~^z|ZIGe<;lMfXgCFvc z@ySnpa=h<7@5_9I!Ruao=D7d%2;=X5=ey&wKk~y82j@=JQGLG=bua+(kcT~NyyxBT z9-sQ;r(B=Hb(f5StKmYmTqKhsX2OM}H z--@P}t`HAaVUjmDOJL3OQOI|`)1Ah-+Xph{x&$(~3L$*50K3MoVI zYQ=B4v+7!n8L>q#WN}gb0ZiWD`ZpLy9dp$9v+Ys6x=628r_7|*aZKSD^TFS-kp0qp zjRQc-X2@uD%ZJjP%6oGpm_=+6PmIi)w-1co>CSf==Y8ou~02zJbC0@fDr`TF-# z+jf7{(%DO==!sTRr~4CZq+hb3kWzL+=lT;X`o+f--%@?mSu{vk5>^$I!X65%NRJRA;5%4r@4IehzEtg-4;{l;OtbxW{-5vy*EksYrVGkCBmJq)!|{?I zaaG!vp0Cvi6=&7ESzB)C!9Of= zjjudUTeR1`+*qbbYC7oy)x9PV5;1GXp-q%VV95j&>wfq z9-rL4C;o&J?lLZSxhsq_&wTYb`sib7^4|}KAx#rMal)d=P3mp{X?Jl8C`-bM z`~!$8L*#SY@_BR9oRFOv%UQ8pU4RSK+#F zvyNdQFE&*|>x_+NC|0FMTnAhztkdCPp>iVBgNHdN5R0}ndNtK{;V~>vvRo3W5}4)? zk306uapYfXl1oZMWqQHRaIu%dKgEl$^_q!5Njmf-MD?!|kgF`Cw1(>gs>BS{U( zVzJqf9axT|CctrpZ~8^iCeYMWJGb7-9YRE%wVKU^;5~n8lYrb2RLyVZ10pr4q2-ZM zLpF6mI&uX3oC3O*RZEhS@B*kQt-%@=Xip3~|205aeV`-$zz4Z5tr4oR0F0fD0-&>A zRSN8SFHTtIvU!F6M-A=Hnh3IGlR>`Hd<7BeX-!`NGz-mRVxV--PON2ME#+tCdA{%F zsudW_p5q@sebG2(D`ww$&N<^|KmF4Hkg+4|<7L={dHkf6vKwBN_v#P~(`q|mkoGly z0oP+(ZNL4-6QA&e@%Zg-35?fx+wy(d9!!K<3xMK*n)q0H0C4)7{-@uv|g%ra0SU2(5J*&np|+kO(X02u8Yoz z@Uj+1t_HW@nsjQuO^u{&sykc6SOZH8v}#6Fcoolc81+y!UBeUeH}p%r2Q?qg6fmO? z&iTR-;+UhOQP`y5JLD&7IPe;=Z}?g`RYUT)B)HV6=}(s0ReF(=nZL0va18Oq@W2P( zq5{ZyVkB&pMiT<$Y_RC3`czyAW^yjI1~4k6MfzhM&n1^AEQuWDY`^%aN&P(rW!8ILca<54^7|!f#K@H>x*AWD^`!r&x z0}QU^D;xx188<#^yBK@<%a0G8e?E_yI=c49kUcuuc?a_X^BlY|B`gp_1yN!0GUGL8 zzGgh-x1T&-c*YCIUA9fB0E_&nHM`m;S+YhE1vXIwn;z^2xhpzeI1m5Me_ix1o$1ANyL?mAxj(w7wOV$jM(TewP- z@!|SZ-YWwx8UOu*AB-Q_9w+>^x4mt<)AV*89(vaDrku+2=R3#z_)m;ukG;)!{_~zc z8D}5OLx1;oe{a0#g)bam{l6Etx&xXcIQ4n~eoamG@RJ{2A0oWyqJNYGIPhQl*RPFh zU;D6eukHJ2U-`;c0_X09;k;))^XcQcr#^T4&e;pcA%`5&!-wBnTniz>m}>9J6FBsp z?|kPt_O{24cWpm!dCOZ%KQ$YT;#q$N{=fm9(kb)`8L! zy54yizM78{p5HHg!37s?-*tP#=qY_y!?$|KYT#OIVhgdK$6ezZ2aexA^^|eWw*UU> zSD)$HDE$PS6-tFqyR^r0c6&#WUA1R9v1u-Kj~bdDApIM#pc*l@+erdT!*+k7!2)Aq z1=xJe?e29@MhS`f~M>AOJk(KGX%&i~5yJ zE-mUV#5qgv;4n5H3+FBlQ`@KCLVU3#X^1KYXdaGjbsH^CM4ccKX00g%WUd02%95t5 z?gUk{mQBJQ{Nlaga%J-~mkc|5Pi?Y~Pj26Jez&{beQY=Ho`ThdIW)jcucXwV#&k`pw##a!hVO2qoOkTMOfCyK`1CYqEDYKcbF;A z1ZN3UiKjq|IjDIdQaOo&L9j{iz(3JRDZua}tl(k^Yx4l#NPK&dm#o1#ln;PkZ_pry z5)uB|nl&m#0W{2~-#k_XutsZ&pVa^ZX>w!=aG75&9I?P-D6<$=a2>zP81p89*ZqpTXG?=U91&E(C zg|RMwFi!piy@{aWkN#+5`VI(9B!1LNu;SQeZ z6-Eb>={1BYTI=cPPuC{diC}L|KhcND6Ix1|)dp(M?alAGHgcvsOWaGA%X{K~CoSF5 zy z;lj;HX%jK1xX9te>Zd>R+3k~sM~(Nr_kH8Xk2wbXi9|4uQzIxss4Iwc=JB<`micgK zD`i9P$P?ec%-DC|eJj^L?teVaJ`{$hP13zslco-_YH^u=(UI=An)9V&iiY~CaGr5- z?iBau(pydAV2YnOPP=sdB2Yn(`2bBXS3)pUSYa5L)?PP_3fBUW{5zdPY-ETQN3Df% zQI3;8U>Nl)1Hd})(RXuFZ*nJO;|zNOVbr-x^H}R@!j)Gv!A7XRkdKPX{VX_Z`4AaN zY>0~|^Ehg3t;l%-8mo1>`AagkzPb`2o}&%nZ*O*?uf+cJqheOUWqn1AnorJ&((SoK z;v`~kty?*V8lrfz!Xq(cXtOCy!>l2p9qa`L>(^e}I1glj`LN(L*{bFo;hM%VjNU?j zi3iT>59Ejo(ww4JuK-X(A!Ka~>78&^riKT(xW#3rfU?fWljdrY3w10Sqgt~tWC@KX zz>%$2a3RxG6)e@7-1jq)IZp%3j)$2ZzyAA;~#iu zFO!kQPUsJXKBcMZMy`di%m+aQR7+hn!PAqU1hq8Xc;uRtyxk{@^CGHw-<(1$iI0$N zV7kjs-`mK0;`e37jgLHXTz2af=l56cd2)jy!6dZo2dNK~-gFqGFJ-QkY?3Uswofz;Y#{axROoteb>WMQ$o`< zEAw8n1vvuvbS*|Kmv%z6TFt0~5xP=-Nhz9Yx?A@bhA93825f&IfK1SUwiqe`63ysemm%(1IOL(ez)=B7i||~xe(P4 zJr`$I>PATt^Qe9&Oj^3BIezGeerUY)Eq^nPyZv#_FE(EoX*x`JjjL{t|9$wco;;rO zoafXU>fiR``~Us@jWS|=ee3wl zr$24Z%BFw+`oGn8=|158CyhVc?if~>P%FcXQ=W6mIOX?G86Vp2Xg}h**Rl4vGUGfN zlST?X3H)~E2e$8vzWLAIeEYhOH;y~r@lFIbSEOF2&7iTc#JNVf#>8T6Le1^9l@>$2 zphyRc)G_tu%0dh+>}DN$k9*v+zH|2zpSTb{+R>Wm0yUbeH*aZooy>S;4CZ5!Rr3R) z(U@M3sFy)aWVn=%Uh|sQj0c_c!10;SetH~!_z{e$_7NxwwY1chpzGR)%lGq1Jf}VP zwDI<{&Kj?O{p)BxVxihK(#E{vZSr_OvpO(ORZUwA=fWkdY*_WKV?7LNrXs9Nn=;W?o$_E3c`c^*DLbcxX?7}M7 zQ{sh0&Q5Kj@vLE@AFe}cX|0c-4k~?^y9^{kNc1tuT zb88*e@Z16p7ZNW7P;O=fu~c7GTCT&xBAK2O3jPrcD4mm>P;@V z@PcvQ`k22S^_RH*4kUL zL+yzG_N1!jP6Fq`x$Hm^)juUf5QT)0ut}6^7Mu({SnX+%p+dzjoCfFWf~@?U%?;vl zu8ni{MbHYys$ zDL|_+b~Tqvjrf($AeBe4^e2oglQ6C*MRG8AJF z5D=mIoW1^Q?fu-Z^8M;p-}~Kr&hzYHt+n?)_nz}!c%KWmpMB^>y?tNPCs#5Jf|BrD15>zWS@bdXMAT)ubvX9@r3B&a7;Jpk}C%a-!fE8(lQlrg4B{3_^7#%^!mdjkIyqc3B9mLvm_9uE7Y2 zUW0d~%$b_a4_+m|P|BREocG|CM&URNaj-^(hm}idmr3Isk7-1_2&P>WKzX@FAvN5B z^F$oHid-m5uS%89P5*x)`fBmK51dE zSysB{MLW7F?`m5#B4#qjF&(N``*ee;JxxgqPllKoqxh(Nt-9fyYtPZ;BuEv5O4@8z zg&D~*cCk;gfPMbfxovd3Bd%J4{f|`0>kNR#4fZwvP@w~#wTAMTbu(DHZ@_~zz0E_P z)^{(1lN@4yO-3VQVnk@`#y?6BllsE4qtv`}i7PIbPxuE!B`iT?htIJq-DoY);pV0t zSwm!Fty``OX`roEq*@Hg(db5NA`#f$`ObH2U%7v?@VKkz>%aaR6qhoG+>$f1xpUUe zF4#ZLbwP-9OPA^o0}KBUE^Dd%cgEh}26e~JPyO^yD<0TDIK!0IUGUUa$7^WY2&HCY!`X8kFct2ZK#(m5jUloL%IGcw@|EJr4o%;uN91eIxv z_R^-pj4-7inFT}a`Ka=-wXA7SDeuO)FHV5T$*Kh%Nd(cr))7@;8pxS~t6$)-&i4z6Q(mDu&Q$ZFhYM58-r7ie@M*j*se-V%1-o zbxlDBS`dV^TEIHnc}{$f^n2E;kh=Dpf3qh-hccfI@RV)9=`hiD3gAOYWzTX)AvjbY zfxGe3Hn*na2?(ysi4mP0*iK)vh>SQ3IGp_ic&&4L z4k*=}oWvKmDE$ri=BiA=SLW!{2YIICnW&{fXq~k$$vRFj8qn|x4;tZKNNHKo<@4%L zM^Uj|T=HH(w2mAz*4OQiDL(tk=WKuSCvWauR`Y`)*BRHr&M{c5x`(`hrPG@E@|VA2 ze|p6Iwu_#8QGFPjPQ$n!{odS1m{Dx{1AI2Ic)A`CE%mO%H;1MWCP&(`h?5>vVIs0i zO2wbk{>e0;c^3yy^me6!d+T1@B>`1cKFrCA)PP2GyM%q6wJ~O$bKo+maxG90#QjuA zbjYGI<6}L`e3^d28ey)8bE$*qo9NMT{epk+1^b7w|89HcGoJxMNsD!=mL)gDW8Rr! zdwf>UD&+Dw^{gw^qjr>s`0^zyJOFU9De`IEp^4?&e`($q~0i1YG-*c=j)UK5@S@`nW6j zMf)SO`?{&(qj0naDJQ&+&dpIgBQ3ep8lHV@iKmN^-=Vo(w%iN!926lNS{kjy&c3tJ z8bLD4@FX@hqc5^ZCsk+ZBZmGel_F1$0c+(6bFf@Nw+LcSE7n+hB0Pv5V_t?MnKWw6 z!M#btTERPDW7+RD4`|45*QYweDK3p82zlvA8GV_VpFZ>RJ9XWEhYfj{xF^+0y3W+;y2Z~yzvZ+^@E>kn?fU3-6W z>aV`+SGV)ezdp6jeu$UFRo3kfV+$xlgtPJG+XZ*J^Y-iex2fLu-uFlhC>Cd2;IJr+ z0FoUffr(pPjt2S7J*Re+v5i?DTMyhU3_e;EQWv zOGLtVz~i`Q^@cAM$ZpOYS6%c81r?#_q(s{< z#*X8dI?2T@Nzz&;VkQqT%zR(|iB_dLDot98zpDXJp61G+K#tX#kbYqk~1d^PTsp3z*B z*lsk!kRCiqqY4V#7)fY-Ge+VSHY)CEOacqaS{hab9@)=cwJ&&|jq<#JR~nHaXyjQS z?Ixgb?Pi!L!9DM*ToEJd5r22pnOH=(>O^5jj(gz{Qah)?l5H;Th#eLyNV#)^Mb~es z(TvS~X8eeLq-6}#vF>ER2DQO{*K+g#+6%H>4Hm!aJ!&90sc5=EPmI6?JUb0vJ^&8C zwWk|AqilUzg*A~ZI~Ud@nuYnakLaY*uJ}*i@|sdwICdQBoQRR^LlZI(yB;06rq*@C zZ&B466JHC22u^UG;Zqnwu!a^X$bGThN2w{Ccbk`X4!CxT@np)TR<*o@-_}wODP0S} zcj?<Jm1%w@ZVs#nPV@gxqDWyl;r2y~(v>BibaEWjwKT8t6&>S9deWlEE|oY#V1C=pjW> zw2oN2Yfsy1j*-Z!e*;CcH}iYct8Vy@wX_e#Q@AY+QVxV=BI+UmzJ&vE&HrC8*ea*K z4)e8NokFs@>PuT~gAVK`8pvE7(f=1+PVi{#IA7i}``Rmqbe$lOAq*UQRx;b;o`N`L z_Q}SM!&~8WEk_>HlL}|GJlt+hIZig-eQa}Bks^CJzY~^OXAyCF&rUxZ`8>rnx;^GD zM?W8Y7c4umiJxs5M9Lj!M3x^eNM%pQat*Dg)9oD^~51P{czb5Q8`L{0oVT5 zjc#QRfbUkUjX1_(lx9yjH@t3#z-S5Kf8P9y? z_HS?gZ-u8ZTW1DprRnQ6h_n?vI&*@{)(rxE_#W+*jmwv}iL?6$#Wh!vIxg17IslCc zJ(|shU~44>LwbjnC6xQg71HK#SV@VLQPWV%Zi&Q^wEG>IL0( zUS+ovK|WYN4T(9C)NL0%<)ZzmIrrT@w%dEHbI;}4mN2}0C|xl`ug1JlY#17R&1+tB zyLkVd!N30pf3Usqg_q)A>j314jxF0?2za=LBw~P% z!?3AikrnC0@TX4WT1Mhsr^}d%9LJyWp{!1}WTiCgJljl}Dv&i6Wqzh2Wn=g+vqrB+ zQ0DBj-lXEF9r2I>eZ53`0Vw>EkE0sOV02KiIM(SnxKmc!*_vTjeYdq!V@x&%x=wX~ z6#u@n8r<67sqGz7My6>!S1-^d-}Hu4(fy8%^=Om?V`l6#`y$l`_w+-9a3=kYYY=rb zHz_#s$q#w)`H5+yk=Yy^=5Tl&q9{i_V=H;mNpMh*7`+Rr_LmriJr*SIUN!lwL)M-k z)6=of@wV$@^vpOi_NDuoA?rNs4L9eE6Lhuir&o=NU?Mr0eX+e7*L&XdrvJL#`A!$? zzhdic+q>TNSM{N6pbmakx*Xi}ov|d(4R8j8{q?*29XrM}Fdst&j45JCbz~|8$Ej&*q(5eLYG6vmD+%*I4W@sZ#(vnX~5M(UV5i!@Kf*?d^?-566O5Cs%JvOb6@ z%U4FbK=eh5oRgve03ZNKL_t&%nr_DuHE=GDZ?4_*r|z*md~cZhiv?pOY{)3`htQHE ziCM!c#r=q$^EZnrMa!{2zU}*`TZxCIsY(5whc3rc5u44SZCr-i zu6!9D)nu5djRoVtnLrD3fc?(<%g_}z*)2uE7%N9w6zgdGWrN0663U@l71Stb)Lr*w$%uu_G1aD;TWfsTo!a>&`@OHRYo@F%Bl7 zYbEDt#N8ySbWYJgA=b$SIdX$dQV{gkUuj?A4cj1qJaV4NyPNX9i!sV1Y!4X>lV%g@ z0&hJ4mOyF0OOxP=fmR>y2Ty4DAmM_e7TATmN_FSW;#77)*wpRmbntNa4_3y2SL_NF zWw(|@cL-V!0Uk)*y3Je+{0e;fGX^6|x*D(}RgH}b`M^b;su$53k!!hFB$wd4d=y0` z?itA~9AI0J>w&!`OL$&}x!56h1ObXiy*H|VVZaymda&prR|B;CY+oh?qMzDj6rt&- z4LO{&1}NsIBbK)6eoZ;)xH%*hTXfDo3L2_OL;4`ow!LTn65#*-C11Mz`Tl!2Zg|`s zP@3rQ&^KAj#@`wgh+NqR?o2#|Ix?md+dp|}dkE5Y-RqvWJ@jD@-|ltX8Jj=k6DP9< z1*@MNqWu#=Fcpopy_LIxD~kmCRrU)SSX^<2|LLoAaQX=M=C(=U8~9a@%MpD%Hiukmt_7>uw>2f=4W_^ZWeN#i#kMPmbqgVLnAvFAwcUY+gTIl z7j@hn4Hqh?!W;oEUR*&RQjj>_YpwG|BWYFrUj`jELmJnGeoWZxgW5;Wl6`?zd{nJ1 z@&{%9f}`caG+1f`eL|wQ3RkVwnn_yXUxh!%v@BUaeLQxZ4&cOlw zTg>qq=y<-cil1pNtn>6M$-~HHf0<2u^!(L)HGcHBD0tR(d~x^qy^H_v{wr-%B1cD& ze$a5Hf}tM;arP<`Q*RnKjZNk2B`Q9jQ){{BM~j&k6cbLMW*8RMNb~8e{V~PA_KH_*-+znm zrynAwV4zzg`bQRc?|xnLD{lA|^?~tYAN`oR6ZYvBKYjc9Z~XfDfc9F~yjI076e!qa zdKox4UI*X+=|1p#XST;Y=CKVYL4u3cJH`BeOA4cW(aSbSCZx)OPR5!y42XB=}#I6-c; z&ghGU(e63DkBG5qd-oao;l%OWz~)tIl+eHQ1JMPHAAITBX+z9Yfe7WT6@@``x?*MM&Ka+D zG;wvW6P=dUt@yJS5J@`<-`R(}z_F>U=4P~N&b4NNMH(y_3gIrZo{F)1G0h8Q!~VZN zdczy{r()c5d-MJzn!ow@$G5BQzam8H1D8!Wd_E-Wto;|v?tUbF(S}(q?|QepZm-yz zoXg(#exxj3E16}}6nQ1n_-Jt(Kp}`ORCxqh;b(~G;evPo5k%K;4&X)oA|jTS7KT|! zb((B+gFse=w&Qi8FC83y0{8}*jGJZJ@QmdqRslyO@kaAvz?_&h@OMF13`RqNef@2k z7B|OSy`ey3bzO)>Gf^b>jicgEi1?swZB`RGRpJ_wUz zwiKXaCzB75CFB->k>7p4hbs19X5H~zi0^nzwB`qlF@-U@;15Wm4;7ST+laB(}f6}U|Kpu^|Oo3I(uoQyFAhFsg_ucCGs{sP?e_bga73b;X=@CwnYf+sy(It#AcJquJ_j zraMkPx0N%@BFV@za@sYwDn+!WfpA57BYWhqdQw+13j$d3n&eiFWPC%XyGfh4Z7v_% z7@Wc$)uz)ohF6kJ%)m)OLaXc0QO9clTpJ@5@`^}w-#kh4JBOHA*aHs@Cl$Zi+I6^N zl;IaX#W=-eVIDG?U$qVU^fxdScn`J9z{3eB7P**uHTE=iaHgAgIVX*f(fL-R zMcn$CKy*w7i^VHDQA?3$uj`si2*Pp$6!08Wy6k6iT@G7mS7 zSSuZ^bw`$G4@rL;*c^uz++|Y+PcBBNfAN~ugc82(+UH$+d(@*Iz5UdFHwCPTCRXf{ zpH>DdY-^=4G%g32b2yUT*_u`WMwG^YqG8}jSJ!%1q_mmFD{)c^;d`Ze<$k4&eWMq| z**??km|AeR_N{7OHZ- z-_i`x$7(6pbe-JXkR#q_-W9cw&fyEwkMqpx!L!=eHNslsV67UZ(_0YQ&M^}WQj=|~ zJPB~_h=;|(JS9=RjP>B)6`Bu`oFT`zgFWJ1>xF?GN2u#upU!3O9duzsoCzjNi=@Xh z531RRn>mgWL)t6ec8kaJxC$P?q z%*5QtpiLqCN`)*L2i%xqiMJ%|0^B40#?3JIKm*Ba0IYyYF@ zKj486*q(CHMRi?HObxAUR@jRS2Rp?y*FpsEoGYJQPZ#*({dWdG_qop@)QX#G>galw zBAk>cj$=+@>`}7X8g$lN9&-^PZ3p_iWZNmuTwxOQOoTjwfF;PI|89$Pyw+JXvQ7nT z!?rV2Q8Zb4*`T3f$6ke%1e6#{_nf1^$noZQNrP6+mmz!-xm>Tq8V@o+KAHzfiSp`o zYftPeT^Jp78hO0;VGB=FC8A~dJfl!M&b0!i=8~Q2Qa?aS=&zBnPK8Pc_{d z##-hq`+0%#9()d%>`MrsamEL|mpJ#Fi{;oh}-63(q$$gkug+;=5B)0 z_7Nt)HuF8|Rj=FYXdhy+zx?{w|KWDwg+H^se*g6XpTGQbnbFGfkuR224tGLewRe_C zdKfvjxclAjzWwUUe|3A`{v7;nltd&V}+XSs#Q)~QW?y0mDu zR-Ub~^J#~4zNOX!f&3%J99p|N9x+YHpRp_ZqUsVdU$B!1s2OSunOxcvlO>A$<9N)> zUGH+&{hN)C9#ra>gk87kHM zg+(CoKLW1LU-Xy9`83_awG9HKqSp`09DOZj3w zN>4Wj)RV?4cO_cnMl<4uxllo@nnwnOf?Bqq>1_kCMW;Ue;SX~bzu2cym??hrViQ%WBlN13#;;j4bmOg z6zejcSVO}ticMj_vqI}uG-Yrx#jfm>KQg`h;;Iv=M*>a;+6b7mDtb$v!wVIt#(Vg{ zj@d&S^_{>PY^^8q-2cb7@PU7i*wwL!ch{TN>fDLx8c*zGD|^`&bU>vZ8(jAVBO(WW zS)*~0AOcjy%zQO~6;k3*KguDQ*cD!74kB0RN6sgv>oDb}@3b-+Od8qVT4#C5pKtz;+#nLg&D#?H0n=i2fP=&kxzLBHkw>#VHt%_{E-NJhjq9@DM6!7gSe0+0DD#qIi!*r=2bm00 zz=-?g%rlaF2cqZF!jAP#lnhaHt|M`g5@A`Wa$&O?Pcya_-odpE7vP zkY!*rX|;O@myuEZL)GNi52t{-*28bd+&LjXK!(^I0U`;*->>=F8*QKe{O9(kOZ+)K zOJksPsi~#Bb~p{u(KQgG3Mu{?jMSEw?~i7^$Nu=$XJ7JcK8$U=ZL@gn5PdMJOT0j1yF}sbKsDDbTlGKI$ZJLOyyGj zZ7wd_AE0Fociqq)%n;VS6Vhmk5=Z(%Mqb4hW-UW2gJ_+)+7tMp*To}g+x$Q|b8YYs z90AtxyHS7S$9{Bs+Wy#GnS3%s)tXj`=4{0sU#EtNGmeJ>cI7Kyd4D|iFKs{c!#^~z zYC%IonV-y&mbc5d4}9PQ+n@c}|F`{<{r9R~|9aO;tlTIFBFoj1(L)S9F;DknAM~IH zZO?n&^R~+_yDTxIDpY{Z-tSg_ac&A;-JU)g_$^Y?F8yZY6P6mqVdq-wb~*w_S00w_)z12ENp zrM@==Q>#o1pk~@tp1}nLiWUSvI8W#f8x2<%t<{&=&zRKaR{guX@a_>G2hY~MAKB|0(pUUN4tA@h zBL?WH-1HcoFKreSsm}$#?zPn?Yn?z*iPUS>aE>rX&CNwWizjQWN5BSWP;+1g;$p#^ zHL`_!lYmfBC~CzV_9 z_wzpgc@$BpYA0H#j>oVbzx4h6?|)xfk<%fpLDtJz0Lozoj;!itDxmTTX9CDT)1j&~ zDlR63#G>|N-M+A+?4J()>$F9lDf(LBtdWi%(&OMt2B&59h2~Tdjm{OpKu< zjwu(ye^f~+JfjHCCf_az{AuO~i9GxXLdy2(2boQ5Ei&&Q!J`Hj#X}m>K2{cEI|6hf zASu$s*izL^w=m(xe;LBrsx%%ya@->9#)j*}$PT`(7rKrZ4=fIGs!Uj%X~?d7-Rp06 zy3?Ju$3OmY672w7g3`@^1xEM{*J?XUp<`(A;<$qFyr>{wZgP{G)bFNv+h6|WlCtC$ z8{JMCRf_xEmHjt1gGpGTO%+1r zDTs?wb{n{ofLPM#Nk-VE(#EATzb`fE0?J+^Q#xA!Y(oY{Tpax7d=#*X4d)tT>C!da z3&suf#AICcp$25mP~Nql`2t31kaL8SqM=oV#(dZmlEV@E4S0vy!&dnt zybKAz%>m84KalGv5{C?dG&F<|a97xsS#IvgeB6;R>RkQIXl$>bi}{xXlHhPb;cW8&P8!@?j`{+kLvfbeN zH`wnkc<=T_U-U(WPWU3P=<#A$>xNEfU)_t&dTrXfKN9Q|O{>pg_3^tu9{ae*Z+E@x zU3gb=Ir#Fch$sPw5S= zr>=vrGcMFdmx>_4s_)9nmpTUk`ce4cmc7-R*ypl*{NVyc^{`1X43Fc>yy9XqzeI87 z1x*1!8cQ~YCT9KtR(`U~d^DhT7hpP!&Lvs~CS~y0Gg@U=?VK1bit07xcl49C+jX58 zO&4%FCaH2mgByh+e|#X%rCId;z6ezIWDmJKD~&HSy4P4;-~6`qJhnroyQ%f zo*iKbi4E)EW6(J9)$GKd#g_qYN7!^K6~DIK?H+gEKa73WcJuGMIp-ULpc=tg`yF2o z0oO?iU>m4$R&8AL*wHW^IY%%s&&B!49mxQClHRrbES#1ZYuqZkKF@nOMov$y-P)m= za@a$CD^BU;>|r^v#>(WeyMT03YC)v*IC{d*J%c;W!nyyX2jsx{g?#gLeh?sorV3Ci z!L=OP_FwOCz3n!)x%Kw6i=Wmt%3RID6IOP#=c@J`{E=tUTE7$d#V>ksJr3D%6xps= zBW+u*Zww7?2$2N)h#n3>IgNO;hGa|bzK2>%LfqA*P-X0 zze_J0A5wdCsrGUl2HEPz(K8W$$%_7=H66g#M$hJ5T+C4Av0@E0mYOz#HfQt}V{ks| zeELLL#kFJErCb^?u7EW!nI-8S1kDyA{AKG6o8a_;9p|M~5z=UiofO!3pV zKYPoc?RUuTkNCFkj~Ha0QA7zbVv*DlbkCRQk+?tmTPMfjW0zVt*Qfs(5dvQ==UEG; z=X$P_LGE=lDn2yGxi>_N7hl_7p5zJnbNb=m;)1|CufKy@XMK!;)|vrW#|hjEzODCK z+_h2tU1qja3StL_s4#;^uGFoa>PI^$$x~uVUYy_EP5BKzXABA}tQRt4H2>CL%nqS4 zcGaw=T;)qX(ARi#+HC`^E_)`o{crX9 z#|B!_bJzTUUm>({)^cNiSW+?RSV-rF7T3=snj>J{j~_P39@ROVuNWSrNPM<2=69F~p>B)f15XA@^r!{hY~^tJyR;w_fA0>p%Y9f7~AOkcVu4 zvG?1T?Vp=E{*{X$?pRAi)%>hq8cQe-(yhXE9CojJ-Dmr?{V^Huc;`D(Qb+|=j2!|l zfItiu{?p_+&>>7^$p!ORufr+ddrf4abv$_mvL*78{noPHXg7$dM8F5s3O13aL%53=hxb{i8MOMvGbAZG*smvEOK=#Q^jRNn%7(mtXEv)^B2`yle3Dr#e8pK9H zNYfyD7jl!hzBo2X*g|sNdDq>4|HhrS$36b>a3kof080=juD#AG_HN`71B!wxisNNG z9bvucH{G-@RKM+QgO~6t>R+KEssnEx`1(#@U!+hh7Pg&=afu^fAl~MOFI+g%a-UqK zaM8@T=|z278e5oKkxf8a6k;1q51xrXBG(NKdSbz8M$6k8RwxW$L1)aC2%H4Nqku&j zjefW^igiD-!c1&i(_juW3(I6;!Svw1-IyPyID^&DVQUv&8b(}MFaF8qnSTuxdZ(!};H zmOYUE001BWNkl5l#=_R87JQ)@`e zsT+T-=kb57E1gf4?sbC;YRRZ6vPXof{rEQ_AcqlJEbo601x#$_kf2!OEAehHz(I$p zYWCC+&c-IyFtocMKrlJaF^!Jc&)`;gi@((rAL|IK{iq;g+38YzoVL_b`-A<#xquvv zv92t4$(HGkWB+YjFvt#L-CG2wUMpei3yn4i zycs{~q+Xp`Qf&D|->!&X(9SP-NfVqXH%=P@U z04(p9^BH=qnKLwQz|TGR-0ksCc*1tK{a1JB+%hs+GWqS-g@OM?FHk&JxLXILdDhA0 zF;^$Ge7F*yD!!F#@RUJss5=9Nxn1@(&74#E=N09FwCXQwfOWyOXc%kW%960MbD|f^OL1jvfB1!tP_Pg$9TSWn zOAI}6%uvAKXQ5%)KDD`5EGvx}`$GK`W;>T%uQ6@b*3mtIKU)GX#YOYaKi8t*^vJV%n8q+DCTAJ)bIh3LDktu^ z!4`=ar>A#cE`*NW-#&M3fhmKtDH}eowsWlT!#u-=%q&uu{-Z`#PM1c=_W7#`>feBF zK1s;%n2#Z|HV3T-=W2OzAw3VpKy#S(_HoJHI3BZ%iqi6tC^U8SyvfDT#9%_W@%04( zfS$8vODu4pWxD8}7#d}tt`md$DByvO?K~p}29ont3Hh5^ww~nIY*S-Grwx77oPi#-U_$kuB5kuoF z@({ugtejkL7*K~-XKlwLT`zs%&u_Q6^^ZjxjrG%ObJmD{N&_y7)Z4q?^{(v;_b>jP zbIv(1-FzZQj#R}{&bpUx9$mgYYX9|BPk-9ew+~$Q0nNDJ*|Gl8Fa6T(9{aDnxbKA* zF7L7G{`+QsWq;iFy|(AS;04?FeAjm;clEwCrSJx~sP7hl##;AKxpwFt5ZnY(@Gv4m zE=Tof>_sQxBbd{^u8Ho`Si(;Z^dkF&Z1ECV|HbB`SXcSeB%Bk zn!ngC-f=W%-Pq%`oiIQq{$u~>eXEAyXWz+3vz!Y&qEhFS=QY_n+^({}TFN_=R7ni(#ii?x4+)$skkSN#0m*L`L-d2?edTskd<f)c*emVV!0 z3MbJ3of56dlEzo90MpYH%a&6aX+IYI7e6e@gdsN8{s?yV>L7HX2F7F9SqrBN5n<1o z%4Ht+lEPMjkA@|dCo%1srJy?MKHm6r9wa?gy`opeOEgrQHfKZ=4;{y;txXCtd(w#1 z`KGiRW9uF3dakf5%2VT{zllZOX+Rry%AboW5!G_=I_f%_to2cmUgL;^eQu2+_+FX@ zr}b+gf`E-p-GJ#;^TGc>3kH7${i(NBO4~CqQ^yY42qvjY$qB`%bhudB^NUHbzo(7K~N$b<)5>Xr=arap1VKw`Z&uo69X z+O|)8{1e-Cu5;e@p$~ny{+0nz4KUW;)138%$doSy?u?5O1TXp@&Fmq);;`>|?zOJD zJ@H9T+J5rR`<<~BcGe^wSJdyeo>bs^2rH8npTrpraNL#>>UwLeMlbvWv4b89Q!57$ zmrQ!*NbNr&Q#cw6RE;1<#PNhNt|*n4^+SxIQ`4^kl8Y7hth%* zF^y=5Vdb`X1CFSQl`#IaqZhrIB zl?ClbO)$8l8{Pwbv>nz8xGlW_`qzmBDAJ0h}0db#)!R^z!A6!YZ7Pp4xKRqqi&A83&`gMTe;aqGnaI z;X{ZzaO%=)nV9DhG+w%Vf9&t|_d8>Me7pFmPaQQucD7cz3bg&L*DxaUwa>-BeVyYj z!skB!dE1Zw_>UW&!aA`Qq0k)sU=?~7(e8-X@mS@1?;nCbaDU9OajxrVim7aNy{9UH zqjUlLF;Ch*NIUw)%ih1=85@BGFlTSV07&!olNl-}k)7J-6rV zzc2KAzxR6q{eT&uwBGpIqJ!*tyk`!9h|rqo(v z?4M~;=2+{F^;>sR_o&}08^j*Igu0w+O(WGRGvHf&r4rm+L-We9pn)=G)le)nXN@_n zdM7za>(hEh)aHi{vp=+5=BE4ZM(5?*XZGJad%gY3r;mHwWA_^_-o8Ecsrw_ots`Qn zdM^Jgc-NmR_K)}_gR=%5?@=g;g`lo@r6Rb`MEjT7!LPZlV~OHjM#aF)fqt`xk@RTu z`l9Q+j5%f!G|hP@cY0m#pXMd~v~gV6XikUxvGwrZ`YFEGTU9@Zmwu?t*4en{K3rSIeYH5bL`~A#?^^LO+eBiP+*vl;mFx$6i5Ro%MnT?-HA&hej+3?c?#0FXweH`u3IP<34y|o`Ley>xz0%< zN^_h@`Q9Q0U^FrI#YGkfgt`;x#=HO|X!sEghO;qeajmS)m>5=^5HYX~{owTJZiy?EoOz3 z4iv@2gAMR5f3J7l>u$Hd!|nHPuRYnY?S{QVBI7$IpdV4}LQ-svy!Zl7H}J#Ovgh*c zpMJ}?ZXet^`S!QJg9IpKvcGYZMqIB_(3LWd)ZQKLA=-}N^q|iT&LtXJA5qf!=B|tH z%xUK)gWW6!wr^Ao*$5D=DfktK1eCHznCs>#{iYm`R_Is*)^QnlN`VI99>fNB1uevN zaEBl-@$ufOk7!kRG+zTR#y^J2R`Uyf*jKMN@#hLQUQ^0IODzc3v~=UcK;c+74y1Qz z&d7f-PZEs?aqOClW%U8nO(T7rGkS4VeD&9yJVdS^@}3}6fEW2=roDW zSr1^fidN;+40bI}icmBUJVl4~W?wiT44lmgT(a)rI=%PM+X`Adja~DO8S}57EFt4% zB0tBB*-mt`tfN{LgT0D9Tnv0>&6;_ot@5B`rRdJ;jHcHEn_TQ1m($K$y%!Xx;Yo9O zSdQsxD9iEUz1#->aj$h_HhCjNb-tsRh#jY)C(;!E_i$P~An0x4JaU}=eS{@V{e&^S zj&Xfp`S_h1#~rDk`1r@SYh2@+5k2vl>UJ_PC`QDgBI`fK1Nc5doR}%j1kJDZI{SL( zUh~}TDHmO||7wCe2a>6;)R`VY2w~xK&2J!L1s+34gxy2~7r{xW;GGrJ)VAbJbz~?x zap;=dJ(PI7;=FOxAGC>Y(5MGG5n|wez~}Hi8V^t4ourdpk9y!G&`H;O$pld>|J`Y5 zUw0?1(XOfDkopUNW_Sh@Xd!$EhKbzL-^Sh%Wb-dPJ+^W{gwb38fp3Kf>V|kPNwcKS z3zUjZA0wKhL5X|o?s9<;68p& z!n=xCOG?jh*1TGm+!hrYSF_Jj%-Z4fFS%gkWb_)j&@&`pe!wzu?Te1`yx?^*YvaV| zrAu?_SRLF?Y$DIt>$>K;uyED(qX!9cl6X=FIW8Bcz+BkYPRX`lQXF)?^4LN4$|xn74j@&HiER zr#}6e?VbDYT|d2pufM2$Qcp%~hT0NC_)ebGTXo)l{nuZ!-SG|=Y|nfCbN3IC_Qw=Y zZ8641U2eR2nbC0$of=S8C znFupKjXYXQ=;?I)sF4U;W7-;lhSl7pcbER#IT*9*NXvjm_nGSR9LFPWh+MD^8HO?A z5M_|MUDqtiDtN{WuInV%+wOALyKawq)Fad5_S3ccn#6Lg1l`x77GJI19bL2KoU2@Q zd)Bj_wO^099km|YOnY-B{5JoXL+#7H*Hy1}_4+XOF^_o+H~_+~2b0^CPl2vydDZtP z?H{y0=FyMYKJw8It3sx9$b&1NedWEMe9Cr@{a3*m!LF@`b+3BOtM)H7++}I)<|qo+yfIO&Ee#WGm^{;DPUz}t*4E}hF-7XY|;58c)*AaZ4@s&q-`JQsOm zrE}C7j_kgpxq2LXd?$Q?E%QYRCP5AK$-(`o;g-7jF-J_`|mM z?Z2YsiBEcB_8XlTd<(FSg#!}Bz7yWuZ7nI6(5zrISQ6J9g;qAbDroQ%*qFNIS)s69 zzINnLFw8ZN&2Mv_I#4dbuQ40<(_=szzGhY!7*WWNe1J({9an8%dYM8m3xjQ?bj%{; zHxNUc34--dEhZkjhpPSIqu=v(+SyKx`d~2|@15)=mk%7ezdnsR3&Rb!Ma>zlotZ6q zPCUGyZ8!a8v212O^UuxAfqTzmlUpIE_6kqOv9(LM183ZaSf)@ScM%hLt|yBI&G{6x zE6<)CM?T1rylrjKKZUQVg{g~^Bk&1-y6;AtwFKGkwfk;s)XX?OViZU;wmTJg9&EFJ zw36ya#3u6Vo^;_y&WEk&Q9X zJUGbz9@HylZUj*y4-~Z)A~T@dz#ZgSi9&FXvk5pWIn=VZ><*j9#S$ey=ky^hrtxDG zzcO6wil2xv!D;;P~d+ZEyP%+f$x=kz(aW0Vt&bNf)F%tdG!>i_II)Sd)m+UKU;7x64C%iIcY((B9`B?p=Vs&4V8pXjh+ooSD{(pZDOor7AdH&80P zDO?3IV~noNatFU@X%5T=-tno%bL8`ih5+v?kIllF&T#?lz+#)4+6y1jgG`=`W>cM@ zINlf*be0eAlHUO#uQ~af5@IK*A@w>nk+tU7(+#=aR0zg^WO2Y&YecIw=Kw!pNX94z z*5asZbgrx1v1My>e@Mij1EtcBm97x0G%hd``zL0t!TB-+FJyqPRLp$Z)~52D17?q4 za(sHf7<0|5Uw!-ZXFk21bCs)94ANW^(dMQ6l70*8XMVupJ`(2viLjyC>%LU~XvMk4 z)vvKV?P*Wj?r_HoqB2k?7!()0J8r=VJ*o?Y^%3XhH)K_cTJyUWhJ?JI zRUU1pnadzh)^{W(r7cp>-`(l7Z%qv`}wLhp>Z9Qmd;hHCh7W z+EeGIFSx>A>hp_ zi?0~jU&2=06fXx;cJ`MT29i&8?>L(QW%kmxP4G54tplAmx2Zsr^auyJtG>+PHG9=i ziLJ+nvFBX%D*Nvq{8Qx9nRl+umm-1kUuzrJ$+RF&Ptg|%!3rAm8?XJ%?GCrU-S)ia zJ%9f&_GV*dhxf7Z@TCHg{c^WBuPev!4JJ7m#(6Yd1c$Z0oIx5tpN#0j<6i0u{JLY;mUdK zUO#d)b~hmd3gKU8_`g~yIu3?_|90Ma*V*xKhwaJx7uoVbaTy> zEwyEI;VOG?_>5;AF+L8|8-J=^V)lybLA`Vzeo4!+gtFpaw=}?qVOV+Z6^V$knku~P(=Yi!hBXr$RdTS*Gv)3n#uJ8E* zqO##^Mc{?32B{qdXrc)Q7sZ&G%o+KgbF@nLRl za}t}eN82gfEqJlUI-s2A-eMX^h|-hv7k%3$Yjmi_jLfd`+eMO^_tB62&+W^<{L8lo zJ>Y@cW&2GRPuPDwiul?6`H)VM@6eCAbkuX_R#<4B_f)p#&$TZ4cLi~Z{-qA}T#zTl zf!g)U+w7m_AnGWNT9gzVW#GW9Ac-sJu=Snyat+{&yiJ%v8Z>4;i6+=!v%sI3goJga z8T^ac0t^4tY@sj&wBvoRDEm^&+=m~p9C;jbR9t1<(+`CV>ed`MR`MqsJd0?FQ9;pI z$>Vr;rmS*7JwkwT?cl(PiBT(zI25*Qx}@te?yrCj)tEu6=U9T1z|62?kNN4ikgY;W3#Q%Z@df$;?pZd-b&* z<%_0%e+(FE8;E7VxI!|$0DWm+3leshyTT3U;O}_B88lZ9dUwm=h ztoPEFy$rk&e>HR3Gv^+A@jGK9Z8o?_CJP_%zz1#5ea>^X4}I{12!*35L;6FyQW0wE zI_!4yqxWSBNjg9>)V@F29%Y@SC%!v^1IS)W$XS{JB^?2=kRTHNwv}bD5kU@53WGIO z;j*wD%Tpz4D^SXSvVf)DCRkYv;TuIVg|2+j`dZaO0ys)ootH+J^w45j>2GOmrBajV z*w~FD=A&+CtyW_$S4c>(P1^}O<*!AlPE!&^%0zk$7XXwjRlzl+Tm(IUK};2A&SMhj zZwsq<;jn^&&@FdHk;C;11q9QLdw5~g%CH-pe}nBdKX&W=ccDC0g_45V0Jm*W10p(? zA;UPgA8leA+J(9P|M_kIe0$G(-o5`W=XZ8q!FaoR#K3+VJK%);dte$e>I29Z7^|jE zC{DVa5AtK7^jf~KmpqNZ^uT46lpzK)UGoE>**LqX2m1f>uRwnxEl>SHjNX(Zus%dN(}cymeK4nnOu9)Q88Y4R{Zi zD*nRoIzUmzC}Ij5*ck<`^;dc$O|YvJFOzoWb_U$;9$JJ@ICJu;jMJ`zhR$CX8;YZAj(+mcdX&ReO_H0LC{M@Ll~QdbGI zIJb^X6A!-Y(a;OJk{|i3{I`!PKg7??0XR{!9Vm0YF)4gDmK*ju_a-d3Y{9l*UlkDuh}yI_<^^bzJnD zy<1<_9AZ9kkoO9yNHQ-Lg%<=ZHMc_0S{lV;5X=Rs^1%(J>?eD$Ks-{tAZ|uV>07|F z)B!DG{D`}y9RfzZC!N>Y!k;nG`4E@H`S5E0`R_mb_uEzX3vGY@_n+O)+8^sS*VHOL z$N2M(1CQn&c6R;kST{HHn)0kX_>PBb?sw*1ynh&b#|!SLofmGnv{kz^001BWNkl#*=FuD)l@qAdEAPfR6cQ7=ZM0nRw6fOo)Ba|b+Ln53ptdQo+)ziy~#%qm)%0HTugI+6oWb5 zI10vE$L3zS3k!$R5hzg6q|_|AmN=U1?%$#e?mr!>r5Cd;aM3)&2JsB7XrgFigHg;- z=FrudQ4CBB4Pa|#_pOB*<-)oKo{hmU%rSO9Ie0DGw3f6^IIGvAY2xPc`iQ%I34h>o z{4NL0U38-x!=SSJc;il*wTN@=%lqLKWVSEX)##kO`>L<{%I#Bs`>E~S^~f~xRAwEC zlfSJk)(QaEKq$Y}4TXprOGcgTS}S36rnc=jUi;eZ_P5_ZjD7C$VeI~RRpW$1bPYhZ zhs|iJxQA_i4eZEX^e{~VaT#fAvj--fYNN-Y!>8suHG}n)+jP@Lv?5NA6)5>#U{t3% z#HAg9L-?X?+&hSdK8pPL%^;bawT6(!O0bpg;)|cQ zJ>;Pe+5YE8KT5dQKKd$GIcL9UyMGw_lRv42aoI6F9(Q=>3oh6m_xQ(cx4PAj)Si)N zUtcip2dBK4`~5}V5UY9Tn^qM$+xi1*C1?SJCBuWcul?oe4r;8CQ2*S0Pry~XjGV%a zfU|s(W54y<-`c+CW;fgZ=)b&v`=)RH=J4NAP1vNBHnnJE-L`9k!}UJA!0VFzfZut| zvSo{VlI95Y!L)Mua7~#_HHMbogw;78GMxB*_#+?Pe*8AK*}ms{zI%Tv&?mS1?>9xw zfkRt$-n7;bwN4w?YG%*WTJ7rw1Xj_Y|4~e2xbQvt{@QMc1^Z>Lmyq?@Cq312ofbcm zA)1r^(i8TU5hwGWgBWo|aLtD!(}A%tL2%H;uW zqk>tR-VA%AciO1pWzik%_YeQz6fpB%$9t|wJWN_9yJoH-dJSZL*>Fb}+20f^7O}I@4 zEUE9=B-b`-?~{6qCU(3}a50*KdZ%U`<$WC$V8`g4jWL-E1`oWJ{|!9?t>ou;QjF*&)z<~|9(ojNpUquom4HLRcQDV7G;hQ$@#<# zu{0Uii#`gItewG8k|L(ZdxMaHA^S#|9P}~=AORNTq({odm)aY#sADkcf0;xJi$G~F zJhT$UjwgGQmd*r&iNNjByAJy~CkDzl13btkKy8EUasw^_S_h#FTh#!YfaG|R-|>Ke z$`=5vJXt7?Ele;dP|a(>!~cuzsrBI`MiAE7Yz{PF&1f7b!1CcR2=M@f{jHO3I<6>3 zr{5+#{|4u8Kl-CTQbRz5#(oSPF_$XD29KDOVP8c+c2&e`=u${pT*1zK8$T}XtJxeC!m5|RRLlsgy;W-L*kOd$U}pU6oA>j6PP?$ua5Jq1;Hb6Dicu4 zGa3NlQZB89*M(xeGm*h1nramm#|qJrnJ$L`MYMoHtE6O}$2p6}S;HN=s4$8*1|1YS zjWjw9bODNSEuWK;%BKJh#3+6RjM6;e--Q)yd4Zux?tP<@V{kAUyhoaG)*V|p`Pu;y zt*TJk))%F6;Ob6ss|Osr(2e+zKg+_Z9To}pD?2)TjVqC-_~Rz4FO0NNBk~N_LzwDK z{d-<;?_3OSkx*YmE8JE5yUBuH&HwsI{5AJxUd2UgAOWY)xUpH#j!w!W z@LlKCiNcqxiFl>i0#DtPx=tL}t3*gQymI`}s`=oF*VA}8mm`U?O#T3`?uCw6co+6v zA79n=dEN;j7e|vBGJrc0swEYVd7*b+XfqZvtWZ1E8#x(r!cny^;fNNgsFuI{&uCij zcw#N`M?{nK&tLxe?VKy0v+YlDNzjIS$~KKc$Gy4XKE!cvWK5I{f*CvLRQjU*kT3cN zU${Mbe{|g)?r=K|?go76g5%@yz1-IyFFz8F?19U1Yzx^~KB!3ogk#~-H2}7W(nFV) z+_|Z+X@hU#iB2@8ltaDdp8brwm!estRxLHoK#;A{j3U3R;AbLAxWLbJy|{+I;nko&^1FN96V zl(pvW#FJwQ#O8(i)?MgMQq>zGK452glpeUq#cu(CXv3L-FNu4YS8+*?>ta{4fYE7g zf`vL>{>{ubE~qhuKOZz_Fd&4k%O%;=UwC!Tg{^S4FFLwL^|?J4vlqFSq13Dj47S6? zd1qy7t$jNVcQC=1&x?P(pXG&=2m|EN!@*M73Y+{1&l|_B3AX=mrG3e{aBTJ!cGX3z zmnVPVdcFJ0U^+AYrmx)Z86o{Yy!Qp8j=|CI>P^|efrv-$Qa$iWaes|{!p8taF zdvAU-ZP3V!4S_QGpU^$M>o&u%53*iHHINW|FypMZ3eT*~R@jyEvtJFj%6##BtzD=Z zGnTFoSj)hu!51IVnyhu~@49L3wocWK_UVi{i5%78T~`J?x=$(J?W^|bCqzk;TpRr5 z57(vW9dc(*^c_WtkGZ4PkI3&YUgtXJZFk%sGkg4g)OiP^!s;G%DA}9=9JkXLDV?U( zcD1WsZM*0x7j1XlABVhr5!8K}bDwj>?Zo7;g+A`ed%t=A``vGQ)T1BW`k1;e4EX;F z6mKe|M3d@`r3zj7&)stCM?X}%=MaNs2AWx{l&Eb>sGBb zY(O^x81TZTW0bLuIjHCxd6AhRqT)W{a}KmMi{D<6z4g`tk7Z@uE{qMgrqO+s<#SPTD+tKQR& zaYj2Dz4uF;tphv2?K@4cj)&LPsfiE5FZ*GOHA!%D43D2dLUK=R=X#lsIX;?VU0$cj z89&H5{IGYEKWFMmh}4SE+F_d=o|D{l+=iaa3muiQo)2>aiR4=*6T|R?H^Scvueh5h z&se*w2hl?5K>|l+cWab$RmTpSFrp$m^g*dN@2G$D1m>@~@oO)C#rDigp0R!GV;|q% z_{Kkqt?3;*`>E+??VrVBem97)15rI|``L&5>~_gBp1FPKL;LSN036~q&DSU_^BXnu z0*eJ8N^SM9a3+hb%4ZB=CBl_~N@#{Qh>-LXvvSif}dNE|hv-OWBks|>=wSe8s-B! z?>F!}`iJdb{)>OPz5N|;+urq8`-ibK9&uw}Zd{)6?!>DLLwV<6t`#9okAUKWGezBe zF|-&{EL!z41(RmLB0E29nFT;OCOD@e&6}O(c-;I=b3g$*I9&Lk@rHJSes8qg{SmS3 zhR03jKwF07zL092aMK}Q`rGxwx&O>>2MUXgS5(fgAj=eA2cQm*f+70E91gWk=TPaO z2cWWVZ73=>$yYi6MFmYt z9bhWY(jGSg@rdT?l>R7k51E#g;v~3AEu77w^V>S)M$H$wnsq%0wFXz@D>u>`_G)B^ zyTuW-pZY6~QsV0UT!vb%W2FonJU<;kiYr4rTmx9VrCh_LY;n^P8OIJcMA)P(CJ(}; z>T5T$k+O0!4OP{PWBn*736Di;%qWVpc&KdA>7On=&}z5D?_>=gV)fl?=VHp zPHMWfLc{OC<``n<8}iNi>wD3T3NzWBMmh_Ba%&CM!nYgSCft!04Y2v*2>jB%f z*Y#96oBd4-tEh20C>(1WU2~WaEDH9CzOZt{`M5LoD*GcAFW*0mP4(-8aHlewVg^^-fPf1PYH`1T zl8U9c_)mC08v*p9;_YLxIqRSFc!Cmj1D%&PH-|}K8L$k=hrO;HHf{)TtvWf47Il9Y zF|{zHBw`Up=(zr}mHCZ~IB-@1@Y7C=xRr0J6BU|aWPjj-mdRuAs5PP+#7MR5_%qkl zIraMJKNX7#g0wYaH;wTg&bRQ=HLJByx$~PtUzS?dS}0f5E6aw2UG|fI+wOSCzY6N$ zCfWp3BO|p2wcj#8nzals;(MzAmA2f#zRJ1wmX5ei46?u)VU)O*%k(i|c9P3&;bffj zOEHn1&1LV~c~DG+A^)s1VR!J_y`pC^`6hd`htE_<1~$DOwgjq^pS42QYQ;-7>BpWy zJ;T^V9F@D^ynXPytqrMR);SC^j^s_}ps%VRM#gHJ2&4vq19xV+!Yj}-O~_B<)hAJB z635XiaENs!c8*><84u3sCvD#NyYJ?7G^xwwn{8J-jHUSnGVuk+K#qD0VVr^jRz^S2 zB#d_T3`FW%k&g##$F0*v~ZOszBOcwOhhakOldgVy3YiaK({{G>OicdgAah&}~) z01wWvT%CF(EV_Tmm;17|@Zp|Ar&C9aRcn&#itPY+u6@@&?^^Y{PoMCF$CoFmMTPs0 zcI&aUKJ$T00h>DB9P@m4jcZ(Ezk~F#+dc1jPY$ro4xKQF9s5PgnhVF5{~qw52W*er zKL9f)*mM@Gl`9KWgsW#i=h@qZ_q}lY*x!6ir~pci`BnBiaG(9`XKlCJ?;6hd67*cY z{r>O&!FKCg-+FuC10T5E`A)~L#u#-nF(H2FY`&Q2y^O{Eushx9PSwLc^{E#VBj?vK zmDqMYJ7jFsm1BQ5mH2~3}sH9k_k%m#-8XuWYr#NPk@_ifj@*16lc=Uz*2 zg6e)~j5?=jfa9 z#hll=H|oNP#?o4JeX?#B#?ZtbHrSKi_|Sx`r{fi0a$njPqoPsyuq!=HwKw2X{woit zvimqK>kyF{R|kTA;L>(myH6T{RCdI>abFvfw64((w$E!@yHiV3)65|E?!)C{v^+IH zdGx+r%23ZZtb<64YDz<)&hI-yyYG$i&4IK|TzLyfW90mj8Q>I`y8&i@gHYBiJyGEh zU7K~IY76x#!PGiq>ix5}m%j9++jI7(34i+2pW18q?}s)bpnb26g{1>~^*dt=yxmHh zOl8pi`Xe9li0vs)ed_*8=s!XMaD-SmLuLzq9;<|y7$&l$FT$22*K(xh5LfnHK3D_% z=J*(&2>^rp=@9Dk1_M2WCq4wW!L*|Jt7W=iDHK>X4O~PK!z)%(G_|mAlRv$1 zowHKpEHxQTVoQe9dIgpB;EGVR?ze!@0(NXGfeI5*{ZqAS*(Suhkr1+ccH#q2RK|&|L)9Hb#)9&J%4DE(~$9H_k_TT^f&-X_aAK!LH zrjlcchz2R;)-h=X8#Y>VjKvW-oldzfF*7b&a8vYve`O2O=L5%vOADm2MS;%gF3@&h z;gK&~^Z>hj(+SOcq(7SWzi1lX%~?EnBxaMbu4?Q zC}e0>&?H|9sGC^DoQo=uU>4pK9Af}Z2iwu3lSVK)Cp|jPz+(Gl z{21mJKE}&j>>SV-^;fUT(Dx-iJtWx=6FeWZ z*S`EI{3_D52aTLIwGLTTj+aoI+TL7twq4}Gur=5UmB4GLnc63agoyRC>=}9Vj|Pka znIYF!lx!*SZ31r*1ao!qDtjti_@n+8K#*Oh&e$ zW^z+m8V$Z-Pb$T?6(jwDAK`WXG_=v648{f)jiG#CXq$oq29yfR=$A6c%2)Yp+l*bu zu=89t6t5jW(vt>W@yQHOc^vCnqd2B;1V7pY>+!HDTB7};4FXf}Xq|~RC63$nsn2|7 zyT<-IV?Xz~&$UgXe@gE$D!fG@Tp;%1L%E7EBs)?^3?l>h$$rP(7tcB_p8dq_WOA_7 z_%9qs(}}CKfL=4f7>g)JtA=>$?7YCYE__0UG_l^%g6;gWNR z|H{*)=Z~@~kUqcMjnDjpJ%Wwd7Y@7wHc~Nw9#9n+uIg*`QjCBBUmuhD$?ivMO(_ zTAo3QSn9o^?H0q+Gblf)U&|!})u=JYx%QM-?#}}9<6!7mwGRImjfd~$f+92Hvj~g? zf*LpMUqns**lJ}3zLq&d{Mbn5fa`FtPf-j<8mRFol@=$p;C$wp1BKu^k zYl+#@${+VNHCGN4%}}RdU{(=^*0|Pc=9SABHQr+Lz@Ph@0!?qT z^b;c;a%=Q{Co=>se&w^QIdL8amVQ)}(u`fc-SCEAxqa;8f3tnyvdbz*K3Cy)&HzN2 z3ucbp25$Pgi#U4Nk}tD_Tif=#zw;mVCr16~_WVnqzukQQAZ6D2elkvLWWMB&-aD7Z zl>Z$aPi%vX#=DzXO^g_O?yT^rXSnSidV%H z9`m+26M=#=PNN)>uYpXZVDxNd6YrkX2of$26rNfsKDnRD`}=#rfp>H*u?B06D8&iy z?CasvwXVH?7<=cR+#dhLCv<%|QK|I(aBqF`NC7pqe(Hb~<@hl6(fggO_qx};jI|m$*9ULUzS8#K2R(Ru#3LSwtb0A>V7U&MKAaLj{*T!H{0m>W-RX_`wg_?zVp@XB-q#+r{Xv zuvJi&oz&Pme&6rgzx~_y5B5H{{m0+?JuvH>$|k{eDD0?pv+r5He11d_?z?*xHDHbP z=HS;!Zu>)uBc^Ek)WrSxSH1dG+bzET7TX*Dc>kTTH`#w@EF6-D6UX#Xljq^M#i_MH z&W`$y{E^^=r-O9_7h5a$XzhODH-F1FZ{PS0-?%;Zxz8h(ifeyi6Xu~EOJN8`rN_qy zyEonaz2p9v>T}My%J#GS6Do~a208q9P+i-`Y)0Rsw6@OomnmnNpl$>_igf3eXhq)~ zeu2$A4EK0NDI)iWT13iFpP`rH^_VwmQC=Au+Yqs@v+wUhB+QO$39N^d%6S!w4k@orsfINw1)KA#}M#2+3aGx7hx1uU$3aoHlTMlf`Is(|ri0-vOZTula z=`n~x;+k+N>;&BS-5>OdKi!j9;H);_ z5W`7%`j+m69Z$5WQxc?FFN0V3(>;z2N86mHKu)hWz5;gP5CX?%&Nt$xj%HRB2$KKI zTGpNMcR#hI?dT`ENFUrgswM!jgXd78XGhsSWJws;3c=_4Bp~uBu(IZuX~5!K*YV2D z1%#}h#xi4mEIYxIv#B?xv@qMe5zsJeUd|g1!o4Oy1;_NAfv_G}I|SK|$xD9uSGMOp z?|Iub&pmg0)hk~K{S~)xAbHcdb!V)8l=1Uh=x*2__2@@!7hUv}?Zd|}p*Jr{iibm4 zJ%*v*_yxjS)x*3e=d@|$9gUGs4k=pFtvP}iAr_+diY z)c88ZLcSUsiv*=$its|00=ecxIXGp21c#zw09Qz(3<{W$nWR%(0O9GKj8c}iG*Vrd zMVzXTI4|S)=8>Z^nk*Iip3r-jFF5}Twja3V4{Xo6S?|}AL!lh<2pBy(xM3N%AosmC z=Z-um+Tu+3KnmDFuUFX28y`A^-|x8rM%IMEZpKa@3D&x_77Cw}Y!>8(T#iA;8YCB{ zjg&?Ufw6^7w2UyaW>Rv438ockuqR|dzU0lC5&fwcV(}1x)8@}Sf^|ZKb5WYVah-y5KD7AKgeeM(*|mPZ!~2 zL!LxOz$ZEA3nNCuKJN_8h{;AClQ_Oi!j82OwY$lCSSx{&8v<#LX7!*h-)2I zx`@x@JoPGuu~LOohA-cY2Z`YZ_}1xa$o0p(#$on1f_vtyq^G_Mqi#XHSvS{d*v&V& z6`68FnyxAhybeS)0PtuA9dGw4KCh~}5Z)i0Ghi&SVX&}P3|Q;jtfIAOB)Y-1eF{`) zJ9ArRfYoIPs}1Cv_n~I?7oT*l!aHl7vFSZ0M%DK@zEewA*`Am^@FaVLgl;k?O6#q% zm3{q_9Vb_Dx3J!vJzoFhCqKSj``YJipZUAb?2jwHGE2G&PF^Tx?k$X%^pqzt)-W;# zI^sTSZn6aLuX@$1ZqIxE^XvD-0~Y;F@0|JBYCeQuJ_RAoJX|d@cOIU8+`2xjyk^k`LWX?sSIBru=~6Y!n_O7h;zMO?j8*V zI;Y`F(1stWGXnI1G^iqWW^V2R7Z#JXiw^tO0DL^jsO5407*naRGt2eCRw?4 zuE7oIcEXXn%*fJMuQh6p;1KXR-swqjC)$%WT(8%Q2+M^iu&(8YZkJzLSgiv3Yy?p! zT)S1i<8@`nSnSXg=@Y6hz(um4ORE@b+CMxwiD6@J;M;SftS>A_JBFSM-%ga(-8I^r zX?`i4GE|WneJuIuIhuX3A*}OE%GTZ2u+|BOj*Ti0)Mx9edQ`=;xi)f;n2{472P9i@ zyO(iYtv$<4&jKg?=N`{5|B5f)AC>wy+Xp}RLB%4J>bUvh*APwh1q9ylPmLo;(J**? z*!8;Cy>9#AANi5}&e-Q~H`_mqbw8Im0%)C~Z}?!DHD|1a<-JlBFqp=QeZx9idW3cRx4;p?C~z9#0G3$zBTQBJT|xIph2GP*B1&Y67@|F&ME=0UQPc+@4h zFLRA|838;+8pxMU4Gt)hjsy6s7vYkzJ6Rr4W9h@bkAK1w z(!;Dz<{$^|72W5W?lvp_YT^08=DGWY&qqA`;oE)geV;nZ8fV`CGIpNmhP4xW&%V-? zwue0AA=^VA_AtFO@Y?y5!-{|FZtDB~+KXTO;<_94_7R}ln`OfeB&h2k^TmE3b zTL%c1?XB$!c)#Za9P#YAW4S@3!eDH(CnC|ff)l~ymgK1qJjOabO7^^Zs^5`hXsD&q+&L&Ypks${WW?4$-8duu|A$a@X!9) zw{0(a(a)2CuuB><=C&yLqCXOwBmS3N_Wte0`-ic&-|w0}?q)tP&>T~2L_>O0`c%*6 znr|S&IHvDf45_qd+;1DkL=lX*B-)?kEA?QVw<`iAB`4RBEKmzp*8agVFOK1B=A`a< zt+>@Um&<5ZWr0A!VI#VZB!2TlPSkMe%N3C$)Nzs*dY|0PMK$rP9v}>D4nK*D`}S5} zY0HGEZSCuiS%uo6T!-;78dy7i_TV-HtKXOdYAdtoSBuTIfBC*-{uG=nQPd zlF>ZR56)YA-Cv&>pS}@;ZYWJs1;A)BY~}gTJn^xwo6J}fC2&N&Qt;?Ug_$}(aSWTl zI9nIoMkJE@c@0IFOxy+rQ}1g_^qE{Y?jtksy-Wl0vfuxfVA<9YCjqNLl^(wRm+4;5 znj^*;Dr4dwF^>rlVFs5&^pK94(Ni}Hx| zG^SqLk9_Q7AG1C2Nl)HB`jHQhK+M6WRc<~%zScT6DF>aT6NMN;2|E=eSHaPkSO${r zL7p_S<3dMA6~dj6dQ9}uxhlj5Kuq#vUhz!x?EoG?IXs+h9mkampvAbew1NS@UHGE0 zGAT5WN+fcDrQ%`;O*k2?9FJ}KE3J0}Y7`+*GCBSX*PtGGqCT;5h3e>)gmXILe4057D^8khn?T`UEjU^>7Tx3d+&SS zOI$~y22SeLrf6f>Y9K981Q`A-5LW1(y%aFVhLa+EvsVdf5@WDPPF<)}Flf$+Pd>DA zVH(A*FC>hM4)E3ZELn9pD%L}YdlIkL=QlDlSQV#-g$#+}qU+ZnJ^AcAQ^BTM2BfQt z?R*qy<5*_!W=ReRhndCs}-UDjHA z@B1llH&&813@_2(gX_&tHN5>_ zigrTM%}IY+w6QV|EsR(1i-Jlwh<|DkjcK6-4hrX3fbW7u=SMNK%3`-MlYF58=>x!` z-Hd(|81&x>uT40~I`yFTF^Jqan;Wi^)C|dS{pS~gP{E<~tcSpBV3$qva9f8X%2OXQ z3J1lpdD=h>=5Wl7vfbJ!%ND$6-#K}>mPhLe6gi2OJICb`x@v!t!IMFxbV+W=?8bF8 zQ~@MEjMFhe{`8B)iih$E%M0I%ALI|3k{|a{+^fN8#YHVS8ewx%p|=(uKWbIsU51XW zw~u_}quZ6QeC6$vpZLW7b;XzJeXNyWS*h)OE!tDDq7hDvyY9?dB&|?b%Cd^Juyni_ z`zz1*mHn&Zz9sQB{&d3_w(zP&6g&!)3VD3!d6 zUymAX&T5n7hg}_riiiA+qF6(~y>Tg?bxQJyLg!cjVFzo5;;q?(8Kc(a+QNnh8sRN( z8YK0i-Av%I9K1J3$?Y7%Q+I*#=?nGwrk)CcMFE8>*upitK!!a>Dcd03eHOv*S|wt) z_6vK$3SODAbsbzTn@7(gIIWyAplb^j8M>A0iTfEEQ<@;>&cLlT#HcVQl}fB{JdsYc z*%B~oSyV~)nlFj-^i46ymW3&Jqj1t^L>9>q_^B8=x?yYgkJbyv*g8dkmO2f0>nXBE z$dW_t3e4d@BBN_)FlUc_`T}11Y%eC2s8tsfng+)7xURBjiHF}g$aU=+m~rD992(6o z3e&NQKR9#0Bx%P#@`A+~G9@j`f1^bN)1yW#{;+58%bWtAdX!Kfa&fVe&2U=eias?T z;s|DoY^pDVcf==iyknweTcfxs5=%V0MS+>4wn-Am_{H#50klq@wO#LepSS=0st<1; z{NRT>{!9Kvl$qOb-E+{evwPU?FWj3SLHO_cC-3fh;a#_9?FUkNG1eSEe&~3a1^o>} zy3n{RF9#-&5@j9zlOUm>F|0M(b-%80UzA*+tA+k)xH z_W6fbuf_X6C*8FoI6=cItzH)=A~x)K+*`}LhZ~$)_R?CtrIn*L&Hb5AVIM_@OE}X3 zjqU^cOiY2j{AYdU_J9XGVEgeW{kXtiFaQTjtkCVM@slv)ETwKg>5KQrK5PGK*hf9; zQQJcw`cU9czRR}mC3upcI3V;GW!L^m-ugzdiIJ50fok z#r-$hy1W6n;1R?X-;BHSFF1dD-}~Rcf93D-ckJMqvO!K1TLFlA>>hsfcj^J0AG+u2 zeWg`evB8!xV8QBX3YghWW~tx!jTdbf?%zK5=0AVa_J#Z3P%Wkd+WCo7(ISN|G-*_K zmoNL}qvwvY+?Z>!moIegXpa1wwZbGm_ndR;T<%w%@youTBGGsF%5Q<9V_?TMyvW(q=>4sY$(!v?8q`w@fKC&&&X~);;=u^wlF{__ zy{TZ67`hMfJVeCy8^c9T41*v#JQhS7Pp7&rOu^KSE;;2xf|d zpyi*(Jm!9lo$C%mbe;i-6wKb{hqT-?UR_}RT7#EbVBDf2u-IUa&}G=+jP^T4=n`6j~B zJH>jSMOhYUmmKI){4Z<_*jo@z&vGii0{k4MYDd;Mjh*5<=3PXwYqjwKVFe8mrnq^Q zQW$hWXv&7-pc0ohzU;zg65U)?p1ZX8{Das}Tpa7LXYgWM9N;;-&+F$Vvu*|N0h_Mu zFhs8WhQ>pv34dZRLgM5r-mYarSD!0jTgMTt62yYD)DMDbjQX5vbPmD7v!4B&?b*+I z*8V1%&)i=2(wC*y%ySc2>Ki7%K+Vcr<#JY9&V`cHJx)n z1PUu|iI>RiVrdpc+>WOVVk9C-yqG2@1Af3`f{?sL1t4whp`SC*W{`4zCIS$v2o8Kq zrA3IXPNu{puEMq)c8rQ#hFDL=Y=T&}q0(sB2W|{@E0R}AV+7G8Dnno)x&Y~dL?cr6 zM1H%#T3Jv(leoofHm(-CZM*u_uD;#jj(6O@AN=VpXyC%{By>>|iB*v1aFD&4n`_Kq zRxm|Fb~Nd4c>NpprtNQY5a?WFFSEU{t;D4XbrlJFiUi$+l^=T2!Z+VEU}jsm+zd+t zj(bKaWS!-cV#A_YSen(djW#w9Od5dXL16{p`l%vpk!K&*f{90STmjcJ?o-?duo_q% zhh9Z_;jY{Z23H-`bF$kls?Bw?7pv1nblL7^2!`~6?Q5_z&`l%e5v2Qy=9yx`6|CFX zUk~_H9>^&{>KBGx=(S$qjK<5{tUIT6j0PtM0%+qr1e@=u>|)$HXRR#U0DR#U#3Rkc zJ)@r{cEK6}5)4X^C`+nk=7tVqbSFRud*0toCAx@Vl2v2F@ggAB1*ZlPPg4wrN>9P5 zC?#D|GdY@i_!gXjyy-_e2jZ52J`FrRk7mDoF8xw%a5D%2u!UwitW+$QPr%jv#0gwz zIrCO)Q=w`z#m`vnHI)mc0-}|TzT0|d{3>i??THyMIlYyhL zH8i1i0w(kU%h%1}r@`HtB&QGjUiPw=-Tt5b@a&tvd4DmsL)izK&MTbES2`(j>`pIn zF}E z|8E@T!IM$r=J4j)6jWFj(w{2q6?IBRP8i6;(oHOVw)g~F_JIwhw&Z1N+~u{8-z~BD!?;>%_t#@m#~2eO{#d zy3OH&-G*2H;U8{y+P^XCna_OI{x!wtWu~0psIufJQsG2YG;@B#PSt~S{ZGn*PivmJ z>BJ_EguCkz@#TWNDFdHlP36SBHk_zFSU@PLsvnQMH$OA)xfg;9{jC*t9PBEhB5V=# zOoP?y9~bJm_Kmd$DHIQIyYSnkcASSeeYxKN&|b;2^|E|jXZ-ZqN*IU2dZG0G_kY0l zEOSH2{u?16`+1aYX>AA7D+<#5{4cqR?_(x8>Uoxc2yP z#_?y%p7yk-Ca$S1&JViQOSOdt$&u&x?B95I)0^IOephS-)xce00J zOYhKuj;7T9BiIJ*UV{ zTvCI_WBe#RHK+80INTG0sK6coQlplD-QON(HkjnCDf3P3^=$0+tlzaLTUqO=DO#0S za0bx*r)wWrvnj+NAu6*AxC1qYPuJ+=xqNT@aB@;{l7`u);d?>_hDMB*vq8HeHOT+> zc}DjJ%XxBL>b!y2d1iv-3L?tU>9-p7x%0BKlqho~`7>`=N57s3arHCS?IWJ%ntQ`Z zZVa?;xBHwAxlfZVW||e%YxlR%Ij7h~Y!IHb&qA!vA(T6Xy%Vv_N`A(DO6)ZXsC&4^ zDg$|nk@Uk;8hJ)k`cwFQ_wj8P&wcLmw<}%g3fl|!Hxq@{o@vY7=52+#zNR?C9)x9M zp91{E{?#H+`tc{%i?IdX0*Fhn44dy<_OlTQNobMK7;A4y6T%`}0Re<_flYHk2K2N= z!%{BbdN=1v!qdTOr~vdLY>Sobw4-hH?2$7_hgdFrcxRHkQzv%z-NRh-&dvP< zK9tw|pPB@Tict+6P8vtWD)-h_%7E9|ED4EsBF5C{~P4OPel zYEiRsl0!PvrxDnV^vOLL*nnEUdm9snLYH5T1H2Yh1Ku?AHZb>a$vjYX<0smWVW-@7 z!E-3x*o_zrE}Q@KDN8+WeQ{pY?7Fr%gw_M4Vgg7y1{qygNbzjom6U#=ZFqH(>;Bp< z7S8(Q{EXklMT`9D0Y+-DYh>Zuv1(u@PL&U^6cadLsWi_aIwe$~sL;6a@rpz({G8R@ zx+VN{^{2L1y~)xA?z)>kL>#uJI1k3mx?+Y7@=IkIbt0;)JsAL6qRs5l5rFj!e+47# zgJbgz7^z9{g@4w#;cs3@A2K+<>ZjlQ<u!8>Or0nF>;5KN1;Z92GwD?9v@G^}@TnYj6{Et%ce&Psc7k0zls%TD{%PWf zpV`j`Wb<99>6jKAI1h@k>vr37I0F~qT;*zDIUIITEKYat9VvAR51-N#=sG9F+Aq$+ zjfzr_k0}j`UKa;2(w}O_cKZFEW8_hDf!_=7^BynV`t1XQ#)^oM!JH?$#o{^0(>;EMva(c4wHHI)s3nozPU2x_cw9S3FX9?9Q*RMq{tT#Z-*Jw^2%sM#0HR(8A+y&BR zF}5vplUJip^i1l$#5r>wjYHSi3{VF`S>Kv$Gp(u0kz~ny2`03lERN32h#iKaNAw{R zJ4puh!c3g~Y2L_5erxr_k37T%jO3#Ej(Y2-dj~Qs)miH4fkiuvUV*jwNqe{c(e;W2 z8BeNvwl@X((+fRUM|GAtV`{RwGpGc98b^&O2k3g&yKbG|eC(tDNbX$ciJOCI?u_6n z*Qhyq)p&wch`GXl*7iUC$7{Ab?tka;S-<+LHK*32!DyJ6IO&4MP}hdh6NEV;S7tIm zAYJcyQ@N!e+=f+dhA-1{%fA(kBCrE$fQI8~4dS1HKekURj z#<;PBo%x{&E4F6<>rU%i@^RQi9XjlK=}UfdyZhbmzJ1~opNwxzw&mmT$=K)aUuAsP z3-976Cq0KxZ+Y`uw_DuuYqtmOvHRgi?0$joNT8itIekG8hm{qFbJ{_Kr! z+}`@ux1enYtPBM6Wq}*iG(fap6eifEdX4&)epQ*WdGXH3btJJ=gQ--@NB<_OCp?$&QT+x9gsJZehT&nY}v@7j9g? z;8H~)y&iK_@uqu7*A3@GoHI&=XG5g>%;sv>oeqA#Sj%24F8mUB=+l_CP3~bq+35d- z@X29sE=U<+RycL8-G}51&vW+j(xN_Z6hNQR-0IOP-{;l?$Q(?I;eg|7TG=0`3 zqfhTzE$r5lt{#FeJgK;4o7vMV&+g@wvH+{rV$;S=#ZwFGY(TZA-{^lLanzR)B5+|H zbbgdK^HFVsdtUo3M>De=zb*Z+@g*A~r|6uyT+tx5o*Vj;y7Jk5hGw9i)g09L1K#Q% zVyQWT;QL3Cq;M%4X$c}Co#S|k6G7$D_jnJ-5+FFIB750VF#{v>#ctaHyim|JpTd&y zMs&(AM?ntEUaE^H1{~XuR9kyg`x|pdte>%ed)o7#|J?1G`Pw^%y_iP!)(&sh`g6N5&!kcG8(nx>^7 z(o_{813hm{qB?29Ru}4`#6oN(*YN|n5v06$R1tDRSMj8f$lh{iXmes`Vb|^XZ&Cy{ zBYZpq;p(>mK>J(}3jaMEIeWwB2!aS>Alg1)iERxuu9l#TLN=Rv7gGDxvfogyEG6Iw z(gdrxAOH@W>EV&#a;-_ae99ySi~>1Ym(d&?b;8s%^B?xgc5mx;a&53@!MNJh zuC|?j{`vK{aVDOonCWr(;rf0m$SFL-hctbIKWSw4)$VYI3-+&@`Qz>H|Nie4#nB+- zP{GA8q65|JWJEgBO{@-c69_fH4p+$pz8vr(?0D$JW>E4hTUr|Y9?OHx6eAupCKk?$ zu>GR5>}wdH3v&>$S`E(hr!+;TwykkzktL`AM2l1i$`3aLU<+cN@s)xH!fhw^2h(ZL zyI4w?R3ub62~WN3{VGLo~fNcIbF^1+_06W~>0W>M`*QxrHQ0 ztq%%h*6h1Ec(Ba zTqe8OiL!-{%Zt+tA5|}_34yaTBxh)_0;1duc~-cbYiYsStgdy#@oQg&*EB-5gA3-n z-lF=hqZ8$cX>-eY@WIIPFTQlcW)U3nilaG5E87O|6*chyv|Aq*SqPKSC#wi~F07!b ze)HVaIu8%Q)q-i?=o$?zorDU<8k5wI6J3({;FIw>so~!0!1r$Zd;aEcx9eQ@I@?D+ z{Ne2i`==iY7Uc{#S?2`{6vu;t^fWJ+L6|e%9Ko8WZwe|c9(!GG|77g*p7*@%PWzuG z5XPJ<^I8ry-}s#zO5cWV1Y6+2vJgJgyT)mJM>VE4DXa{wPWI`3=#9zKI7?9JV`k5N zQY*$FCSL~L8erlvb?jnawDJ}BI%{+H8Xl*I7|c53dku*JjS$8m^HAzkQCm_XqA%QO z{pWha!1%qm!xh(7)$mci8no$w{E+tV!jK-R_$nPtjjl9xO`Hd>mI&8P$FLBQnTwiD z-ZbB61O3Bc*T9K>3?Qk~=-A+Izu8b2m(4w}mm_1Din0h%?8tMqoqGZB%ws7EmYOc1 zT8z+WW&tyapZ4mRL&oIOUBS|b2~g-4IUEa{?pewGF+F1Ju-0iI=em14KTZyYeVIi% zQ1rjTh2W~Vc`j7`^uU;2Y6andpdY%GTsJ1>S`H?a2u)LNDziYg=hKm^48GVBI}J1v zXUzhiWTbmPaCjyz!K?f5Mp5Ig36eusoB#kI07*naRC~fN7bLWcIFwHfnZ^_S`v|xA zM33!*@x~^Y2hdTl!P|-{8l4W=JrCG6w`XphM=j-^l(hi=DW4CgKKHuU+rMGref!^E zKR%&n(pDP7)#Sc5NueD2&@R7rp=AeJ;K5E_d0U_6xtToqvJ;W~|nSfAy>T z*VYp2Tn~!ID;j8-EdM=E_uMdFNQwT;8GxECshG2sYcl_uF_DzHu`pdw!44!=kNF9B zXkkmvC&w3EZFK^~gZZpdv>7Kt)vsGa0-T}eF-T?|CUd zfbkUyOawgC4j&@rh5Y>oU32ZPEnMVd{e{b{?ZS;NE zeqjG9-$y^{(cI@8$?&BnB>ToXcpAEO+H3PUW4(90;~m>q-}EN?3)v6e9{I@q#n=|ztY^(UwXb96 zcyIfk*Z9^tGkV86-cAjnzeGDU7u!euVEQE9L#GrqpP8+ETJ(vyDb?8k90)_cUVFA3 z6S&?>XB)LS|ELdd5O!1&2lwhz&vi$nyNenm;bzZo;a*_MBiMUGUqz&(z9?dah9z%1e+ z?5fll!~-XtQ}?RbtU=cLYG9xV!N~yaKoY;~uWCQ^(LEW(zn}`$EZ2m_f#OzXz^yu0yCDgJ`qM|Af;`r)gOo>@Wx%?L+- z>_@+Zxx9F7EV~ z#$W}HAog^mxb`d{gVYDs9BX^x8=8v0>R%ia+4+n6pRIh!i(j&R`Impi{%2nIH=qeT z!te1L{i8dIy8WVy^m6R!L8py4F8Z0D`RVO(kNdIxZ;pJVof+hHVVs{T6aYrsIE8|k zL?y+W(bqWA3v3XQ28SE_Zsz2u@T3KE=;ooV;;WzxUI{IWIJhaNwVI7--9A(eB4$W6 zT1lz_lf&pTuN%8$(oJxIkh@U72&X)hUqQeeB3s}L@QTWaiFG5wTB4@?)=#~iiscHp z(WTWBA)^O5{H$;Q=pGy(j_vXa6cxEemgWt7MaRyq{X)F zj(57__P<{Hzqa@7FUBgw7GT7mJ<(o-vSX#KEY#$`%_rFkfYagpHDB17oFg@^8o_D5 z2!bBPZ&n}bIzMrgp%(zHMGt?E=Y|;8iWCiB?{`ItcjB%&Db=I7S%iWdj|Odd zXBPSIc>`UEkT-S=BIBccMW5Wjmu<6v!xzL`h)cDAXX(mpD?BO3tf@{faj1sLaYRQ) z5kDPLx{+y~$}@`V5oL3xFeVQ4$$@cWJm~J|M8&^JC)3e>Uz#c{O)oTr(g0!zhQrd! z4$#bD5X4V?6y^H*+Qu$nPZ>{s^nBVr-Dy3uY4NE!My8fS326$AUxj;cGQvmmU=1P; z+5$1+F|k=Y=^s1`2dRD0RhVM;fl1v;z%yW@pJZ1R^?>MzM>o<~fVh}A zpn+#feJy6qtZa=q2aDzPXxv8_f-%;yp0A(Mg)c{{so}kZJZRh>_6$xt-if?@bU+;_ zT`*rT4XbKj(x)Kn|3+-mACP82^4Md|d>VWbg!SqHf*(H`XqR!bhNhv6<|-n>JT`_u zXUf%-u=&+3%HdhtU;p*Hw$H!*^|ya`-}|>KUHM9JKH46gQryhV#)BJe@B{vv-;x&V z!u%Ay^-Owv(f&7UFTKCh@wwaG_OBvy48%{8nqI2ykiJKl$Q3wrYARO7Y$abf^|Is` znd$?r;#>RG!=WFWx+OchUd_R?q2#!ArBHCP5BL*prAr=Wbgz7s?G4uDtDEYIGj(aM zCEN}y6@*#UIPFa1dRn6#!UjI(+E9 zt7nUh6JWD-1Gt~`!j6sUUswJA40`g1xS1S+n4=N!_ows`561$GiC?2Wki)4GQ*UG! z*Av-Z8Pb&0Vzws_ZVC%PsjPSK(Otww?#|JjuoPyt%fEv9!QWR}8@#{jRl! z02>Lqr~$j&=h}4oLQgs&?CLjO&>K24o=4!A6KovVVy6@pNq()3V2 zeU3_r_{#RIi|*yd{7_-&qG5zgwOH~do0u=HAtU~v6wL$IGAF%E|KQ7n4UmyKl$wkm z*SYSw+xz$W`7is6LYblBABv%>MSZfAre@6S3!S&w0+Xw)4;1 zKN)-4W6rcpxQeF2Ioxs$m@m)>qCLU&>@@0KCDr@}vOqlXNgk+WLX!U9HiON6^9}K~ zd=a$ty6MlUpstUY(-`i6cidHzp|>K9AAR^N3x!d~%NU>f+<_H;RE=kUnBD|}d4@`V zS6q=nq6R%{{c_R;&c@gI1HYefxy$V@l>Wf>_{SdyldWOxC+k+|(b}r7q_E77K(#g! zo5SuaUEzw`10VdL?Xi!2?2xCfHp*%u020V$r9#0>-^1R@0mP^<`)7f*`x?bN{Mvtd z`O9CvziIvs+b2Ky$*u_YZ@>IXSG>ahO)JmZKSh2A^&7<1@qX94-nk#>-gx`|2Y&zd z*vC9Z9*kbV@*~g!hFXTY(P*yc?|ILAZGZ3wzrVffUGJ6_S$B`0(0$dO-lv=65&s#- z)W3c{pDwmPL_R?eg5esyl=~FL5%9z{xZI#89)smIH=<+Qmp9IXt;Fo`-L%QP=^lLA zrJtiD87%dP|NpS~>`RCA*(o!5YnB1pB^+}_;wEQryhtA6Z=4|6VK}#KiLcmphP{F~RZB1FuD$pPlam-r6l6$m_L%umd01}Pf%()7yf+kI~ ztinCC@QnV09C#M01(x2_da1n~C00-H|0*>@l}x%}%aFOwk+LIvhp3(Fd1#`T zHD>*B#LVBIrROP`yrRf(z}DgjV&e5JR|b$|Rq;+A>~IVmT2YK!>UPBsJT%W8)saV2 z?}#oN_8SHVc7v55U^&zDR;eb@%Fd|c+A*KC!(7syQ=61-0T=}2BKJS(-OF$H#XV02JAx%bspfW#JPM+0+`8t^ye2BYptX8=bOazD4FNO-?y0o0rUcw>~#HYMy3~7v%*-I*Th^2I@)|p(;eeBae zYCkXFpAT=+&}!`@yqpzae3C0IRfD940sqIf>u{pyeV@Xi;uW-0?dGRMVrEB)A*aGg z3>i#^ulW?6K{y(u;GtrVNaB0_e&osGtq01y9J6d5pY4lxmC=Y$j6ex(fq`b zBH0bwBJ5n-U#*(-A_fq7WaAoFzvgz^+uUY*_OqW2{%|_dZFi2wuYE{T2KSV+>G6?I zL^`oFR<`ZV`=@hW^P2y${loj;Z-O<{yW@m_U@88OX4?@lFDoV9SNJiFmao<#Z)TeZ zyQLrC7n!dZoDP*e{nH2^HoD8G6tvJ8Pm%<$dR)|e7ZlBhQ#~{9@TCrx*bPTC z2`zFwj(vwb!Tm6xu~+a+O9f7iU3g+F>(`cq!UaBYiyLptNDI?RX=2DwW9=|`5#mR9 z^&+3*8dY=mU>>UyMbr~J2{weG$v-1jdfp9nF0U;|jvH)>gE32dJRk^^m>eA%^~Pxk z?{aa63mdBxL|J^@&|gzm;gNoslOE*coiyiItri_vsQ9n?Q(18!h7M|lUe6ldmCcbs z1DzJI9L=wMIxT2NdD=1WCPM-`EG)pR!;P+?T?bG{zVl-zfSRYAcc#LF3KeTLIPtu( zG+%(pi%q6Z>E{uHB1qeQQcFj)qOr=8Vq?6|a^leWFk-&@G(%9#bVTH+>wD_BAHz?_ zcw{*m8&H>D!r+oa)@m9Gz5Xw_^TVq^5uhtZyS2!a@##9UjfJyh)yz6%dII7|)cTt!Etp<}>B>+O1fT5*tl zV8>#UH#{!(HZD7y+O*MYk(b`Nk3!6a9xicDwdlO_QGt=BEIJ-7Rpg?L?oo@o>e0ku z`ndyRktpiN8QN+LOgWTXQ0V8WZk`a4lwD@HRxmH%T9ioBPTDo$M{k4^Q9BPoS z=eb&&S{MwHuRg$pRGI50Ht=UibNzUR)+tb}jRln-K_)ET&2M3=Bp}m8e z3AlCuONV`PMoF$a*lQ{2T-y*GbksulYMqdeZYGRhByXwT2854kx>mYQlRtD%w6zcP zxySw>L~+Mc_XXhB`-k2Y4*{m%n9w;%k2vSo!?QE`CP0VY2;N

h~rXT(s_}CtA)y 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əKmN&2G#(2+jUD7!xN=Of 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¬V$V&jT9MYDPev7Rh2d3WNLNe&2s$t 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

    t;$kfsRd{CDI~GQ(h&G4Tz`M@gcK?bOV&;q<(2 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 z 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

    4*h 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�Al8|4 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 et3~sRlOdtKch)NM(Y|UVaANzapsQSc-z61=wZ$ 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

    -@< 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 z

    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 z�VnUD0nYh;`Kv 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 z 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%0Dr$*qZhHJc6)zoQOd75YTe1G$QZxM~E&f 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%0Aw3E~W?#z{Lyk`9^b-GHzCjpDW{Hh-feT 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

    aiOaScN5i+*%*z4F|m;zBBd{ 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 SyYbBpOTXiif#M5ZI|`CoWJ+|@7XpGb)|Of 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

    }kw{0Q+vc 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⩔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

      d^vklN!Pw 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 literal 245136 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

      pexHcdmU00KyBLY_| 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

      0Et?3}r3SICBf0sGfw0rz` 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П!%`v*GNBQ>j&tcTLC7UZfiUIb) z=bN5YQX+_DqQ3XPu1K-=t0V*FtiQ@ zTv9H9CG{eRp~Mwbza$bv7997YCu^5-P7pXz-o47-ooT z;$UWG>HZRsA_ydxhPq%BC zbn3AYdTaL`O&T_kDz_OB9)j79XOLRY4hp2yk&#F@fNCBE?j5D2^?+Ai6O(^(|EZQM zvdeC6$qwD69YAbXuuwRq$gaiAMwb$)j9x^)Jhpp=sr76Gb~z~z1XJu>Z3Gd*SPJT+ z+=yJ0{$)Rh?-_^dhkh4=cx-wCFck*S{pflSx-d^NeAA{xS(uavBnS$!-pCtH1(52& z5Prt#pMz7xopA~fz(5cm1A~7X#bjaHdhU;M$^9Aj1UusXA&GU_YOesF*Hg zZ(pv)FL*@p351TQTj+mCNFJ`xk@AZLVf^cB1J5|Mo*h((7dacek~0E)u;tz)E)p*n zdAWWnkwoux`TDx7Mot2ygaN3KC<&3KVu3eZe2!%d~W9gX0b2nGxJnkejY$-~^#$Xiw4T*)ZHym7o z;5s}Y_(j%C)k7wX2)kL~rd9v$`M`j1Wn-RZiOq)yDgX1&@W+qM)U6-oy#9AIbECgC zM?>{c>RRUiGyH$=-#f1hnzhpJnmkck%8&8P3P-a~Dw!&Dot$Ur&R30#*xfvK2ggN{ zxm?y8m(lPK@}QFVzD8=v*OlDBr7ow2gUmFVB0)0$9nTfBOEpKM$bw$Pvt)7| zdV*Mip&{T#3F(3$v6nNDg6=Klki*`M4eqf{RS+nox0wbMsjW}(iB__G41do@#^3W{ z@#h-AATEC_&B~9Wj4~g=#=(^1Vs*@7x0l`i^YT@!qLt9MWA+RruU~AplIaN-I-oT}mxJg0@{zyRvSO8Jr{6x*&c3Vb=-%IN zzxnU4e|>p`1iNIxbQG6hKYb2`+GDK)#5z%dH*J6MJWg~TCZVTP)!ARyEe|9QaLYrg zl#dSHVIg(A#Ke)~qI)PHj8j2RGZXe9)uaFOr6bZ^7ZBu>4`Qkw+6O5SOhC?kbU9S7 zWMo-=&UMzaPOa7-u0(p#2t7yz$M5JR7$iuon6#UUE|u>l!HI@LzIo;=n4tlLxzIE! zSYm%De9$z$-ey6$bG3ZRJT-5-4NiDJk_tUEB_M__MFtFLt~b0_MFN#SWk`fDLkgq} zpy0|#Jk1T@0zjlh$Z2|Q-yEgE%ncyWF}O(tf{gp1fUCv(P|hpQ<9nWc65=+0^N_y` zJ4O+t(2UW&*oxAg;7AblHaI{z9aydTjM0BEVlmD0&SUsG z+E`Qv5t%I3GO2m^QHt;mN-dgHq9ei7)9e6A6;P4<`XO0olv>XYW-z)-`w>TssJ-c< zqUNqCv#HE|JHc1$oV;q?L6!>t=m01Xad$-p3(yt)&@gn2DS$e+a*{|r&qCkgk2!x& zzyb<=%98alq;AxZx33rFc1a3RyPsE*Tqf414?qBDfB^j10CX-HVju(~myd_Q?>YZm ziBd-dN}}#EM?R8-j~CaY5x-#-nZ@}PEhJYY6aK**3W3m|ZYq$9sJqBNMarP+?%?}6e%Kt_D@K=oInW%2THm7vefMzY;%mE*n8*XHRQ;0{PF7)3|I zsJFZ&(b*eeuEsipG&CR$XyAXjbS@fa3~-Fh;|AYlsAxVQ)Vz*&ONr++A*FF-a1r|A zJOmMUM=3cHN0Ie={}FCGHt0L1r(AgQ(yf(Y6ptd%vC~zNXpHfGG~~E2Bt^1bCJ%8 z3T5kh4-+NYtx|qm99`bSr^Dbd zP;~vmF&Qd_#2ot}0v|_3uFsl-=tWAX%-PUogeXtVN67+yofDLuHRqYykPX}SaRDAe z-^HmEsBncTfFyrZFh!h5J>&e`#`y=qlsfiWbELd8fqWDI#;52eIk@Z-a^Jh?tw}y} zKMDQtn|HNo*kGzhfM7_^V>SLHn3@X7tXy|UXX$jYT zK5PUP2*1!F^)^mJDBA{7aH33K-yEDl&Af50DZ&5{44{7xDuh;bvIO-)y@*ilx?WzR ztDEN2DPWTtLbKcfI%++?V@2RW3~*>0Jgtj4ILbRXyys?k1+|8acusOtvmzkTLTd>oZ701Jc04yN;A4 z%29(HK)YuXbX2E;_>dO7E-;j(l3pd&!fojS}u~}suOmYDrL%D zVG0Nh5lo40w%7B5&M5t3P)c0bPY4%67Y2GqX^MY05($#!ja(<*W~fz7uF9e3yH&~* zy@OH~B9yAff+g02Vb3uAV_=Fo+yCj-F(m*qLb#8~mvP>$W|y%!zqyUWPX1|BsfV=j7A?Ed9D!ygD)3+ z+iNz{!o)}_@o@o{0H=KjyE8Uiy?d*TS{b^zUa(mxtHc}cl>KBV;>JhG*H|1VU zKyUB+8xRMSGOpNioYO8HOZzZGglM8;&!~!~mTNv=H)lO8o|2K`e0Eo#gdbJJwG=^6 zH%i-2qsqh7c40>kk1=pr*t1-g)-2YArfh$S;2z z+1%rFIBwoIuDW4|EdoO9D8pUUN`Ql8;j|l;X`}q0piGZ0J;a>at^WDFM}9X*{dfC0 z!k`uB*N=l$>N-`)b>Sj21GQOChy%RuCuV-SzAxzxrty3JkgrC^rENN0bt8TIPNVI=gvEP_b72n6Ld1}G3HHu!sLoLJO2 z)FZ5cJXQYB59#sJZS*Gh&u}~$sf~JE)$MR;Pud#0YwMqa!3LRvJ0g=w3^4LTBhM3n##uBVon4|1SEg_7BMH2 z8PWcE>5PYn$OhNVxn3nOfMm+ZL_%O?hf*M<>8x&jti_>0Ew;%{e9LJS?xyI@Dj<vXF@R#|!Z!rZSatwwe0G0iq9=G?V z1a}iKq=HI)M(M)RCa^R()AfIpRP8x)sQmE8gjGxd10$~XgH-OsCaGp26Nf}Vg#z|H zLgNPz5PIYf)<_Wua%m>Ve3KCPqjG9Ct92iu7grZ~{z#U5KFMS*lXlC9sC8ha0i{sL zQ4YF%WJ2{)kKT=PE0qSY`7E}O~6q*UkPDw0%$j7<5DHc=5^=*K;e-!oVv<-(>s|BZ9RmZ?xd( z?zwiI6W0%5P^>+-yuE+#Z$)%KnelNjQD=S)tTz`0KAH|+N9*UOYBvyDj#g3`IIZa=VW`QJ`>GXyR_HoeNjB$dhtLb z`jWf!VIa&1^D}49U2KO`TSIjZTtoUm7y>g$1%O1ez6OR=Vk#Zqs%|a~0-=CN2Yt*O zgTIMABu7e(e~*9msZR&=Bf!8!Die$Ard*=gdQE5jj8Kt}2Fl#6(cM)Lj){6^Oi;|B zWXQ4#c;ay~({9y=WuIg|xm$oC6;X&1w?G*qf%4rd z>4+d@%C7?)b8HhRvsw>&YN`5yzjgTDvpCRUbM0@Lz7l`aX`hrzv0Nlx;iW`pF{LZm zVpplxr<}twDB1bTEUQraj8Y_oBt!zBOvaOzQI30e@710pRJ-5rjiL!K2=ZIiOM@{aDUbk5 z5a6H~0S&>_Avl1LLt*2Z*yP7_c%A|DC)EJXCiC{cH}B&RFleeZn;m*f$Y9WGwal^f z-KfEP>R>;RV7Hz_WYC;I%bm-0nf9h3^U-;_S~q`YmGaA7d~n~$RbESrhhZ`FwKh<9 z)evPZNrIR_$P{7wnLNXrv8Hc-g9EJ;2GNDP1Z$>GDs2jP5ik@yO@A#~5(A|m0X$I# z!W|472r|=Ov2&JN&U@bI_nJR?!|{AJb%1qHxo`VR2c83mfH=0{sJ$T7p7Nu8^OJJD zPvw6@3@k3$^C0$Io~;jEb{|AfDs}5gl`Pmk9QE#I=gcNh&n-islyjkgPJ{Qf-Avk` z@?R&^&Ei~*3W&3F$bj|@nUAu0_gfuSVCfh;my7^NH9G^}GixPLjye}i>WCf`5C;Y_ z3Wb4`VT*JX7lgKDUl{F!3<03rMu5J@1PXtrK$5%6{;?b07F=lr^@T$W1vAx5z6FvP zM?#$gwCdpEcXfAAA$Mig5Js>RQs@$IX?j*~YZ8_0h=oF6ka=O~IhmuH$ zI;tLZ}4a zyHwRr6b&%0oR3W}H4_wYtH=z#SzTErefOFnWGptJ>eKgEfdd=bVnnuU>qnm$WvOp5(^710= z!U_pQ%qh*Ebj?UJgeW%$0bMnTP;fypY*#*p!1jl4Wvvtv3ct7kwUm2!gq7)adp^!h z>zC08k2TE##-bqKeiNEPFG3xi4$PG;=c{JqdELL5-l2B<^-76}%T|6lE+4ulEPyR9 znRUxUM31!PA*F`U^ap=f==maM&ONvKE(KJjiOhVQr=-C@RNtll(_Xfl^O@SEKh#Za zIu&{aR1xC3fJ4-UIL#EG$T=>`fB=%1`FY-hDe6Vrc1sEkmgAAO!-SqMK&DYDT_ zP#z1WR#e)MC2_4TiHN%nub?TV5VU`&6QcNZ5o29FP{Tf351 zrHf3p$!6EFyYOREXs&Za_3SvpG1x0AQ7{z-0s;$!nMP@F^FC|_Xi+QUf<#JYo(J89 z6Q(<7Q&aK8r(jB4SiS(HOfZF2?=a<;Wh!SRTS9l_b&+o`uSY2CFvSqVcVH@y1XCL- zLTVFSM{tvK{}z9>58n-@J83ZLH(=}tQ|7Eqq2996&(PTH6M9VbOL2~eWH{;aM!5$< zPg;Z_z-E}jy(R{T5Iho0ZHSGTrS2IDB{?}I!4Km(!&DzWhi943W_WwLCzv{NW-`Z6 zso)$SwQ;@MyshiWDAUendh#U$3$1cnL?5pYjM4z8goJ;Bsf|NQj^vR38t{XOM0%Q% z9lNhJY$OoTtjj0rpMEH6WTL$}MvTaGxgdM}2z2E3gM=dqIr7oUKnA?W;`Nsm8;qas zLHebP7K0N-pmMm6gg|Z(wmGCAlnQ7!YSJchs|mmaW+%$X@gWQjkBh8QJ5ci}7 zAtVGLiREcptRI3PIxYm!VIk<~F1iF?Dbu4YfRFrTyp+8f&t8+w)FfUlw_dw9>6@!l zz@Sae9?~z&j6i4&=1BE8l-2S*D#*W^m$;J}+17tHeKwlIgfn9tAY2FnfOkKUrLSUh z)~;NO^`g`P#eRx3+6RVb5P3^#5Dp;Y6d+|M?lqY~z@eesGCj^iJ96d@u&+sBN`i!z z7-yV@9H$3MVKQf;c*-RJg83M_kdLiL^D?L{GUZmC&3pA#`#JQ}nvqZ@E8a|cQU8Ks zKjeQ3_|L9p043Cw?ZHvcdP`t(BBgRT4?!7!2I-+e8cYI{QD;+Ea!fhnJ|aGa+f-s0 zn`H+WT_nqCe&2ptF2asdO=IegQg|ekddgp-4fnA)$e89cN)L_FVDguYIC8Kdwd0hl z27Poe^L3_H9~P?*v-r53yeI7kPzXJD6NZ0)xuX;x38miBmt2|U0;3bHr2Xb7{apIe z38m)Q0Tz^EswwJx^x9rV3io%3`}vSB*Nbs|9$SsB`=JjTZIr1sY(&_R!bUcRt`(e& zF{HZ`&q1RQVsq#0!(mf6W>usRP-5gGqT9$nN6WE9F;yIld$X%iS0pmA&_h#sqtt&6 zn#YRh+UZS83zlw9R9@(b5)6NHXzr>_zl>py*%shdoTuzMDSS|dMbn%W3Zx5(G9WG8hE}U?hp=UfG8!g$99w3J4*Sgak)f;R&XYaY4BxXPo{yIK>k0 z|8z?rOc9}2_-JH~rXSXme7W=x&y0W8^G0`Cq)`xhoGLGr8bUK9VG4l6R&A=RU&bY5 zlnAB9f};ZWWattlJ=xg>4I@U6ZsuyeAvnN33f)r;nH;Ug>ZhAxm{j`w9K;PFHrdYU5x=AE91UIUmJrob9)b5%%j|z;`j`SG zo~br!rI)+>_2MZX`tdiLCKSp9rkeAV0aF5aTjPh6VwFOhN=GQ8>S{Z)&f&TIHG^l$2gnk*IA=OYn8jlWmViXBReQoH4^7nQ3~wpK|*#nVIRqee)5%&&AwkzEg& z1)fNK5QPqN?erO*p@FCA8S3L;YSg*12ol60V}yDS>Q-;d=|MD6&)$C}(=0M1Pvw;; zo&r3HA=PIk3{WiS-lPPjMv)-}l3ZC7x*s#Z(jrel#fSjJggloo{6RPc&NyX=Kq93N z%IkV2(vDv8dTKS{HxpD`lE}*_?B?z!u!eBXVhKK=Q!4nf!u$HPg?2m^0^sym@2On7z_}hd_98HcPmVpp)@T~wgsh9@Gnor z00sc%@Ql+x2&cr+E5#J((iR_9@6)1PrloAA)&`}gUL_yzmU@S-)D1$LGFO=Dg8DGQ zRLKn>0X_49{Yfx&=0Z_oTM(khjd;dsvA$ZTUuNZOOg`> z&@G6ht==#Nk(55gRF42YR|kd=r$I%LoG0NbFGvtbkPo0vbL;GLs#CkZD|GXjd{PeY z?;lSAsK~&KXgYsU%qiZ!i>Z;6a|k)p{d%UFtuF%VW>&X2QDVO{PW9Ih4G!Zb=6FkL zhH?E|koO9Qo0sPGWb#-*vUiux-exXPrg7-Lm;jtq2rWc_LJE(0Q`*6;Ciw)l5$1+8 zA2wseAhPnPFwHN|MevE#x9w&#M(klUZx!WAuDa9f4r+g)i|Ym1j?LQHhWlg0{^j<* znNGRe8n#IHe%Z^^c{A~lm|}15`x_Gn6f~~za-!HY(`8v|5~O-^jQb#(#_h&4zb#f* zS5LXY1)h$>}~y6FF-{q(rXXN#1cg zdAKh(Vpq3?DgouoRkBLzrAF9sivi;njVLiZ7AvRSBuyI?D3Ab%!b2d{H1hV>Ci&eg zwVh5I3dMNIQo{}$gIqb1pRI0C?`4$B9N>Mw!#sab>Db~;kxr5OaXU-R%I)N?9*aE; zE4NcXtA*Eg_&KdH1j5FYJ=O?Zsx!-1Zikk~n5qIHH_zCcGolU9yH$qasPI{i1?kgKF}3$(6>XFhKfT zU_*bnpeJJk37F&@XaQ*o{=B7Gs8X*whINwA+zSgijkR|VTKw3KwFd@}3;<;U0)ZJ& zH_S8w{?}N0YBSb;Cj{lR3U@`KGMl`u0s@<595~*!5BI~81%n-W ziHLQtZr|ZA^LO8}2}0rMr!z(cP%71X0L*{gJPWCC!bn*S7U9H%0SKp%b4n;+!3ih3 z@lU|Oh^tMYd+v~4fQ9T^2rMb$;xw%WkD|$kP*8G-VT}%fAeUThYXsk<0{*CMf&H6GS14 z2|~e@OUaI47rcr2BSz`6#X@P>7(Rb=Y4v`R?6zomYAS|sec#`@=zvn=6L3P#jYfhI zA_(!pe^KmT&liiU1znBH@%826VjW+#LXRh`^I&^;;`mr2SiR$kAf<)nA^HFh9%TPS zme>_$qt|+tT;wYCHo@2JhsHP3IJ;3owSg0+`4t68bJmC=+M#E=L<3JD0*hBpH8{nEDuC<{s?~D{7T7 zWm5}tEE^r#HESZvcwVUlr~vGHa8ZA{>cnJA{<412Q9=XCs-{GD;r;whEz97RMVyk+ z4V|oPFQ=(eZEluG9LUshH^ED-}fq>_81Ls+Gfp3DXrpb%k>FtgCJDEk~8M?e_> zX!Z$p*QG#IeYJlIEM}2ckSk|Yd7~nHRZ9Kqhf;r{HYCYrCiD%%%BX=>4s(o{ zp&O=^ss*}&(f?V=9|SSM3L#<k>uW}w+Rol1|TZJE_NZKhTdMuDyF==gy(J@9y0XVZbg^|Sxn$Py# zCE|=s=W&me;*H_!8Jf+z0eMO_F$LFyS~{5mtyF(IAAV>uW#%jEo+}MTI5t^pzfnpI zWmqb=nM!5M2Uq!H!(2)&1+|)ofJk(rb$H(#qdR9)b|8#Wm$16>ER`AMW2#1uJombB zcDVv5)6Pa)@$T(w=!ZQL%}Zgz=sq2yR-{LPs7tuT${p1xB)SNS`QVOO3}bk5*Bm{(z~|XhB2VtR>Cn%4BtU>2i0-AU6-N1SFls|p zVd}nnvvnclfXcJ28%B`skT)>AJ>3&X9Xq0hGXXeI;+i2JrS0)GD|YAIl(-SgLOeb# zM(XiH*OUa%dcqY-ZTwJhBtP^Qp(0imEaHC>*ikpwv_z}386qc20{)>;5j<{S$aJ|w zgn=BRwb&&S%efxPgkv{~%;c+22JQ4(fBgvs=>XOPd^U+2D<`cAtW!XGlZ_whj{`!#Rhvt9l z4g!MQN>2)r#K#K8LIZDjL6|0Q1BiRlg1TFipg)RN7#$aa=&%rU^c7t~t`cclIP4vP z=&IW9RHChFBsPDHvd)!ABy%T#Kw*=oN9+sJArM-tj)X3ZLgE~24Wo~^lMhi(Z+re< z=I?&d$)#gOfj~$=?1RnkX%wlhU+90}(wPJyhK{!wrIR%KA#}NFo zRdwTmvJ<2x&?A^^y@Pii{TKGz#$9(G4>XV0pxQ#bBQ?u#Sowf3d;#p3mgDxB)X9j9jHTwKZ6RoV zZ+@cHOg6UqzzO8ZGjMzrkccjx5gquE_gzA56q`hXfX+vvw=oEN`0Bb>Sk!36d$8vP z{QV5@B*G*#?2S*4V}IC>L3b!KN@a<|W+f4S-walWbQh^)$Hj&5!bQ%HTl^A9;R~~8 zl2!626iR=$d^~=bgr>c54_CJ2Nczp85Dw3zh!oqB-TTrPbsqw5j0y{HHdH}5zwQfA zlC)S^Nk4Va=#AN<#Hm>qpNw!ylQR(zN>9W^S0MA@6)TXc!TS-J(^|t3wlk6u@xl74 zotBY&x-AOisyYGY68Sk77%@{t@`fxTs{UO;C-tmG1Q^^T#Tyk<+&yH|NJdPVa}+ z)G9%~vXO~q()Zes5oWGWffu_Kw zy3qM(lxi#0cKRfsZ@X@bYae`kNlBIpVO~z#iw_>GLcRTZFo?U~W3M&~*<}ae~Id-XB(N7epCDAJy!y5TWJlY&$jFTIX*RjDHe8|GYDJ}TPqD|qJ|AY^>Tv^YTD5eM{mwjRq!kK;@98nN^jaGf7lQ24odI%t7Jcm=K$9FCC6 zrUsu>O3@^7W@;`CUSD_xa;Q*;;m!?0!QDAeR~6oYNmpjmK*P^Ii8vjhVzj8))lQu2 zXYGj>qv}+IhC^jDAD+_^IrSif5(SXYX!oMD^Z&ejSW0p7O$~da!hb4{vM~d- zH)sV(hliQ%5ryJ0z^vPy<&wSJJOM8+M8*St$uk_ZQke6>$|6T3&+l-7-M@`FBvr{Z z0vcWf-w%whMJu?A@?r=Ldw!&kL?0$nv|X?v3dD5>%8E^iuA}A8{)M}9U}ZW1YZmgS zu}TTaxN&@|bjGY22&t(!JbSk7LF}8}!ukV`T=puEuOP#C1T3^}TB*u}iGYtN?myw9 z3-n+)R&t2Ep3=Si-|Od4LZA1;yrA?9l(;zdco&lZ*2{VNPvG@`{?Td67_PSd8#>LZ z)z%7Db;8J*w}dk!(2QM-YlS+=BugF-QS)@;AS*lUW%8OdE1~k?OK1^0qP0f5<3olC zHPC$kL@^D6J{XErC}hz9-n&(**iTUJnn37loUO0NqQ3+BU=l0p%?0W|S@W|jv0m~#A@5li27Xy( z+VhMfwf*DkW1;7Ei4c-CEE$&$`v`LK;65yI3I&0{|5lvq2z@Xorrcpkz8-0XjX_WQ^PK7YC=SpY zcUFab_mrC8P^dBoFp8@=dZ`?kaj;b6PR4|p2ADbiQn>I09GBa;$>Xlm;=Oywf)N;A zNYU1eClg)mD`bUGR71IZ;*V?b@y)7D9*OVfsU9+aZ?U~JZrVr%SB*g2YZXK2lx@t@ z=d|Ux;pj}xXZajC7(LZw^(U_{&I5glm43GL-;@U)T`Wm%KVqk%4kEI<;ViUfib|Or zbeV9>c{yn3QMwN#ZHw-#Q+*P@bx2U{U&zn?P<&cRr2KTzApbJ^2cqk-sLb;uFfD6^ z$0Dt{V8c^9&HzrvF@5Dqd_4W%llkMW^#65!lAUM=ym7pK7(WkT6oHmwQ{wDq-WGn` zl9w%oLpchH(ix;~SQY`Y5!D7JTTv#*MT4wy%(DRXBfknKTAZxVo@q0)km^BTpQwr^Ja<=j~1*U95fP3vPzF5Dh*c0&wK9$c-$-7hf0ZyfeXW0`b= zWa3a1%tdb2jqK>C$3RPHuJ6r##sd|e0U^7!Yh@UU`u8`%EP2K+xD*oT zy;q#pctVAa@=enjYr=ikCWVbB4h@xkMS^r+&#E;aitX%v!Baa@%_J$XlGVm6RaMv^ zSAc{1i;b}itkCGm7Sa{U74b5`L9TL19FUOI1fTk#z#MItI>0)_vO@49PQza%wTpF1 zT;XxGi?kag5VQy#ri*bSd?{&H$eLOP`2)Wps6?_kBb+~iOiaw>hsb9z>JLH#Zyl&c zt$sgBy%$YkMzt%~-zStt>m{phk7KXvT?RXA)2g)br$gt)1i#u`aK4U6{5&7FHzWhG zg@8+SQ2clA8Uex=D5OYUC>i!qw32=^0X9kSCluv5iz`r?HyrdQIJJt;>P>Aj-=U6V z8QtR*p*eew(dDpruRUuB@Eg>avVZGHNmM~HEXnNC$akt*FPJWc4Xec~IfwYnw`%x| z(hO}2F#EyLVS)T&>Jq$^!6xdTVk3E+C}_%I^tFUj|2+@csGm&m~v5L}h^ zR7fiW&@qy2Cw$CstcBwOEoX?1#-h+Cte?V47H%jo2C&}$o%v{~ooF}RzrABuY*aWg z52yL4Z35WgOFt>H@*64`wMC&-MY`1vy8z=IZ2}qN9XTVF-|L2UQHF8{9M9L0u8KJV zM_R&5KL0EV;06Zux8S|F7cgy_!Ex*LUZ~0wp8w#5qgXDBlMZ`&#Iljil_%zQ!{83$ zy%uE4nsVJgbSAebj0< z%Or{tKCZj`Sn)raNt74oKZM@k!u6*EwxN}dkOfsg_yNYi-6Ix**>WvG|MTHqu#*Dc zEFd$6_iS`yK=F1|ocQzoxyV@Cui%^}m5LL#DS(U)O-gJ@CgdOY z#)TcbEu(n4zZcp$O)d0>pbMk8jfcWmqwz$XgY7~S|En>8%#!V$y2J*{qr-}oFSWL* zB46QcB-1=Xo1FO6%_PCAX-x())Td0D2GW&wMbSk?gnW(_3=HxYwnB1HDNuMMc{-}UlTmH7T02uJN z&7RwhZUPJ@EOlOd)2)~13(-1MULNGkU_2&+#_cu~6sXpJCxxBdNcR!n39Xeq_@zsT&hp_rwhYj(00x zgezX$C6HEX&Dx|dL-CPdv!VrWfDRIFcV$W&DU7uROv%x)SvlHJce9)@c5+$_h{pH% z0m~pJvzcDAbOAi2;2a;wMzd0UT%_*LFKRP*u$#sy4zm4o$c~~|rH0ge6et50HbO9D zw5!V_7=MgNztI;YjMl4mFz9PIrBF653bkL`?<#7s7n$kN3n)rv7T47!0=_;Qf%4{# z6d!S#$~1@vZMDZm{594&zD#QfR8>{@gJfq$i;PIORVnTeC&ZBYO~E2u%xo!G?|97{ z)~rwObQ$#sEEjl$L8g&?;c@clIaPHxO)~LhSj{;40hO%rMtmYdkefmOd|kq+S`U7( z(e)3RfJ^OZ+ta@0&S3Sz0qR7q%n{v^{iPzB#Gx8uX~tTsRA~#Kz5U0OBP~Rutry=Y%;4 z?6b*I<30{FSsEQI_db1|=(gQcrEN#f*3_?GKx!BTOa@;Q*M4n_DpUR5X5$qeO&kOl zDQ1u&o<2Yp5IsSzM&N@Nz#@DlATBt$`c|lQ71b6*KjY%Fh$A={ho`OkH^#zHBk!PTF127aO1$k^MRFlnZh2CK^LK*tEYx8_S#46gJ z?0ZCKJ5JB5piIY@M4-{Q&G?oS^AE+BqM@$`?tI?fRwl#Phi7beWY9lXL{D%6WMPV! zwb-}G>dBDUfKdwasOQg?b7bEU%foA_P_v`vdViB_sEc-Y_ER*|oPUd%G&yvJMV@qZ z<-fyZOovW-4#uWW`c0vynjXpUoDmwwt{6HU$NW5p&p1PnJh+^U(+7aQnnYMoq2t$e ze8+Min=)X!x5cAesg)dNr8aP8BS>glYYt*w!Nt8B0l252* zZK5P?{PYvd|Ao8f+sAsZ2&Pse40KJ0@KB`E&q>`xc64n2LawCa2S~$kfNa}*<^K6Z zEt$apFCgrtsbzY4|A;SPy<%oi(em9{eZ_y83(R+WTl-sx3D>A3rFKHVOm5~eP24wA z-04-49V&Zc_3q!2exH#V-4qytzJZM3c55Vd)uVA*FY%eLV{?h0c`Tx>?V9l%ov0l2 zJ5@rnGMx3CF_*=xTnYzT1HO|zn1ORyQ>&Lw9B;d`Rh+N{T-(6$Qa)KmMB6Iat; z3quk1N>Bx>k6duQ$AJBy6a*?lJJP}y7^ROnjj`x#pDP(SNn@OHwcXaUgr)0CefC$U z1)ydOp5)vSRSMGIK{HtXoY~$*M%inGH$@{HP*SIyn_ixoX=E{40gzJtH#3)B5Swl{6@F06M1CcOrztAJwOE&*ccrED zWT)PjQ^u#(qDY3ghoUC|9;YR>S;-_FpgV#(X4;>5+3D78`|`zreu@!+jWV(nVb(dm zENN0Y=sN#iA^S^0+hN;bMM!Ccj}gA@xNdBk3f`ik`4_KBs!y1zH(WI0-dq;drwUK5 zPx_*2WXf41T%r)JKkQ8q?(B6y0?}?6Q9(B2mlYqY0Ot129LN%kL1 zB68b!A}4Wi%Kn2<445*5;4`r8apF8_+aim+qnR&c4afVV!UD^@{W;dvX5;Kh6-vErS%+=KH*Ujd@~3n<1uj=Qi(LS zdq&LYyWv3=tKOx~$pd||Z2v&zz|i-&_2VX#hglMed<4E9x}mlDzg#_N80SMu;^aF{E$~%CDTpD`>sJ@uAKZB-Cukzt(tR)TCFe}NuQ@a9 z^FZdA_O;KOoU?X`>A#S!P`$qr#Z3j5k*$rhzF4llDuJl8&6veA!OY_00GDScLk^?G zDXVhu*nz>-+I&<9ctzC8D(F>&{;P367!u3@@f9=wDTet?3M9Glw>UUlH53iI#jOo8 zt7WwQf%ffre!f(rpf2_OSJ!3fOk!RlLSCYozVT}}s?0ZQ_f6b8Dzx6bBw{@n-frHLGvDqcO#iJk{BeJnx<2E8-_8w^hJq_lL znc652Ea@C-awO?AgU>kj`d+-E`?rQf{`axK$@SbXg9L4DBg0~G)qzciK3x7eo3c}0bsY$@U%)0Zic`huqVH5FOAcUmZC=q|Z z4fz|>D+ShpV0%=3}PN|)hq%l z%jY-nHNp?Y8hkBZfs?uh==!wKmmYPCc=}X!4&9)oA>x1Cf5-afGEOCo>3<=K+g1cM zqqU{%9%eST5-_z*SavST@yp?Zhe?Y#H9*)jp9}shrXt)1%*+#P@OWGwxcwOTiNMf@ zgNs+ZZ+7sWsf)Uz-2Tu0hP6=o&B~UrS9+M%+r(yrGblzR9_Z#E-wD~|j^d4C@a-3j z(u47Ya=_0w{0q(@9*!uOxwE8QJ>MgEyZ5$hMrIwr!A3$aFWt*voU4dd<>-v*3-NA%f$sBJUgrxv0s_eiEY;nIfHNZF{s6G~J6Gi&yL$_im`wOK zo)-iLovB_@rcnH$rN=IvG8p0htf#Jj(Y|k^BwxqnUwolZ^DWgEy9)ljOszCHBv`>{ zNs~1y9#1tM3uCBx(F%R@MM6;xZo6IUo`2q!boJK2HxD+|+on}bp_M?@p-4@*#-ZgR z`}2dM7>Ic8`(y>7R2|x_*D%rf)*+n<*{+s{!*Xz<)aW!7^lWOT={>aR)Hmy8x$VvA$7_;%%ewT{ z-6}{r>yw&Fo?^GI&j|+m_y{mfp#(SGTjVrASk_m?DEvk=cMKrfC6XQfiw*^Jbbdd( z)ctpVMkD?}LRrD0tv#?ivzSpoox>jle?w}#cpW+IE_9$y3u`^4NeBszM9Z*UkfTB( z8OYrV?uPuDNYT4FdOZ$1OGLP(*+|P$RtVtnZAKSuf-P`!ntf)Z2cwo=f-g!!i3 zp%vW8P7#~CGITd7nQ}Qdgqk4AH=C|_%OlxjYGOb~BHp+|LiM38Ohw zLZ(X-2(f?q3;s;PHE3AAXd6v>PsooOu7^w-Lu1}dM$i&5he#8hS*0HANXrIm0VLsk z0$||#1ERKOibJJmF0lp$suJa%Oy07inj(#`V(sj~n3v0w>KIg#R|bJyoQe!sqHWFn zG?*0b$V3_Hx$Yq9>u<#!2v1M}K_vwQW8ZUhGtGu#()N|E^WU83;9NI_(?Mcs*SH2^ z+3T2cen~aXa1k$M?829)l@?}pz@%mIv&ba9akeL?AMK$?LN`2JW48r_v}OQhC1vQo zB*}4C>&a!@kkt937V#*fN3&k+#hH`nf!F5lnOei|BNDf1*WiOE z{RwC=#b}$*wwFqcg1e91@LLc6ibHefkzq?F3w2zx0lSxr+TKW!_%t@=W^HHGtOG&> zr2GZu>+3VkUa6uDB_46W84pU?;{Qw3%5G!!2X>-htjuVpEiSA-o&#q!dKl$iZajF( zy{;u_flx!iAF@002FNZ;QWfJjO?+0!>6H?HTM3zfo7I-u279lG#%#FRb2+RgxUm@iSiZ>5)J;g~EjoBcGxons(heB0pODeNV73G`aRlp~zs?vSu0vPGk zGQUp%SnSu9%!<(UQCqt%#?s94K@qyC+zm?)CYEe59wUZS5AVy{31?7Q5g#LAI}0YO zDcHOA4^3@`!B=Rz;-o?_`Bg4d-=ryebErWtUu85{$(Mg&)vBQ8yW(H36mvLjLLTu= zpMXeY@`G5zwj%+^kU4%y6z$kLG)4udM2~UPoU;bkWLQ+(klTx%3uI+rAB6&myMXF> zU*1NWAzVB4X0hh661$4gEIbGw`c!6lC}*YeBjIB5;^+xG?B1U49kgQ@VPN)E9>&m6fM{i{rkd<77~C+T{%;gzT?IQFRMSkyy+**T$%Y! zD$__hhHG0mcXX#%hH%l!y!2>0WTRD<>5w;lzv{#ww(#S^V87q0$^p0W5el!*`ue=D z(Q31}LASY|*`$E`MrQ}Ob>G$`xFPI(1sGfopDwPB+E<0m($x5*aBu7FeANn%D`wq| zU;vT>h8gkvBC3@uk`}|BZFNlQvNV@>pTw2x+*#tcQ6-vn!&BR|%KID7OVCN80F!c# zOea_dlV0pkT>QfFfT3wJi^Y1u+w#?OZM}>S6{#!Vy?7ba;c)cKqeyw#fMOZB(b^tL zvwTN9W+9ZrM4{PcSgLtY;_qGk|A}ItH~T{s+pJb7QYbY)Gf~_>i|tGlQlm)@|0#wZ zyvXg9x}*6%Gh}+cb@FKN@2BqKZ1i`Smkr@SF-WT=I5XR3-f&w5Av|5JOr_-O>m)|q z5h;(Z^yAsKn@V5TCubtj`8;OqlcL+z`@80^j4aFuutRRU3Q!O0`F~;-H5t5s;ch=e z#;;Xjer(<|gAs25_X@Ry*Ur2np&@NA+AD11@Ja8?6!N2Tt`tinQ(;MaMCx~opo=Ff zX%ZfY(_5lkYjPbH<6r+YzeCXj0!-f`7<(E0WMlA+=q(-uL@BL{{H5 z+|(BS&Bl|=_QZ0M<13($5Hs1By4Yc(-(YG}hK(Vv%V2O()32FK19y@E*zkUH)DUMj z+lIP7Jqq?vrPM;F8^E$&YI0{+q$&t5xJTy%tGajP=$<}#WDdhmlPXXx9DOt?Q7kEh$z1-<$9J#s}=(yeIpX?rpC zOY%;6Un8A@)@dsF<0g^5A<{bXzpbGfIwUgUNW&XWXB?t)jPP!!LzRSsQk+fiuO4-) zi2q=MYqF!zYHT5KTBv>MZ5{7wm+~vVXnvN@4;>blm|d zRGb%g$|iC|os+F^i6qKUe+cmrHUH4IbN4=@_W5(! z>HM@`;^Uq+=b_9ln#a`IwI;EK=bdGq*5)O)j`^vT%ut0O`f`Go!=D=As9=qGK0hw-)~BRt_4J zM6e}%hf&S9@NmU=S!zaBhD0-o74%m=JnUd6gkMuNhi^Tlwoa5`mjd?E3*wx zWS3&~`L{eNv%goM3dq~&_QrOlo)2|0=z5Z8$l?`@Qcs)O+C|i@B8+T@qvAM!8wxG1 z0njOlsv~C&RKjG6$TA5$ZedV&hNRlh)yga5vlpsqEcD1e@|sWYXN(z&K1*1n{(%6Nm+QYHS-=%-ToiohHaf<-Wy-;m9Or3C>w_%l@V+&SF;-7DZl6@VYg82 z;+pfjt>sWkYA^e>Fqyc!2VU@fNFC-lLHj0K+;3)|ieH7F162(d{F!8+` z1j3gS|Kp4!aho@UDzkf4zIrwh@?6f5RYX$oQ^+n7q3jHg`kLCn-w&&jQ0)iSKTs2C zY&s<|Spzf~w@7(Vex?IS`-a8JaiVQD8`y$Z&zEytS!CB>VL0_Lr3 zm`+6+WJ$QSAMew(>};soDkZ113GW>uN+t_=>f8 zQ!Z*S$ONC+os}eY&w>)#xE`S6^}CXlRWZRENChE7si_nh+)~_OZoWyenr5@kM^+Yp zf?h1>LHv%d^V@;6^H|SYx7{m$}6NKD3!L8Y)R8Cr@|apkON@p7$6Wfl8*v)$;3wPEQ;-G()Vpo2&>`JXyNQylr;y`^(Oj&9#b2 zn+_Ux{0yxP71ytjC?WpliXOTHFd#H>_}_aqgv~XxA&Uo{jE&1FQL|FXmh#(aWj%pb zx+7t?BVerHci*|lF(PzOE}mWdHGx+O#^6zTGvx6H`~e37Xo~&HCSSk+7qu^Q7Kezqvv0TG7vz8%0?5Nv9*uJUNwl|Ba^-mK3K?Qt1&;C9 zv7g)rxzPOzvP@9#&P(M@MbsQp*JqFaDaTG^>kw48^L!ICI!{J2G#9eF5)|)kM%T}k zWE;Bl2=G9^1l;aojs#y72|a`eJN;KGvG6Yl9{4b0sg~8y;+l1j+D0}At2$-=$YiV~ zIZA~$Y|geIja7-}i!mM2PB`DqZC?g~CUdi-Vr7WG2r#oD1PI6`)1R7nL+s5 z;l>kzpLzy;^{=>{Y!x%Sm_~B&eSgT-B8>3%`cnX!iN$t`rZo}lv)e6DX-F5;Tq*EF z1qTS9C@&`|z57$Pd^rS?uV~BagChIPNG$4s=jq(?nOG zu|RhF(wyV?@C&abJ%426S7Uy1Q1NjWWNKj1?G2mDWSd8uz1C)U+!U*10}20}cFHwxTl--WUbgE7jp>4k}> zf?d}3U{hX71GN`})(Vq+kKi}I3j7&_7e##|sp?6RrC?jFedakLFJX%*qe(AN&S6Z+ zW&8I(P~pi@3jB{&Ag1nKsi#YwzwralT_)!*wblqGH>X{x1LNLD^i*+~RwP6#7_+)B z9wXr;g|2RGn-|Hr^Oh@l9rV37v*q!$#Tt-hsvP9}@p2=>E=Lo~kH^{fr?-bf)1EC1 zO9RHV5X1y2wi_iTDXgyR9=v1)P9E6|#OJ7#%`5}!yNwt;;u=8v1+l5D=_O!LZ~A4E z-%t^4Ad`(Czvcm6Ic0xRfS<_uKDmTvqNC$wP4WcNJ=6Y-0pCKTuBz_ zTYO91u}a9NQN;gCm-g6Kgo-VEn-vp{wjrG%f_me|xsn1QH3xbu6xEz#mQJ;b&Tr3J zj^tP(;x>D|Tm10T+}dEaZUSHzf}_x8e#Nex+pgA!GAAD*t-+330#fRF<^Q7uxLqs| z(;TkAAoD=^CBJ8;xR+Dq?nupH*PlAKA(-?gcvG9|4OMgjj8t?2YL)2TdSw1=u9c%L zp+CY`Oa&gQ`Sc)*MEl&cXXG61G9W0&p-RYi0JwK4L+v8$nSPe&?!3Yxe*+Y_Ss02%@StXn)Q|&Iyua|0&A{%kiOAaOnceQUSivG`b)eY#R^|CmGfsYN3gT2gvc6_n?^s_kcQ!s+C3f zu*Jm4`k|6A93*Q4X{BunNPHvUo>fKXJ=${?ta%bT)&zvd?}`I@uJX4`<v4|4RIhZ*#oaQc*n7w_7PrE34_{U=89vcjQw@|g1t#c?xanZbTa~D%DurJ zzFpCIjCC=~I`*yMgsQ)m5Ex0<)}%PkQI-W!U~=XdY5T;o8*Awi zO7H4ebwf9gW~z9X^|Z(1l8+Sf6qo2+TlcIJVso@8^pAdbF)UM;Zt`Ajx79>SUyhqb z!^%!^GvRl4>Dv7m$|qh4f=hL?G`;uxMg4+`c52IIFwo)->Hp<358>MFzq?!%v#0Bm zID5tfS$Q3nf~x@LXrIeA-rQxtgR5r^o7%;C?3DMvC=VQ5;ik z3UW5X)E?KtNmh~Ensjz?*K4hoU|Y%rogPPhZd_R8J+b}6~k^P@(u z{CG9w$@JRsp`fE!q$=gstkHJeQGF~=i<@=@!+OYZW;>ptVGX(fFTM-F z`Q$ToY!Td|!Dql8jlvmHMO~Y0{KIo5+vB@+?ZIb8(@g$VWk#iWIZV@=9nkdOXMQ}q z&7;DLNfnxG{r9^yMjDilY~2`wK-3fZAKo#CS=dFtv<#j=3tIKuQAVMddY0x`0VCq~ zHgAl{+MgxP9~LF`#&qFe`nQXqu zTA7uV+K_1#pXFK8aB26A>y@kP!hH7H=K1mn=o(#B7+E^49Q<8hE zYY*DX(-SJq87H0`WOw2I&(Qgonn}m&&Gp{>Yx zX;2WkUuohs>dosLlDHle)V?Ijj6<#+xB~`kEKwSyy#qQp!aKnPjPeS+Sq{;c(F`%*trL@n9{Z0?9w2 z+jcmgNirTS&K6_sgH_)K5N&%o*Nvd26a(NSuX05nR;`5fGHiPuHL$X4z6LUg3el+b zsed*cg#U~jS;kIuyEYOv&QvQHmfO4c6xXGz_G(;;wSY#MDEBnLxCO6$7l-l!r?_=qC2FJ_#F(Cl2y&%yh|a^YYN{K;u!}TecZqE~9h$dvu%LOwthIQ!#KP0*} z_7zy^@igBjA*4;w-K$^sq5i$oHAN_|Rbwmx{Yb&4sqA}$?_{Ev)^%TG&*}<)U^FVE z5Bnvv&`vJGRk6D(#?tp}CUr(?6ZpYDzep_Fs9rHMSnrBKyQ#Kas6 z7@YU{u0Xdu4Ks;bvEV1klr>H5Qn!=Uc7%`(rhm#?Ol+`+=SDkqdFYj8lP-s7ClV8Z zmLMC<>S$H+V%L~?J8to zb`e7mh>Hn-*!ranWyWp@Rp~xBez>m*V8LMjjP0#RSgx78KmLJnmCe6F6x~4r-g&|- zeo=tun&3;#MJvlHk-fBCUiM%-%+Z$O*Di z8x_L#K|te4?9iMB7PG$}ch(S2QBP=jGwV)RwA{P%sND9FcP@{GGZ7+*#VH>F3h)R= zh-?u~<{kynXp^$4{X797t`Dy1ge9bi2G-98qSJ-7WRISQ9f%mZ2mUIosOSZ%k$cO@ zRs~-lJXzVrc?N&WZuZvvll+*P^Jf9lxg+sadK z+RUOgGOVVF9#C(-S;BJDrapfLGKP^2hHy*rY<+b4X}t8s*))y%O8D2tyJyQUVh^CA^N8FJWqSpKZ-B3VJq5)Z6(-#QdJTnOd5i;9x~o6=(+Wn_2TdTA>bZ{xs*1sy0)gj$r(>qrjs4 zhEw>*z-fl0tC=#wU_ilNv&)0`mg0fsi%J2@IVGBg*@}evg1K7d$6R$8L=}VdrHQbz z$D2mYS&eT9;#X_Sy+ zQW)6<6^D*}cK|~O&Bkk|Dj_s#O$!BA#wQB?8s!&~n^Q75*&n_+cA=iR0&JVigH!G6lfFZ)7jmgU3bA$LlJ;r?N z%lkcIIZZ4&m0rGocrP~|Wa!>NNpty7jB2wjic5rydLpBYex)$GE=f+`xV8O5JX#DU5+eCvdIRrs~M%Bys4x#xhlekol!{K>Pdfs{?o7!USSXH$(%IHr?)+TDzv z+q$$ud$BdEbApY;wr&cC@fFcaQiO|cYzk`3q*e!O%@c&|SS@`|S zMvci|#ao#f2d74h$%4t6!F>ET`bW@5v+oTPj3oX{?WX_>`y57FG_CPnexke2tL^<` z%&eKZqGL-O`3H|tlYoLN;P+5l$JZ8jUkA@1dMn=msVV+4R1o?gqvc9GuPS&|oBeAS zYIHd;qD)R*+P$=(a7DMQHqJJ)6QPjwZw4)j(Tm<&TQ@Kb5t7-$zQWawkBLVoXzkI% zyEErI!n|j*oS-E?Em(7{*;zrxh&I#L57f|YAfdoI$V+44WC%~IOg(LI5uX!kN5Dp) ze3NKxXS^7h296BEYn@~$@tkS7IMB!rRlNj!T{Qp!89^z&?mw^vRCJLrqgezqq)baO zMHynDg9&{5qh1JjN4R~pxNF1%=aPQJku*{8X&aIEb}Ktpe`Ey3(hgh$>!Nt8=zL{h z@_X1z(gTVjv|a^ggvq$1 zw#+g)w#YwA+vv9GmA*F<1Fpq;RY})0SyW8=vQiiHXS~vZKY?DKsPHshT?!g}pys3u zFMvU0baJkjHM^cUEJU$UuEeqL)sXt(`}-_|--z|vV6eg^Sr?e4-ooN(QKL{E`nKM{mPJvU4D#!)B_8i^ov=P;V3=Mfnu7E4_lu=Z- z$nQkVtLFnx)1{rz6V^*pOGO!6l5FgeE!}e?uu-Y8TVXbI*Q2=7WtwdQn91|&n8h<~ zD7ci9E&b$mg>Nh88x9foO3`;pyX6yyC4Jj^ACUQrF&6jtORPx~pZbPcJctqzwW8() z`axB3KM}du#7K-A%=I^=kNH#fef4xfWEiVp@hk#AE&qAOVOB)1@!eiolam9>$0x%- zh)0G^+Kx4W#@4+|2sW2C2t_k`CS^`*{?yZxI5RH!&^~T z`Dghih+GLmJFI`PoZhrQG3IpTn-eb{K zec#OBTMPQDddB&XqRC<_gz09~cjoTlCeZPfIx3<#%~L_d6c(JGJ0$^1m+dQ6N!4Ss zgyA)+a|M=0essU#%oJ25xxSMs8viZ*Nh()MuV4!^km>^u1vZuXBRk+*$Fd1mIPN9F zRSK3GxA5-<`E#L44^y-QhbMje7xpu=Xr(Ed zfgp|;FBHoEwQ%(NHwzgv8t?QoZS6~xNO}7@xaSvsE>V8GVKPv&k?ls)3|6U(XAwAZ za6P2B15u}X70h8R*7W>M5T(aU()^S2_0kRse9#w7!D?h?W^WLAVwRG%t}k?UDIA#- z9&sDtd*_($8R>6z(*s(t>@D3x+AGeQx`xfyC(fTUucwWdL68;y6BZZpw7++iFRy&O zyJetqc|RCY`UIRAhY=c1HKSwS*P<`v5U&Oa!%_wJ3Of{V=5tmz$K5x&mKA1NnIYbH z5v~hbHlVVM?Hv96d$D~au{#ECY9BMVZSigKJ!PAJDqIY!P6a-dlh>A%H734SBmIYei^W(MG zSe+buIQx)V6wHm4xJ5n(^L`7oDRF&^Ko2(``WHPI^YBBH-@DlwmzqO*+W4~{9%PxY z@fM=mFGQoB^4qxzT{$&Yf_#BLIsE@IW$+3{B8M2~Qd1-2&1G5%4mOr`5d1d8(8y-l zIxi%#6@aYrTHhsx3QUf$|E@0SUiF-P-_4MDS1nCRW$QGs@ME6r<+@& zaNk3b<(u&R2U1pzam)@Yt0wS1spWb8nraGhr{Y9W5lY@=` z^P1U#Ju7cLlc=^GrC+&EhRKpYCWk%=Zm$N1s2Keb?=rWtcYjr2&G7mMBe=(USf)qU zRaK8IWHR>eva3M9Yvb%#zpE|;`xat>S0KK4+T&mJJB!w>&{;Z!*6TA144cz|)|Ow{ zpBa@n=qci&o z-;$AJ<@psGPrp@9V60x~P9ap48V_9{u;=>)$-Ihh32WzsWA=~DsB9GFHuSMzfS2Mt z^93F@3vUstB-vZ}oIk)F3Y{KF_Rf{2PPp)~qQR!979qE%Sn+F@SG!B4A3t-)i|6Ma zs0cKIHGR*LuK^4udWBB?_BC(hdG2+jvh+WUmraS{PdpvFpz%vkD@fXv; z^_O%tOuD~|1~gX~$nVqJA5b6$Q&xpBy!Qecif; zd2ERW-E_6)V3@bjN}U~nGu-VO!h$B;B~<%6@Q=MpEZl!}m$I<7mNx{I7+%c}*Z5!Q zYWtRk3#ODrga-L9@FX285ZQ&?fngaZwKqPe$ZpU}3^r`b@LliD{+<9@af?~Yryu6<;U{x|8*~G>y37T5nUuKV4 zGH%kcf=mQEIncIb^C53|+_Ff0l$J1V*?kNYT>VU=9vHQ1$3YOFcuo9`e6;k{)Y{4+ ztjtb~`qxi|tHAJL|GY<^^l#fa1{6E3PfJ48rq&NedhM+w$Zh9iHXQ$D)Jox?hlk>d zV$I9r$)NZru-XAwsjmz%Du5o-Mgd<7eKzWg*VB6G;cS0gITa4B0WZE1CHdm26W%n= z{uW9{rp~tOpA@2b8>YXYt70csfLM zwy8uw*p4gfKbUGWGuvU@N6py6r3JB@(<=Dw00(X$!o>$$0UR8L zWq>8mp+E8qp?%+w`*Qu|W_H5o#kK3hkVhJ8Fy~c|i&HVjin_6UWXDjf5vZziGdw%@ z>8TiN8qd&#roR6$Nah198?wpCR2Ml~O9lgqVpy{Vw?9M4W|SCiXmj9U&<}}zn5P(v zz~lTM0ER$$zgTvd5IvU6)R-ZT5SWY3`il=sFjBZ)Oh+f#>-yzojh)>kT$0|5` z`w~iF=Q4zam^bc@3TdXtEGIoc@nE ztpbfvX@618jlx7)qjfq3Ca9$alj7y16Ao8OXT=yZ&qT*RtMGM`B@*Rub@FZR_%JQ# z^22d0Gq_k(=AFx(os(84g~14)VMy52VhRqikg5U zD1XUz@oauf=V=&bpQ0e8F-*u_-`N zWQvwZh^_0Ugow1XX%VLc6QU(&p}BaH4S$R~-!+ipA^bzQ6~c1}0taCXJAei6s~=T$ zgO+Qvd@WBh2lt~gD_@+X9k!hMjA$1@8qZpHgZ8h%2>y5S-wBs=1zk)Oxh(&Z6zttSugs`&@PLAwjQdBri+>8w zM@T(Y(DObEY}iuKMg7n9KuOcByFZjktio`3(qHJFmC)KRw9 zSsYwGv3oE>NPzUlVPt!O-MW4qJqp zh~8IhJbT-ntN(qw{vZ2mXbI#q62feBDK(?PMUcO&Ppb&xT=|M1m6Qk~(xp(%t^ZYP zrYZX(14aK@006eZ!h`2WI7dn#Y0F!_=4s<^e`Sgp9suy*Ozs*x+sfnyXMcc``g5Bk z5?#C8J^;hxdSbtxsCR!MLl|5CmG>D02wQ7?qc}3s0BsY48-fz-0i-YqQ8nmaMx9nU zX{OLgZHRxgU_@?Aid4kXgb~3M2OJ<7A87zV%wk-c&R@gMA>3Ns*o#omuP28LHPlht z+V~bwf`;je#YhOML4YF8B!5_RHt4-}#bU%26+&o5xDw=J5;aU25C*T9C@nBm!o0b3 zSrk~FM40(v@#iGzd%vC`h+6hdFV`!04EMBnOK92I3OsM< z1vPUxKo*s-^_kpY3X(AjRp96!DM+id1)s(uQW~aWYG$*o8>R3Oz<-k_(%2j36eAD3 zVRU}mg;Wq1am$Ia5Cf_9a^f!H7J;y(h<|B;8^&j)$c)?LOfV`;3#vo3DGR>K`O68e zaf-I6L zD}NcaGy)U!_ld6AqJJDo%M2EjzfbzTyJf(Uu#^o|Li*f~1h}2BG~5Ux}2KP!Z5!z9QUGCZ16=yg`q4AzWWZw*w!&Y=}`URJKDHp7+`|AOs0#Nj_N7QZc(^{=s;PFz)ASI-hPtC|BN!TvKJ@^&w34yXE0tg*6uy zHaL2?)7AVSH;8&dPUI*T2nq1r6aiIjDxSq={eQ1!#QI~X3mj+r^xML0jwQ1G#F$qn zn;r3+Dca;V8TuN@=&y$AwX2=aG9nOT=2?fQsA7g)J~)V*yQO_`x~E6t@LrbM)%odl zGoOAC3t=%+Nh2gxN^Dx=njy=y&QW5x??sG5DL#Z@jLmRzBEJTQ%MXanIW&lgcQGx& zrhi{KM5e1u_A*D;{Vu;fxM>vmZJ~8OZKNK=m?%qd4u*%&2+2)*8@_LuVGZyT@IDAn z8HmA7K$PmQQKayLVRH_RVd^>H9WyOV`*sNCl;!-sRcQBnbUE2CAKsp^9hv&14H(GG zG8BZX{_-I9||bGB;NC# z6~-EaGZ&nobMeq>-9KbVX(VPymB{6TIH;u^i~?b9DO1A^iU}0vWp)oXdf;2JM8SHa<|yWmzBqx)blS1z@P=&o_|pj=2o0L z@~<0EjE}MtV+*gQU@Ej4LhZ(8?V=l{W&%7Hx}EOk$H0ga1|v=ejM$q(mr^1W05W(c zbubu}@loNXF*zDM)gDCd>TGY3dN>j+EWtswfNBKCah-)UQ8a>rUTH>#3FVYyw|*lB z8clSLAr(IzT8h9(5(Xnl27ip+H1wtbN-=6DcYU{wV0YSVpJdCTp!RCRg}6HGiqx|U z38IL_F_LEfACk(^0wc8bibaiNj9`?8H#;mCl_tt`D}5uc@sTDBMw$#5iO=j>VmPV8 z5dEIlrZrmc4wg69h-b>x2EMJO9*o=sX$(UXGX|n?gm8$o7~xE=PJf^~W5Xh|RskGX z2QjD*7EYzyaEIe9tuXo!6ce^l6Eab`_iz@WI7nO^qS&vf&yP>p^LcfrHWk(G-ofCh ze7O}s1S?OPgaVU}84qeTE0$2SIuX6OvQI`L<_J_e!R!Z$+YUvt`OVj|TVz_k!j#>f z98T{R2l<2Ygk%M)YJJb|7*sl*Ji0+&k3XZ2B9AIH7FD z#}uL&#Huyg(&p12AljzEcmh#s%?XwvA~yF+`q&`%i~GH4rhmB8pX6xwIsKJ$8yeAJ zo0{nApYdZt#5i2|gSIJ$bxHP}5{q9Girl;A2Cq1HrA^$vI~_tFo$aBc$IBWWpW&{q zUw6qCv~RELLmpeKs-+vHv+bzw+P1>RNo)(mXS+Ai|7UwKOY?fijhq2-m5gAAe!kQEXui+ah z!Gu$Y31txNJJn&3BBBUpICvR&@1b~Bx$Ixx_Gc&fVCVdHL2*0%P$b$?W)`jhv4fl` zM8d5hptqg=ET&rp&0T zb3UGA(vLkQEyWS$Oml{)qZyLOgqTGLwpQ7DP|QdvDqVO0T{wN$0D)M z-i%xix_^v7aDtB@Y-pe9cgjvQ6Ar~Rld3AUWxgE6GgvVuLyXC5U)5^u8{MpC2ZMv+ zP%W>Ha@VOxpQ$P}l!1yeNtAX_dnATFLM*gux8PhzL4*#3MrkevUHFYW!e+uQVKXV8 zka!o+U@ACLAv%LEZnDK@tFk!ey$LJ7H9RjMSh50J$%hG$GExj6_DSPDC@h94LyfEO0`jcVCi3Hykx z#D4-dK7`LmDEn;ecfm;e`BJ}MlEu!^?f&HCZ1142=BWoGC`F49!p%HZj2#n45(Fc$ z*eYH_h!G8f2kZ)lg)8=*+AUfMyNs=*Tt;suIf1D(-9W*u)B&u2ch;F-o-R8l&*wYG zmG1dr>cI$`*#e)-gh7<#^b^6TExuBWihr1za}=!KLSqSP^gD%bS_ylMt)x6g>>0j+ zohJx449kJRxR)!;X03Mi^m;Je-@iDTiTfN%KNzL5m`2Ks7&NNU0Y+;5Ca-}Ljj#6! zu!urq5!AY&%MkJ#Wina`yNs=bTt@8Mh)9t@CJFmz2HZFC8u;=2SB?!0;QT_`j^r=slm8acw43gvjxaYsK;2 z=;8WlxBoOCliT`q)}N*xjF@A~loBDTiJiwTX)J!oW7LQkw$vYw@e6p2!lyA98mW{e=QH^_W_D1KFk zk$INBNicrkNz>qs!HxRPo_LV=rK>xA`9M^oa?wkF8x&EJ^=D!5uKET0bx zv+LQc!X8f^9~R=|a0{m6aALvc2jdij!>Bg1{mDU*STsEAFhK=ZkZMbjtBsOY$h0!)QfDT z7r`JQR8kbI3=UH)nD|be`t5}M#dcEuqIbhE=CC0cW->S!cZWB;^mu~q&+1hz`0iz+ zbFu}r!wOp*3xt#cBN1)pG+?h;f-$XDC$3^dqq1~(G-6ZQjzE%pqkr&CJ7Jfx9kI*! z*lkZ=cB2a>iS{hO;evApN+G!4IBOmCvxjJQpig#gmd*UE*SfBx9g>nrYGK2I&!|L- zZ|3~P`plXbJBO*X6k@Q&%}JV3VNOT_P^~|gz{wU+`qRt^KS5G#mAd?k?dv^Og2VIV ziiW5kJH3Ctt{3hP_kY_DGNbnT`my|!`eIH=ja{V){H0QHJImjn?Mp2F#{Yui+rFR` zz`)ap{60~azz5dIBDRaL+}yy5aRipYc6H-^d;??UX%i_^TgOF+4g848k7ZQMl-Qx} z-?l0^TW{{Be*+U`A#k<{HBy*uw&@5n^8SxSBv_0Mt7aWG=6|?W7Jg%fjgbLJ;umusbRObh#JG&RV@_*cNv)`|j|JO;&H8uN{9rWgK7zIV z?+EN?kj(dwlYeB*d*1~FviGUKz3(~jnR}Z0U^tkv9uzz-J(yL7yN89w^Hr`j8r4s( zguc6o7_Ob>q~DDguS|k9WGaWi>L-r=Y{AzEWNmnkyeHIdDlvwMi>;5vdn2GVHEl54 znl<|36QDER&)6K!r~7upf9$W}2fKUgWo#yxAWehYlz+>`LBDstJJ0v$yfbO-oEDDy zQL}-?0d!3)At)Ex_(pg$87%nPL?InxCBH?m=J@wXx=s}0%HmXj+I~6NiK~B4`%)mB z8QM}k{nc^q{fN!sc(@V4ocOfsC=L6b^AL0^OWN7Z6mx@tyerjv{4W1EIgNVudkioK zbJqez4S&Wr5{#0~aJt|O%wh?Kw^Ew(_@e3B0vV#2L|97j3l-^Ruv_@!U5!p)2MMY5 zmiF*`b*TG3XLJ0uR`(oC#ylH>R)I9I?t?qq{r1!I{)srNOld9Ozd3F!Z?aJnUB`fS z&X@)A6`XEk!m!OyCs)eeoo6e5@$u775VFyc~H;^J*n@Uk%aPSutNum^s% z`-3rT#(zgx{A%Cd&4#1N|NGVHUO#rbzm$jX-R>GMIR@`L%!;CL#(jgo!n;yTanpmP4BwYD4bNtZS(0QYOuxUlaE&A$ zk70!vud#7$6MVmVlf+5)VSl~3@>~h!bmzgP(_oNpX|ekkN4e)CHiz@!Mg?-_ zsme`nCpU(7V33#gtIOi7H{Yv193KtND&0cuG-{5#SdwnkBH%I#W4Ulg!8{Yp%ziaJ zTi}an6(eJ10A0Qjv$GX-{z18xrcRu0={(BsgmQ-}cRbvvP;N`VZnhO@1%K+z&awDz zWvgV(r`%mJ+qj+&*%7}zI4ndx(<>HLPA$YF7T{&s00frxOM3D{w^n*NE zwuklO^UB3R??IFn&zWM>6n{pssB>i@z_UWy$k5FgFjZi)OXIeiu2uU?y-!i+8#xT& z^v#hOZX@w_CE>mc(BIMLj;9+E=w9)1dkn`ps~Qx83{gGPIL!6Wj;{IeGC!y{&JR@v z$*2iDp z)Y6{_lgN^oP^LA=Oa~z->{*My&c0?UzOuN@26k6Nom<$Z0=Uyqr{*tVTNQKr_~x}& z$T*rPDXc|G6(W&)Mt_dRb$MKC-aOQf$0z5m9&$sMxA#HewEr{mV6yT!`@jJ*IDLC;| z3ZY+4ak4o^k$+(~V|_T*+f}e>`$)e}s4lStJHeg~kqH%1%}|J@m?3Ic=DG24={|$A zJEi;f)9B=O3s5e#B`D$4_`=Qst&|YUXk(={xI-Gp*yt8XhFyU_&oSrQ8M*sTFi$MQ z?h~{l2&4%C_a%7TqjA}r=Tt6Ny=t7Y@_lPiyheBnV1G`vMU@g1N%-)^Ci59#$kLc- z3063m-YCYvMIi1o1LBSXEWt1z2CXuBlN&q z&-GE%)4Jk-xdNk{bIKSs?8%$;a)dF9A&#k50(5zt6T6~GuxrfWm(_L!IKKwVPYHfHlkFhTH z|Fd^q+lgaqyFUM~qR;n6W9D!O7);K2{ChBnCg)_Xe$VNuwuP`TavNL1Vy&jus&cty zG#`EW{TTSO_eA*(dQ8RCf_ovECM4&C@ZXe6OMmyK^VPGdl8w$P+48%~>&~v}=GAp5 zZ56hmiu<|b(!pjiR71@{B0w8)v|T)+=4LkBE#03ahukD4cV@t$kjB3maw@5~p-6?T zdiLAS26|!v%o+Q?3soop95Zie$$kF(B4*q9g_NU90diuQGBVkT1_4^3aqlVJsE;?% zz<#0dKv7L;z&Df*IjFUBJ0w?QBh`b%$ z>fv#+zT}+-1c-?N%_?DMr4Gi3j{mTyQlOtQO_15f1xOhs${A$Wn zgK;wBp};)m{_PJ8DPIL*t@6nv2gJJm0YG7hw->ox0-w@9mI9G)N$*ZKQwO9#?cK~c;VpV#fisFt%fB}qS-WP(CXxnX0?9vb9Dlsyk|X7m ztKj>`doz5_&%gSE9h+x&_scl9&7pI>>QMrGJ?6zKN)*WfSGW6Zs?cqf`7-*|jmWpa z{BjOmabs4l{aMVRB?ogxIe|bqVJ=vh?L&V4)qxLk=+>M2RgeSQ6gq-f9Tz5@sNlxo z(*aeI0~`tGvtXCV6=lKwlz)E|c>_WX4h5tyZ;an=`sZ|+CNph(dc~YGdvn zl%3Yxe{PX50Fne@NY&Xn%NCt1hP$QA0|e5L`ddJXs5%4k{N$dS9*U%()T{2~rz}rF z-N@cQok351%hmtR$iG{Azq?!Vt=|3tCV#>p zksU1aZs(UVT`_|kA)zS7%qo%eeTIi9-_cZkm!{i&z3G9(}Y!+ zEF8?KjRv*!QB1puMJL{xh2}7x+PYraQZJP=xb~R{qykcF1{33x4CXCU8;}?;c?m%{ zQQ_}9Ueh~akCwexm*&v|7r>xHv7jpZshuQc4DF+%; zb!Z)oeLp_|vB3S+Bpn5j$+XfnGe#|{umcy%8D+6R6hX3g7W@qK#AvtW;7MVke@ok|K-hW11e|9lp z214p6sDM}9^7GzRWq)2X>m1%v)*LBJ)Fn_!2^Go;y|ZKP9RnmK;E-^S&YgV90OeNm zC-u|()9rQUT^)Cz9}9r4x|G`+A!+YMQlUX64w}%Pf~iGyzVD?n>3HB!9R{=6McnNm zD{7#jdwaAXEQ8X@G1EKe-+xMEH{1;(h4C5y2?0!xSd$H+1_P4QKX0ZDynm@ywh2(^ zg6##jkAUp!yUMkudZXL*(L1h|$M_)y*4s^ZxLB97+gU&9_LIxh5i!({$pqD@3ae6w zih8I)-xQ8-DDKbM%a&6lIY+u}?46VQUg1Y5+>m+7#RF&czZsz7^M88NoBr=i{FK?b zZ~-?rHW!>mD3m`91(DYyyJVX~y0ImV`O~x+Wraq*H~Z?T#;;G9Gm1?Kb7VzUH^aO& zQ446jvM;nYDz0@S2Fb*iO#>;_6F$S zTXhjRx6DvGl@xLZk)TLbd8`$|@jxrhP^tV}*cIKcD-NMBlzCPWA61}IE4%Qdj7x7g zM*m^|&}lQcH2VpEST}gr%tTB zj>j|IZFm=-9DmEK_tisrw{Fw04&_N@xZk$OF?>TENK6b!n0l(dywP_G4e!W6>M2_$ ze}1o(5A^w0+ul*j-~MmDwY0U+h$?TBIT*K_4y)-p?X^;m&FXg6;fq1{`5QHrKj&LB z6>O@|nFB@$v~K-ymuG#h9?2w>Sb*Oo9(m@`{;)&s(0`Bqth6Mw7kcHAQ3qZ4>GZJL zoWeM-)=S4@ew=?e<`b?rvrr&I0`-G(E(zps$K|h?Wd>lnIgxNd=U$cYR)g{ia+7E+FXqb-GHNVh^&b&7;9F*c$$xjsq3m=wWlQGfN>t+%@c@LX^9*f12I#n!nZDh}O#b{RnCdZ@+LaC$O!{Y}cH?+Yt1 zNQ~DIU%j0jTyQdjIvyL0Ex<3(A8vs>%XnY86wO6%{wC0!YlNd2p>=Q~}H!E(H} zT7QJng={R0mj(67yPt1H4dt;5syo`Sv}}mvR2YgHZ7Yzn7~*zWS7`vLgHE7T#3d4_ z7l7}XCrAyG7QLx2;@`<^td0*Cz7(1pDZhA=_3P~Rei7-?zPcjSLk9uoAZ$!ka_x38 z6I-p<%9kf%I)v)%b(t;fC`a)hXlj`sI%`tz8K^(^Y%Il>eYGmu+L}G(f)Se z0mjwiQyophrQRH9VVp@|V8W5QC3>V--f(BoS1^tc(7IN>CHEPB+Y4svuycK~8Gm-r zpImQeqj1_9EjO)1I=X2kCY;(777$&~Z@DO^fShQ<-#NfMozRgb(Ij?R1q;0iLN{(m<1b8bH3Zw(l>emY?){8SdfLC$T^sKl!KaAOqM zJ>vDTd&rL)9za|uE6o^3ddID>i26{D44`Z~VuA>*(dBN&i3G|^N8Zu{@ezOd)0>6j z_7z|HvR_18U-C`N`?+TFslDA6E8*&v(FS3z@3OKWE-h|4#lWBvLWmF~1b@0b5a$vR z1kEd#eZqe`;m|e^7hGxw)j{EGTizU|iF6_{N-jnskee(YBW({5e&VOUh1xHK6A5*; zo$C)BP-touawXzg^#v$L-CKgjKI1QcdNV6-E1M)Crbu81HM3yk$ks9bw2`wCKh*Q{ zX%zRo#<;~%Clni;K|!$Yw|~U$hg{eAf!^QiL;l+!x0iRfV;nMy84}#V+~G8_J9b%y zEih?ENxnS`^|9;c4pl(H3<;$&*5G9*;uLbOwQT;~+l%B)Gj8WhpSMpVz5IkT;!S7# zQ{B_1&-8orqfGz8ujr1pon^4?F2#gnim3x1TGTp^(`kvoVKiI{jeiokU9~=QJ9^6D zR8jKlwq2{bs74RHs#`;GOY?dSdRjCD3Lrh2>hjq$vuEG=$pIizAI+=bd!TR?j^x*w z+0^?A-BR`ytVOuuP} z2!1z;@Ow}s_7d@!Gk?z2p}5`-vIFfzw;eF3wc@GzI9NJVHvzY!XmLTUBtl}m&R9r* zZz#@tof+gW`gaoeE~w|tpsDxfY_BBH^WWDSK~|Lc%yT@GPPd28<8?I^874jNfhzR= zRh(fG-EjQjTJ$7TQ7HGQZj_Inc_hKMMhYcl2n+6Dxe*8rihs+-^l|$fT@JU0NiZ9% zbN9o?xj_IY97^S3qBFa9nt8e5Ap3RjQL26>2D~K$?8EmSe5PpU3_i-$X>`zLI9?Z% zjdY?rAnWD)NLfHGv#wu?rx!vhuTnx?+*iJwwU3xngZ;bJMF95WhED)>Er57y<%7@O z`@IA9-9emU$pjpT5aW}dza|3e_>;%KLIx)TpP^5$cO{%sA3o2+$LuqmLP~^)DV_bH;fo~bHn-VM8lzSy z)ZJvl&&Pt>(fh#Xgxr8HT`l^JqM!CT5x|mQD7oKN=6UpleX0dZEn(;&)6!X`Gn0eZ z;`XWlX#k+;j5pnm9s>j#95Ur%>z$g`4PTl){JLF%v)fs{e^1TQLPVI}y8WB#efK&{ z3&DjhGYXVx01g7cPB#PS^h^6f~i`ZOKRQ^fr+p1PpcnuFeO`?iVtr|W&3O3tD0 zf!=``r1s@L!m&V%Uhjdn;jVkYtHskHn%^z6yUbJb;QE4t@<62ll=Tq;LS)V-{?SY0 z(!lWFsUm(me-HFiR*-Ux=0Yps zUj);`Dwz}`n|*#<+q<7W&I~BHR1X@gTy9G^NVqs@f3>DREo_D$Bzh;iN7r=xO8o3M z=-4WHB1n)__&JzupC6~)V>GmgR^}<%#(_h8I}ExVzn4{)y3K$q0x3Q-evlfHD@Q;Q zLiNbw4e9%m9Xb$lqHMJ{8)JOc-djj>b6aU{NL2X6h!bsYxu9$_TShjZozC_LlV>zq zK@UJqe+^8SfI74m)Y8_CIX9R9j3Uk)K-qC5C1NIT_7CJ(7|L%&%7sQ;pWa(aWqbwX zj3KFRoi|IKKIAun+`erABF>m#Cb{X4ATOcmf3#X`77t5M4i!_qLv0#E9)SF1Gd)K7 zp(eSdVNZoD29!t;y(?A))i)Jk{0e^^>P|~)7H{_{|Lv5s3;w#YYZNeieNbLlKNe!g z#&$|dEp`Y^%U!|39-y2XTu?z&SdPuY-G3;j(!hdCJ*+|qV6Ig6(>-A9Yty zc%hYx8R{n$SaA%6bvux9(GAQ5<+WKi#~Ae0#gxYs6Td;KDUB;ts(>s`>$<5Oc=t+pbo$3|+ii{nHrmUcUeAGx3a8iXlG z309y|zP7* zW~pE&=YIG&Gj!tzQGiK_txhO7Nxs0JmU4iEVEvCjK5!54+0M@CP=r$_e-U6Lu)xPw z4>n0?8d@JK`AB*{bUS>??c@fPLg$(U2WLHp3>i`ah6q)*kK&(}%~ZjFV$Z8Rg+6;H zT|)M25_B&hA>09cZ>4&X~gBlV*Uw1%BpF&nNVL1NMAx*t9+ z3?LY!m@*a8oxukUy_tYvDiI*~=a<6jRp?j+seZ=A`}CO{DQmh@Kn#R*P;m!a8XZ)s z*`Xw%R(g@1&j)qaOE!GucOn(^skl&bb>!8dmp`3xK`KrcD(L%7f2v`3OCPnjeO#ym zDY?9Up0rm8jsg$8=yA`c2~iQpY+@I2JANN|o(exoAp-z%PJsOBu#c+i)v75zeBOtT z+m3({z|@f>4%my=5A|uLC{n9*y}-pH-arKp6x~l9Pm5?YhSET$V#7~cK6Ush(<{+^ z_B_uXuw7Lmq4G&}e}VaG_S#`Q$q(kqg6ORPdg77w?0M#P_C9bskx-wwz{>L^k`QrI zv6O4rBQNzI{+m?#?v_1lTWU}bdkVlwZ1E9%>lPxxaXvEYZTHLOpt-CscTaAI?*pe( z!$%QEKuV0Yc<&FxC#8@SnrAnC_}&h%x8S4p`4*sDEJPi2f4EGufh8Cnj}v}i)rU@S zv0`=CuS@vA=|s8@RBz_dd$9yJ@1^^xg$XL+BNF;m_B)^t+BSD00EI*pJ1~8XIh`CT zPr*YxxCtW?FGrt%>ldPb(A|j$QXjd{Tay%v>H0rKW7u#ewKlZ$P8 zCskn|pjccVfAvj<&2a;^BmK}WpK6Zh z(%%ky2lUyuxhUrb=t(074W9k!c^*G#oATsDMfVh3Z~NAb&?bAVmsi2@f2^|MkFo`O9uSqh?0EuW5J~`+ z$`$9PDXgE`4@fmXRb71fyx{VROB*?>T%JU*@4d^7w$HDJq`enO&O6a(Jtcr9eMEJ}F_|y)#xCXNVL5muOtj*c^Flu5SVv+{LxTj%+Ss$ zgOFmNMUUNO2GtM9)!!ia7tKA~ts%s=$xtaMf6=`b*9U}B($z-BTBNp4hF~-lK2&>; zZikTptZ;joC6E|MYYU8q(LDD6f7%d2$|VE-sQVolLTW$p2QU^`G6$O~2bo?ZlNi+b z{5iMYrfaK8hkIb+k5gsqI7AY1JxLWa3cBG6y+nxJ>?47)?>)^2tq6jEGgnlXfa$%AjlavfN5Fm z4I5z)HXv87<)1eu-*HA628M0|1%Kbp^?U_TUWg zh!JD&7!wAG!7zd3@7p`8VN=yW=UX?%KPjk#s%c2q8miJ4~PiOdyNkyk?xL_>2hkf7z?! zd%KFAG=Nm5g==3FX|d^E0KR9UAT0kuD+-m@qc?^-XbO#x`F4~Uq$d0Re8;o3`SvK+u16gbqSK-Rb1oKNTDOA%!ssm%$6o@ufLJ}Kys9nWLw=LR&GwUGfFmNz!n+@iNv97i85}ldpuOMK z@xwsu+`kA;G0qG`F$ItTe~h@LTVDCS20|23p(0(usoR%5a-@O|>ND;$ZerZN0xT(3 z&b*Tf@EpWuG`J3|wwXk%^+>zvae3r1$gPYcVQ>Zo!4fHeq}%N{5r7Mc{fOLW{Ecz@ zh+HqxkdD@Ab$Zp{AlprE%0n3}cN)(y5s7<%@k`FSa%BvTIiZ+we=ZP*ZV$zpX=JzS-E%!QEAPl5Q|MOvjj8)J10fX#pw>}#4w15vn4*_A z^K_Oe5&P^5$t^zugVPtUP)!k~IW{wDVB)gisGHkt_{pzZ;> zn!Q+Qy5`7L28@2Ex7{j=c9E1|?m-~czyO>UQ zU`Qdxmf(+2_8)zCh z_UGYoe|nYQx*k1*r6B~@I}C|5FYWq^9y0iAVg{nyyKc14O$d8I^MGljx0-QR&z3T^G6a!P@2 zE^#14kQ@yM%Wh)O*!S`zo_dTXvv|3glu~SfzdbZar;c6bloF&I7Ab$zbkp5B zrP$suzGTEtWZFN1akc{S>LfcCnKhix>%|h@rCq-$_k(s)4I}<5tq%c5Kiy8Me|%`5 z9+H^-qMG5|x~0svP=Tmk1j!uK4AZRyX3hBV5hV@}Xu3EGnD9dR{!%|F)sy`H&Npdc z9(Q@AkgBib;#Z|-?$<4~&6TRhza%G0OCR=jA11kZa=twj$Gzkszm9+u^uoyfMXwZ6 z1O4qM)oXWLmMT@;s{j5f6z|t5f4#7*3<#;urjxd|Ot{o5(&TO$YaE`YsFcsA-Ou7> zrxYrCWm*yO)2UJ|1xyiOKS-Yd$|WX3m`|whl>YOX?wJcAAOk@W%UHPFIgAd& zP&J$Y^9pJ~&v~Vm*$PdcI`Nz_{YHh$a;1<-N~unz{T@?zw_Yi*O_plWe=uzut}hzq zSJ`RyF$$u5e&{Cm!zU7bs=1y;NSPs--T{XN5WrG2B%B-M-vE(_TUHG}2cw=i#De~& zD&pP3Xy4+kP6Q+Xlj{o?k*926__(Zfo8#^Cq?9hOI`_clGD!{aGPS^&a!oCp%QTFp zX$yEmS+*&YQH!T>*FZ6gSPH;y*VtCUMvus1Y(Z?o^7U@5!d5~ zu(EbUK!gw#f-*~3NH{b1bqnj2{d{XFpptu4viw)tLi@cy_I=(Q2}&SyK;v_!ACJ`v zk!@(b%F*`jfi$0zuBTD2_>&X?z!Ab!S~_ZojuMH4Ou2vbD6j9D%O~RrID6iu@UaWdaPLLU-j%GSuHE! zNIQJo!9*rM%40Pek1u2E?KoK=?Q)0~Jb*aSi+G_5nh7%tz`Y=jBsDO@luHJ{iFCLt z5tr((BK17-W=7dZ{1%AYH!n#6IAg%UN}zHvn=U`JbBXQ|e7VlwOSep5#@&7+zFue(vjOYajWN$6oh-U$Ja;vCb77!(ihYzSfb+3>ltrm)4^jp zy4m*8qTk5I6{U(y@bmP?rtqh97@A{I~2zGYmf7+lOj%;ejz%;hp1qU(r!zYy& z%_LCHrzF@^;(LXU>y1vFNTM9n8?G|Cl0E??))jOgzdOLs*1eS!V09|-_4GZ>G7EeZ z-Da!UNwMTQSZ%IauBT6r7U(_QK*g^J2x~j@_tE#cc4nlW7{aUxaQ7^Fy@TsBnn*xO zBoTEWe-1e2ji>p3_&5&JPNYEE!zMfu*Tbl13n)TZSwSky38O!yUnvcSnbd=*5HNPT z>GMxbyb^*ql|*g!03LlY!R~WPFz2Bv?POS;W?|jc03b=&(p3lpjFV)5p4HQ^TmN zqWUwg5B`sf0}4nGrO=~&L%vgb(wA@FwJX(qrW{<~n7?B+T6l`B5n$N@sAL8y(Q?0B zyjHAMPZ$gt5FCLs_JCF^6b(a`YrtudgYwp%51@?pI zkW*bLcCc<*)@FhHL$Z7gmi za({1*miun$wIkt@Lv5L0neRwx%H3+rCzd?a6NvfeyNFpzxZ(jzf~&W z4NDcDR3w8)ublo({WN#$nNs^*Dne*)4LLA|4`SGULbLv=+3!yxfo-5PNS9qt<7LlO zabXZj0G3EMnsT?LOOx}hebF=3Ffz#{fsCjlf7>z4tMF5iJA!&A+V8>dZaq_AU#(EaPzrVGuFujG$Jy3) zy3em7t?)9J&o)Lf=6-q3%bqFX+<>NjHrHw8s)quj68@qv@opVcX5U;YsrJ^OgMTG| zlk}(%O&$+b9(qpgQnA1$koSNh!NulMM1Vn%)J+YPtAEJtI=w&ZnJNQKepOe^-Fl|d zwtzteL;ySJsfqF`OE)LUbZHzqOvk-!<2ZEx^4rVJrJ6;?F{KboCY2BS<8CRVfMGvj zdJk?Xw5?YtPe<7Zj;{|2NwV50^?xhJT&EtNw|0qDD9zkoJG|Un`r@-<_4`~ZizC!m zyUQ!(h*N^N@0H$zS8AIsrxYNAA;LM3 zKtf1v7$JUc$)7GHa)0ymefy*kaSpi(5gjzRwfkaGNVN;?Liv#BlffX|=zqE&#>-x* zf>AJ`90W{+@=R~4E`60-DgdL9(;sXv)m#3wCb939{%5!J!ZsC*FyP!lv7(Y54Rg7| zl196^RI!LBtweF}di*}{O951tk|Q7`##A|rF7r$Enhi|#Rl>P)b>x7zQ5Q74|FXTlG4dKZox<18Bcy8UYTJ4Rq4g z-Hje)yS^=rvy~X^%F4O`AI9!SP+~&}41_*k5?K)Bj2VBIOiP_Ny`cgI1qLv^-ccP^ z=ov&o0RFt4F9Cvjn|~1$-fHo_czo>yv&|Fe){_g7;9Ax5`r`KXp_e6%s)#T$dtO3} zQ8qDL)l@HGf+4Ilm3(fV|~)=`TZFsK2f5o~PnYpY*@4n^|;uA-kmRn$#Za^(H;n z%~tc<<~BCsbhF8|I?+tq{iF+^OgaD%5y+XfyrN@t$$yE22vQaNQujOWRO-eh-*@*( zKPBB(v<@oN5!7oNuO|Hf!Ge?q6dX1(Q5AuCwYhq12;d;3Vv4kyt#8$R)=jKqTmN01ZK13jA=kI+<9#t+f-~6}?~<_6?BiO# z>Hf7{R8j*fmOSda(viKmCc#pw1LI&q z?g)nYSS?u?KD4)^&~(2olB)aHW2zrfd*~2R<$s~0Gth;>xL{oCY9fGcC))5;pbNk` zQ$LKKeD^`W3Up4iIHXz3>?6)s{n^t7JNkbWH6{`S1gmwCd zQ*IEd9(YuF_&@;ngU+$?JR}0%?1=V3zYXXV*jCv%5>f%+V6p)pWFtGyNBWN}%@4)H zqJMo@xSn$kxWN_05>kSpJnN3bhL9>g$Ak#xf#x`&HJLE?i|Ib*X3Xv7*7V*qbyW_u z4^w0?-S;Mo(XL&b6$j~cRE6otV$0RBHPqQ92&xdBFmS_x{jXqL z@RvDekBYqcjDIuZQV+%h2kv^USQeGX^>`EPKegA((i|37-Z0~caxOV$0s?BWYkND!5FvmZZ0x|JYPXk&EV~c$NkUHB z^H~bI9&w8mw{*QS6|YO(C?}+(6yLCH{w0KS`7)L5=huD0UkSH2;)F|O)XaIN4`n9f zG}Vt+2J2GZ{dSAdzlLy( z;7hU3x8gqH|5|bTlsYGfK|vg}!iaHc5DAE7i_L?}RI1xfJjMI2XZ*4iCx3z%97!xW z5&}U+T%K=(4D0#;@FD+wklSgGQQKf#s_2twvB|3$4`P_hMsrX7>3o}Si}kwvP>p+l zarL=NiZ~NM3VtRk0gQi(X6o&Ri`}o4pw=ltAc!}8@n5MtX2%}450jNeA$l{GgWi<* zB-<@7;BK%fl`1e(--q(}rAO?h;=-vN?4;gPIYsqfcRemLW7+?wo^CfS+ z51&cE?o9EP0ClGwh^)+m@ouF4xE=MIwdLVqF{))3Blok%rJ<55&w%q_>o9{~L;(Z)dUdO)v_3 z4FQUYy46m$o-_-K#(z9tK#k~PcSx2iYf;bC-4CNghC0$*Dg+<}RxgxD<2CuBcQ4$I zMr7cZb$nc6fiN;9ST5lRAd!>g{--qFa0QA~23ng&LVvWPFE*uJFTp60LRSI& zn_xuW4kP*=7`bg_LaVf>Gw7rhcoHnslkL@d9|`e9JTQ2!wg(CK)5w?s_4!8>OTw+5 zs>L?m&{GwL`~;3fXG+z7ev_+;za2;XO*qSbr_zj6n&>2d?Vva74g>FW&+SNSNg4y=H)O9JO?bl)q_VSohll$L==; zj^=(dYZE;}M9;%rpF*7`=h=8Xvo0j7w79|L<|wmp|I!ymupziMj({OX-oDFs8%O-d zSH)N|2_Zw*WmKiIqJVgGzV&l7etX>5{jTk`m!{SvSIv3B{bQpXa)anPJqKEP*@~YqUTYe9#orC_yUG`pl5#Ex z|3#Ua?tiz3hTU%p4XG`Clo7!Qa$x+PdW}Z<;Q`>}FjovRu*)Z8%JuMJ2n~!Op_Bs^ zAzG{X5E)!Tj9%WDyd8bapf5EH6{!LtFn=qTTwG?W$2X~9Kkkbn^Krc?jDhcFG4M?& z+7=XbYmK1LNo&n9J)+%Z0Imbi&tMZ+b!Iq}aeqIHgzA|ME;(dOFss~|3fBOpNOy7~ zB+2b$kUqyE)*^-o{Cua4&*Fd1nA&f3#{?k(xdTbEO!1+Q9y7yckVZGlW-)b$F%L{Z z3uFLg9T^5H?z74jX}gHuV1(8S`(YMeB2^;s&*x}-7H`>TL$MTyJCOUGJ>mJNQ_0sx zhktOVuts>8V+Gf>p5Cxw7>Ywbcsli=STR3PQ; z)ImPQqVlT+r1Iy7pnMenvst|0qEb#V;C~K^`lR@j?nh=Qo}vXZNrsMxOpm!AMah*D z$^oMaN_y7u=5Dh{Ab~om^y6t%AI1M%!muwPs>q2W2^^F#hM7^cS$a&(A<8AeCbX$l z^UtnFkzy@Hj|hfX>(RVp6_wrL@a2u8+jXCQ(nA$gKmdQfq~WvppX>S1)-Gbsgn#am zzTQIxoAfr-DTJG=C&;JGb!OQ;y5B=ph#5?3(O%xxnH)Kk&{sI%qBwP zZ;4;Mp&QCJf6hPEUHS-cA4Tt@2!VY$Lm5S?>;$~tLCw-gEK(SZ65zPrkHn;&Do2s~ zVH799;u(zJCENBn7@;nTs*Chl^gN5mUQmNdEMA6EuVxX}GcdhRK6f8Mlz+9R>9rhZ zr>t5p(X5lqR%_wVCR8rBrGNWbBnTK>>oidW zDYLG(R4D#!2v=|9hJ(VN%%Un3URG@TEP9?rWGiWdf$~rVbWqXQ1-p$S6!G|8R#Cb) zo;A^yx*tUb45Chz0+DhEEzNH#Iy|ZJyKPpALmlP{pT#?15npJ3ub+$t$4>Ao*h@zX?328}4UO(Z(Q@1XCa|wkS(!!+&TV=yw;2PjWxip&0~l>v z;FzH5B^=~YJ84pFC8nJ=>}>Y6P!4Y^Q}?TbGjb9zzQdwfT*F-`N}%Eh%7vf0@ji*n zzNDcd5kytYcz=EFWSc$qHMR5`?p5<17lxJcabU%w6orH^)#&FG|d5YLw zDC)I45J+GB&HE@y+v1`!i3khqV6$5_1v(P;cCg&2q<_UU26Chma6O10G@@cR`=6?{|43L zQeZ-T@wYpG5!#MR=`kFR%{hS&2QY(?4wk$>;>y2->glRUBq_p^Ap8P(l}QA&ZR z3N(Bcz0V@HSGqw!ea?b7C};#=4wuTCZ6M2OBr$;Td@9s+J&PaoqT*B8DYy09yy*60 z7wlQ|Vf@c9QhURQG2nzV2NP5CT&8lUcWHkAluAAZqNxYCbpH!a(l~&kz`DnitD@J_WMeIRqQQ-`EWX!dzci1kB<}A!)R$oeaA_~uXFu~ zx=g(vs<@s3g#B{A_hA&aEMf?OkId9(zx7^N`K|4 z2%O6zM#+`qOo&gS_enH0Y@Ef5QZNdr1AUEYuHNs(7Mo0c@KE1R3gv7z;{JH?azCm@ z(Ij?*UDh0~jk#3r3-$X^JJ}`Z7wQ@f>4V5F1R~@5r5fQMvO3|l;G=q)XhUMolJLf5~AID7E6^zFysEU zHWwRGwOur8-MGvyVo9OUjc`7Ro+lC5m-+=m05Rxbs2^pPqhuwt#jSk~j|$UlHx}Nx zAH|FPs8pVo`rVdBC5S*Mp`S**0~n!wb2v~3P?-e>0b@F`OvPsLXpK%%^?x4A;eK{~ zbU%z28&X|v7}c{ZJ!)TuD$CeBGX_*a35r0>f(RWh4&*Ft8Q$n3g!Z5o&k$Pwy^6O2e`dF?{+66)9 zsr)qWdKND?q`Ey~1RMea81|jiJAl!)IUGtTv6O;b@1-8`A^u!GJ`T3w6$xburBJ<6 zazBh0TT(TQW|<9_8AeEfB0)Vd{r+(8!$|C_8c>B$Ow#MKH)M$$lYd||5_!zlo6*r? zcWf2=?q~60N2+G=tszxPw~h8=#<{w3Uw-NiSfuubQGLjiDU0DCl?sMMnhC511Qf!B zA?a=;nzIEW3xD1QS85F(+qA(gsX@rF`DFo%8~^$tk1HHrdhHEQHwWNJ3bj3VtG zZ1<9KQ&~-``So+${Uj28K{Q;GXr5nmSqmH{6e(-%_uY7(L{QO-4z%zs}>dL6Vg73wrSY0Yl@z(G?*?*CzPSS!v2A@3 zQUMvlW=ruAjIt(Df%ro$(aj9Xjl`i=I^c}!VPw!r$mp_CzkpDMvBV#mx(61S^>^P4 zBco7q=6_(ExD+1rV(oNdcG#f@QjP?(&y2XAMRF1`zT>3A*S;Ho-4-!oiIB$8ul9Q% zMslGCjsv1q;;+x8E(1q8=@v+=)rz(AmBn~5O}M}FhKZAi(VD(dhVixBFEDT$jD#b~ z{dUwlK#|$nMaI?fWYPhNhg9MaI_{>UQ6BCB(|^Hpy_j@==M6_E@!~r!>T9?tD0N%B zNDx#P&-}G--e-|rsP-eEYy@^NGWEm)`y6^&SNqjsztULK)}Z47A-Ge4RI62lr$r6! zvQ<+|P(XZD#(Q9qU)W5nB1J%*go~*RT|!i-4Pu*Pv{;KjR8heF9;!tl^&CZWYq%-A zc7FwmP!P-*5`Ign_gNGdmc9WX0C3Wg8r?rn(I||QNao5blo|4E{NR2TPX$sfEP~UL zhRen@pj3f`Cc!UhcpgOvZ0#arm{Ta>^`-viIy@gnlI2qWu%`P>y7XMgx_=q!sXnS{ z664h_nw!I2w+&V5Sq);kOFoNl=h;&%N`L#d8>ai;FmRB%$wyYz%u}wy4-J;&=}o-Y ze+s#u#Z!S)>!1cWN!<|Xvc4N#=|{rXWV{C!ZCzAlE&#>Afoyo7n~Kgw_^}`xh4wU6 zrHeU=x*x?;c~on0(dA|lK_r2oko&0{&$9?k)v`0`DZ!Ysj1F|*NV?g@;Y=daX@8Gn z%S`GRj`mlsr_myidS)1(s8c8b-n1{lml-c~on85uCP$QRh z?rC|u7p*!gE<3#^xvsXJcXQXXXc0#}ix*ED!(C<<8DboB0DZIQ85Cc>>Rq#Fn?_Y0 zDv+ExKrv5XvQp1hr>oE->?Lx8HtM>6svk*V04?rA8K#_YOT0)RF$mI4W<*&aA#a$w zA($%zP1O1R^Tysn(>EFof`27If8W$aS>Y6dVW}P|-i#mDo7QR*8qT`I*^~9J^k!X~ zKbf@FoA7)(9d6WR+FYC-`V!h7W&)0{J?*I=O5Gm`seL1 zz5Jio|NZ~|@4H`Ze~0z!?B2e8yZKJlvyGssA$^=wC;q}h%dVkbQtYkSnOcJ~e zAKKY=uHydQI!!snL<&SPHMbJJK#n;zu!=wl0Ydp7!sU#spI2FI?$sob5Bc{(PKba6 zQ3nBTY28b<(}x^lQ;4(G{nIwOq8?zJ8+z4=p6~+L@(Tib3C`scGHXfVJ}DS-+gy#$FZd`7fEJ7 z1PFx$5Uk>BcO$MMdkWM|^=3}XNBky;+nRBtSItsH9n7S)bM4XwWk(_re1h3>26mSX z_c#20z&Ira(^K4xa{$>5cg=nY<6N&)ArSeD`;5QJG1xXtF@FFhLrxZ2Vkn4?rL@jY=%Rx;&(Lh`F733}hoWAD3wG=+H9S_)>6 zLg~N_%?~@U+Z{CHi*qjhEIst?G@|eFR&4`C#<8R) zntvZ3(HPFJSK@J5j#r;b!)81kig%>@^{pwxhR~!54!K|!QQdDej?(zV&?{uhmMRze z7bR_a_}gj3-$bKnt%$WlA22GEuX??!nwZew80faUhk=*#?#Z5*T5Ev0Hf>4 zpaH4kO62nL=qw8Z<0#te}8-2 z*#EA$k=cqRA;1a3(EQZ>h(wbej;$BLLvl!DWJH29KStq?0;9_h-~$eBn60J#IFw=d%Zl_&nvOP zu~XQ}O1O96W%rMLVl8H^{5>R;m49T+GA}{^GyqgjEr8XjzhS4%CuIax+$gom#_xgA z>v~D{8|E+7|0!UCI`C8H$>?^_T$HP|alV{;8svi|v~@p=1RHvw>UK&dxU%Xlc_c;K!qr^fCLqDO?s|wT0&HQHGlj+lwrgY zhyzCz=+9g|5N8l@WSWwoK$uBJe^Q0xZfPWr#eb**DWn1^e7eGJBvxJfpChke12TeE z$LK}gfWj^oKuaD7Or=DefCCzVMUfUfAp}b)&o@c=MOjaPIbqDx61)Q%oooM45-oQv zT$CFJ5!z2hOX2lHt`KRi7JpA21k4|KB#>JYQLgnzAl=`mt6}7fbHWuMKvQWLjp_~o zAn~@c+yjloc`FN}NK%GeOh-MuMnxD8R{dlkF&!7i#R8>4^J%2qqErg4_=Tj{>x@%} z-NJyV^M;5Jno6^1L{f#iSp1~6@w^B_s7$()L~swq+eeW(P7O;&_2i-pCv`P_oNgNP99-n9(FRN` z7PaWecor#!mV7HTB0-6Yk`G}7m;n__GOAuj&Zn^TH7`|1yNLX#DdM}OQ8*e#f+S+h z%@)r{s~Fi-*45Ok?SHHI=T*KLHq4(Qrc7E~7YGo>1bvjhu}u+EaK3S>ufnL_m6YCo z>pOsvIo25o6GYcHPG&K>9X86zMIa>CAy~|HpAw0!`C>K<>;#N^9dY{sqhTaM2`HiB zMpfuM5_d>+Y)*yhQ3ct&BVuNF2q63k1b-UE%oxv)Wy&SpRt?Qjnyz5&(d>hW<=Xhtjk@oOz_{=zaQ zj>e2wUP|WeYcxs>B=#C`?tn$uGbD7s_5R8sri`ZGhykEJ4nnbEW|2yOD96}qzPWuEofD}FMWmb`>H@}T zc&yEcpxLxC~!`rvLKMg*MqMGJ_C9^N~d zMK+Ihvw?M^S{_Ae{ijxF@*FmQ2_2D4(}p>s>VNL@QS!!MyNK2M7T`xo!`&^4&{6wF ziy<*6T%>ONLo^SseSvml^1Mi=Xer+G-9Qr@MwW1F57#J~JKs;VA__;u^H6V}MC_co zAyn#Ozl*+`*(-l2Qs~cZ@~dXG+sx#{xf?){1B<K?3|())XXiw?Mge-$W*RJV%xa_m$P1r4KhHV_q;96`a5i;{+~6pF)kzVq-fBrA$QBECgA<6-1zCt$=MSVsFe zv0;``uLwhcGq0v``!GW0SYT8>nZO9SX-Lfko|55W739Zx@DfA4Y%_H84XMazFMkyR zsTWGZpQIvww=6mf`U`c5p#&}rW47ztPKM1+C9#xs)_$ypOU!)Do6q`Dk=dd*>i)r@ z_ES9=ZyrYBJT*m>S#+@@bp>K{uol%$vfR%1)~&^?STKL_)MxFe$ZW|QDu}>BdMMsL ziU>H`MTns~fDoSUqdup5#SU$*lYdX)CqEA)>MzrU`9A6={itZSs9{*O9}=oi5Yii( zx_uU*bQHXS6mvi*b|HCF61i3QG2Sh=TitQsW&PTJTG!2o@pwZj+@0$urcD#87ejzJ z^s+a1K%=wh4F-Bmr<;(GZTiW@OFA8kZBnnemtHM-3=2oGwS}M4OwhK=nyeD%@3|GHuTd0u&MTkEaKB z2Q(r_(?~f-oHG{##e;0DA8WO@kK0(UIY`%fsO^*H!+5+c6&hah*K;HQAaBpj9l!`2 ztBeR}_s4~onqKCzGSr@|>wn=%H9V<@WBCa(p2fYc)O{~?FJ?5X$cQDzNK#L*_zp;f z&f^+f`DC2((@~6+;<7qvu9ChYeQo$)s`wH&fBoBDSLy+ZW{bf=z%h_gNY5}2P`tU|GV#7ij`S}gt-`He5pN*yFowmKV|s5gj4gaZ;Q=m z@pxmZhS9EkV_IPYB1F}j_BwFxfJW}zfuqg?ms+FoWEw|{hr|<|J@pfXi7zi=(@cDA zzTn0uy{Vc;bH#6q|P!7krctf>ptI z7?1a+Y8Fjazu}y53dHrLsIdLOdNBU?70c*Y@)wL~F$WihaWb0)+bJ0;`JZT`$7|tm zF>ihX=Xh%>;yWdOYMNoBm;njs_0?}Y7XN*G%F#>JAW{tA>2`5bEJkvVZ5#+y*Y!pA zi6jO?YCelc8-G&`w~OlTLG_wq55?O@Q65=3MHu7+k<$wsz6_owd$B5RO^cQ3q5}tI zU(|ROkN2e_VfKtar(Cb!xq9-(WAWeHZ=Cmq1E5ZYeSyknDAxGHlTU_oE3#<^(3Hz^ zVQc=p#__IHjiP^ig4(cUE0$shV;jwtuol{UbY=0QKh!+dn#dE0QD};x5(i|+q zqP<4H!WHnq}t(H=lS6w-wZvA#HQ~v zpT(nnsoF4_tha&mcpCuM*M#$6{C6kSxv0SrAqXHBUMg&XOdSRm{m0k!W4% z`7j=BOMlgd5i0~SMnnkht(pZRlt`IuD6c=`@6q`0P2!HGQGLkDEDC;lkN6Uno}U78 znMu`N>$T(>@`_9t599H+R1KraQ^iozB2EG15WjzwUw<%Sv(;}@(677~z^^~c=)rhK?PACU zq5?4&J>n$Oqq*3M&Zi<>tN0edT91y+r;*TOO5zCbOfzC&n4_v*E~%6rjdwt!aE=<4 z2Ztm8E>bwPdVMx}^$pW7^pqS`9((mrWMn>#Dr!WONac)T6(%3RxI4^fizN+ zl+SD+BH7k-fnzG3nVGNcPcgCd01{Qf7ZZXWz{vG@l~hgyBwSHqSPDml6Y4E`-G8a~ z03&j=jGQ4zk&vh7Q|t6~llK=V=yi~c%jI;kV33&)BZrm{5+cF4hT+gKDpUo6fMQN5 zGAx6`2+*Vc*OyH7Sp0Xx=)AKSW68OSNKS9U*~EObQ`?5;RXU%oHlftA9k_v=#lTI> zXk4igGRZJv*H>!vX#95?`Tp;|%YRWp#*hx9PNwnUA;lJP{JPA|z&00u5ykpz#(Wyd zCqW~(FvSpJj&=JSFf4_`1f~Fbe(F8Y2%W1NgsC`53KtvUau18LuZ8>Z8Qw@A4_4;S zi=O#3ik+zO{R8<8BeRspP5>isBTLY@kw#_CF#*@#d*jjg&op9Z+Xxv^AAd4or{{1$ zbeV1?($Si~Evj==j0RFk^F39Lj)#rR5{zm-s8Gia8D<)xltB5a*Vj$;VEpIe26i@$ z5=#}05Ep_}x$y9H`aJJchBUVDzw-3Bv@n0z|F~|dat@3xZV;e&0P^~h;vS6u3?p%_ z`|EIuGUP%9$5*OPtA)Jse9^h8b*7&xM_8Nf*^y`>rcH0 z7^$N=oC=VT)D^aqS>%0;lhYS}D!j<$z+(;vB=4Kg;&Itj4Wr4`4Q0@QGTL6*{|;c} z&Xy5Lj0q+#XpArCq0W$|isenv*DbZOY0)!Z-hWRwb#IVL!)R|7H-By3Uva=B#Gada z2QV_n9vrBwffht_G1cf#tRoTHoXw(<{3_1s?Uk6`fQa!?;Z!Jh6F9&y%P6rPfJR=W z@g87wbW;_l>JygSMXz|h`_k>>%5qrAZR(5Ie3-#=^ZnF4<03R07dC6?oT-+NL}iaQG6Iqlf?vFmTS+m;FeTDyPBDrkK(R!>IW#= z`^1ft!GU@^mQFi)Fy1_j+_}ogqzgfPbZOVg=!bb*AdugXEr4W+D{(H))AFyca61O#x8-b!$qrw6TZ=CUVSbTfchfbNKkdKeYPFj(;}MU+(P({{1`u+5YRl_p|i&fBydW z|NB25zJJ>J66?po#eM&B|Fi%4jSE;I2D*=cx@aWG#*(7c7-Bkk=M;!r3h#TdF-ZuOdp z&QWZ!er&cki}t)49f+R!fvDC-22zto0HOPf$$wRVYUu$Gpz}h6QfOEkffj&NF1da8 zh)3i5iM}lwk9fbz)6=OC7c@Tfn%Q+$wAL@n@c5~=ZY>JKnE5mcXfeGJfM{j*1NYZ( z8Yx6bGU4ez-ZhMfE1SWo3l`TbHJ-H7^AuPmlB`SRJPysTmuP8Z4s-_{)q+ubwM)X0 zvVWU`2q_^~ht9M{0--FUP@c5srrth_&RVRHVRgsVG1SR0cB_w>HqJgK!>HR!wAKi< zsxRilNTCHKVn8{m5K_38q}`_xo^M_m3X8wtNFc%#Q``AGu5*RB6!a%Ksx5G7Ano7r zN*l@{AshhgMt6=Rw=G{R2urk-snAk8MSmar8}o^j$WlM1c%u>XyIn01WlE$a6=Htkyr8mziizHNVxTidKK^%qkl`eE7 zv^LNW8qR9ri_?fNWE_E`am0H6H3lyBKNg04Ss&*!t5~ftNzw%=CYdlEM)pa$@lr5; zvBaTX3!qoxxPwd%Le8~+At@q&xPMsxIB8a7I8FQ*Oj}^v&-k8}v6cBS5@t!HEu#+B z_VvmQhY_k5V#z7F&4wNi#vK?PtN#cfrko&p`rI;}@N#<8DlNH~XKLfwcAI@Ina`rY z7KOT+NGXu}t5^+Z5$XP9>^0)t1&WS7Dg&GXo%uf*MF3X?f4v?@pv|^mFn_9cH;tz8 zC@RD(b)Z#b%q0+R2Mo6Uc%rfF6dR9|hlhvPRJS`a zpG1Ky9SlmYu(PX>-vWxdt5(O0UbJ}EEUNP$1(I$isMgtsQbtS%-G5Lezv?cF)4`+p z;UZDtqV5A1oIt?&em|V{Q3WGJzCCennz9aNl0XVPE!I1rkvi{S1%yC}U5I(S4Clps zqMXRQ6bHRwt~Z9GiusGJ2t}4&%^`HzU+%ZU?Xk$j`I0yAv=sqbdJJ;Il*yHC z6hP1))Huknvs;Z${!LPPM>4%B_?esaKXpfQ|r3n>k*s2U}o<%0vd^fr- zi1MhrHJ(TINq=$iVmy9PZVn?%3H8#bx1YEXj)i`X5ocVwh#Wh|9`(zf&sTYuV0r4EA z{dTRIFUOme8yM0M#L`oM$|_PxZAs;uU{NxpZkH1OAb&6QZdr6*yUHc!Dj;z&Ok9_Z zNH8mEomKy3-eS%6)60|jY8xD3OJGPSiL#w?N3Qag82*woc=7VVH&+jw%qelKts}&haX~IR&EoO!v_S%~%q#^fcv%|6 z>wjWtK8wnl>Mg>UsbI)1b@s+06T$)n5dtVgl+*LE_$6zK1<)Ci8{JgnS<_#C{hzEU zcGka8XO=?jq8!iT$;SYw51;y-N^~9=m2=bV*nEN|u`nQ11wcr^{qi4&dhH0({xYNh zlJkw+li#gsM8#st!qd}?DT0y_Ab*f8y?=P8+BY|6BdeX|r%G-7AVKJ1k7fOca4+nFJEg+PoWV+9Nzkg`R zII^HnM-{37P)cwT;z%JOk#$IDa6j_*?!5K60E)_z13bC&z%1H>;Gg4fN90Su~Pfyh2#XmA0kVQM_tCid$3JAhn?oD1%2`r*l)~MJ33Hy#OBdjS@PCA8v{G^W7do`!T zv4;V3BmifpgE%IYesR{Q)Pw&1t8AoKt!%AeK8U-^9q3J!AUoum6)V#ea_JB?K`QL_!w=$))+WL;K+{O?AanXO$k6!taGc~Zs>(lNMu?g5i(s#1uik zr&gfMlf@tcfI&u7AO{Q^`i4*--RpIuv8880fBp4;v!KLLazu;9a&>H7SkULqv^8EN zhVfOe^b)E+7JpuAL%;bHD+|hWnv@73?CZyWQ7pM$K!T{^m{9?38%VBWLZN!6SYrB< z`v30Mh!W>sT#T92<5(`VDJ37Jn-wvg4Oh!ZX-n#`lQ17YE-iJY^&$bPx5(|`hmnPu zfIwMO^nEo%$d+J)>;bi565qz0;QP+jM+A3%V1AIuE2N z>!};)UBEXVJ%ysJLSK+{vggkfsgP{MN0%%=0kkkfNu}(0V3x2R_FhA;_?D*q|E|st$Ld8TF;=liD_vESCpz;P0DH zALo`30$}ACLW%c+P(*>n7*N3{Q!WMJ*f7B{C>0R^Ft2|W`h!iV^DL=e&?pID;B<<6 z&G0l8ZN-bp$5eLG39X(*%l!ScTnGyh$RyCa6ZS+>)Q!vnRJSfuO7I!;NGArN>MkRJ zyj3Lz&w|?7W6m?6DzIU6XIb)R?4^bbM4K}a2C|;w@VQ&b4sM{$mNR7|g$}vZFZ+Ai z5d@Y3QwV>8-c-@gsN7C0<*#7!`{{$tw9tZ>iC@B^kU<7;(`QpZ{=+BL7tT}hG}NX# zTxI?E`1*dAnRT8qg@Oq6X6$_cpH8SfcEeAD;HZu*by3JWD>Yiq{q=wHT(M)fJi~tiKpn<8Fxgit(yylNIgY5zjgxSb= zf|VC&3B7oUNyw1Rg8f?SB8l~PKc{-t`O>^pTIlUdaJ`UPew63^NKHW~7iVV~D4mF7F<$GL@8I^3IL;SyOGV2a+J&>5G!aAZln$eKe=^-|pTTfk8tmkA7@UG4bp!OW^d zSYM21^GlQY!8bl@zzH1vUWwG*TSynZeIS>r#W$tUs$Y768JJu|h7I$(iwFaja&Fa6 z3kW;tF4CQUe@&+3{Cxen5Kv3%F9ClkqUy|_wq>5{%^raKB-xW_b>3;t{!_l~qIqdN zKmOilCDb`1Bnc$aO-88xIFhj#+q5>5@^p~EnW&%KKt@PeEv(ohLNJWrUI+c#Vql`( zd;P@8`QlQ7Euf7jWpAIlEe(EjoCOOCB=|`Kp^u|RbA4$t_rB?OAURW(_}71#{D4ag zjz}yZr~+L#)y_8dE$2(_t90QYH!J3!Gtsp1>mh`~!QzwxjHDuO-*iI8chF?#Yc`-j zZ!DDn{eHq9NQOamqd>M7*>0?VSXH2K6_ALV%IALl2qRlUzy0~0Q7e_ejFOF-W z*zh&7%y(Ao|j>p8UKn_45LfC?(f;lU*z?B;)w1RyDIbaU*N z+@h}be3ZxXe@F9AvI~P|YjFk_>F66c$zj4@>-_7fer$mT-XT!Ut zVZf4{GVtf=z|=tgR&9Ud-aZf$3vNE=i>x1qm-qb({?GpFH%==`M46Dng+n>66tk^x z7>7sU#zSpdk5qd8LwT`KFvJfcM~W>ifUMW*Dfb(lPhV16%D0e&1IW4FcY<~% zrd-%`6)PyC4sI)a{4uB>z0CUY&sN=eO^NeZl@t^b$zABNKbPjK?s!^jH-^JOvQ~Ub zyrxs;}q6W1smp8AfyBN#uP`jyW8uF5rK zLb!;?AKR-;xPwQrR$nq-0<7wT0QhF2&yYWZM~fHAH@ANfmk|GYI$uu?R^JHP+9N-x z`$NnvVapD)!_ozjh%j(l%f!BZe3kFzczih!Iu%JyZ`TIR%*&diZdK6Pyb?;{!30#y zKfj1rfFlUB_62csf%sy_U*8<9vTh^xk`l<2u<)h#k`#LOI-6AQ#$f ziDz6u#Z;>+#<}7qm~AA})$iW@cqYg>V2C0DCBp|M`C@G__7k9-*ALPgm|1_%fO=wf z4VypeZA5c^tD-V@PPyYH){n!B`(2PTM@ufTcDsd(L5E~DvW30jfJPpItj*c(4wRa~ashH$XW77S<|G3J*m1 zequ;@@)lCjH&W;bPRSW1s4UwhrrLS99U;$_n@PFzC4T$U zgNyr3m?Pwv{#7xkibd`66rV5V8ilr_r_y#%sgPy+h50bQfqp_LsHJBX_5Uc_Zzse; zIqX_#0qem=cE+j2Q%w0@^@1IQiqbi&QCAhdEoL*UAOsw0j;R! zqD{E7Z6;oVsjVOOUh{ofDu)u&`8R)~{rxpC3ZO+HgcuNo$v)V-y$5H*nsLi6%LG0U z+Jbu-8FH9y0~}IuYi)yHGD%1{&-@~FhsMb6!hE_4t2Pc!0)=urmFbUy^JznZx$)EZ z>flmKGN=xNAQT^zg9yadpDs9w?MM6DXMU;0b@djj!^a3C;)C+-;XMAEY@~k_;_7-C z#KmF#H=8u6Hs1Wt3tOFoZ+lji4Ct8nQT_*Eirmxtfexe zRC@INGkwgNJ|Wc6#X_E5izs)t>H6U5c~lC=r*zz1Z5t2UTc=O)W}$z-t|vU_aMWqW z59_vhLa(ox=;8P8`lZep8KI7wL@v7NpOX39bH&#w8qp;QAo1 zBp3q9w>};9z#2%1*1gx(ywe)?i}ej1cg**#k#cG|5Q0%g<^D=6$n-wfzlD0ch~aq` zr&IDlpo=thZQ_rs)$nn> zN-WG52>?u3NSS{qq&NH8Yi;k1Cbnw5JY#T(EW2_s{jk;K(*vxm?i-6YRkk>KfE^PX zwov&%;1~&nmXHzhj{b;y|h!&s7c8_nu$pHFu6amI__5 zfYimbS9Q=8DPJ+uBGH#}wU4UZmwM0mqbm@zjf8*LyzV~>U4#Yy){g8xrxChnS^`Qr zRrXikz*+sbc<1K|quJLm?z>77q;~l^k4k|N7SfzVoQ)Y8zdIbM6B`J;rFCrTVm~qtj?- zQkj45TpV-KXw(C9)K>bznrUE!TEg3@7d^rkvc{IT(hmi zF_M8uspx-f(}MQ-{!GK=Sxzd=RsX@XkyZu@B%eERNfwr9Xx0%GYLKM@*rb`U#K zq6-cXN+BerXI#&g(DZKUthIYD;8lY$42u)G*eqIdk;0^fmUuhu%M7wa;}*@7{R63g1Uc~ zfJ#CXJcdh^L&B6VqB!%6w~5C4yned#q`mXFp|WL!WBXL;r|Uz~W!T77MJGB9uXvGy zW_)daQzoZWC&CGb5<>wFOFYDSH`~g=Iv?hzjT=(H02Syb8S1+oHyI2 zDo>`()a%IKPizXkNi&$Awawp}rUHKv3;#`p9jaXHE={|-$c)gz6}avQlgFMb_MEl7 z9lLV~M?jxO7rS@@rRPZ~vLTUpIM^rC#l#o=Zi%Nec(`17xa^4OBNxN(TjmR?w$T*c zR(r!w@o>*PV0g5V$=0)ZSajlwb^CDAr`tMs;Bi=t!Q6NldVP#HU>6ti<{N)nqP$#y zbnnZXkikCcmuke@UDd!p1YPV7Zjgf^LtR-G*9KjGmTnquzkYnN?eZS1C#8@>fL%y3 zMJxFcW>3ZVVlrHIrdyk+yx==UYz-(av^VyUY4M zIR~Zn_eQ6m4&6vdrQF#AcJY7nE459x732T${5mEQv2$b3TgxQHF1Df3hsT%Kc|#0G z!F+A@T$E3IoHhOEYWrdlAi>)e$NPl=ePe!CaA5eVvkn*#>u--K5dt30%n6`Z1fy#z z-bzCCf=JKFI(W73_%^hItLxIqa-tkN?^ciuAxVV`$R~c`$J_C84fB7kSz<^AQTAZG z06Tx1j1`Eg<4LhZd;S$C%tAY=Z0d?qR?zU@HV4)cI9xjFl5e!4(}WNr-Z= z-miuS`Jcz}*1dy^`%R2P=O9X`H$f?PA&r(w&bo^#4^<2G&3F-Lhk0XOHl1Gq!*2LB~FwjxAYci?$`VRW1IM5h&Kv@7G*+D3y1}fwv>+@YT+j z`0Y>kFYY%Xj*hhP2qB1y*Y zoN+xgqZ}(P^n4&ZW1#sRkRu2ofrMXE8Q6o|FvyW(-2-EcH~@bxWSBz5{7dMezw%}I z1V%t%Sj#8b4KU91P%SaysI}>?F-!UuLy@G1#hP6o!^NuiL=LI}(?OQ^+=ytP^>++{ z@4tVm%P)17%2Hl=LdPTTTgVg6WfY(#sR<&dlQ&+qyZLf403LmCwTZ`;Ed314Cr<#2 zF-0BKOMKX#&Vn+FJ3F1P9Rlhb1l<`>^5AO% zt->Z>ewM`>NWUnz66?idSYb#G+6@`D2t$8>O8sP4KfYG}MJP{1y&2Exym|VN^WZqb zkPzacNhsLM4C3q3Yc$LniS=?DetHtzeD(;kbdRsP4?#k0aQ$VE|0Yi|h_0@IJFL{ZlTJo&C1Y?@N%*Q`e>j`p`n&yhx@|ss0$N%^5NLlH zGjfO?(q;eO^Kx9AQ9biCvj@0}Iyt$~?i>$3yVJ>>%MR*umXdQ9+hiVVzV4`7Dg@Y2 zme$$HFjL4O^XWV8bRuAJ+k(w&r(4twK;oSYmjil_fyv=6o zMCL;6Y_Asbr_+z~8xVsy?sXz)0fc`6ruvBx10p^Fh39tO0elEL4t_xf0VK-7Ila{^ zBdYaK_$3{DDRh88KN!7?0weR`+x0v5$_xxji@lc_z|})O$cVZvdaY)+4<97XV(MDq z7*Ob9>CqF7FlMo7GCzu&58qL@lPWa%UzthBuWk7-fD+p$5Z6CnDz^h&+WoM7X*~ zP<)#Mj~;wG6?W%*3&sK>id>8_4XS;=e;tZW2fg$ZmfOM1XnyNnClzl(>wlJQUz*8J+KCSwtCm=kh^XAz*(%S+N$I1{$7dvO4B1PP;ZAMS6ZoGfEcz$?=;rcB& zoyXcbsV4J%kG#!KxRT|QP`SU9UUO}SN8f+nPyDOG zINIqX8(r4vEt|J6N<@FOV+pZP0OI{rC!iMmyAFs7c0TyNHdM<5R{#E}^vm5&)jF?{ zWRR$s$gcPG8H?RY12tZn^Th@~ZS$g?WDj+}`79pyLIJkK-z}2oTrGE^Ap}Up2k@FJ zTs=eh-}kUbjtmz8sO$oE5dx-UwA@Q(E306yDB71# zW88v&hKnRU<94yHSwbzgC3iXk@1DlHwS>$u8A<^XTK?p87{xR_ZxO!1 zVLXrdx-G_P4>*5atn#Ay@NsDoLRD;~{@s@YCyed%T;r=JLy^$C0{M*!h5ktTjxTA( z&RH4d5)r^$1cCx&VvPpa_Fh-%e5x0jJgwrycmkm=I8dzUVMP7+!H#BPiOWp$|#?G|BRqvSR9~@qwJjwSHez;(qaw#B& zS9R_5Qc&q;!MN=sy=xU}pYtWwkNu1L{^kB>|JC)5X6DQ|M(S!2;G$x;X7$)(v&SN% zN@Y-rg#mx+Nb~FE2r&x*sk>DWLU1oW<3!y7q`K!aOKQGSI&Vz zO&|QoMgd__%&7SN#1FTzOQt+X#;&?HhG0Q}8yodgKtFn!_2cjYe-rG=v3G(UBlT_6 zedY9AOzBCE>msc@y61I$GVP#Ro}14)B;4W@PzHaM0|O3Nhs0vrB-F3pbMG4X|J5ryBkf!_VSRw``zEK@85A$>EY_|2U?_*9W zfdWexwmi`wDJmn)4h%mhD(h^oB7f9W&#m`1e_?^wFQG}|qBE2?JHv6LyJ~f|i&ZQy zYBUozf0Y8l!lDuZL;;43?#;Iv2OoowU7I~g5ux_;>9P0US9CS${_nnTuB3k$F|M5B zli^zzS-swDBpc~$IqzQtAJWV14YXx5U||G=V1gpRz`p6z8Z3YJrvqCT<#*Hfmbuao zEp08ZEsQ({qu#8bLSXuXETQkxH2N+>BLa?=kP3(aATD5B&Uyue>(86k>JhL-a@|N* zZ=gh{Vh0QB^9OzS1K-R3aw zJ=NMP{`k7;w&Drn;XCezDwl639mDtD*v08n;6W_VRW**V7Tfjc`}bv*jx`TTA>unL zOFvzwx6Q|AlXalh=9O$AFH@u|JI2GObD@*~ttm=46#MY89i`1Ps;qx}%?s5tw-{5~ zP4w<9;oW+n#IeT!LMSN%#D(Ovs6O@zWS)3JY@O>w<3SPiL*rpY%F|Rw3KAv-68vDZ zEVRTg=|A;^_&NLjPoobbsjke8&hB`YaHk>PdFDnkf(dmobTh0k(R1kqB~j6rN_Jkt zol-1lK73eO0z#@qWf*@ygb!HsPZWqGx%OgNZTf`X?0(hSzP?RK`vLXf`|m5uEuH25 zAX4rPb7T5yk?A7U9KEiy;}oRX0U2l8DdXw;#1DnSlH|{lFMLMD_pkY(2y?7AJ$u>E z+xJ7AC(NNT3(E6yv+QzSc%4yDculkl9TDKU*t!~K#>4oD9}0h^1^k<)Ot`}HuM{`Hl15T8Ie>%;P`26zW_*5z7zU_5-Ew1z7G)RONlG2ndkeaQ=D6he&UPpS&utrvh zZDIT#dxU=h<#rKv`fOmdS9nOH*mDEEBx22cSrnkG7|-7E#!#wVRPeVXfAxaAx(RUQ zGGBE*2?K;}&H5gDU-dy9Goez2L|EAMia%rT1$2V*R$@~d*8>l;kwTCa+s3o^nGXuE z1>_&0X(H+Q+Ooe^k*7i^V+e0l`oi-2+KbC@wjWQfdfgD> zm2}vA9FMx83Pw!+M1-7Nd;cB;kWfOd3m-=6U=aHO^-SS^-`bYV0Tfy+(1k>WzrIKe z+jX9NsNy8A)SJWL#CY~TaYF&Lr2M=83tT-Js@|y7n$lNJhEib@gZAkAYDwO4KuJ5H zSV(^ttBu%%J@_WiwQ^w=Vf|1yyPU0s@$^B;EFp;Af=LAtdu2evs8($IJ)*?q)z@Dt zmzim~_N(?~V?^zPk{*5E-j}VyBFH#(5e5by*3(q1pV>qy%dDOr@<};=FrPjtEUkBn z)QLiDe@TI+&o&f+`L%7IP<|&>e)84xpPql?`R|UW^JF|=ddIM}!t$syCtT2lA@R0We^aBK!ID*!%B`d!LUD zAh-TQ14NaN>Aff9eh zlof`A{eJprbMD^SXPaKsAIFq&#Kd*iaH)WW+4NS=wDp-#N52i}wKEby7bkZxqS?|? zCT8hyh`+qHmFpMd#-Ch_u>}yMP&s9ip}mZu-U!Qtq?9Tj7l3ox4!e#q5Vo+$Y3Vbx zb(_8ScS$C}btilXCiW?5PssYu!{>i^jrHU3>b`%y|Ji^2M#`0aQn3mLE_T6!;hl%Kr!Sz30*bDPEd z4LamR2n^+QL5GBU``r&;eZt!3z3cm3s556*R8V!mkp!n#AzJk%d8|BzU>JWT>ttJR zJU-^J@u(AZA0>(ps=RIl_FYjzEvZ~Pru#vbK|uXen``f+e=zlm^qWa=KMpaDyJ>i<(?K5mVpnOvj#@LY_B!+~0L(ldXt zJ5dlbpzO6k0O0+BClzMuB0qm;RK;-0y+32B^#sI$uqak<<@b|){OWfm7GvduUD;#T zOR~SD*8QUqKe)Ev#W-}%=&FMv7c!c6dk<4W8toxcLhM zD3z9OM`uK$AJpj)fE6lv3^DYl2b}(pD_*qL&{aZZpsaC0Ke23b?<+Se^Nm^6XQoZtT@0_ zdtIk9J{pc|W0I(MU*!k|bFZTcfad4i7*>{AdARy#MV#%eb=P)WMeMpvuGMGHIaqT7 zr+VS2g1R0p=lo`07s(-@mrsg}8H#T+gurfm{rczluR4LP+5; z{1^&0g7s`C=pTQZPdG=GP%f?tA~7TAAgfL-?fnvUlT~*+bUwm&+&F5Vnz9j&tevIb z`-BSxnFQAr_*0$`_Kf%kuXen^`f+e+zX@;#9S4N;VHecCxAoHzh37PVOg?6Pp;C+& zo)$S6$d`==oI_{QKALwn-~pw2%S@y_sLjluL&5+n zKV4aHEkq31e%(yDPqrO_=i8M_Ft-FCijrSX?1N71-F%H82X!+9RivSu4RLjC3eSum zzS{W`>&Jh=#r-bCrK9dWqmXm%A`*Wbv=@(wmqn#mSkKbERI*kMo3C)83FkV!skH+S zB5}rvB{@b?a>Nliqo4jQi0cspN_TpeJj6Z3oe+oW&@;?jFkXlkWiG=h>1Wf+_&og@ zAC9v(z&Ns0L_!gSQXU|#u8KOj1VP3HVeotnZr^`n#Q_ya3UbwXDi3k95V!TV9CWw| zDJ2%R+|8%EqXN@LVC}EOqW#DNOfG%#_00Ur_?{i#pFE?IS{zUS)VU=pW6R%3Dv8vz4%X99$NyMf3=84gr(BOl6G)|c0+5|= z@a%t^0&=Y1B)No;k7xUwEvif33@VkmhH}5LOo+^7^x5v)d%PB1B zo<@iX6O3NlHmdhkBKu7$p)hc-5*7CKAibMUK^rM~>A?MUKLGSWyqJ zt9!2tIrye5l7}bwl0xG?^Ub4=iP+ZsU9?0Ji$Wn(oGhgz;vjV77WpekjnBD__B3AXGp#z=JPckFCHvb zFBL2@$GQdtSouEca-W_`ePR;!WkDecYE3^FR32C3zWF>dp+F#92xWh1(1DuX#q6Q- zPw5wU)b|sKuDmLY5_U-*FCH#dFBL8xQOrR|nKEs@dzy4Z7n5JANpIp;uIbkR<9@Yx?5}YUaQOHQmf?RIFbwD z=)5^o07fANE)?T?ITn9FkJ*>uw3O~_UXsP`Byavi9V6JHCRj)C73+u~ViZt*WgI2> zn)Kw?aHJQU0K~QuAd+}V=`4*=&iUxw5ACDP^b9=9I0LsAppE; z<)2~uCv$cj`NeVM7s8P^%ccXUj-UGH^x$zeA3T9nX8X`Agn1wk4wo~}Q{#Em8hBJl z$d!>H2aPyDIgx+AVN_3N91dr{oK<(VMkFL9@QmOZ&A#j^> zULJ}&8Py|u1_YPH{w#1QMPOV|n$&*1>HJB+6R>hJ$8=_sy3Q zCJ0*)sd$k{pn%)&PE{~s6+DBtCwo@K2pEx8T;b4z@g87gj^YHm{3bXNF1Bo~TP{^I6m?niN1vAt8Lf1&2v#{Y|1u zN({4$%9dlP?j~0)YIrPu3yTOi8b)>Ym~Pv2A-oX^EK}*|*uQEggEA5bN0OLg$^C66v87}^6_J-?e#;X?mJs7{qFgn*4B@==|7jypW%x2jOysX1(e`=k3 z=s|zdPM9xs#h{CL5u9%=^Osn}M0w9ba?dW_0gBFZ8wfF|3(2RmIKzQP(ihpVRi?a3 zvsgde&6uwq%jizP$o2-Qv|)r8>8>301kR`t{WZggnchSrJ;QhhG)l*^23HqZ5awct zD!xhugUeE{QGaE=ZgyPb;`s*JQpHZhxR-yu(T4Fd>Tq9Tkq|-Yt*%+|NVLa`&YKLm zfQ&*ndDJS%2S;qU2#2zyR3sR|BVNF$F|rMj%-A}##Xtz^JMDq0Hw<6*>*S_(y>ygl_V-rF0@7_=x?VfBC8 z6Oo1`QW<1KO76vrx6k5{JSqVSM0GY#4;KTG6!U|1Wg&9gSga6VMQ6|E*B3F77IUs? zC=`ElsGc}BEOo;GBnV@V#M>tkI#w6e9{~Ve2{cw)nTJ?s;Gb|FE)O@ToC}eS`6voz zq4(bK4^RZ}&Edc_7Zp({RYdR2Y21GSjM&jELUsHolYqG>FOqhOwW3APsbi4L$7FN6 zxdF9Q6)yq;u#~#9b6*Zl!}vFe3K21^yvPt&uZ5mryaN`Y<02i7rSjbDcihiV+>jja z^v2~joIFSSfx$FX*u>07kztE*LJ7q}u!AHj-L3Q+7A;bujG`AS-T{cnc{6_{*IOw8 zbWzS|^p+sF>}C41aBWMT3+qli+BTj<6(?GROBHhw%=c$B47Z5{A&Qy3$Dl&D2)#rSA)<%EwPV%)$pSRIgC6t&vu5znr)qD~;RsN@BjAN{P&^>Jp zO`>h0pBk1xg;@E`LfSVGc__Xg=i5RNI~Eoh#TdBKEFLW$Dw|}=C*sZ7Y!eyqX?hYe zo<#<4I8ub_4kFdJz3RRxkHv3d(Rrd@C{uy-n)8!kOiatQ0$-y_saM_@P|Ow1zpJ+h9Tb z>z4T}3VXP?@1rWah&f~O?FmW4NQCNU$+@`h9!3wv??I6{E5Hc>1cWZkVjiH}d_Jm! zrwJ>i2D93*4{t#lbtivb+@D*dJ43|SFx4sbI)=z~w`zDOehZ3FI2INm7EodgT`0gw zJ{gw=;$?}5c53jT^yPFze7H>aC8WO*2? zwnAgJjt> z^`aQ$hcuXm6KwvbsZaV)q0t_yBo3r6Uua-)JLDzTfTHZnEO%_rqvy8ae@0gLEJbx{fkIdY*;TmZFj$=~TW+wDraT4@YHx?{dv`2Ww| zc`hfCW$pU^T*X|#A!B><6DvS?0RkevP#|H26&|kstgY%UC8&}jYXodm$@Ea&a)rqK z1rdV#@KL9UOoz}~IYMyhu0xZL z;eN*cd8z$o)KBrE)#`5$%?liCdixeAvLhu8!cEVOD=Y9j6i2yPu{gWW7RvV_h40oK zQs8U*QB=pnMd|3D@uG6wn5Te23%Mz&s9B0H)5HH?7ix3ZbvM9kc63%_7qCO4s zxmhz(%s(Y7)lxIveaY*r^(-FmM&-(G{Wq=^#Edkk^?wH#_2EZrB_UyaSRDl^#KBoFN zgK-2EUgf=PE*Ipnmb&Zhl>ICo?MLNmU+c!QL@GwYm_`w>c>6389iKs;IW3gArLd%cBR?I*oQ!`w z-WPSHIBx00bL^#Fe{PlRNAYMss$tPR)o&S#5>X6aDg(24`z+EUW>Fif=x2?_tS5K5 zMQ0q6sI(0yGWl{Yp0uCEqy4CcMfY64Wxe49GYL0T5hzc60~oy*OkvK55DfcRFx4l$ z8kPz#vi(q9HKWs9CAF{~#-k0Xw#R>ql4_$F9@H1V1B>3x;hGt(P=rorQ72bRL|>Dd|7cHC8(2NjMZV6btc@~c( zQHcOEK>UcnWplGkq5{@OP8~!;q#zILpc6gLH5Han4>g9TynD|<}i0d zh4W8o(L7>_3aAx=0A+HSr9jNVQv7zsF?%!g%cz0Jq@No+jJS8z|g@waw2Vt=I{ z?m2*)0tZ!4!d;oto3MY3ND9OhCP5^DfHA3-WcZkWj;86Rm&W&v z0>6PV4NkQ~6f+B$l^}=97frwjeyr(wfG5gqYrBEhEpafW@hw=So`%u%zj1x+Ui@O`9@X4Kp`I&N(et9~*$=BZ|^Ql319tw&K{Kk=evC=w;Gkbyetw?L5}e)K~% z9C2;l>(kBRa=!J4ps2WY;UbcpQ4&mPd;=J% zcd=h74d)d3DE5DcTG3KG(yfTQrzsn5R)c5WjMxvOa>tAKQ|?AMKRd$(wrwdf1`s%0 zqo5)6_F3fKh7l2no)q!1PUEE+e_0RVR4)^?MObzpbn2mMJ&TgK zZ2==?rZ=1g-Ql+nBj!g8BW7?q+{&B3)qxYcHdB#ARF{9+38L!DUB1__9>(MPsDR+U zRC%JhF;VZ$;vm2ruUs5W-TnD{3-+)Hfu==OHZv+A)&cx{noNk8IHP$bZJlsZOO0?aI`u7JJhp$Fm?)!He0o=^#G%@B^gLYFmc4m# zDtqm_mbMb8SyTdHu z+OH;sn(z7`^m`zTHTyb>cLpCfzjP1PAxNy#C$PjJfQLRX~f#I)Tj_s2uUB~Q<=MI z1=W;FK9%mK;aG-m=i>+KVcZu=y|t(jn^;026*R=%K8yr;$`*63s7BbwVDbGU8q*EM zvvscB!w>Cwrk`f^!^nRVHSTwcTUPeRN*R9@aT4r*`vx##&+>*5+(4T6&`Qlj-Ztw# z>B_evSJT>zMCy+T`(aeS2^zWcv5V0ydSC^N+US~_0q}sun`e=F>-i(o*@1|UhPcUF zh!$(j?YvX3-;Z&JBl6m_9>xQ?)K4+vey6x)h7n#BLhvntTFkqPd|noJ?fcb3Y@%M2q%0ttVtEf6mbX#C#|qo?EsS7uo~^|9!tvt5Pixo%6( z3hhWGMWU^8eQrODiaDkSSD1{XyZQ7cV3Z7kdI)o`p1lcJJR^%(Dn^V(xnxFynjvT4lw@nkChR+g_KG^O^V$hpIeWufo2y2BddK8j4AZ+;4! ztvcpG!0nVmy7Z-vs!_oUrx@vL#*FZqnd`28ZW^D_rEzrsjpyW%9uY7$4Ver~#_8GA zMmBffNv<2ul}S(Ga%8bu^=g0i1E~Q>#D7f8D|$FX#gzjeRh&zSv_9j)8%!MbZW{>! zpBU~CAAi-+VSl(vfWuYOsgyF}8dN_!kNDy|;!E-9S=|6HRT9PJ=}DZ)W4@kz?&aUM zgF7;kO*irz(G?wNh7RQ6PLl z7Rkj~Bp32kUHQ@j79kXX*rEBE+7GNYaods7NP1Ch;w}ZPwaCZ&vE+N6)o!~IR z-Q9zGfB?bWJ-EBOdw}oU&$r$m(6ef4x_f$R_ONbwK9_W*~~7{oO;_3lf%P|{=u++QpG6$>f7_@ww%?yve*~W zNaG>D0g}Qu7w%$;KU8G>#%1O%b8Ry`_bKN08~+uNcCqpbSie#%jEku=7H|jlc@DG9 zPfpc|O&mW{%jOO zV9?6%14S}(PM4M#{DyzkNFMybFcR@u+{#6V6~K`83hjAQaSk{pXcBx&c&0w;*uQ-d zUk`Zx_irALBd=ehGR8<6TVqW|#Jt=PFUsZn1G$37gozcN_*d%>*(CP7;LpuP6MAp? z_mT)gMjD7Pmf|+fgHZqE7BtwHv1z{OYsypbX{2SHz5Q93^--hujqHsm5>fwDO`lUk z)J)>v|D?m=%1D2r1FT+Bc>4Y_8e_gTYDn-=yWlC;;-!2bGQ=id~Pe{(Rpp zJnuKU)mXC)v%*QSxM^17+DZ-XI}vnbBUJ_u!ywYZOrPLjg<0rTVu&s6XQw7X0Mg#t@dZO zfIPApkFqt2p?MapR-!FKO&1SU?N4x4)G3ZYA%IzG@iT_)S#)aK6$|YJZkt_()EqL2 zSqnHPo~0?;ne^kZ0!QJy>im+3z$k)eFH}wq#YH~~%b{YyDGOtX6ZP^?CF=NLp7hTR z@p3)W>gJmsgG>IpuS17tJE~P4@#qq-)|bq9&RRbt=zuT3fc{P*-w7M0LXZM!keex z(pTkLh|wpBQ+m%gfKqf4$irT{;D2st#6tarp6&6YgIGh|Gh&P2k!TQ#VTqi72w%^H z9SAGbO60#n3<(CM6t0=mRn`8)2f_Nsx7x^v8;R8r2YTBkGfH8Uh#XMiReBwix5-IW zwk@?j=vma!8?K;Vcfty50?jikkYrfSlEIjX`W;B4Ma!KbzcPDMutA~{q(BqwThbjm z>?~!=%``-ufYo5$D)fraiPRXDny%UAS(<_HMQ7%=nRP{>dV)v50_TZvu8vqjv~hIJ zSvN-$hSiTvvYo^A&y3jHfz4^P{}uqh&rxy(agn;o@(qkr9W!qoz#9&Ba7z#f4o{0? z>&(e9#aiu&UtBu;bp6BTrP+P>H7-8Ts$zL)(@n8NLVfbDAx(yc)znLp_Q(E=tpB^u zlzd60^P7f#Fj0+Wx`FOS_w za&7uR#t6+r>Z(8`2nz%^eYRQTkYYFKbG{55B75Sb9o#Mgz~fhtRIYKc1-2ePnZr5x zvd!57LEXytz7FcjijA8KxIlU93ev3^%>0bKv%l3Tqae{QDXz|)KNHo4o=O8H&TJ~w z$beaParV??E3odf5sCPfZpDphKYJ(2rl zSe9xh+O~D=49_@`0--$;pp<{0U4vl}sfH+>npX!bt~%$)?WN9s@U@2XI|*RCUKi<^ z$bRJNo3CUaeg8!6m#4qz^HOaKP)ym{k>=H03{Abpy{dF2Yn;jPH_K-;ko_L;EN>b! zi3zPoN3pE%sOdXmF%{hv4;+$?3E82YeJ60CnuNQA_DiD?&O4MPmgc4u&Bb^1cx|J@ zLz@8-qkvq!3E>Z$e;O4CT@G>J7KZS98)-{IBKm8rCd6dR>_dne{b@Jor)ieOPKWpT z*E5qb6h8^I$V&fcpc&A?{0Q%Y;YIq<9H=70+M(d;rNi1XT7_;Qj>zguIJO`ea~zEO!*4I8~Wz<0BuR@5CdFF89)RcUE!t9rN*Qqy#wOQKz<+)kiUSb@tsXJsKpIo?X=;CCkfSeY3>cye7*Oj zzHVp<($DXll#jWZDViL?er%+EN^SQ= z-Vr@$_|NI5^(G{{#6;}LlKW0tx7Pf~&On6Lct#=rSS5dSsJWZ0=9K4~dAfr;a=KvG zNBcrlzGFh8r6F|xy}(*@cZI1ltiC*0T8Gs0G?@Y3M6alEOPt;1K0|m{PtH$&`%N^A zFMV0i-XhLeGW~%Q|Bmh0a`mwl_|53fnPO9yEMGe}?*2q=GHi^YY$ZSOc2Mhydc|&m z-Ij2yDQNlA7t=?)_ib^Q74B?Z$Y%rglMUSbc<|BjSvBeAOR;|0!s+2f+xD;!vo!nb zvPOS`^s!XB2*JHG>kEy~o-YNH>(OhFwMnw&6YEME(AbT)M$T}gh4*9t;7j{j<6jpW z-SGrtG&oiGg|mi8hb%U?1HG*zgl>3QH`?aG=WOqT$TZ&suKP!-PyxjrJr@%Z)Q)c8-YEf(w>c?agdZ%eGq6mA|)AHd8AsxPsFL?C5E z%-&|ob|I1}gDM83KlB5T+~ib)EvXjlw`V9`I8bIt%<5XR?(DZ7eL8QI+(0H$-ZQ;d zayi0R0PjFI?emQ1{nX2XO19WvrU`T92mPdHuuz(^92@FTP}0Doj{6TdF&8a>4gGs3{pt$!^suIUsfOp&(2U`4p}ntQmxx+J8RXplxI~6B zVp3IgS^1o^8j%u25DFcK|AXOI$06heCXAe9klEpRUug&YU;)HXJsaOH~@8fBz`V=HvZ_ndDI{fRl9hPFWJ3My6Gd(PX{`Ew3@s{)Jyyq_i^b>~B@e(zQa+#Aa#gzy;> ziO6?XtcbcA!dDl%UdO`WXq==vy2bnK3y1KxGm?9Ox;eB#arFv}fk*@4T% z;C#8?{lR~BC4#^uo_6l8#ipRP-F@7$RTnHZrQ==`@g1#i)XO0q*O-x=Kp6B@Zx7=Jre*b$~H~f(wqPI+|E*octa-d(h zehL+^+FufuHUGlHZOi(t5)`w(I<+x9sjS$;WK)ll#Ax$}S%3XFI4xWWlJ4i_!g1f4 z;3{HTy77r+yW=0+4)eyQ+5ExU%*)WRh!b}!LBB3nL6CDehb{-d^cq)-9)W02G>UMi znseljPT{6m&dmave{rv6T=DPZix*v~iN|h09Zp0i&4uTpw-Vx&K)LB$aySG;oxpe# zgip2!n|G$QGN177rw=8Z$4h~)3h|#J)BD!Ro@bQfc#%!gvav@v5{5`X zs~85Y0T%VU4s^X1phTWtSw-vdn)5IQMFd{7(M^fXChp+z`m@rQqL!ND&h?)}S?k3B z7T=-{*K%{beeoDC1ld*ywGK8jsy@7yXb-W)j%YKMvD{yR$?NGJmQ zC5f$CctEYpy71x_p3<>f`i+FeZFeU_ zO<(^z195QvdGcZ-SEaYnHowR=rPA$a2=b%dMlW5Nv*OrZd!@4l+QL;My=_!6=w8Jl}SU z zxSLl!vGw+*7`;;;OX=5RfoOhEP9EJnAy@1e`<(J;D4Z(jA>Fm$ZJbD%A%gGgsFXiG z(a0HzdeqVQyO_^-b0K*=j8J+x)fuNU_4i;CBr3j6OM9rN0`s_k9Wh7JLm=qkDae*P z;tNm10|sAvdw&w@A)$9*K}kfCGOOu%uP)iY8CF7>B(xj@r5)F!;1wLtI0%aUC%gj$ zvFTWvu)17GDsSckD!wTE?gr+79zsC~S#`5~gVt!6PuA5De`1Dv<=aI&y(5J4G5HUu zfVN3KQCZ?3kBjctm}tMb?&q%q&t3iT3TVljHuj%>{3DKcRdEDz0t;iY?~RAx+quiD zEn*}ol1I${q#U;GU%+9WDe_BZy)fl}^R-DkT+7ciy7G+Xwp_Xi&t`ZM`CjRr0J&=! zG2EfhjRK0&wc~?u${oo$2YYO8i-Pr>PS3G5HX+8JMqFK`QRZ+t**g)Pd zJtU}lH+}sA#l887bezURY+<)PJpCU|?Pw+pl8z0pH24g_5)s2yHs?^VtFj;c3hs=f zN+VKiRTHAX$b)p_*Y9<|^Q5YYM>k3rxIj;{NS52-=vqp>HO!yv-T83pXt~=#!N^^n~>TTw|5`p98TtEXw8Iuw|WV6;n6}10(XO!wNJM=4dNG^ zDw`+TH9v0xxuZcs|Bhrt5S2;9)`r|{LxXRBYui}boTg3t@`Z;<&l2I&Z>{toXcQJw za`7j-F3uQRoS^AxGKYvC_NnmcwTog%$*V2KT&K_E4O-mnN+XK_Fs4T{Y@saBRAL)Y zv&m}IA-JVek3zQ#LJ4~fiTOEq-gB4z9?KPPY^2`-Nz`ae&VmfC!`OIRWKwn(giius zr!_wf*)q#Gm;@*d<>O;DBa1X|f8Qep?lH$N_lpj^Es??1VVBKR@^=RE(qPifGbLJH z%&{SZ{fDDtMzQ4xw1(NY%YTY!=U2f|nVB`3_tiQMe+(IyQ{Ie!j)bW{Nu{V}le^23 zZECCll80kq?+HXmtoRQ2NN-AF+fDZpEtW};#_DWxzGwUd>tBA?wb?akH=k~QuUB1k z{tg`@`3)M@A`)>jrKoF(Nug{T8$`*~AG634A}(vfwHXwAbe<)CEbK;w?`fd^5)QRF z+R!i)*o2p4e<6}FQef_3EbI@F))&(XlEIDwrk>=6s*Hmy{0qyM^HT)*DHNY{k+NP4o+_edm)ErA_gx1;9*C-WW+uB7dS zn>fs6yfff-Rg;|v8#}ZLPCUqv`8l;|TaVY5f9KaoJ`Py>MVVnd;*TFESO7uAOU+OP z&{OT4v^J$PFqattAivE8Oz)@`j9_-LITbtxUt292C(lOWZEZueNY)I?S3LCd*Zi;n zgmID`25G$x7FISrPGzVk2QrZ=;Z=#oUPa{dLi_~$wXuJmTs3veY%yL!`r#b*!ahUm zs^Nj6+Ieh#gAad2@5Cbpbt=12-{2eox`&Gd_7?Cws!n0Ct*RRV&oA;fl~7V z<+CrH!WW^0`1)$&3Q znHh#|e>t5NJP9(PUyD-tJD;OU4_Z)MKPuDc-Y^i%Y+9#ss`)Y;XX04S!<5Vm;N)y5 znKjNuJlrJsFMB`5K89wVr%9?(^Aq#^q7gBq*_mortw7`(d0`E_UKPmiuV_p$L8*B+!YcUK})-1grH0)OA8|QqlqvLSVdOe=oHMTetp5J#Z4g~**ti6aF5)W+ z?eH^~ezu{3BM*#Q0T$sav*`UV+-NwYQRYxlkPFn;pu?2^OHT0%x zq(&Lo0H=;4@v<_aTGb8G68n0kn=XDiX*b@(nbdg_I1uQs6HHW)%`Cc)rKJ2P|E}Zy ziR4kT(Y@?*AQImt%t+;9sEb%#H}9V<#vhl9++I@zG?8qcmg6$a1$c5DzrK0%Gt#|i zp72KQw>eFDKST#sKpb%aY0`~XP9QF4m{M$8Cawb9JM$nargE^w?;S)Z*6Z&CHYw{O zl_uY#`{KVRj~Xh4?V~DcHXGI#r01n73h-6A-QhMPXieA9ciZCk)$3w99`S!o1ZIA&&ZqH*G(2%rc#pe> zZ$oc~UnpY<)MTCgy$7;clT;f1Mo&)D^_q97632JG$y;awRx;##dEboqa^YJrN7MVd zeUcD-<@ZP#I#(#I&YQLV>c zzk^g3i2K$7d84adhf(x5UAD*e-h=Do6@Spqnh%PhIvOs@vkt#jb!rlwIM~O&E~zrb zFmLyGX~w^|=bMK40~bXP2X`AV4{N4kEm%a{AJdY`K$`@wS8L7?8JHqYf3aS<1+rJo__&{CGA?6W$f z;&%O^?KBNqA>mE{naag#4SK&4JA^aIS-_t}=P3m{QcDRvZ-w1}QWhoNosn?X3qrw_ zoHca93~T!@(N)92tE_Upjcy2u(L~o;1ENHL%NZNO&?ZpjuS(n7cZYs-){8F`7y6&VkW115 za_l^VPnVCQH4K<4B`^0kF3TJ7XQ#vO0{s13XiF{;;m5ifc_(}QAW3qg90|R`$)TrQ zvZ3`>RF=Vr`X+U_5Qj7X;G0t=Nq=#XWUo|yxFOxXv{K8(mtQZJ0vlVV zlIpZj5)KsqD~C=lT!&^fiD1pjBa5OsR_h2D=$h};AN^?)SCFo_Z-2wW#0EJnP+(h1 z+CCEBppUYPwja0D{?qXtd5z1bXdk?%p^7O#V3Jp5TYyLKVpYL= ztR(l)8bY&gp@y>c6WE=dZeR2%Z;!b(f~Xw07e^U;;O)g9t1~8;1Kh;0cL}#t9X~KrXhkr<};ru0`WC0~c*3QnJcoZvA zwpi8OG)R$o4@~d2Cj8|6@sx`rs(HIO2U%FQX%80u<~o+oEqb0{`y)*I5S6U7yrfA zbsQn^{pZdd1T{KkG9rw1O6xB?4dUJWT3LAjNw3~-K;Jl9zrW$UwH;680~7A1!wh~HF-+lRV}szV%VUqP3Oi#%*%lfTyY)-8bdq4U~NGgCHryuoy zX=((0Ju+TExgD?ST8{PJuYP-ygAAzr>Jf<3|0ir$H?1!YBMAvl++{cPGlm~#tPWc} ziCXgt!((v5XDjDMv^#+c?jb>sx4NI*g=DOLSC%!Fsw3IwB!Vj2 zjA`q~Q@WpID;r;G?`v2(QhXO+TFOIIBvo-ev$U|9kDbZ0yBhw+#{ulr zJ{J4y(cd^%u#oZ3hz{>rU8!#m=zlTQ#yD?{$sv*Pb0)qIi7tH5E>wdO!Wj2G!`3aN zlhaP!xA7)v?K-3<_4lJ+jw{4Q>nX`q=5r4VO*^=z-o)6p&Fpbx#01JU})Ho3!{>;n$kXi60c-y*6?SyAWf4AJFH_MIYNC8P1{46%vI zp&^TTqDuHvUaGct;*_#h?k17b2O(P76d7MG1nokfS(dyW${!tr~3dp+1?EPm$ zJ`lGP+O?snk=(M5cqO{S?q*FWfoF0po5x2(yryy9Cz>*?$|!91_k-+xKoIfFsD;tMjMR(Rabr?))f}9fqA~$3)?%}BhSkSh; z4~=}%+A;?*$Qq#LRkIxoT@ka+M=~g8-iX#H-f`TH;p1R#^EMH_P!*PtL2@dKp}hBM zus+2m&xtcx#P4wyP2}-0u97mNXampY4{kEq#1>FwAzUL~>d}wG0EA51R&*vNF##jO zhl^!Gt@UKm0VI>%U?Cng967o*_Ej#?C)_NS1~7%_#TakHH#e zjgBl0{@qB^eN%TTfP+xjo|I?DYl7k4oYp@tp3hD=Cfh|ugBr#88}Y*?eqR~RcF8cp zBTEreeY8B4Jax;3nJL8Xmu}hk$3e>?Son|e?^AE*w{OpJB=-=Eic8PZiaFfl^1r5hqKI$pSh0HU}KGV}Ct@rTZ@Wa5F} zT!c2k8uu3T4=bdrWL$yVcUW8;s})4jM6jmBo)w#rGL9f(*Z``+ei^h<_0o`p(aA!r z=}3m(R8w!&Z@CplKF+(WLRxTQh0faL@q4~8d;m=0F&d>$WgaxH=;W7(mpgf zgV|C(JJv+<)9-3jt(<)$J|@Y7jPVBZk8U^}0gvIQWxCd4UOO;7JHU^sUJmX(c4ia( zo-D5=X|gYa&;L8TT{)@J+cuTxF7LHbtmdn{PF%rPU`!Fa5Cfe7lH$g=eHaH{sRAX= z0{9`|X}gyKx6zH8`!wt-#ubXg$=6W(q>sUsL$bRNP?V$yY1!?PYr|=Z{(aVKMp(WV0YM8 zV(FLsW)`g?&+@qoxT#7D8v73+c1{jF809Wi4EFb4F`Sa-;pT|kI{QM6Oaw{I_@-w# zYLlsHfBEF&UpI9OjEjyPs2h8$siL@KR&`l6z^vw+KPId*{$aR!75&g2R+LYpzs1+u z@Dw9ywSTRQJW%*uFw!nX$dhFoj60?}R6K=tq42YJHc+3aDUiGjnhdw|s9+o`7Vxpy z62c_jQ;DRdlX()$dlawF>yHxWU;7Izh^^15zKy4q%#ZT$V=C@m+tq6nU|p_EQR2kj z02k=7#tq!n7v6~7&t&kj}RMc zM(|rGlClJHhE5A_O`#bqHBw1OjxT^238X3SoE43xe<0WyFWA`kYS0OjVX!9=UYlNXwF1NKPU6TUL|WA!Pz(M z)=^6)-H8Xzs={|$`z39oV8g2pb74ALu&BEOuh+PE921``hZp+hceV85ycd7t#rQ$~ z%x;MVfR(N4L$Uj*kB(SQX#_gJ&+Tzvr>7uLmli&Vq{z{MY=CN&n|dex1^)st+%o0u};@oXR}3@h3f$kx%pWn*~%l}`Y^w_M38A;#!H%<^%&j}bZx zvOLW{Li;HT7McvoVgD$y8w^{XJkHCOT=3@27PlCVjWVAetmksgQRNBt#h;f1Xpn*& zEQJ{g+T6+|d~yspHPM$x>-oxsc^TQYAgQ`gq@;X-W^vvO*GNV1-qy)Bw~7GNHsO} zHJb=Wby+Jku5n-@36Vc?*>vv=d37@5mRlMJrAvw?t%MyZHRG^``ZOeao$)vwvahFC z4?avOzm>4!Tpp_c#;fk@2#TOJS}4d0M+mB0u4u(hOJ?6a$KNUL-W0d{aQ>6yHwgoF z%tQ)cDrF-z@)7xc{C9>47?p`Q)xtayBAq4=K*9nSB)gJ6CNa(p%Ot(vj zaW5`&V6QnUQBuy8YJ{*1h_-5Tw)$&SBeUFM)EEi_Nxd9W&RE&3eJP(zFA_SCpMFhA znK6JqDQ0?7nw}sinF;HxNne{6#(K7bOu(O{*M?^cN9RurrWn;cSEP#RDHUI2H`{qC z6_%q#4gmMn(daX{1ScNHkCpPE$vH#5a$;Mi2uj*k>OUdT(HaBzXfV7EWYUjCUpNKl|Fh>sY7eR=YMKz?7h!DcV8z27b_8*2)7ehFEA{c@9`x#Is?|2QNPt_J)zY zEz?hiXeK}Z#mH+{$+Y$WrfojsxW^Y1EPm~G*F`)?uk}gx3_S6=*;ObLcs!c zn<+SAC>D$WDlui=n6_b-1}|{+P1=QXgWH7F{>B7=p1j`BWO}@Jv|AOB;wt_In|e*u zEn8b^-hcV*Yl@*9s-}=Z#Bzw)s9mYu#8N+d=+NhlANQw(aO^0x3zX_rj^FnN=}^u9 z;4^o6;nzJFe3wW7Dc;vrH0RR^0zd!0L@hXw~R~ zj#<(rMk75yc=_opA@9i5C0DwD?lDyi3|53>GQN%x4Yg?~%^i_G;H9R#l~YE8aP9J5 z;MmkvW~~~u*b070u3zfdVQZ8xmOdetQJd(q^xgPV2WmX+EYQK+%W}#Ppj5dL7ZIQ91G%+PQMX;pu`MOO!I5R2g{>|mcg99!%XEORdh`CZ^QT$31aX)UL_%Rf^2Qqx zt?`mi`&b1rno&oq@J6L5?KDPN#=Iz(N?P+`JTIG=2!~_P0|J-c$;oOXdY^W9swl-I z)dPYuzzihi^#vy0H-?kaEiy(;Pse5N9PKans>-4_m^DkH-%tksiUkH>edcm+^A@cx z;F|ZJWQTHKJ_Ye+i8gmL9f3aJm^d!IMHiihq()P4pGcxZ=6|w>i_nQ16oBs2vqh7& zC0>n_*VIa$0o_aj{YifioA{O@EWXMFVpElj9>wfltY^GzhaY%r4N0Iw{gBwZb8_y< zBP`bZLnzf3ks3GMc6QWhFB}E+ihx&a4=Wu)ZeW%S7Xb#^3c!E!h6MPK!o;!2*gBJE z_%-v^?5`BvWUhw-CJXUijrYKBX4ZDif*w0cF~nV<|2GoV=bs@5Vj3sBMhV`y+}*V5 zNS6=Ckh^bZF()A1-)6EiA-^=!Bij~SN4O) zZE4cq8*Lv6&oelWqm2wHwX$e7J8xQsIn@-_mDNQrr1pW_{q!kC0Lj$+pXMM&Ba=b@ z4BtXJ0HY7)VyO;tLle4KnNmfP%XFw$2aYYhn^e!uDwlLw40sq%zy6CcsraMUrNfTm zUx5TZ+CoTge?1!_4tNbJixX+~=Ut|YF$v$(jaz5db?42`{gXE+JfeBm)7{0^y4q*2 zn;4mbO|A3wpRiGKZmUzty^iao3Yls0tu$XJu-t%DX+g25C{tK%&TT9jB?GH*@2}R! z(-uyDs8eg?a6WyKh%FAaWc7!1YlBpN1!r~t1LbEbAK4QUh@Z66qj@k>Bzt)94F|~Lubh!_c28s zy-(`ENxEfZ!^l&#!Ca64X8;L=Gp^_dKx5aHehqHILn(A0*?vbG_-^x%O+tG*wat}< zO_|fy%Vq;8?S7`aH_Ftxu9AX^LDzKHiV*Jylikei;6&beCrbW+tV7ISDsUV8)Mry zp2+f2WeXe8sDD-s&7yL4tADX+BN3WqVC?@(h;LN^ML5^ttr@=S^J4hP0OPYsnNw3v zySAxd`B|762`XN>1S0gKrkohRYn=^jv|hJgaQW9n(fwJq$vOC|a7o<7-K!BAffLyAco|VBqOoj>+q5zsgEsKUEx>f^6X(fGctf zYUi2?pK%t3>Zg=@2kLf@B|p8X$Q{mBuBeNy>nb*HFcgbw3B7SJdk&a<63vzQbL{?d zTvtc%sKc#Bzg!~>+e8e{$i^D3TFB%AQ3$1;k(h2Afg!wm!J8!E%^M9v36J6thTa`J zYUjijiy2V~2C_tPThPzEocr;HK!&3{-tHSe`ii299*&>0U~eE>FPUoqmwzD=bfR;8m#K{{S@K+e3B??hnq3C_`wS%*BFS8~n7}ylJgC|F zww|uV$h+vMeDRK1PsW~Une6q(=TC^`2!RR*xLO#Z0VCqZW#V6at-tK&gLzSu!Ercxt8Y*%)NbLieP{t|agFGRK ze=&OGl!4nO<{8#`4sS^9zXVwWqxkvhuj$2vX`~V(VZ%)Bad>u;n=3TAjR4RbKNG+j z)Fe(-FL_|Iknny4$(Dj!5K&36Z8h6`pbqHsCs5U@g)|e#KHV_$KZy(TLu7x7C#H`~ z?k|O2_Kxn{%d12mSh97ziZ`C_O`orZS2sC_a0#c6&hWwci%#B?Mgv9cAyxNNJx67D zNiuFl2qEQ?2v3DF5kro8f6)#KL-tC6R{I*q+oiLa-tvFgSZvpiM5C!{qBU6u0Bb}U zokC%(_?O*DO4@^P+h*!l=XTGP<*6dgSQFZ$ac<{RvQADpes>rilc5v8fV1cHqF#2w znH{jI5=fZN$FP)-q?1Nt8in{kgHZ=(M1uODw+hWM)ke|46Fpm;WX;z**$1NtAaN2D7sQbUvxGo`d>mmP8Zs%l(Rj5gdUHE$#Bxy0m z-k3euREx*0XT9FIML^M3IwRNWg_pU$*;Ddi;5xnZ?aqLyZ{mvKG2s_+t#dnGTjlVe zgl7}88N+nxG^(Vjkq7{Lm`G1cKns5+1}=dW(a#_$*m*adbL6FC$%l&z)aC&-Z*KOh zuUyfNqt~Nx?z;SAn?)((s%)>D0TRaFo49{&5GibHU^Bt@l&TQ8%*3T&I{-&b*cs-Ay#lKa>kz(3 zf+%ZZV9Y8Qt#!8hGygZI&q?xZnlHYlN`RSI2JVeT2piPv^X}>g@9S~Sd%vVnK{@&- zK7I7GvD-Ft&GX)J2m2H~PJ=&rMyQt!Uu(ycA_bh!R{lj=bXgMGZPEYq2a;=7D-6a6pzx*e2H*JPcXiB_}tp3 z4+xJ7JDy!)e#9V3jk4Rs1ageTw3nOHVl$$#<`xjmtD@Q+#W{X#+R}GBcKOc-z!t;PYMRI}GB;uelLzlVdtpRCOziA7p_t)? zOt#{>3HG`ncughN8*3HSl@Ze1lcV#K`|iYt#e5{~tG-_#bYzOd{W5?vadb;B^stZi`9Y zcYT3iQ)cl#*Z*|XaQK!GEMTsDy}o_leV=9BOZF0Xn1d<@(F)~UGvsHCRwZ_zt8g-9 z`BoiotoaYZuHAsd2*vh7kKQ#?<74M6=uz26*ZXPEUiK@>W3Q)1;yw+sJ%>!mg7|8? zqK=T0k&H&r~2YgkfM? z^g%clgtiam>)DJWzcXq2RgO=`QK{!Ey2&-fbzZoJil~0py;kC@P9#TFDp87OzD5lV z?XpQbyP^oy>Al7e=N&q;6(4$4e>NcrKG)iAX;n}_NI&qDjkILg%_jzB+f1RaH7{bc z#xl5^K*RXW_+oPMJ@tCQgp0J=U`O%Jc8Xe;IrxTmtBlNC&lSFkuT-4VCUtTthHoth z|A~?-d;q#%6yq_Miu@bqv2En1hle?`{cmkMX0;n`q$}+rF&j|3GQQvCGeFMMk|wa0 zkJ0MghP?n^x76GQPZ`8DIKP)_6qnHgL5ma_0y$UDJoO~OE}&=zbPs)L(`|EmbHQy) ziZh4}X(c5J>4z*s>hEm6b7yWlGsA(o30G5+A0}F;c$tjMj2lDh}#fOevcZMYxd z7$OgnQmd;rFDwSF68nFxNa@`pnKbM2g#R>svH<}3sqsVAdV(Y*<4pBm(WK2nI=jL> zJ3l(&ZhdsmyuM_xsVQa&z8|OT{XYN)LHNGJa8k=W$NKXb$;Izq7oygUw(Mt5ad0Y( zaU+;ey1!!PfIW6T_?ScAA50S?7tVjtt^AoqK@laG)4#|JUVLZo7jNwKM$yv@5=@x{ zH`GT#=x&~Sf30PjC>pPoJIOo~;f9LZkK!>G6l3BbMHH8cBFwKY6iVQAf+LJ>Gf@?ry^_^UCdV05m{ z9>nW{8B-a+ckA#S*-}psGCrvAF_h34E$YS2OS`g4f0g3RqLT4ux@bRr3IJ0~BB{CA zS9(C-Uh+j;eNQmanrTM=Ca?3`!iPMy0SV_2Ubs_iza1iHnNByo+$|o~oB4FPQK`3{ z{aX$ZB91WYG&qr*AGR5CTV{K|RLI zN8WSNf9ed@#a`l`*6vHodHp`6UvHr1z?cIzPk}{2+C8EDFMAZ6QNb~Uzx0gjT~17V zA_C{$cq9RPH_smToRX6WYpS`AA-RYgbvvWpl-%zU(O~RfCA7F}Qr&CjhFibUr&vSBhOtihfZd% ze?FLZ8>P%vK27dP6-VB(ui^#*zI~_jKvolLQw9H7XCVCQy)K+#ZC>bY4s`|ixr=;K z9Dekp&LD{?Ciy6^HwVp^c&u7{VR*tPnPq1et7`l4JLYy0N*pswt(brV5Aa<(*NKgW z1D7=D^85z$Y41H^%!~kPAKR=ag?tRve{*AfpNK~1xzJlK)oI%g-!Z?_z=z-lqzKqX zhA_T*!Ucox%fSc-m4=&#j}Xs<3zh`#`N~JaMLf64%Pw8AZg$XoZEcJFw@TT5_>MZB zgi?nJN}17CLG=3U$#;3&tE#sL?0t>lQ=WaDR4ELXS)U&C#iQ$Lq{w&ldAyC0e|e!! z!$bQwXdZ3rBof|mjm$s+qLfH|^_Y)POckX(i1}_FKH|FMhXNcB^AY7E;j&(@qvK_U zmoky`u9GOLNosTh372DiorXQc1cB&RFzOb=y%KuTY-9rq9iVsn=pEUDAeb=1Zl@O- z;?uX$!;FyOTdK6I6o9+(UbZ zsZPNKc%A(8WJ|bKZ+8aaZZoybjymPu0JUmi``J6@b5f)oBRIv0<^*4Tn4MronNYzr z!#6;WV9!(wL7Fj+u@B9+=6yVt+H7TdTA6JBKYQ=BoJh8{?Vf*Eu`Xbfe=)r|#7PJt zJQ5JGgTQ;?ov!{LQ(e`Sph}8V3o)URUQP8XIYiDUhkwTo7Y8dT$M&DU>QEuR{xrBXrocct1e!9?wz2YLiWxaD#qEpfUTm^o?yPy;!f8dmu?dt@>Lv`tiTDU0?t(dy#PT9Z?evJz%J?niC>>z0> z%qO!~n$#onS!P==#7jdNUAJnTQOJJw5Op{;f{wXU6 zE~!z&(0|jM(aqXHei(yAF2n9Je z3cmY|FNQ_;u*1dEph9rUqzt4buHO#2l|c{T(;P9gXzq0Q7J4^)91q$EJ+@SGwHSpf zvS&Yh3OPnJRC6gP@WN zpIeVwwDq=FO5)_5fBk#Xu_*#d!ZA@)aB{GYSv%N0>Br7U;3+Ga33glxuiU+7_lJBh z+$7+OugWt$dVW2(wPMeK0cKXC2<2l3RE(ypkz|pSw>{YzH)8Wzdp5BDggFqFWCk=mm)3#Q^A%gwQ!9~)czfSjuRpLe&e_t}i>2;^4>rkPUl2&qp8tyN9n7wZuxL^_NpO%TEG z&K@je){Y=VAjAn};GHA?0vt8fO1_k{|c3WAJpr} zy&K2;=w&vKe~%aVi%=)hI}4*UHH9!AHTf~REAi<>qp6y|)q2@Xb6|fl0yE`kiQxXJ z%$)JTT4wFgfAgUlv2#ice#M>`Dd3*Pu2uf?#xcLpo*3;pTu+cPsxp}RsQuUPFrDcV zlf&2fR`;HUwA8!`#)-xfQ&T-S(6yk_5n6%+B_xLce+JvmID{2Q;A>U74;ViK8-&oDVv;zTH=j1K7GVrJohPY)MFBCR!iNB4CH9!A zEZJy`vZVYnuJx0RSl52WIdUY0XdFUWt;xYeH0O@iW~r+%vILx;vnk>W7+2WHC%KpL z28{phjBC%zFEPv4;ewr>ahum$Tb39+srF(Ue|}Bj}u@zxF>;{eqMcgT76fk)vJ1PKkD*yU#>=xYA;r| ze;;x|9Kj`eZ&T*-pbv&S$c)-aq!r_CokKfj2@sK{q4`SF=)o+(-YkLlWH}|6apj}J z#b>i3W#XkWT&YF3GoFUl$*uJ$5(GZA0<$Z$B1#HwqNpo`JSOVEHAMu;>#P8M3dPWOqZs-o6se~bf5eh8 zgt+ukoz3TKjm~nIdfYt6SMBZ7>$>$+v!2DHE~sHq2t^1LiYj*ReQNW8M5yFiV@w!vOK1PH zwQ^5W(=DiHg&RtY-iC%(ANZly?}w@*I~5SvLG33MispAAU1qa*YTSzUl8?puM%k}$ zL=XXMCj{46O0D)4jtq>L86|ZFK_lFtF0Jf;pduB4R zmN*+ul0`UPUY9n*=UU5t^cZ#!#fWKUwgw%dM;)d((MBPFGj(Z!TcfBV;BLYHq6*-x zvPYPA{zW0lz`5~Z_X;Ezc`DX*ZP{FtY6{&yi;4Yf^o~2B8bUzu00fap5u+t!nG-})n=cSe~)xbsxlm>ODZd-+t>J(&2a5GYk&LOaUWDON0}@QB0|Gk zf-f%Zhq+-71roP6U6TjAMtJq~}EnK{3oev&04!z7_D(h zDEs#;9CbqpWv(437}=H!HNx|PlWUbj3;fW%n9#F5hHD0vQ2J3ZE0qd6+OBOTyOwUG z@5tRMX20&qQ8(1Amv!wt;g`;Y5{x9qjQmX<**9wlz4dLWG$Ll$M=o^JdX(U<^&T;p`e_kk|+`Z&PvrD&y3MGi3#W_Rgmx7*9s1hT&y=4e|ek<`HkISR2L!o;>rC<5o12zRIW&7*j;E-3dbOE3vX zOLHILAm2r{#g~f5XQWy|fRCfm5s?gbgyG z*KY@vcU!2!Mgxwc(+wf~5}i%9Q;lWb@+%=?dNpgr?WgZpTPTstAsFsM44bSC)|c+d zW>RpD{wm9Nv+z;xOeiBpOquvlq)fF{zZj{lp7XhUyRw^AL&F%i9=@Yqs9AHV38MrP z#-yf}%_f;le>Fye|3&fOU+9ElGYo(*^5ccZHqS3ou0k)(oqpi$NhtK3vL3~wUZ_D) zD6oP`AuffwbUEH!6GG`Poc>)R<5=~n}}L; z5;AH%eGuk47%`v=2;_Rd07#i~B+*!FqA8cu0{YCTX0U1f7T`P5kSzr8r@4;`;4+k6 z$MM@BoQtXcPCS&Jc*_3jJAehDmlTvqGyZqD-dVY)AvC!(d|-fuVwwkj=MB&&J)1y< zk+PJ+e@F5qlrL2Bg;Gs5%cJURJez;oJ=wpblThVwv%ZfbiUm7d@2vMau+gP6pBPhf z_%A$z3vZX}i%JF_yLjq)-OdM>_lr2^$kPMGSP8&H;?qITq+dolwxgrR*nK889K_SFbNh=A z3@JxY3_+gaA1d%dIVRE1A?^Wh9G}qzf8D#$6Cr*R64HYu1|Kas1hh(NeWjI&8>ig! z3Y*7=Yx`A%dk@+hRTJ<|)#>$(=<0rb&-f0lHr;ABU95CExwQR&LvUwic_pG|nasW= zm)H?-X3da=G(8UA^2;f0ZLm z8RtIY@yTkrj^&1tN~9kd#G0e0`s*NRKjVryf=B{?GDbdxl@sRf=HjlH#;@W$6J7%W-fqcl*RTg4W zEZ1|}>9!hv;^9t5@H_h%7s%m6Q7OOxx|5Laj7vu{!Ke~UQ`0hWHpYp=s7B<+6Gxv( zxM7T#BFueX4j8wGanDO^9_K<_AkSc2y(?_H+uHs_cnu9j1{aIrNUNNAe@^Dsi+U$v zKjB(C0w`7#6OHr-EB@Z#ASfcHwsuCrgHsA;er zGhV0L@JMR08zu0fQeT(q^K_=(jOQZO6E3J(&W@?TSi%wA-`oy19AYC=8pl|1rOvoy z$2S=5^#>j9VW z))FEWc^6z^Y~O@S;!wh*;u64-8h=x&jhY?uzw^@n)ZRuAp^Rd5rILX+&baqAHjlG4 zxMAtNk(wyV_DsT`D6dv$`RTS4+tn5=x_s#9PE~iTr<@`NemWdZB{Vunr^A=KmH{&N z$ibJlUPHK`5QCTTf6tTnP4D%7vPQ9wH8U*;_<%HMe6f*n?@MeRA1>|}Ax?s2tW&FCP9xJAi>6%$lDh)J;YOlpD9`6MmA zhH*0sLaDe?`O$#!Z)P0gPmK56zCSVEnBvTW#s-rO4fphLe^tv&GWP43QbZkTDj1ZS zhV+A#+EO@*o31faR#TXrPdxEUAQzkvitv?6>j#XVgK?K9epob9rUi%jm_?~)*Nxh$ zGLP5ftn(CqERpBV<_Zu$V#Wzp5F-KK2n)iATSLG~#4#s~2$Po$7!Mf#$+)*2$5e2p zm5(;{w?dv_f7O1>ZntbaU-VnjnMb3yWNCig^i!? zzAFca|Luq)Z#geGu>yXW4?UB+%u_O1VC8A)Zd0nFe`Q7FHr*>={D={!3_DDLlaAGU zT}_^EtH{?t&a?)~Ss)GZ_d)KZ8itj33oGLYj=hh43AIHtJ0Dk2y_U+Y#?eB!o2uHs zI@WX^fSKkPthLEk?J+L7BYy1-au3&DNHok8@vtJ|q8%;}zPa9sKs4-gihWpn8(0O_ zga|)Qe{?lGeoNfP>!@9Q8!XtORi`ccMcN?%1}7T86U?lL-7i~9=3p)mfnWkmth;gL zLhwPbuJvBy$|c~_T1xi;4dDCVXAGbB2qvaRAd>k=Q4LsTrQ^%u_N`GNy=7Fz>!oM= z;Zw|^gi81qTn@ZHo@E_;9Lx^5u$OdR6++6@e_9i;_x0>aK{@rat#XiVG(z1@`Mwmp z%XUWnr-~e{tw)a$>Hu_@5Uz=E?~woDb<$re^2EiRPVj!Yyl?_oA+skeVDCRWo!+Gx z#?AXo*y&DZv-yVOp-712?+UTjyccUd%oR4?cn&|4X{? ze|u|}x~wj(LXv6WKCfqGvHtBa*1w5Hg1z^ZFh&q3*hjb=rGR2{?{V+1+C~7Ptf7m2V532Ov1|xCUd&-6oY|0}1H!2msb5jwRQcW%k zqe6AxYA)o2)ndl-@hJHhY^#mG^lFK&Znd%{z>2Xtt*;%SCcE1 zKm8Pqq3?z<^i3>!FQNqs6$CHJhv->$D$^5Hj67#BNoU8iO?0{A_QS}uqq&*R!urF$ zKLaDYNenCS62Ki)=aW(R9E?me(|y3NbK)|9aj)UVJ9(q2Bm~^1f71iT#1o6|I-5mt zJ&E8hf5W<(9@!700t^_US{udW0}WvVqsH&6K+KH^q4RZ`ehx+|6nED?0~CK9=c_`I zU~ju9q~=N@AJb0iktVATrMKa3Htq}>tnf4!_M-?ss6!biQXNr@UhCK@mOwm zDuhkOt3e@Ccw?*LoBfL}IKqy6@4aD4xbIF^VHqKirHHf3f6fI5Fn*1j>OG^yOJcH$D4Fl)}MgWD1Z};-Dwh zkoZkg!k;3Me_&$Pt6%HNrvSx0v*=l2#Ne1I0_X2^A9WRLwv(wxA(!RIWF0O?Uenc_ z^)L$TBVZ)9RW-12UX;66F@W*cfxa>rJqH&xW=MchINe3XInqOH93POOR>LtQVGwHfTn7h#-QW9xs-P z({8;rs%%QTSgO`x^L({#|DXo^mdE17eRU1n(x^g1Fssm&Dx?N1p4J?$G?+xV>7HI* z%*z~le;C!?M!ScHLVMnN%q$)<)}siqpd$&T1e{O-_HQ3WP8?=r-@tuU!ac!m1&LY< z2qf^8Zt@LCJaK#x+%Zi#@sUM+(h=2G*;s3y7?c__I3tm;{lOyT$Wfm43_y_}rjSMq zK1GxB4QhNcaf1XUOa#&54Zz5b6&K-crrbwwf4G|0X@h0EsJ+WJlYG8PzGl+)!>FXg ze)WbQWNrXPO$Eo`yP87Y`SxLda!v!RIk?eRx*9iN(aoYb)*4Rt#Z>-;;usC_U1O6P zp=v1=8j0+ie#%>qA|o8$Q>`&3W|(+iW5b{b)=*%oiIiAz+dAODltV;MuXMd-z~Y`= zfAkjPH{ve@AjJ}Lt5O)>04?`9S2L=zoU@5SZ3Se2o8c2Ku}n3yAD`%G{Qp%h?iu3u8iO8p%CYN65PXNdz8|GQoE7DxrFNI7__f2YTb z(PSd8pVo`|{kk_>J;-*xF_qS{DDV}>iwaZ3sC&Ohz~Zm-d|fQMtlo#YezUrl_!#TI z$Fc5=wztC$&sWIfT$Z|gV?T=gXt=nquwh$$QJO{}f-gU$5uo_rJ=7y54by`OVbtkn zk>%3cP$3*H+^r*Tt#xuL2f48Qe=I6jxJV9l;LPqRcn^%CxYn2w+d9J)ftP2tod+;p zJB$>0+eO8=Mo96~VSF2q*&NLZ#dZOOyW@0vcHgpp(V`?rf;|h23f^TZefX%lu-Oif0&O6(Pde~Gl5t2&3-PsT0(S}rQx7v+H46L;UBU1s3 z|Ghcfdt^#8qPWC9l&89lY;(Js+_$>T?ey)wAb9i&@~FrAQMKhhs-#lEOAlbY0T{Wb zVT9W)_^8xJ^5(7*tyGt>f9NK=DBO+ey~N|>{?&RGk2j=hyX9^mo`s;^OkM^oUOkJ< zTkb|kB#mC-=}mCu$08~xJKN`0R5qLUyfrK)>h{BUv>{d7J=c#V7gR9ml4l5D{B@wO z3`TD+l~6(v^3{>r6|INVQ$D(GB`5P*F}BUIiS;lZ??|=XGBR*re*~EHAd`CiFbeOo z2EiDtqx6x!c`o2cnJ(IT5hsagJ6!EYxAxZ~gBUT(s?58Jnut|nC_rq3o&@0i_qWqRi5Bv7Rc(f-~+g&E2 zMkY*YP5V%vnxjEHe|`TL9=#>D<7%^6MUPwi*V`O#N!^bav28U*f)MyNLBx0yEDG-# zMux#P+Z&Jjqe5yj(k|$SYW9Wg%HnM>%id2z_QQCzDOKAo1&0-uf^vCz1*!nX|L&xE z)-@o4!k8g)dcY{(glrcFjf_;?Vnjr6W%G2-irUjIYQzN*#D~nrC|T*zTC*YYt^7oiwSF1K?cb?EZzzYzi3%TPu@ULN&UTdc70R~~qcwYoPVF!CA8kklbGavYW8Io5 zV$|J(Y2sTzk$KxiDy34K_z)|erecL2BD5Ie_nkG~f2ccMm|M@{(S}sRqFeCh@O51p zMWIY)H_*Ge0ThX6o!=xekn}O7A=b@|>V|WCoxShBJ}%*eREhl{9&1J=bic~aY%_}B zSW_e|kPQz|{O==E-ksrqqL2)qoV8$+EJjM(?)vXKs%6p&Axl`Wi}E)^I}*7iM|1 z2uh3B&!X_GXMiPux0(1@_$FJm@M|Of@;p+5Q6gI8Xq>qM7LWCz63QJ+u>i{mKCB?f zf3m$cSQ~APy;<*o#b4+7x>%H+b`d-u0`VgAk-Hi2Vlr1F_i-vvfmK3-Ug+AzQH^1= zd5V}zK^Y0c#T!5ody9rsp|Peudcs$&YOgpGGtr|(jH8dq(fy=qJ&9oN93yuJ)16I+BUO@7-A68Uw-#uz~UKYe~K~OZIOha@${CPy9uJh34MOht@%TLyBy93 z4-fXk2=St~S(N*8ixKb!=7-tKeb3Lvx>}Y(ZDpw+uQ((E+cSg6(z=6 zBI0N9V(78+RM4fI!0Y})wK5t`o*(UJQGnrt<1Dmkg8$&4N{135!9jr7Sz*hpBA1dH z4>ic!TtA9O#xqQnpCaKya7s*Gf8^_IriO7oj#esz;i9;@g7!CLI@}avQh_`Ao5YRH zW)UN%5i_a_0gP7H#Hr^?)nOs^%B9>Ap1!g<&P_G|F;a$$4 zQZcyco^BQS!(*;l9;@f>q|4J}99}N__7@g~J{BrUN0|~U$4nB6Y*T(?m?+9=FhG0* zBq~p%$S5^~sXkWOtP}EqH|{dyOd>lTuIk%R{&ifLOf-lE2oj@r9aU*JS4U#VHo;!!i&P6b9jL~e$%+Dtt2e!P>q->AqC6%*^J{V*O=L^Uw(Z9lb) zMFuwtjc6bge*G*Gf8@R5O>)5qBlPq#|M-b+ANs{ku{&!gwMahhp4av#QI9I38ms9p zXjq0K2UAW_U=?qGMB;4~h1OhAqE9FB=^PF@Ad7knC^B!m2#1fFez4O~485X3aS@&8(*2jGmqx6WRm%SI;!#ah zgQB}B+_q_cL4{)AsRm~8`dK92O-bWq5-ZVlIvvi3e>xP;$Y7bx>WAm1{Ujb!L^UM3 zd%`W#eZx|jO^_^5o4NrK*^x58CK5{@Res*iE$~w%QB-Kmn!1aogRcEEi$?`fDOL{R ziV3iof^cS8s7Nq2&a({0Gj0Gy;b|0^fFroKu;`E4#G+Q46=tIf3dPFp4(_(*D`q{4 zN99nBe^qohgru>vm64ys6arakOz&ZoH?cgP+(yW9kDG`WK1C=oP0?Z72)peU%=ugStOpt3@M~E z;o|8HH)xdSFB=tF#5>(mBEe$AIlF?MaHgI2e|<2f*VNq$_z#N2QCbSPD;Y^jVcUW? z1{R4(a#4XBMFet<`2;9_)+~BDsFEQ9mVlma6=(5YJ|^0YP7}4F%|(12%5FOLqo{;~ z1wslz#HbEJMaxOV;GkloPJGF<4WOt<;Gv!oMaCsEX5#c%@p&>W#U~9tf1I_t^>8#? zf6hjS)}v_JP~Ru{!M+$@?}LMivBX>xhNN4M(h3yeQ?ZdtzN~*Ld0-U3z(4htU{pwB zEU1spxA`(ky2I2gKOWQ;LlG^kV~->IQRKprVDhkOT9NFaBYYo4b;gxaSUZTqgMf*V zNVN#=q?D@p|-7-o|6`{mc(>3Pa{iBuX&d*k5=vOkoNQdk5cxtsH9`M! zKbuWGy6TN6#O3KIZU(V+T(&Fy9*x8vpKIA|Ma`^7@x3P%Q?m$_m@xUMkE#z|*QHq` zk|QI)aMA7?sn^kRvIU z=*N@m)%<9VLmEj%&{a)u96i17XZ$w@7kgV0B?-I;KfPl-Q(r|wfBAAv7Q0O}$lu3U z+x~_XIF*iOT!4QhlzSN2e7#nV)aF)gBs+}A7RZM2tX+#5Q)0ya?RIE<`_?h!uJ6W z4Q}jbLm2;h`NygS;3X0y|0a30Z*Ob);;t4?>*>8N1``c$f3?QqboQ1})EqyB>(8CV zbH0}8KBr2v7yH>$+(DX|Z54vigIWQm%E91Z8HEVW6xWv7PY4gOzS@N`f&KjF%m17G z6rP=FlpDPj_r>`W!re_yH^ug46j{bI+udNb?q{#S0|xWSm@*Y?gtU7=;{6+7>PVA8 zH!E5Z6Y6}yf7@vW6cd8!U!`(!v-b1Y7E)>O<348VYel@-pi)m{@hGnHv;0<8t|4zi z9R)$0KtgEZYT{Qo0x^#@+jZtuUXANUa6GQqk_feE#$0|IK`QXFjn;CL!)e z?R$Wl>*-x3(pyAXF&e$A)-#!b{RnI35TZ2J1aU?8f1B4ZXAUAl8Rc^b`_4!3iN+IL zULqxR)rYQ$*}#16xvri<`x*%)TeVtz#?Z^initaUy=)b(hmc5gp=`_^;6>Oin^ zgjtA1IiZ}gGj0z4l=&oxNI}G9Cw~L`d0G3(JsD=43izo$G{M8$bUHt-q{RI^7mYu^ zO>3>;f5Lu-kD5>OLAV4$3xbj6=TnzDHTYCYN_p9iw!nUVjs4`FV^AF4U#a~pjhZCn zM5PnEMP5x4Z`*PgZ#O0T*;B+3oJ*#dWSHXp)DM_d2NTAKGP}|gI%BK%=L{%j?81%S zf%&{}`00tTIkZ|MALg?*XT@oB@zi>3)JjiPe~jjh@tge!YwDo)&Q63OzC0k9az`5V zLq<3!44-p$>csdH8Nt@SO1b}L?WeagDtriQEd)Bf{JEPglC2!ZioPYbQ~6kI7p8st z={ssbDI$)78z5&|3C%RM&440K5oJtYCyjv#{pZX7n+ZKK*TFRWkNH`^FgW=$yf?jYivff*$}g#P71buyV% zTvz5#YC3JydL4NMlN@^{lpM_dQ|(YqBmwr2K=OQ(9G^0vf)dT?wd(u__Vb@F|8Mq_ zc_OTY>GV`S3ZRY2^Fy(oOy?e6-bB9Hf6Y9Sa?E~$kC{*KiQ$8UNujBNBYW`()U23P z$nExA6SIG%`TRusN1I4e`G`NuJC*3sVLJQvypF&0pBrp5x`G1eQS>->-nI2Kl@e=u zzV6!-(L9eeiszy(L9y~M|gfJwDjdnzv1xh$V29@~p$amqK=v&jT=G$9`?EG9*9$b)7=U7 zCohrX)e;SX6)=z43tu&BHB_)(8xB9mE`VfH+3T9dj;7Lk-Mx_Hn zonQJnU=Dw?(nC<>z>8Gq$CIma^RJ4z*6&513zDjhukA-1^5_BfF7rvRvkP}oOqq`^ zwb$5!Ec&gA7)5C$!4q6l``1DV2*ex?H*>D>-pPDFxL7&r--o#>e`oCSb_mwsdA>gp zA%2s$H0sB~T#_G89}g~NjB@zrk|xIY!F9c*H(mAfyu#-3;oAQCZvW^0(=Xt}y9kKQ z79*vJ4;7xUdakvm^+AVZbB}Q)vk}?1UNu}GqqL(Crdkqs@Ap$KA#CdSQo{vN@YZvT z&Q}N2Mvz1^iQra4e>72~9m2meP?$R|sW|s&$**z+7F1od!93vHgY%$e_m%=*3WElt+`_|l-lgdpm<-D93zMjHAC-D zOzLy4mV=+A&5paDPrqr}*)s@O%a8UPV+bA;x@gE4aPDQ#e?2ep`$rEi?pHxBJ-cEh zQ*dJZD0?-d-Ry3l7R$n2=XIP3Jw2_p^(B;d#=&dRlt_-1*iX|k4jV1W-7f8iuz*|JxbY-t|^w1je-XVaO{5 zGP@fjx~i?S;T?KwCnw>|6)-Lw2JkWnmrTiK-&rTx!DjCs2X43^_?!w0U*fDYq9h?a zaMlCJ|2&AQDHj}RA9nmcR_lynh=m8Nq318%%`~1!e_jFO(h&;YSc#1awm8u66vEN( z)mo~7bN60LJ0aIZDau&@c>wvZi2O+X7p@k^$VdHmuuJOaabp^e6hcq^NNoA`7Jt1q z%J)a*2vTO5G?5As&D@&;tz_J^XbR3Qx@09l+%CkA=;?E$%#4cMZmaSjJvMIhuwvW5~bbK z)PLNWk(qW2I`WoYN0#lBs$!W+S+Dv12gnt7h#;H^N(h#gBQB|y3@8gqf2UjsGY1(h z8S`W^@0Xs4m+(3;xmJdQsazL(%CpZDGo>ir+ZFi7Z8mxRG$RkZHi+I;)`ii$k{8w+ zSAoDumQ+z8fIr0cCBY4QU|J=6f5M!ePfzAF_7o>taeSpEtAIT>d!E57GpnH$@u34F ze=>A3)~~~9XM?6qN#-wwLeqZqG;+)WDX@5&sDt#>A$t6bZDGuz?+>O4*fqp|)BX87 zX;Qd5!d>#B(%#?9BK~d`@%ON(z3revR8oxf>6xV6tcF!=RSKhFd-v9y&y%YPwjai0 zJ}6<1(%8%s8IfcQlwpKK)HIp|cJS)$e;{^U-ouTG6hc6Zd~{s2UX$Ufu;2a*{1my_X>X-xaO zaI!SZhgTsSdTK=7zrC&SDd9*#Bo~07X8W^-ggg4D>=rZMPq^??iT+yUoNOajUei~ zDykM|?N2z#?7{CNF1-pdK<{hN6P{)dV+w~2VIS_M^A&a~{s33kPwte*)M%34Yej z_tU&i!Lbqj3B1nhhmU(2J`Utbfqf)fW|6V#;j~N?IBIluZ$nz)1V z?fIOC=t&2=stoMXjV_dOf1}qEBwKC(J(m-8Sl}awXzdnH`Qw;Iq(1LgrP!_J{kIgZ zEjE>j^&{1P@HrWGkYt>2^CaZuGo4bB_Yv;^zUzmNco!KM5rX-u@Wp4{yo#YUpO8lV zvDzQiYKyr2^c{6N8FLi<>2)%C>FT;L?e&!7pul(i>>X42q*%kffBtlz^I2^2tlvlv zNGi6Jv$vf8WOCP9l>ctLVgj@{Toh!kgeI{X+{l2i{4V_qV2kU>U>zZABltCh+q(`o6 ztw{ji@10K1OeZFS5==2aoxaxut(KoE!}vs_b?qglab#eb2P$}OuwEiu99-}`n-*8(}Sx0? ztdC>4(7IPje?En@{VeYLp!?0$gir_l>@hR-z)Raf2EMSS>`E6G1$J<+*zR5L6I61| z-AT4T!Iw*iQmxXq*-b@Mh|Fe-$7J#vrizq9l`?ytAk?FW6Mfo|KWYvDCq7@X{d0B@ z|0DDE7bQY()(%qdM5rKKQ7riBC5Y;vhHjV#0w)P;o|# z$jkncKZBxs(BabUo}3CHFbQUiZomw3&orns3R(>LsQ$f$pF^e5c8V5gIvPHdGmAui zU_W|_JDgF%7(BZdZoQ)?&|a(c#pl{FxFsY|6}&3=yqD;BOL~IQg9uRg5axcndl_Y; zui^SSf8S`+c&S;QtU9*S_r48}nss+X3b#cuUrtT@$G8?qYDEx6=d8Ye#d-~@u(^+1 zXl|ak_5y5lvyOV z&$z%2WfaaVlSBy12{+p=g{eYbr|TOKeh$LDf2EDv-%Jky2~}p|a6e22pVxu=9A|`bBr&&rGd&WT ze=sG2tD4Ta2 z;{uzM`@{BiGtLQijD8$gacWSv+*y~1e{(_cmFB_&!p}muw_+uOSR4_}PY=h#0#_r= zUPYJEtn}2JvDc@j^?ejcd7V8I9cySJLqMKX0|gf5aN!c41QAr$MbMywN{ScT*C3yf85m7 z&WQL&q<>SiW}Lu{CeUiQo|^S1<_9p`0kALz=VbPF*-)y67qJwXsd_jS8YP8J+0PyW z7aDGMlxs@e$*!O5F|(kVG1Js6FWsz#83gMJBKE(iQ}Slv^DZ@ExWh`ssE>w`P;A%~ zuf0sJUWS2i>#9HxJ{@wk>k)UXGx0O6D=e+Y@yr3dH0 zB1^)^m6l=x^!A#TJxeHrXsLY->#P#fO+FpNwFw#5Lz>?ub=LY4%KOkNAx4)F!_9{8 zFD0RLFZY7a+VFG=drDD)6#ARiFW)YEo|AGMYXw)@NBFm#PK&RZ^0Xc4MJ8`uH5e@W z*RYjDIGR&o0xyOStezAOe*)7dAoLT2ql;TTDYaxM@HlS(J%T;W9{51QX+L^OI*gfeKEQ=Pf1n3}AjOmj!Lj1{ z;&~Q=ASUG!1qFwzXAdjSf`g)3E9OU;JvzB>&Lgw_U_4`mOj^9&tz+1J_KrB53@Zl$ zJ)yzbA&vut(uFaw8KFpm+7?5$|~~Y~mY=ee{>jqxonoG>JbfCy~2M zxVPzcdyn?Bx9@W9%hNKf9rdfcATMtA7!!)ize*MJR^h|^$U+jX%zABg`dWlcJM@~Y z(cDf%BKh%P$!d$xbtgF)myTrM=Na*6c5z8ef)F*UfOwE;f4P42ly`YSfj7pu5At4D z^-yHIYHVLNy@$7WvKeRHg8k$jbve1&PATDSq8L#vE?oc+LGQlV!$MLasQQ~kFmIJT zf;=-V?;TVS^PQe)sXg-fqP5P7S@<=bR~5Nkk}K$FIqGt9xf(92^_hs@#RkWloLlKpG zu3iCo#~e;hnFB_Ta*PIf~t-bqiR z2`-rSfnw`nB(wQtvw|9E5Pqwc*tlT5SkrL_6oNuW2&pka@KJp6ybIPEQ=!?Fsv`$> zaL)zxtoDH&q#R-%a=H&%2$Rjj%XD3-wQHqy{-u-FJ%3?8dix5r1)C42NgMRcsX|V^+0(L(lsPJcJ0tR4c6MA$-)TMr$mDQWR`;&~bJ(@Xg!J zbuhKJr+JD{C3lFL?%&l)mVmWs#|NM>SAm?ftX20atQx0{G;`L6c{4P zL6j3}o`|OBM37L&-16u@PeT936BQIW3@AW9o_~I`UPB@+5xK7Q8b=SXr`$C192GDz z6ag23o^Cy8WZjv@(wkT|SxJv-EfP&6?6)3R!+C(%1tKKo_EX=FE|!j|SrPMuO`LVc ztr2dyVQ>|HV@-fFM*u(U$J587tC$fhyVjPLPUvsCxK zlz$ZB5g( z5bjH^wU4pChfHah+~p%#+3SR!`?0tF`hQ_%J?WTJN15RV!ZmT<*xtXMI0SBY^8JYt zdd^<7uh<-6&Jev)@ueGQ{8GzdyqitQd+tNZ(+OAk+4yOe3^nGtP~;(=Db?=p?H8{% zghN~>!6i4I?m?~xIUJeFzfn)p=hd_L3c{skf}v~GHVha)2jkRxe%S0h!XYD7dfYMZJ z!ewB{1IYipa~*4e5$D=R+D)^5c$=Jt!n#<MD~)5$9WxiL1bbH;*f->GZXIbl@=SX=a;p{C3AqqbN=>hHY%_rTERcKGeyO5L z3F$-9y!9|kr1Q&c?6FF>h2E+j8LaFd06l>GV3i|W79t2|0=U7F3fm!v-+u-PBCk|= zIe`2ukROrs5@u7e@)44+URrWR=2{kZX+_%IWokl7R{;4DZ=Eph5G6FwEd-JR+3v1u zDyiwm3@mv7`MqiRb&BCaT`aWyTG7WLSJFY+%=QY* z6c@~LOHPdB8)w(m#1%09{(sT4EnYvuxF7@~avv4)0tqLwTYdLfeQfaIW4~2@drI5S zxR4GvOI(dk8Dje?Wg$!)Ae_thCnU}|u=lBvAz~8#go^95+rh}t-XeDI&QnvlWlH-P z--}i&q1KCFsyrFeL?JnODpx|*vq+E`kLB1b+A}D8V39%KEZ?6f(tqsIV?$aBX-4m_ zv+L}y99;0GPaXd4zw`;<58h~fdfqBEz8e(~f9%OkB=Z<*w4W>EnEmuI=9ndy%8b#v z%kFm4XBt{GrRuUZCIW95cOTIJzyEz^_qsUz+g~F?k^+I$hj2tD(kZ207m@qB0pI3i zDt)(ETtP-j2!~p}OuFIe8|z5>(L3ga z66q*2()a#kIu9-`pUaG@6}*&-W>qQWTDuQu0N?*UBieGLtO-YsVd`T=->|yP?vmkf zPo*o9L_(&bt?0e=^qFj^0G|)wBjAPZS3CrF@DH;GPAaD7nw8WhR)TIpLC- zCoV6oBdCpcVuOT>bRW;a3jXgi>)Acqbm24#M8xS;2%L?QQghzS*LG2sy6=`>D=!cB zgJ+b>5d5PEBJ@DPQwWD>hQK7jlaaEyv;(RIk*02W(SKPB8lrW>ICgsH)(C@Q? zx9fl&k&a*#Bkdy;+zi%;k#KP&Xf&0q6rXB^x&8Hs1OM|Qih^>Euz4b!Uc4FzFNH|S zFW(9ixPPGkeP6q$gr~%Cjg|Wr`zQF~)po6$UcaUv(r>()$>bK9)YN|X_I%KTSx}@L z{i^_>^rhLO8iV1JmsMslYh?oT{`F zzdG7+ACw6Ilm75RIk7DXikT)HUN*aUQ(EAJ{(tv)(7P+fr2fnn$%9MltiT~h9VAoL6rG(^7#S*d0Zg2;`fMWLn4dDCV zXMcLoyiK1`O@|0jonD7{8Z4ia>2Q0K%gUzA$2Q^e&VKlgHiTjYWRjoFFr2wXac%HJ zAy&ZPpk_QQ9q zB@~-6{GXjLOkA2hu+&Cu_p&Z1rLJMMfV|JTpx&uarI3(V_*i2U+C`Q%GTr6t)54PTvgzj>nki~<;+azViZMUvsm>&yl&=owv5GYzLXmZziG?tgcl z*Ho^6#&jlpKTE{;eb{;wkB=k)itI-k6od6qmo5o1@J;Y#8(}zdudWHK;Fot|!(pQw zBYnF2dABNdr*DF#%Dwwql1@oNrtIIaaNvF(8bRi$pEeLa^Q_9uCy~dvM&iO&k8$dn z1P<8yY%$(D2};ea9&sNY=yKXA=zn#)mTx}2ly?33!*cjKw;n#@fl_!Q%v_Ju2SdKd{}4%ioPx#3@TX6h%5uF(igE^P^^X-rk>vbmTb3;H!)sAm=w9Dg#ir_x79 z=oV!L$=rO^-Q+RrZ)#egS7twZ%&cuUZI%iHdWZ5bWUn3j(o;!X5yjz7aoGUS>^uz6 zI}tta)jZy7JESr}zQ2yp&O)_TB0d_nciTw4O(#!RkOt+{p~x&RMexVI*`p=^lxB}R z(nu+OPDP3@S=vE0)AU+vgMWbx@HwQurDvssaU?lKK0MpEYJZv<$HQb%%y!HAsg>*E z$15Nl3@A~WVlZ0n5$AWr1$D5b2yrQlRPb4)55Ht*hlE&|h|6!^3K;+R*%xA5dFFA! zeiLMNGM?T`PVN$DFl(*z!*D77a6irAY>Qk0lvlub!1zzbwddR>@`c!NYeq)#;PRSQ0p%Y*`$Cj^_a#wHlt}{lP%0P2 z=$)#x6O(Xst+V0ef`6noR{%M8kdT^lK%Jxgq7YNqVS)>#%qlWv`|d4DxT069TM!U_ zmU!H|=a+yHH_ZsABR*{6*0w$kZ#KzZIg(FQs?V%--H3BS98EMvloA2|vwh>eAP|v* z84q%90ptH#aqsC;i4~JX`)I5xk!1ZoUEZW;MX9FUSap+F>wha?{FtxK1$H#2Oj9lq zA!k(k`WjaqQK_iVm*1foK>qQwFSK9p$P_E*W`rF3n4FuSLS`IAt77kY+>52NYBO(e z`ym(aA-Cp;3%IH6Z^NbtIdB8eiem-$0iiBEzM}-^oXRVO_^&Kne?rckAPk3*G9UU4 zI2OJ`!&3Myxqm5@xD@62!^HmOmS$)G6JuZDS7xrd)lc{c!^kWb)Qpfzi%7%K=Xy`l zCSdQ^`MoaoT(zVR5v-O3G3uk*v_-phEs}{Wt9Ta{jojoV+cDP9!e(zlk14_Cwiz0_M{B7c7N&E%?HIsKhc@ z>ipj~33-+{GTZdzIrZ(2d}x8Xy{S4-=bGg#T3#(T0+cgw&uzM_M~)_ zpa?9WP?|D+zP92|d7(m3(?)UG%|d|_`Xwj|&wq{rI2fAvS?bkYJWLj$yUa*0^26nX zEMkk%HTa;yp$vjP)8fm;K|BZ~3al~3oM_WlaOu%ir8tuc1*5AsUKu&n~EU9YVoLgCpl-a9kE1!^26h7u~h22O7*28zy2W12~ zoN?e!zH7W&w#|efL^#v(Z`!ADvpy*I9wZl>OD?27y)2Oz{aOgslF`{iwY$pPmj}D; zb?nsh^g<1b6cNM~TLj*_25A3^xytAAw!FZ4^`bLF!>BtoT@LNXsAAS+bv$W!y_ z;e~B#d7{U$*lW^$`1ZZfUk2zO_^=~fWe9v}_)H}P(9@SKLkNXgASM0Z<%_)gK(P>< zz`v)bLiupr3(dOmr%7#B9E_g&FXdIndisvLpg6`2{lPQH8Yt4x-UJap1LdRQ9SO20*aIf#?(6^=&V8r zC&7o!jteT)bxuzOhVZl)(DY=Rkv?&HPxi9XSUufG2ZAy3n%7}XqZa;GOl6S?Q`a5C@iQsYIloESg1 zDwS)HlRnlL%CvI0W|F~yH)8K+r0;Wns3Py;yO&+85cr{A0weP*O=v|G$J_^uPpQIl zCpjO4CKC}Z#!KVDWA_RYGROKt4U3c`cq$8wK$g)*%jp$SEVfW^dT)z>(QJ-87-Xf7^0 z8Yr|377BfV6Y8A{6#|>)TOVzq&pG~9>+NuTJFOLpFVk_dQN6bwzT;jfr^2D814L7} z6R9)K#D6jw%D@UitR5soZ-3bdl?<89H9qPRtKww%uviru>$_#MKaTe^^lf21i$|SM zgCgc!Vk5aFg{u~KAw#GnVhq#E76m1xG%$o`?8yeNjBq8%=}stVitzj{L}S^-EV`T& zNCGux_Oo})3FTBeOiQc~#fY9)s`V81G~rlXb|P0|;(Aj9@V_egw)hfBtRA9{Moe*vkf8f(2)Lx~ zVF-3stVB<4X(0^T^^ z{msSp-U8&plx$$3UFvS^wq#jS)vun+m6=Z-HelZxKFCPTmw)5KcR%pW+RepZ_ufwk zJh9MOa?G_*9srb)P=A%2tRwT+KzIpSF`oA9Ut>u@{0KFjElhK?*IR7vza z7eMraRX@g&gZAEj;`s|-tOMDpLVvw{vixO6!7;k8m$~i%C;{!4;_d-C5&ST!#Nw~X%`h>L+1R!dsjZhR z?*TUq{QICon%(tNY4NBEmv8R@Jq)e{^BPy;kr-(|PPdo1?*Tu5Y(0}aW^eTlt)=s! za8UAaKOP z`nbe%4M&D)wh8o?FR}jf8|m?Z^_+7e;Kz@IpvdIuAD`teImevA7i(5i`=I-ve}JxC zo0ZJ+I7vOoc{iMYYpq}MiP|>7CxKx%o_edwc^tZwKpznjO+~;BtK}=9DyCP=;B-YVXvb9v9P%-|Nnl>ibdejAC z4kwIL5N%_^|4Gpa2GJ+NID$Zga|g$96rM<&NPoM#&-y-p>(c$?U7N)So_hZS>G%_# zzSsC%rJAkkxRu?EgZ8t|h(n2HNNcVrJKPIvWL*H^N+PrRS?@Q_Sj##W8X=8+UH4f( zk9DOG1h&${+56;yw9~U>Z<-r-pJKVpqk2yD?MK}>ykjOMS7w0asGg3M!zjFyDJ0?I z?3W^}MV(TAyxY*{qwb^rfjZ}|Wi}88EF|I{+|5eycD=Ao&&h_bdTh%J@0Gf=o^{~Y z!3Y8vK{=xMSk{@NK=~zwga)2_cR)HoMzML{tx5m*0({c{e!Cgz7`dB>f-Yz-JeY`f zvh#M4g)6mLR1KojR;1I&XRQaFBJEJhHIeZ17e@tubxa(E6~yo6#W=TI40J}N^LK-` zc@ZCq_%T`Gn04di$BWwQ^7)u@5~geS_Wr&;<)1&={SuqEPZ#%3AI`ruafZ@|NPO`F>cP>72Mk%&f#*o*KRDi4lHA1U6F;C-f~XDcL2F^;9-W8@c|&@ zP{);agg}Z3ff*r`UCs#Zk1(zY#%8OtFXKMqeK=^@-9}cczijDo1si`qVh31!k>y-H;hy&aNYa1$RKI5N1`c{m)%edhi za(@pp{??t5Rq|D>MJ&Lkv-en~N^|!H`C+V%C2`D=oa9Ooj%|nbt&e zE|j=no%~N7sxxGTb(jzN=a0TDIm z4V}_w&3j$6io_oKo6?t@^Z_^$)5lPvC?r^Z_O$zdDTdYtgtD zSRG3tF(<85d9V~{l3s8;Dy$~cb-c_2i3IM=moW7KJAa*|*Mr#uecrx}J4LG3oy^$& zmP1Y{sE}gDNgFA2JR@|7-~PtsKdy$vK}HPWAz=Cqgg%Q$$XtbnjN!ICa!v659eY_G z$<=uzSK^VlXNFQhgd~{{%m%GKZ2ykEERXc+Jko3Fqx*s|iIC*f!*ae^CO;}YAEIE5JWCj+#fX{4GQHC*0;Mv%wr z9o*E})oEl`qLI6*qv;Ibo_ccT>&E0cyA2bWrhhRi6YbP!WdEG2U}gr!2604R5=XPC zo#9*Z2>B}_d~f{z;ym)J^T@Boqig>RRnqKp^EmR$hUly&Z zTv(4I1z9r9;S6z%xI7vY5e}ggiQNmO`+p}}e;P;eSFq}>(5N+~RNkpW!-1E7yL0{jB2WS%xB^2y;gMO-^@dW85O9*ClQe993dQ39WzDb_}taDKjx3_H#F;_WRsu6LTmdJZ`f zyBZ@$<_Pm>?~V1E2u}z|=#lbSynhx?t(7Doib{DXXgsd7$%k<$(^>Gx5P#|gnuYvo zV?T_HI)q7y&6+7nKB?kAsiFi(E>~Xs8jH%D+9>Rw+k68Sg{v+~Y&JPF54HZmO!4=2 zZ5AQ_<^y2XW(vV>+(U5sJe3A&LMiGQYEnMQw`wHtdM;QT%;bbgwI# zZm)Lw10;k^0Fy+;tlIjgdqIfRFPb8-NV;ZkziBol>a6Vo9~O_ ziAjFN%=pya%=j-2ooTKcm}ZiX)mFPOnCeg`+_8W0x!|YLMd^qSUDW(?v&3Ix(R{SA zoA!@T@1I5PTF%gBDYvH;DT%6h>)`UJ^W3N`QW|fFoZP_{Q@x)o9)C>|6XpC^fdns{ zz&&RfixNxD5%Ldi?jJ?zDvQJ{p(b*Fupl$cOo{g75j_)lAg*I zmGjR+GDQ@>;8g#YScI=h3S-aivv~I`a@VGCOtdog-2D88n|z>Jd0)>k+K6zj8rp8N z>w*1;sMHwEAc(~o1b?e~@18J!UvT(=OU8FER3OVjR6(&RE#B!CAs@x_&QOgrHK%fa zS=292ZYGJ164`2`R*mHPaEV(Yv$Y>Z&K>Di&j1vGQV0Ug3*JBHvI0d339d1W^v_W5 zA4Ta}TGUE#Es%$E8;W1vvoG1l_%N#i51m{o7agbVCs7lJ{(sXD{t3jt6_Ieo#POGP z>r@djOquqJ8Q%az?XHPbVGhZY2aApAL+K%#94tl&l+9!I*6F5R?039j6gd!_!b1lU zBE{io2B66Q5k-NRW&JjgL2yF2AD!MmiF-f8Pb6w8b`3XYlb9U@%k4}r(SHri*z>3$ zXG!*CKZ!y+(tkwZf(l0H;rOsPEb%MLqEn)Y@oSZSDdYZ8RPK#$oFd7Ql;@*3?QElB zHLE{OaUk2ukxFtgwcqImzDLLS-799=R`8+ml;xtRgt1Si|0cWeZ;PUK^|&FNGI;ZF zdis=H)ncRVl8_YNh9492@;u(RpG5YTA>&UA{NiYc-+wL;;cGXR?mme34Ka( zH}tmgS^ROie_s^cYl`L#!9D6>#rf#5HhW*wmsy;}m6Y*i4N0 zDBeGcu76!`iYRlJdT0hujzlQ*9xiTQBu%dt#R09A?Kkij{8XlRXs2Nrh*(Rs8_e(z zZSI~#f=^U3Frvb&mO2~7&QpB!{QTCcS1uW6MvmNPB(9_>v)r;%FRq!OnM#bQ8fLh z?z!T@;PAdDmlY@yDHS4``Xt^xiI}-p6&V+ZYb?({KvkkSk?(x;*6zfIVwy;;nnn8q z)RXO}kU&};p%TIr@~v&Y1B&i;{fr?biS%GGHO^H-jcg^@=c7cj8w|ZiYdB>;iKn_x z4S$LI-ZtE_0VzT#L74kL@@x1Yrm z{ihfmI@|2M+X@un`XNHmZI`_HDE<)?m8&Y62?U7R_Mf=FLUGyN>IF(BDuHhKK*i{AgkM|cY{R%&9YB2+zXOY|0V=2kRS0`%dwc7y2C}v6SEi}->v#}J zykxQczBVTtP;D1Q%@8EGNca;{_m84-tz{S`pu3G-XR}ys&d0UPBa71hs`eJmkAFiN z7wl*8R12y}7WYl2Y};OA@>>OZ?svZ3Ka2#OIJlw2tUTSDh5HqZF{gZrN!ZlXWtwB>Sp*-tk+(j zTlrP0Xg!N3yHJnvMT#v8QZZ!+3xA)*Z^5E=9nav*D1r9i_%?qZXQL0xc!l)zNNn@% zY3a%Sy%{I_Pz{R*mT#677mYh6d?+P;q5tk#B*=Yc5o0X~L~rNAn3DZcck(hxRWs%K zV?U)EsAK>5@KGn~ageHESXzDLhva>$?3co@z#AhaNYUC5w!h!zPUVL)7~xQM!sE+?Skb z!aP(o-pcdv+c1=x^y*K&$~2#zC9_rQNj%+)$_`C#uw?-%))+xn?|*L}{thtmQ%h`& z6bKL5q8OG)Hb=x`sW0O%^-%3SRv6k3eZc3A4SY;gvGkEGgff%^_93fBl#BCR#y z9y;JUrMGx!B{G#rAg?whlFWJPx$(Uf9>%4H zgTW-zcrNFoViO3qdVkF)mYmwp;>m7Qb~w+EENg(%iYSOt{dDmgpr~DCQGiS+#XPK& z3ZWsbr)d2x{n(oI%fm!{5SR9&c(NCj9S-zc*8awU1?~GyeG3xZ*GWNMggtGOYEIUJ z1YJZF4z?3yJ02|4UHjwH(~YQhXNtxpTodfKp?(Jt-R-6{0)IW^`;pJDPz;w!%jJ7K z`SKDhBsbM&-OY zE=}l*?!;pG#5NePpT(1HsKBCT2*_Y&e*r_bb-uwhBFMC>`z+o&i~Hvg$1Gxr1>aZB zUxuie_84(EhxhK0uHs0&pc&MZpX zWRYQtCBpu$#c#l(`zfk9Sk#PoXb4{gSTwKuU6LH+CzE1T$UMJ?HdO3TE*U&_;HU8! zMY|^!iGSqg0pe$i_m84*w}OFTM{6vw zvGk$GA*we0;{3;~6rs|x@eB!(i^j|^XWT!Er=~L$6-b|7 zXk?yKrN^c&wWCcwwZELf8F#2DloKW(Lq00=EA9MUS(KV1+gfhmfeHU8Lw-m2{liF* zt1b#ok&uF&e{vHnWarD`JlrpYbFJWd5Ngc}75iCK)BzGDLmY$19PT|eEdG6PqcjoN zHh&f&tQHdcE8gxOMXXNkAcm`Ke$r>NNY}|_z7XmZM?>0wj`lE*RNt*Z$Ee?eMREM6|FFnGFeuR;mJp*QZNKJF>^Z7EgZ7VKvX>8xHzs}|xu&7-N8pO0#aew4tlt2E2Dr}akZKsh)AyC^!qfbHm(?y|A zrHdeo;vbJ2Nh~`<#Y75?nFX~)y??vEb68|30^2h$(Cxix8u7Om9D+;j{SLvWQ(}Q44dOwTCUlMSoI% zTSb$DNmmUsFVm-ND7dwMfcVG{_3-3|ki(J&vus$3AO>GEXWZAt`)8537y23FRC5n) z;qB3)8Z0H_ua#M;`yLHe=7XgD!%`;=Q4NdxZQ;tgQ&jkPMEUKFHGCF--zMDM`VBF- zDUcUoOuoeGGy3>aPsZER)LUFkaDVj<`oa$!QPnYwhb0YU+0hL_0-|RKu>BzQ{$b>< z!pI4dm{AXBH`7WX7k%aPcvR`lLpk2AFB)a*Sv={9YJ_pWG2Fh1evn1Q_3ig(_$>bZ zyp((24dD!;AML?%iWTF@;p20qJ7d%AOw8~$o_Vq##zRlkLl)`b;SI4&7k>qW&BjIg z=B0ig#otHKHAV#rxhBNJB4XW0qV6)-PK{De@%NwzmEv{#=cP`1qS`KtM6=y_x37x# zk0RH{fBKKNhBQlvrH2h~bUAKJ-`C-Is8M-+i$}I;vYgqE;wej1lP!vWj2I3scAVSo0sc*+-*(8I=X zVcQA~#LN~Azw723uqa&%8U&e%e&PW|JVlXIG8vwdceGUuv0c4hzvrwKLYEc+wTs zpt#=`E-Z^s38R7Uf!!%o3S)zmcBb1>y>Rtmb5eaB(QNR8Yql zvNC~<7+$d5{D03NE~R3c$vf@r@e#i+;+TVsGpRkefxM;P#_YZQ#H*}aOorYI>*g|j z2aF3xNMux+K?)%beX`(5=P-siVFYouA933Wx#A3-MTFjGMaGBx5|E=4)&>M?aj-My zSCEgEn`yTdNxy8v!RO^Gn${j)`5i#MFXTr)HP zKI0#Zy9+rbgm6VY2sztqayzP z0W=GCu=|XE{^%Pqj$NCjFqKFX#^m{DZp%Tpo6AQ~H5LjK!%V#t=Zo4MFn$oMAI9ns zq&os*V1Hj54-#T|tZt6ODTTD$XWVD}A02l+SI1^%Sz<5e>V;91HM7Y=HXKCRWIdkj z_xRf#Fn&VExeyML44wgy=;})@#Qifm4)4&1COJOi{}RT(w)Gl>3v&;4*r8Ev(W~UK zZt~7%G{TKhpgpmlaf}@R!}Re>p*TAfa*B{c5LG~fm4v4OyPSCh)()cZMigNXR-lg# zgOi(f;i)7zyI}&Z5aL?wxmR4ekloz-Az!DGz5g#>wynhVcnow#7`Nr~6}K0P;kVkd zFpa&1pGJwtk(vaT777A70g0DU3IY{ebixn0Ody_qP?Nx7b_YdgMIFS5+{JEE9ZKUh zY19w^8Es^YnwB2)@s*rvxI~zkp!arFWbEG2hQUCK1 zj+c{0g1(YAYGw*Lx12>VGzv|wmo_f0o;EJ7lr|FVT5*+-Gcu~Ym=4D4IQsY=eA~Pw zNxRa^FKN^MxgZ9-v5&Oz(2W=3KnKGgnpH&_%l#&lKQ4~+D`_JD!G8hYTjz}sS6nY| zTwFbGTwEz{B>05ancR8MdWcmcu^BJrI_u`NCbsW6nVF}i!g?M#B@TB>9IwbDsN)wB zN2!&WpFdN^J^aa>#}aXhhQ5OXssN+mfzR!y!7%T~M^5}96Lh^L*$#DLpB ztH&jUC=ucIOdb;WCEqQLNy2&@B@qt7Tyq7%0y^@or-(Ra z{9aK-7}1Pet_c=PN6?)Q zbiO>Iaq=}3=f%(>jf(I6`f!`-Zms7Lg4A8x4FrCQd^%dC3ScFFl4?!N9(!z=?-CYV z!gt`i*I$yxtL>?G%^e9gPh6rr9IWP=)hCkA&PorXPAw8o;fdG;?T3*QGaw>4(@YR_ zbd*D-BZXlDNLBm!oE0o8#j%FO?LKF|d=$^?$5EUh#rLoBFH0PyMFeHua9h9BBXgoN zE7Y@pH8!M+4wGg+0Vv#6iXUZ-Ad4Is*A#f?&R@YU6it3954!t(6hCg~yFzi_x9(UK zB{N5i?EDCIlTO!%+40-3+)mb>N5hv!4gxt2Z|3RA7H?wWX&p$u4+ocx4gxa~-Ut>S zS!BtcM(gb+yKb!7ub0sd0w@o)cpEmyZtuEDhaiqaGV^70H%n`O@T<$PWT94{-*w zE*T{zlSweNNly}^mj)05DGpNVyww+>no_euZZK;^mpu>yFMq$iKNqWw?nJMe%YJd) z$=E-}NU?SV*9am}VqDG-QIyg_RGNL+f=hnEB?n*JicL7-O8G}O_fMkxDJnd0u|m|# z;;_o=U_RBuRw6iz@`7$WckpUtKZ=|>$~8ij!jT%ZQc4r9Q+&CRsV~YRGL;s7r`rI1 z7!N{J_v#`N41Xj8dFZ)G>GJ#RIgww+A2gbh)jVFLarA0FikmPR3Skv z%NLEIIO7ue%J>an6zUD%htW^|02@EelfNYvPKEJ6%fev$)S9ca2evc`@9e`ycTu z7TZcaJhD=ulX~g!V(D>_Vch;>RF1eKC^N=zij$w5-B>J(1U^)9iu@VkZ@}VSOYt#_ zTATm!^M7Tr``#$4Rb^0~RHhY9o|3El0NIZsBMx!x3zwG9^K+&ce7N6r^9@*3Cl)tz z49Sz1dH!0N(2062W%9Jsj7DG7YkF;esh=z4AY!Z;iIV$Hlz;2u-aNl$?Wjs20+Q~l z;x`~sxE2@T2TcgUUgr6?59{R`H>SgJq~92~;(remjqG0pC-5C-ix`9)396|ti}w%X z-Yod14mgRK*2;qiTp_TT&s(KvuaiiWQ=QoBBC^ie4f>1Me?1{^d%>)G|;A)ZWTEuj;dx1%Io{cl%M)C(}jk7>ig=FoXzF zT7MRzVt86gu82QJeE%rY6Kge$&ka-3(|T0dtUYzsd^F1hQjMS(#B;CKvnc67ws>4z zJRBs}wpIE$GRnxfuZwpNBf+laMJsdV6 zjmq#rh-%v*Drhvx_IY zQ4NX*PB*q0Yyby{9&91yTG7=&#DCG# zYciFsT94w%UQ~t;OB$BNs048=r6SsA@%~w4u4Xr;xJa0Xo*OdE1=azXSgar3qP?u% zlyukr6;mf$Q5iX$=$Ez?7dbp0DAoSF)OSG9H9}<=F{Olu+Tub!uAkD|LUcGzw%?*8 ziXr<0)RV2K3?G_K*`|t`L7I!0zeD32uqa(skzlMiglrxrG{QraC_X$Z%Db{fLeG&! znz!v|@l+?OVR66CZ`p(f<5Clf{3FzFfFgITEE2>iV`hBuY!rLZ1_@PlD1X%%$ibqM z8a#K0_HSG~YDGOl@i1Got;kP=P?(Avu0Qor{BgN|KSFh%TNFrZ!99!+KjgQ~(uO8q zicMVEqENS&Pp0fAk)O;JkKEsEt1QA*5}=E|E$TO5QM#8i7$i?1iyq1uo4F2z%a7su zd+&Al*r$W_v~&j(8mBr@jejf(Z77i(V?u4~31^fjp_uP-bN?u6cUfdgQz6d>k*$*) zX_eg0d0Qv@lO$Qk?QeZMYD4`TpE8c6F_Iw=C0KWEBPbagx_!T4S!I?`1nsh`cSC= zS=8E#;neeEDpP)Kr||nW_|zKG&dh%Ax6^&7{J`V}+mTcot2JcQ6m4uUmom7@njb&KQg(o3`NEn)`a=V;x|B%xyquXTxy8R z&M)$Z^9aRjI9+ItC_is5AKtsDZvS+~=`K`$U~z-=(bskBE>r~xF2LZ6;{B6ITx)H-*e-s^aHYGm?!qj*kNk&ieIW`WdAj@@@OOZB93#@*}S) zyHM0bV#1K$ZSxIC6z&_r5#xkOCeA;#3G!H$P0O|DpjcXsm&?@feQy7Tx6?hS{BV%p zvIBoqB8V9ok$!x7|0teVDuvBZkOy;{)tt;zb*@&AMa<`;;i8lk)Orw4cc5CHDGD<> z%n0(2Prm_)?%m)Lf;NFYw4er`Ry9#rx1W;j?9*J7>dP2^bt@sC!Td2lAK&K?U-yj_TISUOM&w?^Swv0^=pr`u5Z;q)-G zunm=huKT0>-vCDJ>Jlyyhg*VrsAo)5w1jv2jpQi4ei@8=d6g=!rrR}N z*$*S6jIK7}Odm`wT1Fz}RG9$USH=4$k-F!L!W_?`{p}jR^nEMWD)VJ*JM9O;WK+yW z#`0a-Pol<-fRsx}%rGS%>G9vPxIcfg$SgCPg6AbNYv=s#w{HNW`#~yG5(z~;EO>iP z@j^S?7LQ}y;L%btoo}p4*0ab6WQ3Sw#xW@4QA@aCaer#jHp_lVs5HI%euR4eC{ou^ zenBLW+)K8oUUI2au2auPmX&dAmFqX-Rr||}OlSu&O*G~db8&c#$`N+p9atBFK~P+gOuiDmo44(0H1u&7-52Z5aY7f8WX}_8OTC z5^XW9ZtIQpWJ2smkx_?H%_%oWGw3*5#11@^n8aqzU+&L%+JPb^NHKx^wWr?zMd_}K zQc!8;63&M)^!iXq;H|98A4l75vszmvcW0=A>E7fs~iX0833T<*pCT;Tx zhvx*5!gqfA4lHul;v#?ue-W&Q2sPA5)aPT>5SvD*_1K#|;8D>2LsWr1WQ*3-7D28# zGK0@PiuaGAJpR)UZ(>2U`B|S|TYPSh=Fx}OPGmVBc9-*DNDqc{`(flK(?#qEi9vce zf(X?zUkz#u7!@Xd``i7KDBQ~#rt*DYK>aHahoxojq5l?qY4nnte{HW)5}AzsMSh_V zlEshb&R-xB2YwLR9AdG3!%8ba#KxHiKHdlM{y|i(lE@SX!NeZwiYtUu>!-y+4IeTk z@vdimi21AsQPPu%B5^R+NMSR*A+%)+Pci7ULU0lN693(!h?RTin@Nm>mL5{Ym)EC$ zcQ!`(L8Va-wVo5Hf5?1oJ&PyJP&qp+W>~hwMl~XY#mtTDH+6PjZocw6i<1f8Wi^`8J5MTe*mG>L{L9Gy?+pit0oeJ zKnNK3Ad2m!9!w`0R7?anWcW5-KE}Ff>q$JaLj45demA&fBnl}wWD$OK{~M5q-JPb) zbQJQiNouY(#nCt)N{aC|Jj&FPrKG$A4o?}O8b7#?BO8e4Qt;bNF#D-x-Il zp(#cXmtw{}f2_4-yEU#gF^> zzF4H__)q_4(VQ3(rMQQwVakUOp<*CSQ#je0x2wV7qy6sSM?R>>qKF+v;8tTuD6DPs znPTwhpwtKP8-U1MMUiPl1wtOi_jB#VxL11R<54B0f1YNn7ZNmSKZu7es7Gz!?63{o zHd`Bv7&ALF{1cn|N0GP|6a`|!>@hpP3A|gaPV$izYLuCZX3NpkG8oTTkK&OJDm#u( ztVlDm51nur%_}Sl2*jv=Kkwt@38iRMKe1B zkBz@x)V}rHk99W4IGAg8r)J^vMSZpi_QtK=xO4nh+T)hXdxrJ-;&Cz>^%n4DWGB7x zf8zKfcAxiQHk-V6+x1W1G<;^)_f5^G+kL}7{^Y-Vzx(gUt+e|;|NQ>{{_mfDwEHDC zZ=Wvi$EW+x{;z+qNCNR5Clt%`J9u6zsa|$CjMsvLM6I-qZSUzlvs8iuvTIr=``SH9p#x?t4 zjunuS%X`m#@4er5zIo2f{4>vU=KOx=%$a%SnP*6Cw1&7&bZm@X*ZkbUiltU`Yq(SK zI`QP21_J53>fCCPiT4S2@*z}}n(b_EvsR4}vy-7$q{2_1uh=n07Ld+(cH?J2m95;1 z#G|}tpTtu|qNB9U-94Yok21^6&-)uW7NEWM~uF+g0cWHr4=-;Cxtf`a}7 zjC6!nzKAj>+^w~C108or6@5&$E+64VWce`m|^&aemucTWMM)RVnGK|3tr znDZ$w%z6Dgj6C?Wt{YLDZ8DV58-f@N%bqmkpC+S!(55PuUWF0nzND;705PC*(BGoP zer*wfWN6wYTr*h7$40-NG}~Ux+@nf2(2qPzir2MIbQoZ4DH?rWH(#`4c2MwmUM=W08mA?=j}W&A{oCk z!66}FKHvGP@l`q)g1gdVyUy7Yu3>eruVUlY=0I9Y~&f#9raSBAdGnK#Hlr49oS*K zzS&NN=RyjQSmQQ^2G6S=H%U{-N$q?K`urm6Gil=u6UZ9tw4%>L)I)genR4qhyqZv= zQZHsfNp(C-GDYpA1J`%AY=})4Y<~@mw}TcoQGZ3<$j=Xr^Jf~-IyrP`q5)hfSYosa zluN!X{Ms$iCj|*aC4@&$f}Zs4z3j8dPF^&CzNdVG3gLvNW)3;;?`Bzy_$@{}ix&170xIjF=w{&x^ z!U4&;z3P%uEFR=amyHAZVQewf>0C5bTES8UeA#y8oB?NDDQ?rUorGAH*zfF>7vbEB zf1MqC(n#6)SdK}3!!7q)L7^4pFDoqq;+*@GRvHNv<{r8@E$DCN%_iECobFl`GgwOn zUU)Dv*k;HCJdGNVIk6yW$B$KQ&bZOBzMG#NjcM8#e-^B+S6XYa#wau;IEqb2T?3r4 zPv;})rzhYq4`Nj-1y)-R$J>c_!0P%+JZklsLE^@)k5r@@g69*=KK9y~Q5S9AMiCaw z=F>ou{qSe}-&R&k}gtCNa8fAI1)KuK+XL{_6)4YSa#XXiziR^`}h z4@QtFw636~L_c2x$gniOEz6ku`nC^O*O_|1#-fhqj}<_Xd~(W6;is>3r*1f6npweKx?1|93|Tl0N&o!S}ZHkD`%_6e=#h(3pDuU6gYBX0*Cz?LGh$!Gq2=6zjW!UG1*00v_10iEt)p^lIapeWl*-x z#k$d0j5__TM5pasHgotaUnUFi0m}>Bv7s-ih@U|nx$sev-mN!wP-I&7n@XZ zeF^wte9nOOJh(@FckNs!1T@Xpnjr9zN3P*b#i#4QClL-*j5PE-X_W&jc19IYO+buO zKCn5TJv|AV^!57I6S2Q6*fq2paVTcY#^it+E$DL+k)d2GC_iTGA9%d;3J#a0L1;xa z%@u)zJP8x7EXF%8_hXG~W0sFe>O0uS{@w#N(DuG+Y5u+Q{E9Rw>&yN)nhj;db7rOk z>0L3nH(u61?p$kHXC#PD{Q?CO4=-zlNWZHLl_!~}ruHCEl}+$8#Dw410=Aihfp-85 zs~d`zr{N}v+FIwn`(RFI^Ewo?L9@pkpGP-jyIpgKmzNeOp=&A~K`}F`4duQmtxBY_^dA?A9wuL(}eJ>Oi;R1uUI$hIs zXCbwjLub3)Al=))ts1vyT-7_86B{r2^UrFm>>&iV5j9Ps>~aNUM@`XSTce#2cb=mzEh2; zEDY5+e(^nlWhgF;L9q|==G&b4#hl`QEkS>Ov2f$BP_tvq=_N?d%(nf-{aQXyU9ldJ zJVt_{f8yM%4l|xbV7{@3Wads>rv?edMF1Kr^Dejj?M{rU2UzVfe2jsf`P{MoK6RUK z45(nrN2*PUKc!W6@TIYuV8|1bIW`N{L+IRTLjKPmO8lgkDJF7(t& zrS*;X9q2+h6%i>5q+qBxhcF`2ll~FwN{rat#+{cjNI_((N@x6$8@tXjaemFqpx@QU zWs8@M;`+rJiKB{Vu~FqIS5hx?+8P3It9DXzqKbeogKpljrjoZ0l8X)c zza~lt@9k#LCf@mS-C9$FR6O4lwntV|ND9rm??GqhNWiqM@ICheI(^b=B>9}pxlBqO z=Q82BYBZ>kNt0M}c=@Gd9=9k^AgCBZtHr&~u-b4jklbona0Z?ll?TVzHBzV*8d+XF zH;dOV#Qo}DZIyF9GVwNTkDhwOg-2CdLbN5tkY+$}!_#1_AKNf}Ly!e)t$Lfeob?JD!*;uDLgW;~cSBT8< z-)s%G@)a(d331*QW7+s5&m8DBchLT}5D9`|5kMlF2en7hcBWRfj#t7LZ!++q0!2aB zS7+NLmvK}g-1t*Qo49*FN`GimxTJyPKNQrHU@WEXf zdK!xGTom6mPKFtFT%5NUChtcp(r|Ly;VX?OUXjk&zcvrbN#6U85_)iTZXdq)_=y4~ zQjZGDhEjVVpjz`d$>L+SznmWc`XfxfwL`SW@xbMyurK&=RAq|LZm-N=rkm4V2Oi~P zIS*aR`ZCSAa2HOBfm*q<>7K4R5Ex=bfP}M@A`-xY#ZwgphF;arlcvzL(fV{R8bJ;N zR+bo^oqZHfTzWO!y1OUPub;KjtFmUlNJ1>^tf!yOf5|<~LS*EWP%3>1C7>eDqY;n| z>w0oWQra`Ya*X9%j&uqGdGYm0mH!3pmkzGZ#r=D^b?UM3=#jb2z>6yV-K4a-01_Wt z-L2uzwl`6D1^I`0`4o25u?h&b0%ag3OkezS-9!EipAO;B=GL;60@3`&481+~EAAnw zLX2gCqQ)^F`xfI&f$4f8bc(eqv*hJvFwgKIlU&W`X=Se>7}i>yi%R;`+5yN4@v_5z zBt)${oqIWcesO*&SnB&zwy%knBrwKuC3uQbL5Xo5rK^MB-1SG- za7cGZ0@%>YZ3GfVWli?mvG*kTs?9$1TpatmoO>g00L9K+ACEhshs6fu{Avh>)Hf-J zm$O3IqpjaZYmH%HdPB+PjX^>?u>4sk&(#~&ldS6r^ZtYkZ#iw z1;;Q)aUYrPxTOz|Ra%*++axLd3i`f$EoZw5zPwbGoi>n#yAr-`fOf3grO31%xx=?` ze+*g^@__IYI~cNZCERlU5_0KJJOgwx_%7TwO6O|BrlWuN(OmyV znr8EhDYhEowV-onMYO4`IcqLa99N#4D^D2w+juHLhw@&-iytNmq{VS`arMx!z_Vk` zQwR}gS5rv4XMOn>$S6}N%k*Wr6ax!5W5-+~Bk#1XBqE$-LHqW#j-U)&_c@%Grl-C* zTtnC!%?mYOxBj+&w6eDHbrWJ9s2xcgr=_XwMn3Lq4MqGq*qn}7(pU(p4;3v_Ja=lW zaQy+fJ-)*SKjbi|VUn{4arV-Bx>20vy?<>l4VqOfQp4wQPe|ap10sq-)8?LvUCrSR z6r?DR=B>GzInJ50vu{S=cxOLc!+U@}C8eaKJXE+X<8JSpM%nVAEq0?;cNM zVak}lVj>bwQd>0JjRap%*i{WsIw}O~wE5pIn-d8k4$t=Umm%pold~)yhlkvQ1I5`( zWfY%~%Y^v$pzmi)cRD|YEa=hV^jhj62A=|RG!%8)Sg)_TnC~em3&a%4XZ;#hZNIUV$_Q;xc6uR89xvRH4=E%s~OJ0J8xiq5g4l(T3ODw(?yu*2EIP zLG8-t1LN-`M&5JAi!Vni5BZ5lH2e1N8*1QFQ(f2D{TOvF2dKe4{gFgaO`W>ER~{4F zk7^#4BX1Vtqv`|4Crc2tw3#X%Q&uT52@fuIi%eXN$i_ujeQkF%7XQ?Tn%IIm&!A<0 zJ`n@iEJ;241#jk9V~X0%4c;Jpd)-S~S68iR_g86^3QId5oAdbjNZ>rFrSGTBUClfF zS>jSl?NN(ntM?}DCpIFE^#BEjG5Zj@bHoUB+!kvHEn0Y*)Y zf6$RXAM(ol4A!WTJ=azgqoQC5)e)!mgTo3V+UTUY*Pzphv-@Hvx-n*P~E~r+bWZZanVhy5r`m>;HaK= z@_BT>9wsIvXs3!KdQ;NU8T#m?YNvWXOiWDhrc4|j)*03|99B!DoFD);UFYTZ#Lx@% zcXA56-8i^);+1**AiM>VnB>!x1J}(h7=Od3_Y9wap78&m{a?^CRm2D$8vO%h#4Viv v2IaqN{(q}~lk!g~4E=RW;=fWP{*T@NK#|_FJ9q!qCAgL0+ull?;I{oQ6c&Pn diff --git a/docs/src/design/main.md b/docs/src/design/main.md index 7cf125d9ee..01b4ef9fb9 100644 --- a/docs/src/design/main.md +++ b/docs/src/design/main.md @@ -34,7 +34,7 @@ Miden VM consists of several interconnected components, each providing a specifi The above components are connected via **buses**, which are implemented using [multiset checks](./multiset.md). We also use multiset checks internally within components to describe **virtual tables**. ## VM execution trace -The execution trace of Miden VM consists of $72$ main trace columns, $2$ buses, and $6$ virtual tables, as shown in the diagram below. +The execution trace of Miden VM consists of $71$ main trace columns, $2$ buses, and $5$ virtual tables, as shown in the diagram below. ![vm_trace.png](../assets/design/vm_trace.png) diff --git a/docs/src/design/multiset.md b/docs/src/design/multiset.md index 2e8ece1cbf..efcb9db72f 100644 --- a/docs/src/design/multiset.md +++ b/docs/src/design/multiset.md @@ -74,8 +74,6 @@ Miden VM currently makes use of 6 virtual tables across 4 components: - [Block stack table](./decoder/main.md#block-stack-table) - [Block hash table](./decoder/main.md#block-hash-table) - [Op group table](./decoder/main.md#op-group-table) -- Range checker: - - [8-bit range checks table](./range.md#8-bit-range-checks-table) - Chiplets: - [Chiplets virtual table](./chiplets/main.md#chiplet-virtual-table), which combines the following two tables into one: - [Hash chiplet sibling table](./chiplets/hasher.md#sibling-table-constraints) diff --git a/docs/src/design/range.md b/docs/src/design/range.md index e1cdab9562..d89063ddf3 100644 --- a/docs/src/design/range.md +++ b/docs/src/design/range.md @@ -103,7 +103,7 @@ This 3-column table addresses the limitations we had as follows: 1. We no longer need to pad the column we want to range-check with extra values because we can skip the values we don't care about. 2. We can support almost $4n$ range checks (when $n$ is relatively large). Though, for short traces (when $n < 256$), we can range-check at most $n$ unique values. -The one downside of this approach is that the degree of our constraints is now $6$ (vs. $2$ in the naive approach). But in the context of Miden VM this doesn't matter as maximum constraint degree for the VM is $8$ anyway. +The one downside of this approach is that the degree of our constraints is now $6$ (vs. $2$ in the naive approach). But in the context of Miden VM this doesn't matter as maximum constraint degree for the VM is $9$ anyway. ## 16-bit range checks @@ -111,94 +111,64 @@ To support 16-bit range checks, let's try to extend the idea of the 8-bit table. ![rc_16_bit_range_check](../assets/design/range/rc_16_bit_range_check.png) -While this works, it is rather wasteful. In the worst case, we'd need to enumerate over 65K values, most of which we may not actually need. It would be nice if we could "skip over" the values that we don't want. We can do this by relying on 8-bit range checks. Specifically, instead of enforcing constraint: +While this works, it is rather wasteful. In the worst case, we'd need to enumerate over 65K values, most of which we may not actually need. It would be nice if we could "skip over" the values that we don't want. One way to do this could be to add bridge rows between two values to be range checked and add constraints to enforce the consistency of the gap between these bridge rows. -$$ -(u' - u) \cdot (u' - u - 1) = 0 -$$ - -We would enforce: +If we allow gaps between two consecutive rows to only be 0 or powers of 2, we could enforce a constraint: $$ -p'_1 - p_1 \cdot (\alpha_0 + u' - u) = 0 +\Delta u \cdot (\Delta u - 1) \cdot (\Delta u - 2) \cdot (\Delta u - 4) \cdot (\Delta u - 8) \cdot (\Delta u - 16) \cdot (\Delta u - 32) \cdot (\Delta u - 64) \cdot (\Delta u - 128) = 0 $$ -Where $p_1$ is another running product column. At the end of the execution trace, we would check that $p_0 = p_1$. This would ensure that as we move from one row to another, values in column $u$ increase by at most $255$ (we are basically performing an 8-bit range check on increments of column $u$). Now, our table can look like this: - -![rc_table_post_8_bit_range_check](../assets/design/range/rc_table_post_8_bit_range_check.png) +This constraint has a degree 9. This construction allows the minimum trace length to be 1024. -We still may need to include some unneeded rows because we can not "jump" by more than $255$ values, but at least we are guaranteed that the number of such unneeded rows will never be greater than $256$. - -We also need to add another running product column $p_2$ to support permutation checks against column $u$. The constraint that we'll need to impose against this column is identical to the constraint we imposed against column $p_0$ and will look like so: +We could even go further and allow the gaps between two consecutive rows to only be 0 or powers of 3. In this case we would enforce the constraint: $$ -p'_2 - p_2 \cdot \left((\alpha_0 + u)^4 \cdot f_3 + (\alpha_0 + u)^2 \cdot f_2 + (\alpha_0 + u) \cdot f_1 + f_0\right) = 0 +\Delta u \cdot (\Delta u - 1) \cdot (\Delta u - 3) \cdot (\Delta u - 9) \cdot (\Delta u - 27) \cdot (\Delta u - 81) \cdot (\Delta u - 243) \cdot (\Delta u - 729) \cdot (\Delta u - 2187) = 0 $$ -Overall, with this construction we have the following: - -- We need two table of three columns each ($6$ columns total), and we need $3$ running product columns. -- This gives us the ability to do the following: - - For long traces (when $n > 2^{16}$) we can support almost $4n$ arbitrary 16-bit range-checks. - - For short traces, we can range-check at most $n$ unique values, but if there are duplicates, we can support up to $4n$ total range-checks. - -But we can do better. +This allows us to reduce the minimum trace length to 64. -## Optimizations +To find out the number of bridge rows to be added in between two values to be range checked, we represent the gap between them as a linear combination of powers of 3, ie, -First, we can just stack the tables on top of each other. We'll need to add a column to partition the table between the sections used for 8-bit range checks and sections used for 16-bit range checks. Let's call this column $t$. When $t = 0$, we'll apply constraints for the 8-bit table, and when $t = 1$, we'll apply constraints for the 16-bit table. - -![rc_optimisation.png](../assets/design/range/rc_optimisation.png) - -Second, we can merge running product columns $p_0$ and $p_1$ into a single column. We'll do it like so: - -- When $t = 0$, we'll multiply the current value of the column by the 8-bit value (offset by random $\alpha_0$) that we want to add into the running product. -- When $t = 1$, we'll divide the current value of the column by the 8-bit value (offset by random $\alpha_0$) which we'd like to remove from the running product. - -In the end, if we added and then removed all the same values, the value in this column (let's call it $p_0$) should equal to $1$, and we can check this condition via a boundary constraint. +$$ +(r' - r) = \sum_{i=0}^{7} x_i \cdot 3^i +$$ -The only downside of this construction is again higher constraint degree. Specifically, some of the transition constraints described above have degree $8$. However, this doesn't matter in the context of Miden VM, since the max constraint degree of the VM is $9$. +Then for each $x_i$ except the first, we add a bridge row at a gap of $3^i$. ## Miden approach -This final optimized construction is implemented in Miden with the following requirements, capabilities, and constraints. +This construction is implemented in Miden with the following requirements, capabilities, and constraints. ### Requirements -- 4 columns of the main trace: $t, s_0, s_1, v$. +- 3 columns of the main trace: $s_0, s_1, v$. - 1 [bus](./multiset.md#communication-buses) $b_{range}$ to ensure that the range checks performed in the range checker match those requested by other VM components (the [stack](./stack/u32_ops.md#range-checks) and the [memory chiplet](./chiplets/memory.md)). -- 1 [virtual table](./multiset.md#virtual-tables), tracked in running product column $p_0$, which enables skipping values by up to $255$ in the 16-bit section of the trace and enforces consistency between the range checks in the 8-bit section of the trace and the value increments in the 16-bit section of the trace. ### Capabilities +TODO: Update this section The construction gives us the following capabilities: - For long traces (when $n > 2^{16}$), we can do over $3n$ arbitrary 16-bit range-checks. - For short traces ($2^{10} < n \le 2^{16}$), we can range-check at slightly fewer than $n$ unique values, but if there are duplicates, we may be able to range-check up to $3n$ total values. ### Execution trace -The range checker's execution trace looks like the table described in the [optimizations](#optimizations) section above. +The range checker's execution trace looks as follows: -![rc_optimisation.png](../assets/design/range/rc_optimisation.png) +![rc_with_bridge_rows.png](../assets/design/range/rc_with_bridge_rows.png) -As previously described, the columns have the following meanings: -- $t$ contains a binary value which differentiates between the 8-bit ($t = 0$) and 16-bit ($t = 1$) sections of the range checker's trace. - - The 8-bit section of the trace contains the range checks required to ensure internal consistency of the Range Checker. - - The 16-bit section of the trace contains the range checks required by other components (e.g. the stack and the memory chiplet). +The columns have the following meanings: - $s_0$ and $s_1$ are selector columns that are combined into flags to indicate the number of times the value in that row should be range checked (included into the running product). With these flags, values can be included 0, 1, 2, or 4 times per row in the execution trace. (Values can be included more times by having multiple trace rows with the same value). - $v$ contains the values to be range checked. - - During the 8-bit section of the trace (when $t = 0$), these values go from $0$ to $255$ and must either stay the same or increase by one at each step. - - During the 16-bit section of the trace (when $t = 1$), these values go from $0$ to $65535$. Values must either stay the same or increase by less than $256$ at each step. + - These values go from $0$ to $65535$. Values must either stay the same or increase by powers of 3 less than or equal to $3^7$. - The final 2 rows of the 16-bit section of the trace must both equal $65535$. The extra value of $65535$ is required in order to [pad the trace](./multiset.md#length-of-running-product-columns) so the [$b_{range}$](#communication-bus) running product bus column can be computed correctly. ### Execution trace constraints First, we'll need to make sure that all selector flags are binary. This can be done with the following constraints: -> $$ -t^2 - t = 0 \text{ | degree} = 2 -$$ - > $$ s_0^2 - s_0 = 0 \text{ | degree} = 2 $$ @@ -207,26 +177,11 @@ $$ s_1^2 - s_1 = 0 \text{ | degree} = 2 $$ -Next, we need to constrain the row transitions in the 8-bit section of the table so that as we move from one row to the next the value either stays the same or increases by 1. - -> $$ -(1 - t') \cdot (v' - v) \cdot (v' - v - 1) = 0 \text{ | degree} = 3 -$$ - -Next, we need to make sure that values in column $t$ can "flip" from $0$ to $1$ only once. The following constraint enforces this: - -> $$ -t \cdot (1 - t') = 0 \text{ | degree} = 2 -$$ - -Finally, we need to make sure that when column $t$ "flips" from $0$ to $1$ (we are moving from the 8-bit section of the table to the 16-bit section), the current value in column $v$ is equal to $255$, and the next value is reset to $0$. This can be done with the following constraints: +Then, we need to constrain that the consecutive values in the range checker are either same or differ by powers of 3 less than or equal to $3^7$. > $$ -(1 - t) \cdot t' \cdot (v - 255) = 0 \text{ | degree} = 3 -$$ - -> $$ -(1 - t) \cdot t' \cdot v' = 0 \text{ | degree} = 3 +\Delta v \cdot (\Delta v - 1) \cdot (\Delta v - 3) \cdot (\Delta v - 9) \cdot (\Delta v - 27) \cdot (\Delta v - 81) \\ +\cdot (\Delta v - 243) \cdot (\Delta v - 729) \cdot (\Delta v - 2187) = 0 \text{ | degree} = 9 $$ In addition to the transition constraints described above, we also need to enforce the following boundary constraints: @@ -234,51 +189,6 @@ In addition to the transition constraints described above, we also need to enfor - Value of $v$ in the first row is $0$. - Value of $v$ in the last row is $65535$. -### 8-bit range checks table - -The 8-bit range checks [virtual table](./multiset.md#virtual-tables) is used to enforce the internal correctness of the 16-bit section of the Range Checker (where range checks for user operations and other components are executed). - -This table can be thought of as a virtual table that contains all 8-bit range checks required to ensure correctness of the 16-bit section: - -- When a value is range-checked in the 8-bit section of the trace (i.e., the flag indicates that it should be included 1, 2, or 4 times), it is added to the virtual table. The value must be added to the virtual table as many times as that row's flag indicates it should be range-checked. -- In the 16-bit section of the trace, a single 8-bit range check on $v' - v$ is required at each step. Therefore, a single 8-bit range check of $v' - v$ is removed from the virtual table at each step. - -The running product column $p_0$ is used to keep track of the state of the table. - -To simplify the notation, we'll first define variable $z$, which represents how a row in the execution trace is reduced to a single value. - -$$ -z = (\alpha_0 + v)^4 \cdot f_3 + (\alpha_0 + v)^2 \cdot f_2 + (\alpha_0 + v) \cdot f_1 + f_0 -$$ - -In the 8-bit section ($t = 0$), one, two, or four 8-bit range checks are added to the virtual table at each step and $p_0$ is updated as follows: - -$$ -p'_0 = p_0 \cdot z -$$ - -Note that if $f_0$ is true then the value of $p_0$ does not change, so no 8-bit range checks are added to the virtual table. - -In the 16-bit section ($t = 1$), one 8-bit range check is removed from the virtual table at each step and $p_0$ is updated as follows: - -$$ -p'_0 \cdot (\alpha_0 + v' - v) = p_0 -$$ - -The above actually enforces that $p'_0 = p_0 / (\alpha_0 + v' - v)$. - -These two updates, which first build up the product and then reduce it, can be combined into a single constraint: - -> $$ -p'_0 \cdot ((\alpha_0 + v' - v) \cdot t - t + 1) = p_0 \cdot (z - z \cdot t + t) \text{ | degree} = 8 -$$ - -Thus, if the prover arranged the 8-bit and the 16-bit sections of the table correctly and $p_0$ was initialized to $1$, we should end up with $p_0 = 1$ at the end of the trace. - -In addition to the transition constraints described above, we also need to enforce the following boundary constraint: - -- The value of $p_0$ in the first and last rows is $1$. - ### Communication bus $b_{range}$ is the [bus](./multiset.md#communication-buses) that connects components which require 16-bit range checks to the range-checked values in the 16-bit section of the range checker. The bus constraints are defined by the components that use it to communicate. @@ -295,15 +205,13 @@ $$ z = (\alpha_0 + v)^4 \cdot f_3 + (\alpha_0 + v)^2 \cdot f_2 + (\alpha_0 + v) \cdot f_1 + f_0 $$ -Only the 16-bit section of the trace should be included in the $b_{range}$ bus column. Transition constraints for this are fairly straightforward: +Transition constraints for this are fairly straightforward: > $$ -b'_{range} = b_{range} \cdot (z \cdot t - t + 1) \text{ | degree} = 8 +b'_{range} = b_{range} \cdot z \text{ | degree} = 7 $$ -Thus, when $t = 0$, the value in $b_{range}$ does not change, but when $t = 1$, the next value in $b_{range}$ is computed by multiplying the current value by $z$. - -If $b_{range}$ is initialized to $1$ and the values sent to the bus by other VM components match those that are range-checked in the 16-bit section of the trace, then at the end of the trace we should end up with $b_{range} = 1$. +If $b_{range}$ is initialized to $1$ and the values sent to the bus by other VM components match those that are range-checked in the the trace, then at the end of the trace we should end up with $b_{range} = 1$. In addition to the transition constraint described above, we also need to enforce the following boundary constraint: From 3aa5dae572bd5ead57634a89533163a6e78bbe4a Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Fri, 30 Jun 2023 04:09:40 +0000 Subject: [PATCH 006/120] refactor: refactor bridge row calculation --- docs/src/design/range.md | 10 ++++---- processor/src/range/aux_trace.rs | 2 +- processor/src/range/mod.rs | 42 +++++++++++--------------------- processor/src/range/tests.rs | 11 +++------ 4 files changed, 23 insertions(+), 42 deletions(-) diff --git a/docs/src/design/range.md b/docs/src/design/range.md index d89063ddf3..d10abb5308 100644 --- a/docs/src/design/range.md +++ b/docs/src/design/range.md @@ -121,7 +121,7 @@ $$ This constraint has a degree 9. This construction allows the minimum trace length to be 1024. -We could even go further and allow the gaps between two consecutive rows to only be 0 or powers of 3. In this case we would enforce the constraint: +We could go even further and allow the gaps between two consecutive rows to only be 0 or powers of 3. In this case we would enforce the constraint: $$ \Delta u \cdot (\Delta u - 1) \cdot (\Delta u - 3) \cdot (\Delta u - 9) \cdot (\Delta u - 27) \cdot (\Delta u - 81) \cdot (\Delta u - 243) \cdot (\Delta u - 729) \cdot (\Delta u - 2187) = 0 @@ -139,7 +139,7 @@ Then for each $x_i$ except the first, we add a bridge row at a gap of $3^i$. ## Miden approach -This construction is implemented in Miden with the following requirements, capabilities, and constraints. +This construction is implemented in Miden with the following requirements, capabilities and constraints. ### Requirements @@ -148,10 +148,10 @@ This construction is implemented in Miden with the following requirements, capab ### Capabilities -TODO: Update this section The construction gives us the following capabilities: -- For long traces (when $n > 2^{16}$), we can do over $3n$ arbitrary 16-bit range-checks. -- For short traces ($2^{10} < n \le 2^{16}$), we can range-check at slightly fewer than $n$ unique values, but if there are duplicates, we may be able to range-check up to $3n$ total values. +- For long traces (when $n > 2^{16}$), we can do over $4n$ arbitrary 16-bit range-checks. +- For short traces ($2^5 < n \le 2^{16}$), we can range-check at slightly fewer than $n$ unique values, but if there are duplicates, we may be able to range-check up to $4n$ total values. + ### Execution trace diff --git a/processor/src/range/aux_trace.rs b/processor/src/range/aux_trace.rs index 3d3a496c73..548b112ef4 100644 --- a/processor/src/range/aux_trace.rs +++ b/processor/src/range/aux_trace.rs @@ -49,7 +49,7 @@ impl AuxTraceBuilder { // AUX COLUMN BUILDERS // -------------------------------------------------------------------------------------------- - /// Builds and returns range checker auxiliary trace columns. Currently this consists of three + /// Builds and returns range checker auxiliary trace columns. Currently this consists of two /// columns: /// - `b_range`: ensures that the range checks performed by the Range Checker match those /// requested diff --git a/processor/src/range/mod.rs b/processor/src/range/mod.rs index 9c0b12e4ae..14c5e58ba5 100644 --- a/processor/src/range/mod.rs +++ b/processor/src/range/mod.rs @@ -3,7 +3,6 @@ use super::{ utils::uninit_vector, BTreeMap, ColMatrix, Felt, FieldElement, RangeCheckTrace, Vec, ONE, ZERO, }; -use core::cmp::Ordering; mod aux_trace; pub use aux_trace::AuxTraceBuilder; @@ -278,20 +277,18 @@ fn lookups_to_rows(num_lookups: usize) -> usize { /// Calculates the number of bridge rows that are need to be added to the trace between two values /// to be range checked. pub fn get_num_bridge_rows(delta: u16) -> usize { - let mut exp = 7; let mut gap = delta; let mut bridge_rows = 0_usize; - let mut stride = 3_u16.pow(exp); - while gap > 0 { - if gap >= stride { + let mut stride = 3_u16.pow(7); + while gap != stride { + if gap > stride { bridge_rows += 1; gap -= stride; } else { - exp = exp.saturating_sub(1); - stride = 3_u16.pow(exp); + stride /= 3; } } - bridge_rows.saturating_sub(1) + bridge_rows } /// Adds a row for the values to be range checked. In case the difference between the current and @@ -304,30 +301,19 @@ fn write_rows( prev_value: u16, row_flags: &mut [RangeCheckFlag], ) { - let mut exp = 7; let mut gap = value - prev_value; let mut prev_val = prev_value; - let mut stride = 3_u16.pow(exp); - if gap == 0 { - write_value(trace, step, num_lookups, value as u64, row_flags); - } - while gap > 0 { - match gap.cmp(&stride) { - Ordering::Equal => { - gap -= stride; - write_value(trace, step, num_lookups, value as u64, row_flags); - } - Ordering::Greater => { - gap -= stride; - prev_val += stride; - write_value(trace, step, 0, prev_val as u64, row_flags); - } - Ordering::Less => { - exp = exp.saturating_sub(1); - stride = 3_u16.pow(exp); - } + let mut stride = 3_u16.pow(7); + while gap != stride { + if gap > stride { + gap -= stride; + prev_val += stride; + write_value(trace, step, 0, prev_val as u64, row_flags); + } else { + stride /= 3; } } + write_value(trace, step, num_lookups, value as u64, row_flags); } /// Populates the trace with the rows needed to support the specified number of lookups against diff --git a/processor/src/range/tests.rs b/processor/src/range/tests.rs index f6fc09480f..7ec9b3d3ff 100644 --- a/processor/src/range/tests.rs +++ b/processor/src/range/tests.rs @@ -147,21 +147,16 @@ fn validate_bridge_rows( curr_value: u64, next_value: u64, ) { - let mut exp = 7; let mut gap = next_value - curr_value; let mut bridge_val = curr_value; - let mut stride = 3_u64.pow(exp); - while gap > 0 { - if gap == stride { - break; - } + let mut stride = 3_u64.pow(7); + while gap != stride { if gap > stride { gap -= stride; bridge_val += stride; validate_row(trace, row_idx, bridge_val, 0); } else { - exp = exp.saturating_sub(1); - stride = 3_u64.pow(exp); + stride /= 3; } } } From 48b03301e923c7325c96b2a99162b1a481686710 Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Fri, 30 Jun 2023 10:42:07 +0000 Subject: [PATCH 007/120] feat(docs): add range checker image excalidraw --- .../design/range/rc_with_bridge_rows.zip | Bin 0 -> 143543 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/src/assets/design/range/rc_with_bridge_rows.zip diff --git a/docs/src/assets/design/range/rc_with_bridge_rows.zip b/docs/src/assets/design/range/rc_with_bridge_rows.zip new file mode 100644 index 0000000000000000000000000000000000000000..8b4abdebacdbd9716a6943529fd34a8e7de885f2 GIT binary patch literal 143543 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%0DkTn-q6gesRKPym1N732C-bG- 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%0A6Gm=SVXZQb94%)5h4* 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 NYybcNH827I001zFV5R^7 literal 0 HcmV?d00001 From 6f30097dab594276cc3fea4cd277388d67fc8170 Mon Sep 17 00:00:00 2001 From: "Augusto F. Hack" Date: Fri, 30 Jun 2023 13:27:08 +0200 Subject: [PATCH 008/120] stark: compute lde_g earlier and remove tmp0 --- stdlib/asm/crypto/fri/helper.masm | 32 +++++++---------------- stdlib/asm/crypto/stark/constants.masm | 11 +------- stdlib/asm/crypto/stark/deep_queries.masm | 2 +- stdlib/asm/crypto/stark/random_coin.masm | 24 ++++++++++------- stdlib/asm/crypto/stark/verifier.masm | 2 +- 5 files changed, 28 insertions(+), 43 deletions(-) diff --git a/stdlib/asm/crypto/fri/helper.masm b/stdlib/asm/crypto/fri/helper.masm index f8075a3c6d..ca67df6f78 100644 --- a/stdlib/asm/crypto/fri/helper.masm +++ b/stdlib/asm/crypto/fri/helper.masm @@ -1,6 +1,5 @@ use.std::crypto::fri::ext2fri use.std::crypto::stark::random_coin -use.std::crypto::stark::utils use.std::crypto::stark::constants #! Compute the number of FRI layers given log2 of the size of LDE domain. It also computes the @@ -8,17 +7,11 @@ use.std::crypto::stark::constants #! #! Input: [...] #! Output: [num_fri_layers, ...] -#! Cycles: 123 +#! Cycles: 55 export.generate_fri_parameters # Load FRI verifier data padw exec.constants::lde_size_ptr mem_loadw - #=> [lde_size, log(lde_size), 0, 0, ...] (6 cycles) - - # Compute lde_domain generator - dup.1 - exec.utils::compute_lde_generator - movdn.2 - #=> [lde_size, log2(lde_size), lde_g, 0, 0, ...] (65 cycles) + #=> [lde_size, log(lde_size), lde_g, 0, ...] (6 cycles) # Store in `TMP5` in order to use it for fri layer loading exec.constants::tmp5 mem_storew @@ -30,7 +23,7 @@ export.generate_fri_parameters # load z from memory padw exec.constants::z_ptr mem_loadw - #=> [(z1, z0)^n, z1, z0, lde_size, log2(lde_size), lde_g, 0, 0, ...] (6 cycles) + #=> [(z1, z0)^n, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (6 cycles) # prepare stack drop @@ -38,33 +31,29 @@ export.generate_fri_parameters dup.1 dup.1 dup.6 - #=> [lde_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, 0, ...] (5 cycles) + #=> [lde_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (5 cycles) # Compute trace generator `trace_g` = `lde_g^blowup_factor` repeat.3 dup mul end - #=> [trace_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, 0, ...] (6 cycles) + #=> [trace_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (6 cycles) # Compute `gz0` = `trace_g * g_0` dup movup.3 mul - #=> [gz0, trace_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, 0, ...] (3 cycles) + #=> [gz0, trace_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (3 cycles) # Compute `gz1` = `trace_g * g_1` swap.2 mul - #=> [gz1, gz0, z1, z0, lde_size, log2(lde_size), lde_g, 0, 0, ...] (2 cycles) + #=> [gz1, gz0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (2 cycles) # Save `[gz1, gz0, z1, z0]` and clean the stack exec.constants::tmp1 mem_storew dropw - #=> [lde_size, log2(lde_size), lde_g, 0, 0, ...] (6 cycles) - - # This is the same as the word referenced by `TMP5` but is immutable. - exec.constants::tmp0 mem_storew - # => [lde_size, log2(lde_size), lde_generator, 0, 0, ...] (2 cycles) + #=> [lde_size, log2(lde_size), lde_g, 0, ...] (6 cycles) # Compute the number of FRI layers dup @@ -82,15 +71,14 @@ export.generate_fri_parameters sub.6 div.2 end - # => [num_fri_layers, remainder_size, lde_size, lde_size, log2(lde_size), domain_gen, 0, 0, ...] (12 cycles) + # => [num_fri_layers, remainder_size, lde_size, lde_size, log2(lde_size), domain_gen, 0, ...] (12 cycles) # Save `[num_fri_layers, remainder_size, lde_size, lde_size]` in memory exec.constants::tmp6 mem_storew - movdn.7 + movdn.6 dropw drop drop - drop # => [num_fri_layers, ...] (10 cycles) end diff --git a/stdlib/asm/crypto/stark/constants.masm b/stdlib/asm/crypto/stark/constants.masm index 17321d5e1a..8491dfeb65 100644 --- a/stdlib/asm/crypto/stark/constants.masm +++ b/stdlib/asm/crypto/stark/constants.masm @@ -85,7 +85,6 @@ const.R1_PTR=4294903312 const.R2_PTR=4294903313 # Address used for storing temporary values: -const.TMP0=4294903314 const.TMP1=4294903315 const.TMP2=4294903316 const.TMP3=4294903317 @@ -123,7 +122,6 @@ const.TMP8=4294903322 # | C_PTR | 4294903311 | # | R1_PTR | 4294903312 | # | R2_PTR | 4294903313 | -# | TMP0 | 4294903314 | # | TMP1 | 4294903315 | # | TMP2 | 4294903316 | # | TMP3 | 4294903317 | @@ -195,7 +193,7 @@ end #! Address to store details about the lde size. #! -#! Memory is `[lde_size, log(lde_size), 0, 0]` +#! Memory is `[lde_size, log(lde_size), lde_g, 0]` export.lde_size_ptr push.LDE_SIZE_PTR end @@ -255,13 +253,6 @@ export.r2_ptr push.R2_PTR end -#! Address to store details to compute deep queries. -#! -#! Memory is `[lde_size, log2(lde_size), lde_generator, 0]` -export.tmp0 - push.TMP0 -end - #! Address to store details to compute deep query denominators. #! #! Memory is `[gz1, gz0, z_1, z_0]` diff --git a/stdlib/asm/crypto/stark/deep_queries.masm b/stdlib/asm/crypto/stark/deep_queries.masm index f2126f7771..06c89a8468 100644 --- a/stdlib/asm/crypto/stark/deep_queries.masm +++ b/stdlib/asm/crypto/stark/deep_queries.masm @@ -395,7 +395,7 @@ end proc.compute_denominators # Compute x = offset * domain_gen^index padw - exec.constants::tmp0 mem_loadw + exec.constants::lde_size_ptr mem_loadw #=> [lde_size, depth, domain_gen, 0, index, ...] movup.2 dup.4 diff --git a/stdlib/asm/crypto/stark/random_coin.masm b/stdlib/asm/crypto/stark/random_coin.masm index a34e777d7e..8d4bd8e0ff 100644 --- a/stdlib/asm/crypto/stark/random_coin.masm +++ b/stdlib/asm/crypto/stark/random_coin.masm @@ -1,4 +1,5 @@ use.std::crypto::stark::constants +use.std::crypto::stark::utils #! Helper procedure to compute addition of two words component-wise. @@ -75,7 +76,7 @@ end #! #! Input: [log(trace_length), num_queries, blowup, grinding, ...] #! Output: [C] -#! Cycles: 104 +#! Cycles: 168 export.init_seed # Save the parameters in memory for later use @@ -124,7 +125,6 @@ export.init_seed assert_eq ## Compute log(lde_size) and lde_size and store them - ## Cycles: 32 add swap movup.3 @@ -135,17 +135,23 @@ export.init_seed dup movdn.3 mul - push.0 + + # Compute lde_domain generator + dup.1 + exec.utils::compute_lde_generator movdn.2 + #=> [lde_size, log(lde_size), lde_g, trace_length, num_queries, blowup, grinding] + push.0 - movdn.2 - exec.constants::lde_size_ptr mem_storew - #=> [lde_size, log(lde_size), 0, 0, trace_length, num_queries, blowup, grinding] + movdn.3 + #=> [lde_size, log(lde_size), lde_g, 0, trace_length, num_queries, blowup, grinding] + # Save `[lde_size, log(lde_size), lde_g, 0]` and clean stack + exec.constants::lde_size_ptr mem_storew + dropw + #=> [trace_length, num_queries, blowup, grinding] # Construct the proof context - # Cycles: 9 - dropw ##trace layout info push.1208027408 @@ -616,7 +622,7 @@ end export.generate_list_indices # Create mask padw - exec.constants::tmp0 mem_loadw + exec.constants::lde_size_ptr mem_loadw movup.2 drop movup.2 drop sub.1 diff --git a/stdlib/asm/crypto/stark/verifier.masm b/stdlib/asm/crypto/stark/verifier.masm index 3289387455..d7991f8f54 100644 --- a/stdlib/asm/crypto/stark/verifier.masm +++ b/stdlib/asm/crypto/stark/verifier.masm @@ -236,7 +236,7 @@ export.verify # # Cycles: 15 padw - exec.constants::tmp0 mem_loadw + exec.constants::lde_size_ptr mem_loadw push.0.0 exec.constants::tmp8 mem_loadw swap.3 From 844eb7a4b458030791774d01b7a93752bc716ee1 Mon Sep 17 00:00:00 2001 From: "Augusto F. Hack" Date: Fri, 30 Jun 2023 14:34:40 +0200 Subject: [PATCH 009/120] stark: save the domain generator to memory --- stdlib/asm/crypto/fri/helper.masm | 17 ++++++++--------- stdlib/asm/crypto/stark/constants.masm | 13 +++++++++++++ stdlib/asm/crypto/stark/random_coin.masm | 23 ++++++++++++++++++++--- stdlib/docs/constants_stark.md | 3 +-- stdlib/docs/helper_fri.md | 2 +- stdlib/docs/random_coin_stark.md | 2 +- 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/stdlib/asm/crypto/fri/helper.masm b/stdlib/asm/crypto/fri/helper.masm index ca67df6f78..60b581b4a9 100644 --- a/stdlib/asm/crypto/fri/helper.masm +++ b/stdlib/asm/crypto/fri/helper.masm @@ -7,7 +7,7 @@ use.std::crypto::stark::constants #! #! Input: [...] #! Output: [num_fri_layers, ...] -#! Cycles: 55 +#! Cycles: 52 export.generate_fri_parameters # Load FRI verifier data padw exec.constants::lde_size_ptr mem_loadw @@ -31,21 +31,20 @@ export.generate_fri_parameters dup.1 dup.1 dup.6 - #=> [lde_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (5 cycles) + drop + #=> [z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (6 cycles) - # Compute trace generator `trace_g` = `lde_g^blowup_factor` - repeat.3 - dup mul - end - #=> [trace_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (6 cycles) + # Load `trace_g` from memory + exec.constants::trace_domain_generator_ptr mem_load + #=> [trace_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (2 cycles) - # Compute `gz0` = `trace_g * g_0` + # Compute `gz0` = `trace_g * z_0` dup movup.3 mul #=> [gz0, trace_g, z1, z0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (3 cycles) - # Compute `gz1` = `trace_g * g_1` + # Compute `gz1` = `trace_g * z_1` swap.2 mul #=> [gz1, gz0, z1, z0, lde_size, log2(lde_size), lde_g, 0, ...] (2 cycles) diff --git a/stdlib/asm/crypto/stark/constants.masm b/stdlib/asm/crypto/stark/constants.masm index 8491dfeb65..f292f2dc21 100644 --- a/stdlib/asm/crypto/stark/constants.masm +++ b/stdlib/asm/crypto/stark/constants.masm @@ -10,6 +10,9 @@ const.DOMAIN_OFFSET_INV=2635249152773512046 # MEMORY POINTERS # ================================================================================================= +# Trace domain generator +const.TRACE_DOMAIN_GENERATOR_PTR=4294799999 + # Public inputs const.PUBLIC_INPUTS_PTR=4294800000 @@ -100,6 +103,7 @@ const.TMP8=4294903322 # +------------------------------------------+-------------------------+ # | ID | Address | # +------------------------------------------+-------------------------+ +# | TRACE_DOMAIN_GENERATOR_PTR | 4294799999 | # | PUBLIC_INPUTS_PTR | 4294800000 | # | OOD_TRACE_PTR | 4294900000 | # | OOD_CONSTRAINT_EVALS_PTR | 4294900081 | @@ -139,6 +143,15 @@ export.root_unity push.ROOT_UNITY end +# Procedure to push the trace domain generator address to the stack. +# +# Input: [...] +# Output: [ptr, ...] wher ptr is the memory address of the trace domain generator +# Cycles: 1 +export.trace_domain_generator_ptr + push.TRACE_DOMAIN_GENERATOR_PTR +end + export.domain_offset push.DOMAIN_OFFSET end diff --git a/stdlib/asm/crypto/stark/random_coin.masm b/stdlib/asm/crypto/stark/random_coin.masm index 8d4bd8e0ff..20264f7d53 100644 --- a/stdlib/asm/crypto/stark/random_coin.masm +++ b/stdlib/asm/crypto/stark/random_coin.masm @@ -76,7 +76,7 @@ end #! #! Input: [log(trace_length), num_queries, blowup, grinding, ...] #! Output: [C] -#! Cycles: 168 +#! Cycles: 175 export.init_seed # Save the parameters in memory for later use @@ -146,9 +146,26 @@ export.init_seed movdn.3 #=> [lde_size, log(lde_size), lde_g, 0, trace_length, num_queries, blowup, grinding] - # Save `[lde_size, log(lde_size), lde_g, 0]` and clean stack + # Save `[lde_size, log(lde_size), lde_g, 0]` exec.constants::lde_size_ptr mem_storew - dropw + #=> [lde_size, log(lde_size), lde_g, 0, trace_length, num_queries, blowup, grinding] + + # clean stack + drop drop + #=> [lde_g, 0, trace_length, num_queries, blowup, grinding] + + # Compute trace generator `trace_g` = `lde_g^blowup_factor` + repeat.3 + dup mul + end + #=> [trace_g, 0, trace_length, num_queries, blowup, grinding] + + # Save `trace_g` to memory + exec.constants::trace_domain_generator_ptr mem_store + #=> [0, trace_length, num_queries, blowup, grinding] + + # clean satck + drop #=> [trace_length, num_queries, blowup, grinding] # Construct the proof context diff --git a/stdlib/docs/constants_stark.md b/stdlib/docs/constants_stark.md index ed90e7a896..87e823af5d 100644 --- a/stdlib/docs/constants_stark.md +++ b/stdlib/docs/constants_stark.md @@ -2,10 +2,9 @@ ## std::crypto::stark::constants | Procedure | Description | | ----------- | ------------- | -| lde_size_ptr | Address to store details about the lde size.

      Memory is `[lde_size, log(lde_size), 0, 0]` | +| lde_size_ptr | Address to store details about the lde size.

      Memory is `[lde_size, log(lde_size), lde_g, 0]` | | z_ptr | Address for the point `z` and its exponentiation `z^N` where `N=trace_len`.

      Memory is `[(z_1, z_0)^n, z_1, z_0]` | | c_ptr | Returns the pointer to the capacity word of the random coin.

      Note: The random coin is implemented using a hash function, this returns the

      capacity portion of the RPO. | | r1_ptr | Returns the pointer to the first rate word of the random coin.

      Note: The random coin is implemented using a hash function, this returns the

      first rate word of the RPO. | | r2_ptr | Returns the pointer to the second rate word of the random coin.

      Note: The random coin is implemented using a hash function, this returns the

      second rate word of the RPO. | -| tmp0 | Address to store details to compute deep queries.

      Memory is `[lde_size, log2(lde_size), lde_generator, 0]` | | tmp1 | Address to store details to compute deep query denominators.

      Memory is `[gz1, gz0, z_1, z_0]` | diff --git a/stdlib/docs/helper_fri.md b/stdlib/docs/helper_fri.md index 5aefef7e06..408179e740 100644 --- a/stdlib/docs/helper_fri.md +++ b/stdlib/docs/helper_fri.md @@ -2,6 +2,6 @@ ## std::crypto::fri::helper | Procedure | Description | | ----------- | ------------- | -| generate_fri_parameters | Compute the number of FRI layers given log2 of the size of LDE domain. It also computes the

      LDE domain generator and, from it, the trace generator and store these for later use.

      Input: [...]

      Output: [num_fri_layers, ...]

      Cycles: 123 | +| generate_fri_parameters | Compute the number of FRI layers given log2 of the size of LDE domain. It also computes the

      LDE domain generator and, from it, the trace generator and store these for later use.

      Input: [...]

      Output: [num_fri_layers, ...]

      Cycles: 55 | | load_fri_layer_commitments | Get FRI layer commitments and reseed with them in order to draw folding challenges i.e. alphas.

      Input: [ptr_layer, num_layers, ...]

      Output: [...]

      Cycles: 21 + 83 * num_fri_layers | | load_and_verify_remainder | Load the remainder polynomial from the advice provider and check that its hash corresponds

      to its commitment and reseed with the latter.

      Load the remainder code word, i.e. the NTT of the remainder polynomial, and use its hash, together,

      with the hash of the remainder polynomial in order to generate the Fiat-Shamir challenge `tau` for

      the `verify_remainder_xx` procedure.

      Input: [...]

      Output: [...]

      Cycles:

      1- Remainder of size 32: 1633

      2- Remainder of size 64: 3109 | diff --git a/stdlib/docs/random_coin_stark.md b/stdlib/docs/random_coin_stark.md index e3a76d0ead..c912db493b 100644 --- a/stdlib/docs/random_coin_stark.md +++ b/stdlib/docs/random_coin_stark.md @@ -5,7 +5,7 @@ | get_rate_1 | Return the first half of the rate portion of the random coin state

      The random coin uses RPO to generate data. The RPO state is composed of 3

      words, 2 words for the rate, and 1 word for the capacity. This procedure

      returns the first word of the RPO state.

      Input: [...]

      Output: [R1, ...]

      Cycles: 6 | | get_rate_2 | Return the second half of the rate portion of the random coin state

      The random coin uses RPO to generate data. The RPO state is composed of 3

      words, 2 words for the rate, and 1 word for the capacity. This procedure

      returns the first word of the RPO state.

      Input: [...]

      Output: [R2, ...]

      Cycles: 6 | | get_capacity | Return the capacity portion of the random coin state

      The random coin uses RPO to generate data. The RPO state is composed of 3

      words, 2 words for the rate, and 1 word for the capacity. This procedure

      returns the first word of the RPO state.

      Input: [...]

      Output: [C, ...]

      Cycles: 6 | -| init_seed | Initializes the seed for randomness generation by computing the hash of the proof context using

      the trace length, number of queries, logarithm of blowup factor and the number of bits of

      grinding. Currently, this part, as well as the rest of the STARK verifier assumes a blowup factor

      equal to 8.

      The ouput of this procedure is the capacity portion of the state after applying `hperm`.

      Input: [log(trace_length), num_queries, blowup, grinding, ...]

      Output: [C]

      Cycles: 104 | +| init_seed | Initializes the seed for randomness generation by computing the hash of the proof context using

      the trace length, number of queries, logarithm of blowup factor and the number of bits of

      grinding. Currently, this part, as well as the rest of the STARK verifier assumes a blowup factor

      equal to 8.

      The ouput of this procedure is the capacity portion of the state after applying `hperm`.

      Input: [log(trace_length), num_queries, blowup, grinding, ...]

      Output: [C]

      Cycles: 168 | | reseed | Reseed the random coin with `DATA`

      Input: [DATA, ...]

      Ouput: [...]

      Cycles: 54 | | generate_aux_randomness | Draw a list of random extension field elements related to the auxiliary trace and store the list

      in memory from `aux_rand_elem_ptr` to `aux_rand_elem_ptr + 8 - 1`

      Input: [aux_rand_elem_ptr, ...]

      Output: [...]

      Cycles: 150 | | generate_constraint_composition_coefficients | Draw constraint composition random coefficients and save them into memory in the region from

      `compos_coef_ptr` `compos_coef_ptr + 118 - 1` as `(r1_1, r1_0, r0_1, r0_0)`

      Input: [compos_coef_ptr, ...]

      Output: [...]

      Cycles: 1309 | From 3aa346f95a9670fe1813cdb3408c6474ee08648c Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sat, 1 Jul 2023 00:57:55 -0700 Subject: [PATCH 010/120] chore: update changelog --- CHANGELOG.md | 4 ++++ stdlib/docs/helper_fri.md | 2 +- stdlib/docs/random_coin_stark.md | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index baac868be4..6035075232 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 0.7.0 (TBD) +#### VM Internals + +- Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). + ## 0.6.1 (2023-06-29) - Fixed `no-std` compilation for `miden-core`, `miden-assembly`, and `miden-processor` crates. diff --git a/stdlib/docs/helper_fri.md b/stdlib/docs/helper_fri.md index 408179e740..28c1cf2498 100644 --- a/stdlib/docs/helper_fri.md +++ b/stdlib/docs/helper_fri.md @@ -2,6 +2,6 @@ ## std::crypto::fri::helper | Procedure | Description | | ----------- | ------------- | -| generate_fri_parameters | Compute the number of FRI layers given log2 of the size of LDE domain. It also computes the

      LDE domain generator and, from it, the trace generator and store these for later use.

      Input: [...]

      Output: [num_fri_layers, ...]

      Cycles: 55 | +| generate_fri_parameters | Compute the number of FRI layers given log2 of the size of LDE domain. It also computes the

      LDE domain generator and, from it, the trace generator and store these for later use.

      Input: [...]

      Output: [num_fri_layers, ...]

      Cycles: 52 | | load_fri_layer_commitments | Get FRI layer commitments and reseed with them in order to draw folding challenges i.e. alphas.

      Input: [ptr_layer, num_layers, ...]

      Output: [...]

      Cycles: 21 + 83 * num_fri_layers | | load_and_verify_remainder | Load the remainder polynomial from the advice provider and check that its hash corresponds

      to its commitment and reseed with the latter.

      Load the remainder code word, i.e. the NTT of the remainder polynomial, and use its hash, together,

      with the hash of the remainder polynomial in order to generate the Fiat-Shamir challenge `tau` for

      the `verify_remainder_xx` procedure.

      Input: [...]

      Output: [...]

      Cycles:

      1- Remainder of size 32: 1633

      2- Remainder of size 64: 3109 | diff --git a/stdlib/docs/random_coin_stark.md b/stdlib/docs/random_coin_stark.md index c912db493b..6d20106b16 100644 --- a/stdlib/docs/random_coin_stark.md +++ b/stdlib/docs/random_coin_stark.md @@ -5,7 +5,7 @@ | get_rate_1 | Return the first half of the rate portion of the random coin state

      The random coin uses RPO to generate data. The RPO state is composed of 3

      words, 2 words for the rate, and 1 word for the capacity. This procedure

      returns the first word of the RPO state.

      Input: [...]

      Output: [R1, ...]

      Cycles: 6 | | get_rate_2 | Return the second half of the rate portion of the random coin state

      The random coin uses RPO to generate data. The RPO state is composed of 3

      words, 2 words for the rate, and 1 word for the capacity. This procedure

      returns the first word of the RPO state.

      Input: [...]

      Output: [R2, ...]

      Cycles: 6 | | get_capacity | Return the capacity portion of the random coin state

      The random coin uses RPO to generate data. The RPO state is composed of 3

      words, 2 words for the rate, and 1 word for the capacity. This procedure

      returns the first word of the RPO state.

      Input: [...]

      Output: [C, ...]

      Cycles: 6 | -| init_seed | Initializes the seed for randomness generation by computing the hash of the proof context using

      the trace length, number of queries, logarithm of blowup factor and the number of bits of

      grinding. Currently, this part, as well as the rest of the STARK verifier assumes a blowup factor

      equal to 8.

      The ouput of this procedure is the capacity portion of the state after applying `hperm`.

      Input: [log(trace_length), num_queries, blowup, grinding, ...]

      Output: [C]

      Cycles: 168 | +| init_seed | Initializes the seed for randomness generation by computing the hash of the proof context using

      the trace length, number of queries, logarithm of blowup factor and the number of bits of

      grinding. Currently, this part, as well as the rest of the STARK verifier assumes a blowup factor

      equal to 8.

      The ouput of this procedure is the capacity portion of the state after applying `hperm`.

      Input: [log(trace_length), num_queries, blowup, grinding, ...]

      Output: [C]

      Cycles: 175 | | reseed | Reseed the random coin with `DATA`

      Input: [DATA, ...]

      Ouput: [...]

      Cycles: 54 | | generate_aux_randomness | Draw a list of random extension field elements related to the auxiliary trace and store the list

      in memory from `aux_rand_elem_ptr` to `aux_rand_elem_ptr + 8 - 1`

      Input: [aux_rand_elem_ptr, ...]

      Output: [...]

      Cycles: 150 | | generate_constraint_composition_coefficients | Draw constraint composition random coefficients and save them into memory in the region from

      `compos_coef_ptr` `compos_coef_ptr + 118 - 1` as `(r1_1, r1_0, r0_1, r0_0)`

      Input: [compos_coef_ptr, ...]

      Output: [...]

      Cycles: 1309 | From 764e8beefd16225e9790afcf752b2791c5c433cf Mon Sep 17 00:00:00 2001 From: frisitano Date: Fri, 30 Jun 2023 17:19:16 +0100 Subject: [PATCH 011/120] feat: introduce additional methods on the AdviceProvider --- processor/src/advice/mod.rs | 27 +++++++++++++++++++++++ processor/src/advice/providers.rs | 36 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/processor/src/advice/mod.rs b/processor/src/advice/mod.rs index 111b7cd0cc..a141d6019d 100644 --- a/processor/src/advice/mod.rs +++ b/processor/src/advice/mod.rs @@ -1,4 +1,5 @@ use super::{ExecutionError, Felt, InputError, StarkField, Word}; +use core::borrow::Borrow; use vm_core::{ crypto::{ hash::RpoDigest, @@ -100,6 +101,11 @@ pub trait AdviceProvider { /// are replaced with the specified values. fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError>; + // ADVICE MAP + // -------------------------------------------------------------------------------------------- + /// Returns a reference to the value(s) associated with the specified key in the advice map. + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]>; + // ADVISE SETS // -------------------------------------------------------------------------------------------- @@ -177,6 +183,15 @@ pub trait AdviceProvider { /// advice provider. fn merge_roots(&mut self, lhs: Word, rhs: Word) -> Result; + /// Returns a subset of this Merkle store such that the returned Merkle store contains all + /// nodes which are descendants of the specified roots. + /// + /// The roots for which no descendants exist in this Merkle store are ignored. + fn get_store_subset(&self, roots: I) -> MerkleStore + where + I: Iterator, + R: Borrow; + // CONTEXT MANAGEMENT // -------------------------------------------------------------------------------------------- @@ -214,6 +229,10 @@ where T::insert_into_map(self, key, values) } + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { + T::get_mapped_values(self, key) + } + fn get_tree_node( &self, root: Word, @@ -255,6 +274,14 @@ where T::merge_roots(self, lhs, rhs) } + fn get_store_subset(&self, roots: I) -> MerkleStore + where + I: Iterator, + R: Borrow, + { + T::get_store_subset(self, roots) + } + fn advance_clock(&mut self) { T::advance_clock(self) } diff --git a/processor/src/advice/providers.rs b/processor/src/advice/providers.rs index 49c032503d..9360388e81 100644 --- a/processor/src/advice/providers.rs +++ b/processor/src/advice/providers.rs @@ -106,6 +106,12 @@ where Ok(()) } + // ADVICE MAP + // -------------------------------------------------------------------------------------------- + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { + self.map.get(key).map(|v| v.as_slice()) + } + // ADVISE SETS // -------------------------------------------------------------------------------------------- @@ -184,6 +190,14 @@ where .map_err(ExecutionError::MerkleStoreMergeFailed) } + fn get_store_subset(&self, roots: I) -> MerkleStore + where + I: Iterator, + R: core::borrow::Borrow, + { + self.store.subset(roots).into_inner().into_iter().collect() + } + // CONTEXT MANAGEMENT // -------------------------------------------------------------------------------------------- @@ -257,6 +271,10 @@ impl AdviceProvider for MemAdviceProvider { self.provider.insert_into_map(key, values) } + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { + self.provider.get_mapped_values(key) + } + fn get_tree_node(&self, root: Word, depth: &Felt, index: &Felt) -> Result { self.provider.get_tree_node(root, depth, index) } @@ -277,6 +295,13 @@ impl AdviceProvider for MemAdviceProvider { self.provider.merge_roots(lhs, rhs) } + fn get_store_subset(&self, roots: I) -> MerkleStore + where + I: Iterator, + R: core::borrow::Borrow { + self.provider.get_store_subset(roots) + } + fn advance_clock(&mut self) { self.provider.advance_clock() } @@ -383,6 +408,10 @@ impl AdviceProvider for RecAdviceProvider { self.provider.insert_into_map(key, values) } + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { + self.provider.get_mapped_values(key) + } + fn get_tree_node(&self, root: Word, depth: &Felt, index: &Felt) -> Result { self.provider.get_tree_node(root, depth, index) } @@ -403,6 +432,13 @@ impl AdviceProvider for RecAdviceProvider { self.provider.merge_roots(lhs, rhs) } + fn get_store_subset(&self, roots: I) -> MerkleStore + where + I: Iterator, + R: core::borrow::Borrow { + self.provider.get_store_subset(roots) + } + fn advance_clock(&mut self) { self.provider.advance_clock() } From 7a85ddaaf9d5f34b108732c70cc4dd962a0bed15 Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Wed, 5 Jul 2023 14:00:36 +0000 Subject: [PATCH 012/120] refactor: change directory structure for stdlib docs --- .../mmr.md} | 0 .../smt.md} | 0 .../smt64.md} | 0 .../dsa/ecdsa/secp256k1.md} | 0 .../{falcon_dsa.md => crypto/dsa/falcon.md} | 0 .../{ext2fri_fri.md => crypto/fri/ext2fri.md} | 0 .../{frie2f4_fri.md => crypto/fri/frie2f4.md} | 0 .../{helper_fri.md => crypto/fri/helper.md} | 0 .../hashes/blake3.md} | 0 .../hashes/keccak256.md} | 0 .../hashes/native.md} | 0 .../hashes/sha256.md} | 0 .../stark/constants.md} | 0 .../stark/deep_queries.md} | 0 .../stark/ood_frames.md} | 0 .../stark/public_inputs.md} | 0 .../stark/random_coin.md} | 0 .../{utils_stark.md => crypto/stark/utils.md} | 0 .../stark/verifier.md} | 0 .../ecgfp5/base_field.md} | 0 .../{group_ecgfp5.md => math/ecgfp5/group.md} | 0 .../ecgfp5/scalar_field.md} | 0 .../docs/{ntt512_math.md => math/ntt512.md} | 0 .../docs/{poly512_math.md => math/poly512.md} | 0 .../secp256k1/base_field.md} | 0 .../secp256k1/group.md} | 0 .../secp256k1/scalar_field.md} | 0 stdlib/docs/{u256_math.md => math/u256.md} | 0 stdlib/docs/{u64_math.md => math/u64.md} | 0 stdlib/docs/{mem_std.md => mem.md} | 0 stdlib/docs/{sys_std.md => sys.md} | 0 stdlib/md_renderer.rs | 31 ++++++++++--------- 32 files changed, 16 insertions(+), 15 deletions(-) rename stdlib/docs/{mmr_collections.md => collections/mmr.md} (100%) rename stdlib/docs/{smt_collections.md => collections/smt.md} (100%) rename stdlib/docs/{smt64_collections.md => collections/smt64.md} (100%) rename stdlib/docs/{secp256k1_ecdsa.md => crypto/dsa/ecdsa/secp256k1.md} (100%) rename stdlib/docs/{falcon_dsa.md => crypto/dsa/falcon.md} (100%) rename stdlib/docs/{ext2fri_fri.md => crypto/fri/ext2fri.md} (100%) rename stdlib/docs/{frie2f4_fri.md => crypto/fri/frie2f4.md} (100%) rename stdlib/docs/{helper_fri.md => crypto/fri/helper.md} (100%) rename stdlib/docs/{blake3_hashes.md => crypto/hashes/blake3.md} (100%) rename stdlib/docs/{keccak256_hashes.md => crypto/hashes/keccak256.md} (100%) rename stdlib/docs/{native_hashes.md => crypto/hashes/native.md} (100%) rename stdlib/docs/{sha256_hashes.md => crypto/hashes/sha256.md} (100%) rename stdlib/docs/{constants_stark.md => crypto/stark/constants.md} (100%) rename stdlib/docs/{deep_queries_stark.md => crypto/stark/deep_queries.md} (100%) rename stdlib/docs/{ood_frames_stark.md => crypto/stark/ood_frames.md} (100%) rename stdlib/docs/{public_inputs_stark.md => crypto/stark/public_inputs.md} (100%) rename stdlib/docs/{random_coin_stark.md => crypto/stark/random_coin.md} (100%) rename stdlib/docs/{utils_stark.md => crypto/stark/utils.md} (100%) rename stdlib/docs/{verifier_stark.md => crypto/stark/verifier.md} (100%) rename stdlib/docs/{base_field_ecgfp5.md => math/ecgfp5/base_field.md} (100%) rename stdlib/docs/{group_ecgfp5.md => math/ecgfp5/group.md} (100%) rename stdlib/docs/{scalar_field_ecgfp5.md => math/ecgfp5/scalar_field.md} (100%) rename stdlib/docs/{ntt512_math.md => math/ntt512.md} (100%) rename stdlib/docs/{poly512_math.md => math/poly512.md} (100%) rename stdlib/docs/{base_field_secp256k1.md => math/secp256k1/base_field.md} (100%) rename stdlib/docs/{group_secp256k1.md => math/secp256k1/group.md} (100%) rename stdlib/docs/{scalar_field_secp256k1.md => math/secp256k1/scalar_field.md} (100%) rename stdlib/docs/{u256_math.md => math/u256.md} (100%) rename stdlib/docs/{u64_math.md => math/u64.md} (100%) rename stdlib/docs/{mem_std.md => mem.md} (100%) rename stdlib/docs/{sys_std.md => sys.md} (100%) diff --git a/stdlib/docs/mmr_collections.md b/stdlib/docs/collections/mmr.md similarity index 100% rename from stdlib/docs/mmr_collections.md rename to stdlib/docs/collections/mmr.md diff --git a/stdlib/docs/smt_collections.md b/stdlib/docs/collections/smt.md similarity index 100% rename from stdlib/docs/smt_collections.md rename to stdlib/docs/collections/smt.md diff --git a/stdlib/docs/smt64_collections.md b/stdlib/docs/collections/smt64.md similarity index 100% rename from stdlib/docs/smt64_collections.md rename to stdlib/docs/collections/smt64.md diff --git a/stdlib/docs/secp256k1_ecdsa.md b/stdlib/docs/crypto/dsa/ecdsa/secp256k1.md similarity index 100% rename from stdlib/docs/secp256k1_ecdsa.md rename to stdlib/docs/crypto/dsa/ecdsa/secp256k1.md diff --git a/stdlib/docs/falcon_dsa.md b/stdlib/docs/crypto/dsa/falcon.md similarity index 100% rename from stdlib/docs/falcon_dsa.md rename to stdlib/docs/crypto/dsa/falcon.md diff --git a/stdlib/docs/ext2fri_fri.md b/stdlib/docs/crypto/fri/ext2fri.md similarity index 100% rename from stdlib/docs/ext2fri_fri.md rename to stdlib/docs/crypto/fri/ext2fri.md diff --git a/stdlib/docs/frie2f4_fri.md b/stdlib/docs/crypto/fri/frie2f4.md similarity index 100% rename from stdlib/docs/frie2f4_fri.md rename to stdlib/docs/crypto/fri/frie2f4.md diff --git a/stdlib/docs/helper_fri.md b/stdlib/docs/crypto/fri/helper.md similarity index 100% rename from stdlib/docs/helper_fri.md rename to stdlib/docs/crypto/fri/helper.md diff --git a/stdlib/docs/blake3_hashes.md b/stdlib/docs/crypto/hashes/blake3.md similarity index 100% rename from stdlib/docs/blake3_hashes.md rename to stdlib/docs/crypto/hashes/blake3.md diff --git a/stdlib/docs/keccak256_hashes.md b/stdlib/docs/crypto/hashes/keccak256.md similarity index 100% rename from stdlib/docs/keccak256_hashes.md rename to stdlib/docs/crypto/hashes/keccak256.md diff --git a/stdlib/docs/native_hashes.md b/stdlib/docs/crypto/hashes/native.md similarity index 100% rename from stdlib/docs/native_hashes.md rename to stdlib/docs/crypto/hashes/native.md diff --git a/stdlib/docs/sha256_hashes.md b/stdlib/docs/crypto/hashes/sha256.md similarity index 100% rename from stdlib/docs/sha256_hashes.md rename to stdlib/docs/crypto/hashes/sha256.md diff --git a/stdlib/docs/constants_stark.md b/stdlib/docs/crypto/stark/constants.md similarity index 100% rename from stdlib/docs/constants_stark.md rename to stdlib/docs/crypto/stark/constants.md diff --git a/stdlib/docs/deep_queries_stark.md b/stdlib/docs/crypto/stark/deep_queries.md similarity index 100% rename from stdlib/docs/deep_queries_stark.md rename to stdlib/docs/crypto/stark/deep_queries.md diff --git a/stdlib/docs/ood_frames_stark.md b/stdlib/docs/crypto/stark/ood_frames.md similarity index 100% rename from stdlib/docs/ood_frames_stark.md rename to stdlib/docs/crypto/stark/ood_frames.md diff --git a/stdlib/docs/public_inputs_stark.md b/stdlib/docs/crypto/stark/public_inputs.md similarity index 100% rename from stdlib/docs/public_inputs_stark.md rename to stdlib/docs/crypto/stark/public_inputs.md diff --git a/stdlib/docs/random_coin_stark.md b/stdlib/docs/crypto/stark/random_coin.md similarity index 100% rename from stdlib/docs/random_coin_stark.md rename to stdlib/docs/crypto/stark/random_coin.md diff --git a/stdlib/docs/utils_stark.md b/stdlib/docs/crypto/stark/utils.md similarity index 100% rename from stdlib/docs/utils_stark.md rename to stdlib/docs/crypto/stark/utils.md diff --git a/stdlib/docs/verifier_stark.md b/stdlib/docs/crypto/stark/verifier.md similarity index 100% rename from stdlib/docs/verifier_stark.md rename to stdlib/docs/crypto/stark/verifier.md diff --git a/stdlib/docs/base_field_ecgfp5.md b/stdlib/docs/math/ecgfp5/base_field.md similarity index 100% rename from stdlib/docs/base_field_ecgfp5.md rename to stdlib/docs/math/ecgfp5/base_field.md diff --git a/stdlib/docs/group_ecgfp5.md b/stdlib/docs/math/ecgfp5/group.md similarity index 100% rename from stdlib/docs/group_ecgfp5.md rename to stdlib/docs/math/ecgfp5/group.md diff --git a/stdlib/docs/scalar_field_ecgfp5.md b/stdlib/docs/math/ecgfp5/scalar_field.md similarity index 100% rename from stdlib/docs/scalar_field_ecgfp5.md rename to stdlib/docs/math/ecgfp5/scalar_field.md diff --git a/stdlib/docs/ntt512_math.md b/stdlib/docs/math/ntt512.md similarity index 100% rename from stdlib/docs/ntt512_math.md rename to stdlib/docs/math/ntt512.md diff --git a/stdlib/docs/poly512_math.md b/stdlib/docs/math/poly512.md similarity index 100% rename from stdlib/docs/poly512_math.md rename to stdlib/docs/math/poly512.md diff --git a/stdlib/docs/base_field_secp256k1.md b/stdlib/docs/math/secp256k1/base_field.md similarity index 100% rename from stdlib/docs/base_field_secp256k1.md rename to stdlib/docs/math/secp256k1/base_field.md diff --git a/stdlib/docs/group_secp256k1.md b/stdlib/docs/math/secp256k1/group.md similarity index 100% rename from stdlib/docs/group_secp256k1.md rename to stdlib/docs/math/secp256k1/group.md diff --git a/stdlib/docs/scalar_field_secp256k1.md b/stdlib/docs/math/secp256k1/scalar_field.md similarity index 100% rename from stdlib/docs/scalar_field_secp256k1.md rename to stdlib/docs/math/secp256k1/scalar_field.md diff --git a/stdlib/docs/u256_math.md b/stdlib/docs/math/u256.md similarity index 100% rename from stdlib/docs/u256_math.md rename to stdlib/docs/math/u256.md diff --git a/stdlib/docs/u64_math.md b/stdlib/docs/math/u64.md similarity index 100% rename from stdlib/docs/u64_math.md rename to stdlib/docs/math/u64.md diff --git a/stdlib/docs/mem_std.md b/stdlib/docs/mem.md similarity index 100% rename from stdlib/docs/mem_std.md rename to stdlib/docs/mem.md diff --git a/stdlib/docs/sys_std.md b/stdlib/docs/sys.md similarity index 100% rename from stdlib/docs/sys_std.md rename to stdlib/docs/sys.md diff --git a/stdlib/md_renderer.rs b/stdlib/md_renderer.rs index bee8e5fe2b..1ede6217e3 100644 --- a/stdlib/md_renderer.rs +++ b/stdlib/md_renderer.rs @@ -6,7 +6,7 @@ use assembly::{ use std::{ fs::{self, File}, io::Write, - path::Path, + path::PathBuf, }; // MARKDOWN RENDERER @@ -49,14 +49,18 @@ impl Renderer for MarkdownRenderer { fn render(stdlib: &ModuleMap, output_dir: &str) { // Write per module markdown file for (ns, module) in stdlib.iter() { - let file_name = markdown_file_name(ns); - let file_path = Path::new(output_dir).join(file_name); + let (dir_path, file_path) = get_dir_and_file_paths(ns, output_dir); + + // Create the directories if they don't exist + fs::create_dir_all(dir_path).expect("Failed to create directory"); + let f = fs::OpenOptions::new() .write(true) .append(true) .create(true) .open(file_path) .expect("unable to open stdlib markdown file"); + Self::write_docs_module(&f, module); Self::write_docs_header(&f, ns); for proc in module.procs().iter() { @@ -69,16 +73,13 @@ impl Renderer for MarkdownRenderer { // HELPER FUNCTIONS // ================================================================================================ -fn get_module_name(ns: &str) -> String { - let parts: Vec<&str> = ns.split(LibraryPath::PATH_DELIM).collect(); - String::from(parts[parts.len() - 1]) -} - -fn get_module_section(ns: &str) -> String { - let parts: Vec<&str> = ns.split(LibraryPath::PATH_DELIM).collect(); - String::from(parts[parts.len() - 2]) -} - -fn markdown_file_name(ns: &str) -> String { - format!("{}_{}.md", get_module_name(ns), get_module_section(ns)) +fn get_dir_and_file_paths(ns: &str, output_dir: &str) -> (PathBuf, PathBuf) { + let mut dir_parts: Vec<&str> = ns.split(LibraryPath::PATH_DELIM).collect(); + let file_name = dir_parts.pop().unwrap(); + let dir_path = dir_parts + .iter() + .skip(1) + .fold(PathBuf::from(output_dir), |acc, part| acc.join(part)); + let file_path = dir_path.join(format!("{}.md", file_name)); + (dir_path, file_path) } From ba4d98cb2e2407c88927282d767b7cb034661ca0 Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Fri, 7 Jul 2023 02:06:31 +0200 Subject: [PATCH 013/120] feat(stdlib): Allow arbitrary length sha256 hashes You can now hash arbitrary length input if you have done the padding manually. Execute prepare_message_schedule_and_consume once for every 512-bit block. ``` use.std::crypto::hashes::sha256 begin push.0x5be0cd19.0x1f83d9ab.0x9b05688c.0x510e527f push.0xa54ff53a.0x3c6ef372.0xbb67ae85.0x6a09e667 exec.sha256::prepare_message_schedule_and_consume exec.sha256::prepare_message_schedule_and_consume end ``` --- stdlib/asm/crypto/hashes/sha256.masm | 50 ++++++++-------------------- stdlib/docs/crypto/hashes/sha256.md | 1 + 2 files changed, 14 insertions(+), 37 deletions(-) diff --git a/stdlib/asm/crypto/hashes/sha256.masm b/stdlib/asm/crypto/hashes/sha256.masm index 421e718943..92ccc82357 100644 --- a/stdlib/asm/crypto/hashes/sha256.masm +++ b/stdlib/asm/crypto/hashes/sha256.masm @@ -232,11 +232,13 @@ end #! - state0 through state7 are the hash state (in terms of 8 SHA256 words) #! - msg0 through msg15 are the 64 -bytes input message (in terms of 16 SHA256 words) #! See https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2.hpp#L89-L113 -#! & https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2_256.hpp#L148-L187 ( loop body execution when i = 0 ) -proc.prepare_message_schedule_and_consume.2 +#! & https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2_256.hpp#L148-L187 ( loop body execution ) +export.prepare_message_schedule_and_consume.4 loc_storew.0 + loc_storew.2 dropw loc_storew.1 + loc_storew.3 dropw dup.15 @@ -1054,43 +1056,17 @@ proc.prepare_message_schedule_and_consume.2 movdn.8 exec.consume_message_word # consume msg[63] - push.0x6a09e667 - u32wrapping_add - - swap - push.0xbb67ae85 - u32wrapping_add - swap - - movup.2 - push.0x3c6ef372 - u32wrapping_add - movdn.2 - - movup.3 - push.0xa54ff53a - u32wrapping_add - movdn.3 - - movup.4 - push.0x510e527f - u32wrapping_add - movdn.4 - - movup.5 - push.0x9b05688c - u32wrapping_add - movdn.5 + push.0.0.0.0 + loc_loadw.3 - movup.6 - push.0x1f83d9ab - u32wrapping_add - movdn.6 + push.0.0.0.0 + loc_loadw.2 - movup.7 - push.0x5be0cd19 - u32wrapping_add - movdn.7 + repeat.8 + movup.8 + u32wrapping_add + movdn.7 + end end #! Consumes precomputed message schedule of padding bytes into hash state, returns final hash state. diff --git a/stdlib/docs/crypto/hashes/sha256.md b/stdlib/docs/crypto/hashes/sha256.md index 9d485a62e1..0d2ca114c5 100644 --- a/stdlib/docs/crypto/hashes/sha256.md +++ b/stdlib/docs/crypto/hashes/sha256.md @@ -2,5 +2,6 @@ ## std::crypto::hashes::sha256 | Procedure | Description | | ----------- | ------------- | +| prepare_message_schedule_and_consume | Computes whole message schedule of 64 message words and consumes them into hash state.

      Input: [state0, state1, state2, state3, state4, state5, state6, state7, msg0, msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9, msg10, msg11, msg12, msg13, msg14, msg15]

      Output: [state0', state1', state2', state3', state4', state5', state6', state7']

      Where:

      - state0 through state7 are the hash state (in terms of 8 SHA256 words)

      - msg0 through msg15 are the 64 -bytes input message (in terms of 16 SHA256 words)

      See https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2.hpp#L89-L113

      & https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2_256.hpp#L148-L187 ( loop body execution ) | | hash_2to1 | Given 64 -bytes input, this routine computes 32 -bytes SHA256 digest

      Input: [m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...]

      Where: m[0,16) = 32 -bit word

      Note, each SHA256 word is 32 -bit wide, so that's how input is expected.

      As you've 64 -bytes, consider packing 4 consecutive bytes into single word,

      maintaining big endian byte order.

      SHA256 digest is represented in terms of eight 32 -bit words ( big endian byte order ). | | hash_1to1 | Given 32 -bytes input, this routine computes 32 -bytes SHA256 digest

      Expected stack state:

      Input: [m0, m1, m2, m3, m4, m5, m6, m7, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...]

      Where: m[0,8) = 32 -bit word

      Note, each SHA256 word is 32 -bit wide, so that's how input is expected.

      As you've 32 -bytes, consider packing 4 consecutive bytes into single word,

      maintaining big endian byte order.

      SHA256 digest is represented in terms of eight 32 -bit words ( big endian byte order ). | From a401fa8861d6d264ff04aab6065343621348ac7a Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Wed, 5 Jul 2023 13:23:54 +0000 Subject: [PATCH 014/120] feat: add support for docs for re-exported procedures --- assembly/src/ast/mod.rs | 39 ++++++++++++++++++++++++++--- assembly/src/ast/parsers/context.rs | 14 ++++++++++- assembly/src/tests.rs | 17 +++++++++++++ stdlib/md_renderer.rs | 19 +++++++++++++- 4 files changed, 84 insertions(+), 5 deletions(-) diff --git a/assembly/src/ast/mod.rs b/assembly/src/ast/mod.rs index 9c2a0dd4b3..216d0dec8c 100644 --- a/assembly/src/ast/mod.rs +++ b/assembly/src/ast/mod.rs @@ -717,12 +717,17 @@ impl Deserializable for ProcedureAst { pub struct ProcReExport { proc_id: ProcedureId, name: ProcedureName, + docs: Option, } impl ProcReExport { /// Creates a new re-exported procedure. - pub fn new(proc_id: ProcedureId, name: ProcedureName) -> Self { - Self { proc_id, name } + pub fn new(proc_id: ProcedureId, name: ProcedureName, docs: Option) -> Self { + Self { + proc_id, + name, + docs, + } } // PUBLIC ACCESSORS @@ -738,6 +743,11 @@ impl ProcReExport { &self.name } + /// Returns the documentation of the re-exported procedure, if present. + pub fn docs(&self) -> Option<&str> { + self.docs.as_deref() + } + /// Returns the ID of the re-exported procedure using the specified module. pub fn get_alias_id(&self, module_path: &LibraryPath) -> ProcedureId { ProcedureId::from_name(&self.name, module_path) @@ -748,6 +758,16 @@ impl Serializable for ProcReExport { fn write_into(&self, target: &mut W) { self.proc_id.write_into(target); self.name.write_into(target); + match &self.docs { + Some(docs) => { + assert!(docs.len() <= MAX_DOCS_LEN, "docs too long"); + target.write_u16(docs.len() as u16); + target.write_bytes(docs.as_bytes()); + } + None => { + target.write_u16(0); + } + } } } @@ -755,7 +775,20 @@ impl Deserializable for ProcReExport { fn read_from(source: &mut R) -> Result { let proc_id = ProcedureId::read_from(source)?; let name = ProcedureName::read_from(source)?; - Ok(Self { proc_id, name }) + let docs_len = source.read_u16()? as usize; + let docs = if docs_len != 0 { + let str = source.read_vec(docs_len)?; + let str = + from_utf8(&str).map_err(|e| DeserializationError::InvalidValue(e.to_string()))?; + Some(str.to_string()) + } else { + None + }; + Ok(Self { + proc_id, + name, + docs, + }) } } diff --git a/assembly/src/ast/parsers/context.rs b/assembly/src/ast/parsers/context.rs index ea07193da1..f1ead36945 100644 --- a/assembly/src/ast/parsers/context.rs +++ b/assembly/src/ast/parsers/context.rs @@ -329,6 +329,7 @@ impl ParserContext<'_> { &self, tokens: &mut TokenStream, ) -> Result { + let proc_start = tokens.pos(); // parse the re-export declaration and make sure the procedure with the same name hasn't // been declared previously let header = tokens.read().expect("missing procedure header"); @@ -346,8 +347,19 @@ impl ParserContext<'_> { // consume the `export` token tokens.advance(); + // attach doc comments (if any) to re-exported procedures + let docs = tokens.take_doc_comment_at(proc_start); + + // make sure procedure docs don't exceed the allowed limit + if let Some(ref docs) = docs { + if docs.len() > MAX_DOCS_LEN { + let token = tokens.read_at(proc_start).expect("no proc token"); + return Err(ParsingError::proc_docs_too_long(token, docs.len(), MAX_DOCS_LEN)); + } + } + let proc_id = ProcedureId::from_name(&ref_name, module_path); - Ok(ProcReExport::new(proc_id, proc_name)) + Ok(ProcReExport::new(proc_id, proc_name, docs)) } // BODY PARSER diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index c404edc6b7..3b2ddaf448 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -676,13 +676,30 @@ fn program_with_reexported_proc_in_same_library() { const MODULE: &str = "math::u256"; const MODULE_BODY: &str = r#" use.dummy1::math::u64 + + #! checked_eqz checks if the value is u32 and zero and returns 1 if it is, 0 otherwise export.u64::checked_eqz # re-export + + #! unchecked_eqz checks if the value is zero and returns 1 if it is, 0 otherwise export.u64::unchecked_eqz->notchecked_eqz # re-export with alias "#; let namespace = LibraryNamespace::try_from(NAMESPACE.to_string()).unwrap(); let path = LibraryPath::try_from(MODULE.to_string()).unwrap().prepend(&namespace).unwrap(); let ast = ModuleAst::parse(MODULE_BODY).unwrap(); + + // check docs + let docs_checked_eqz = ast.reexported_procs().get(0).unwrap().docs().unwrap(); + assert_eq!( + docs_checked_eqz, + "checked_eqz checks if the value is u32 and zero and returns 1 if it is, 0 otherwise" + ); + let docs_unchecked_eqz = ast.reexported_procs().get(1).unwrap().docs().unwrap(); + assert_eq!( + docs_unchecked_eqz, + "unchecked_eqz checks if the value is zero and returns 1 if it is, 0 otherwise" + ); + let ref_path = LibraryPath::try_from(REF_MODULE.to_string()) .unwrap() .prepend(&namespace) diff --git a/stdlib/md_renderer.rs b/stdlib/md_renderer.rs index bee8e5fe2b..88c94e1d1f 100644 --- a/stdlib/md_renderer.rs +++ b/stdlib/md_renderer.rs @@ -1,6 +1,6 @@ use crate::{ModuleMap, Renderer}; use assembly::{ - ast::{ModuleAst, ProcedureAst}, + ast::{ModuleAst, ProcReExport, ProcedureAst}, LibraryPath, }; use std::{ @@ -35,6 +35,20 @@ impl MarkdownRenderer { .expect("unable to write func to writer"); } + fn write_docs_reexported_proc(mut writer: &File, proc: &ProcReExport) { + if proc.docs().is_none() { + return; + } + let func_output = format!( + "| {} | {} |\n", + proc.name().as_str(), + proc.docs().unwrap().replace('|', "\\|").replace('\n', "

      ") + ); + writer + .write_all(func_output.as_bytes()) + .expect("unable to write func to writer"); + } + fn write_docs_module(mut writer: &File, module: &ModuleAst) { if module.docs().is_none() { return; @@ -59,6 +73,9 @@ impl Renderer for MarkdownRenderer { .expect("unable to open stdlib markdown file"); Self::write_docs_module(&f, module); Self::write_docs_header(&f, ns); + for reexported_proc in module.reexported_procs().iter() { + Self::write_docs_reexported_proc(&f, reexported_proc); + } for proc in module.procs().iter() { Self::write_docs_procedure(&f, proc); } From 3c4c5d628439da44852995fa41fc130cd494eac4 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sun, 9 Jul 2023 02:08:22 +0300 Subject: [PATCH 015/120] chore: update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6035075232..2e6998269a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,12 @@ ## 0.7.0 (TBD) -#### VM Internals +#### Assembly +- Added ability to attach doc comments to re-exported procedures (#994). +#### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). +- Added `get_mapped_values()` and `get_store_subset()` methods to the `AdviceProvider` trait (#987). ## 0.6.1 (2023-06-29) From 785da4205ee8bf97bc725c95c4421296225169f3 Mon Sep 17 00:00:00 2001 From: Jacob Johannsen Date: Thu, 29 Jun 2023 16:58:34 +0200 Subject: [PATCH 016/120] Used procedures map added to AST --- assembly/src/ast/imports.rs | 159 +++++++++++++++++++++++++ assembly/src/ast/invocation_target.rs | 31 ++++- assembly/src/ast/mod.rs | 161 ++++++++++++++++---------- assembly/src/ast/parsers/context.rs | 77 +++++------- assembly/src/ast/parsers/mod.rs | 39 +------ assembly/src/ast/tests.rs | 41 ++++--- assembly/src/errors.rs | 14 +++ assembly/src/library/masl.rs | 11 +- assembly/src/procedures/mod.rs | 10 +- 9 files changed, 372 insertions(+), 171 deletions(-) create mode 100644 assembly/src/ast/imports.rs diff --git a/assembly/src/ast/imports.rs b/assembly/src/ast/imports.rs new file mode 100644 index 0000000000..a0e0f416e4 --- /dev/null +++ b/assembly/src/ast/imports.rs @@ -0,0 +1,159 @@ +use super::{ + BTreeMap, ByteReader, ByteWriter, Deserializable, DeserializationError, LibraryPath, + ParsingError, ProcedureId, ProcedureName, Serializable, String, ToString, Token, TokenStream, + Vec, MAX_IMPORTS, MAX_INVOKED_IMPORTED_PROCS, +}; + +// TYPE ALIASES +// ================================================================================================ + +type ImportedModulesMap = BTreeMap; +type InvokedProcsMap = BTreeMap; + +// MODULE IMPORTS +// ================================================================================================ + +/// Information about imports stored in the AST +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub struct ModuleImports { + /// Imported libraries. + imports: ImportedModulesMap, + /// Imported procedures that are called from somewhere in the AST. + invoked_procs: InvokedProcsMap, +} + +impl ModuleImports { + // CONSTRUCTOR + // -------------------------------------------------------------------------------------------- + /// Create a new ModuleImports instance + /// + /// # Panics + /// Panics if the number of imports is greater than MAX_IMPORTS, or if the number of invoked + /// procedures is greater than MAX_INVOKED_IMPORTED_PROCS + pub fn new(imports: ImportedModulesMap, invoked_procs: InvokedProcsMap) -> Self { + assert!(imports.len() <= MAX_IMPORTS, "too many imports"); + assert!( + invoked_procs.len() <= MAX_INVOKED_IMPORTED_PROCS, + "too many imported procedures invoked" + ); + Self { + imports, + invoked_procs, + } + } + + // PARSER + // -------------------------------------------------------------------------------------------- + /// Parses all `use` statements into a map of imports which maps a module name (e.g., "u64") to + /// its fully-qualified path (e.g., "std::math::u64"). + pub fn parse(tokens: &mut TokenStream) -> Result { + let mut imports = BTreeMap::::new(); + // read tokens from the token stream until all `use` tokens are consumed + while let Some(token) = tokens.read() { + match token.parts()[0] { + Token::USE => { + let module_path = token.parse_use()?; + let module_name = module_path.last(); + if imports.contains_key(module_name) { + return Err(ParsingError::duplicate_module_import(token, &module_path)); + } + + imports.insert(module_name.to_string(), module_path); + + // consume the `use` token + tokens.advance(); + } + _ => break, + } + } + + if imports.len() > MAX_IMPORTS { + return Err(ParsingError::too_many_imports(imports.len(), MAX_IMPORTS)); + } + Ok(Self { + imports, + invoked_procs: BTreeMap::new(), + }) + } + + // PUBLIC ACCESSORS + // -------------------------------------------------------------------------------------------- + + /// Look up the path of the imported module with the given name. + pub fn get_module_path(&self, module_name: &str) -> Option<&LibraryPath> { + self.imports.get(&module_name.to_string()) + } + + /// Return the paths of all imported module + pub fn import_paths(&self) -> Vec<&LibraryPath> { + self.imports.values().collect() + } + + // STATE MUTATORS + // -------------------------------------------------------------------------------------------- + + /// Adds the specified procedure to the set of procedures invoked from imported modules and + /// returns the ID of the invoked procedure. + /// + /// # Errors + /// Return an error if + /// - The module with the specified name has not been imported via the `use` statement. + /// - The total number of invoked procedures exceeds 2^{16} - 1. + pub fn add_invoked_proc( + &mut self, + proc_name: &ProcedureName, + module_name: &str, + token: &Token, + ) -> Result { + let module_path = self + .imports + .get(module_name) + .ok_or_else(|| ParsingError::procedure_module_not_imported(token, module_name))?; + let proc_id = ProcedureId::from_name(proc_name.as_ref(), module_path); + self.invoked_procs.insert(proc_id, (proc_name.clone(), module_path.clone())); + if self.invoked_procs.len() > MAX_INVOKED_IMPORTED_PROCS { + return Err(ParsingError::too_many_imported_procs_invoked( + token, + self.invoked_procs.len(), + MAX_INVOKED_IMPORTED_PROCS, + )); + } + Ok(proc_id) + } +} + +impl Serializable for ModuleImports { + fn write_into(&self, target: &mut W) { + target.write_u16(self.imports.len() as u16); + // We don't need to serialize the library names (the keys), since the libraty paths (the + // values) contain the library names + self.imports.values().for_each(|i| i.write_into(target)); + target.write_u16(self.invoked_procs.len() as u16); + for (proc_id, (proc_name, lib_path)) in self.invoked_procs.iter() { + proc_id.write_into(target); + proc_name.write_into(target); + lib_path.write_into(target); + } + } +} + +impl Deserializable for ModuleImports { + fn read_from(source: &mut R) -> Result { + let mut imports = BTreeMap::::new(); + let num_imports = source.read_u16()?; + for _ in 0..num_imports { + let path = LibraryPath::read_from(source)?; + imports.insert(path.last().to_string(), path); + } + + let mut used_imported_procs = InvokedProcsMap::new(); + let num_used_imported_procs = source.read_u16()?; + for _ in 0..num_used_imported_procs { + let proc_id = ProcedureId::read_from(source)?; + let proc_name = ProcedureName::read_from(source)?; + let lib_path = LibraryPath::read_from(source)?; + used_imported_procs.insert(proc_id, (proc_name, lib_path)); + } + Ok(Self::new(imports, used_imported_procs)) + } +} diff --git a/assembly/src/ast/invocation_target.rs b/assembly/src/ast/invocation_target.rs index c5bd257ea3..f7f7f85304 100644 --- a/assembly/src/ast/invocation_target.rs +++ b/assembly/src/ast/invocation_target.rs @@ -1,10 +1,16 @@ -use super::{parsers::decode_hex_rpo_digest_label, LibraryPath, ParsingError, RpoDigest, Token}; +use super::{ + parsers::decode_hex_rpo_digest_label, LibraryPath, ParsingError, ProcedureName, RpoDigest, + Token, +}; /// Describes targets of `exec`, `call`, and `syscall` instructions. pub enum InvocationTarget<'a> { MastRoot(RpoDigest), - ProcedureName(&'a str), - ProcedurePath { name: &'a str, module: &'a str }, + ProcedureName(ProcedureName), + ProcedurePath { + name: ProcedureName, + module: &'a str, + }, } impl<'a> InvocationTarget<'a> { @@ -32,15 +38,30 @@ impl<'a> InvocationTarget<'a> { .map_err(|_| ParsingError::invalid_proc_invocation(token, label))?; match num_components { - 1 => Ok(InvocationTarget::ProcedureName(label)), + 1 => { + let name = Self::parse_proc_name(label, token)?; + Ok(InvocationTarget::ProcedureName(name)) + } 2 => { let parts = label.split_once(LibraryPath::PATH_DELIM).expect("no components"); + let name = Self::parse_proc_name(parts.1, token)?; Ok(InvocationTarget::ProcedurePath { - name: parts.1, + name, module: parts.0, }) } _ => Err(ParsingError::invalid_proc_invocation(token, label)), } } + + // HELPER FUNCTIONS + // -------------------------------------------------------------------------------------------- + + /// Attempts to interpret a label as a procedure name + fn parse_proc_name(label: &'a str, token: &'a Token) -> Result { + match ProcedureName::try_from(label) { + Ok(name) => Ok(name), + Err(err) => Err(ParsingError::invalid_proc_name(token, err)), + } + } } diff --git a/assembly/src/ast/mod.rs b/assembly/src/ast/mod.rs index 216d0dec8c..35d764f1ad 100644 --- a/assembly/src/ast/mod.rs +++ b/assembly/src/ast/mod.rs @@ -20,11 +20,14 @@ pub use nodes::{AdviceInjectorNode, Instruction, Node}; mod code_body; pub use code_body::CodeBody; +mod imports; +pub use imports::ModuleImports; + mod invocation_target; pub use invocation_target::InvocationTarget; mod parsers; -use parsers::{parse_constants, parse_imports, ParserContext}; +use parsers::{parse_constants, ParserContext}; pub(crate) use parsers::{NAMESPACE_LABEL_PARSER, PROCEDURE_LABEL_PARSER}; @@ -52,26 +55,31 @@ const MAX_BODY_LEN: usize = u16::MAX as usize; /// Maximum number of imported libraries in a module or a program const MAX_IMPORTS: usize = u16::MAX as usize; +/// Maximum number of imported procedures used in a module or a program +const MAX_INVOKED_IMPORTED_PROCS: usize = u16::MAX as usize; + /// Maximum stack index at which a full word can start. const MAX_STACK_WORD_OFFSET: u8 = 12; // TYPE ALIASES // ================================================================================================ -type LocalProcMap = BTreeMap; +type LocalProcMap = BTreeMap; type LocalConstMap = BTreeMap; -type ReExportedProcMap = BTreeMap; +type ReExportedProcMap = BTreeMap; // EXECUTABLE PROGRAM AST // ================================================================================================ /// An abstract syntax tree of an executable Miden program. /// -/// A program AST consists of a list of internal procedure ASTs and a body of the program. +/// A program AST consists of a body of the program, a list of internal procedure ASTs, a list of +/// imported libraries, a map from procedure ids to procedure names for imported procedures used in +/// the module, and the source location of the program. #[derive(Debug, Clone, PartialEq, Eq)] pub struct ProgramAst { body: CodeBody, local_procs: Vec, - imports: BTreeMap, + import_info: Option, start: SourceLocation, } @@ -81,15 +89,7 @@ impl ProgramAst { /// Returns a new [ProgramAst]. /// /// A program consist of a body and a set of internal (i.e., not exported) procedures. - pub fn new( - body: Vec, - local_procs: Vec, - imports: BTreeMap, - ) -> Result { - if imports.len() > MAX_IMPORTS { - return Err(ParsingError::too_many_imports(imports.len(), MAX_LOCAL_PROCS)); - } - + pub fn new(body: Vec, local_procs: Vec) -> Result { if local_procs.len() > MAX_LOCAL_PROCS { return Err(ParsingError::too_many_module_procs(local_procs.len(), MAX_LOCAL_PROCS)); } @@ -98,11 +98,21 @@ impl ProgramAst { Ok(Self { body, local_procs, - imports, + import_info: None, start, }) } + /// Adds the provided import information to the program. + /// + /// # Panics + /// Panics if import information has already been added. + pub fn with_import_info(mut self, import_info: ModuleImports) -> Self { + assert!(self.import_info.is_none(), "module imports have already been added"); + self.import_info = Some(import_info); + self + } + /// Binds the provided `locations` to the nodes of this program's body. /// /// The `start` location points to the `begin` token which does not have its own node. @@ -144,11 +154,11 @@ impl ProgramAst { /// A program consist of a body and a set of internal (i.e., not exported) procedures. pub fn parse(source: &str) -> Result { let mut tokens = TokenStream::new(source)?; - let imports = parse_imports(&mut tokens)?; + let mut import_info = ModuleImports::parse(&mut tokens)?; let local_constants = parse_constants(&mut tokens)?; let mut context = ParserContext { - imports: &imports, + import_info: &mut import_info, local_procs: LocalProcMap::default(), reexported_procs: ReExportedProcMap::default(), local_constants, @@ -201,7 +211,10 @@ impl ProgramAst { let local_procs = sort_procs_into_vec(context.local_procs); let (nodes, locations) = body.into_parts(); - Ok(Self::new(nodes, local_procs, imports)?.with_source_locations(locations, start)) + + Ok(Self::new(nodes, local_procs)? + .with_source_locations(locations, start) + .with_import_info(import_info)) } // SERIALIZATION / DESERIALIZATION @@ -219,19 +232,20 @@ impl ProgramAst { // asserts below are OK because we enforce limits on the number of procedure and the // number of body instructions in relevant parsers + // serialize imports if required if options.serialize_imports { - assert!(self.imports.len() <= MAX_IMPORTS, "too many imports"); - target.write_u16(self.imports.len() as u16); - // We don't need to serialize the library names (the keys), - // since the libraty paths (the values) contain the library - // names - self.imports.values().for_each(|path| path.write_into(&mut target)); + match &self.import_info { + Some(imports) => imports.write_into(&mut target), + None => panic!("imports not initialized"), + } } + // serialize procedures assert!(self.local_procs.len() <= MAX_LOCAL_PROCS, "too many local procs"); target.write_u16(self.local_procs.len() as u16); self.local_procs.write_into(&mut target); + // serialize program body assert!(self.body.nodes().len() <= MAX_BODY_LEN, "too many body instructions"); target.write_u16(self.body.nodes().len() as u16); self.body.nodes().write_into(&mut target); @@ -249,23 +263,26 @@ impl ProgramAst { // Deserialize the serialization options used when serializing let options = AstSerdeOptions::read_from(&mut source)?; - let mut imports = BTreeMap::::new(); + // deserialize imports if required + let mut import_info = None; if options.serialize_imports { - let num_imports = source.read_u16()?; - for _ in 0..num_imports { - let path = LibraryPath::read_from(&mut source)?; - imports.insert(path.last().to_string(), path); - } + import_info = Some(ModuleImports::read_from(&mut source)?); } + // deserialize local procs let num_local_procs = source.read_u16()?; let local_procs = Deserializable::read_batch_from(&mut source, num_local_procs as usize)?; + // deserialize program body let body_len = source.read_u16()? as usize; let nodes = Deserializable::read_batch_from(&mut source, body_len)?; - match Self::new(nodes, local_procs, imports) { + + match Self::new(nodes, local_procs) { Err(err) => Err(DeserializationError::UnknownError(err.message().clone())), - Ok(res) => Ok(res), + Ok(res) => match import_info { + Some(info) => Ok(res.with_import_info(info)), + None => Ok(res), + }, } } @@ -301,6 +318,11 @@ impl ProgramAst { pub fn into_parts(self) -> (Vec, Vec) { (self.local_procs, self.body.into_parts().0) } + + /// Clear import info from the program + pub fn clear_imports(&mut self) { + self.import_info = None; + } } // MODULE AST @@ -308,13 +330,14 @@ impl ProgramAst { /// An abstract syntax tree of a Miden module. /// -/// A module AST consists of a list of imports, a list of procedure ASTs, a list of re-exported -/// procedures and module documentation. Local procedures could be internal or exported. +/// A module AST consists of a list of procedure ASTs, a list of re-exported procedures, a list of +/// imports, a map from procedure ids to procedure names for imported procedures used in the module, +/// and module documentation. Local procedures could be internal or exported. #[derive(Debug, Clone, PartialEq, Eq)] pub struct ModuleAst { local_procs: Vec, reexported_procs: Vec, - imports: BTreeMap, + import_info: Option, docs: Option, } @@ -327,12 +350,8 @@ impl ModuleAst { pub fn new( local_procs: Vec, reexported_procs: Vec, - imports: BTreeMap, docs: Option, ) -> Result { - if imports.len() > MAX_IMPORTS { - return Err(ParsingError::too_many_imports(imports.len(), MAX_IMPORTS)); - } if local_procs.len() > MAX_LOCAL_PROCS { return Err(ParsingError::too_many_module_procs(local_procs.len(), MAX_LOCAL_PROCS)); } @@ -350,11 +369,21 @@ impl ModuleAst { Ok(Self { local_procs, reexported_procs, - imports, + import_info: None, docs, }) } + /// Adds the provided import information to the module. + /// + /// # Panics + /// Panics if import information has already been added. + pub fn with_import_info(mut self, import_info: ModuleImports) -> Self { + assert!(self.import_info.is_none(), "module imports have already been added"); + self.import_info = Some(import_info); + self + } + // PARSER // -------------------------------------------------------------------------------------------- /// Parses the provided source into a [ModuleAst]. @@ -362,11 +391,10 @@ impl ModuleAst { /// A module consists of internal and exported procedures but does not contain a body. pub fn parse(source: &str) -> Result { let mut tokens = TokenStream::new(source)?; - - let imports = parse_imports(&mut tokens)?; + let mut import_info = ModuleImports::parse(&mut tokens)?; let local_constants = parse_constants(&mut tokens)?; let mut context = ParserContext { - imports: &imports, + import_info: &mut import_info, local_procs: LocalProcMap::default(), reexported_procs: ReExportedProcMap::default(), local_constants, @@ -391,7 +419,7 @@ impl ModuleAst { // get module docs and make sure the size is within the limit let docs = tokens.take_module_comments(); - Self::new(local_procs, reexported_procs, imports, docs) + Ok(Self::new(local_procs, reexported_procs, docs)?.with_import_info(import_info)) } // PUBLIC ACCESSORS @@ -413,8 +441,11 @@ impl ModuleAst { } /// Returns a map of imported modules in this module. - pub fn imports(&self) -> &BTreeMap { - &self.imports + pub fn import_paths(&self) -> Vec<&LibraryPath> { + match &self.import_info { + Some(info) => info.import_paths(), + None => Vec::<&LibraryPath>::new(), + } } // STATE MUTATORS @@ -436,6 +467,7 @@ impl ModuleAst { // asserts below are OK because we enforce limits on the number of procedure and length of // module docs in the module parser + // serialize docs match &self.docs { Some(docs) => { assert!(docs.len() <= u16::MAX as usize, "docs too long"); @@ -447,15 +479,15 @@ impl ModuleAst { } } + // serialize imports if required if options.serialize_imports { - assert!(self.imports.len() <= MAX_IMPORTS, "too many imports"); - target.write_u16(self.imports.len() as u16); - // We don't need to serialize the library names (the keys), - // since the libraty paths (the values) contain the library - // names - self.imports.values().for_each(|i| i.write_into(target)); + match &self.import_info { + Some(imports) => imports.write_into(target), + None => panic!("imports not initialized"), + } } + // serialize procedures assert!(self.local_procs.len() <= u16::MAX as usize, "too many local procs"); assert!( self.reexported_procs.len() <= MAX_REEXPORTED_PROCS, @@ -486,13 +518,9 @@ impl ModuleAst { }; // deserialize imports if required - let mut imports = BTreeMap::::new(); + let mut import_info = None; if options.serialize_imports { - let num_imports = source.read_u16()?; - for _ in 0..num_imports { - let path = LibraryPath::read_from(source)?; - imports.insert(path.last().to_string(), path); - } + import_info = Some(ModuleImports::read_from(source)?); } // deserialize re-exports @@ -503,8 +531,13 @@ impl ModuleAst { let num_local_procs = source.read_u16()? as usize; let local_procs = Deserializable::read_batch_from(source, num_local_procs)?; - Self::new(local_procs, reexported_procs, imports, docs) - .map_err(|err| DeserializationError::UnknownError(err.message().clone())) + match Self::new(local_procs, reexported_procs, docs) { + Err(err) => Err(DeserializationError::UnknownError(err.message().clone())), + Ok(res) => match import_info { + Some(info) => Ok(res.with_import_info(info)), + None => Ok(res), + }, + } } /// Returns byte representation of this [ModuleAst]. @@ -551,6 +584,14 @@ impl ModuleAst { pub fn write_source_locations(&self, target: &mut W) { self.local_procs.iter().for_each(|p| p.write_source_locations(target)) } + + // DESTRUCTURING + // -------------------------------------------------------------------------------------------- + + /// Clear import info from the module + pub fn clear_imports(&mut self) { + self.import_info = None; + } } // PROCEDURE AST diff --git a/assembly/src/ast/parsers/context.rs b/assembly/src/ast/parsers/context.rs index f1ead36945..babc300367 100644 --- a/assembly/src/ast/parsers/context.rs +++ b/assembly/src/ast/parsers/context.rs @@ -1,19 +1,17 @@ use super::{ super::ProcReExport, adv_ops, field_ops, io_ops, stack_ops, u32_ops, CodeBody, Instruction, - InvocationTarget, LibraryPath, LocalConstMap, LocalProcMap, Node, ParsingError, ProcedureAst, - ProcedureId, ReExportedProcMap, Token, TokenStream, MAX_BODY_LEN, MAX_DOCS_LEN, -}; -use vm_core::utils::{ - collections::{BTreeMap, Vec}, - string::{String, ToString}, + InvocationTarget, LibraryPath, LocalConstMap, LocalProcMap, ModuleImports, Node, ParsingError, + ProcedureAst, ProcedureId, ProcedureName, ReExportedProcMap, Token, TokenStream, MAX_BODY_LEN, + MAX_DOCS_LEN, }; +use vm_core::utils::{collections::Vec, string::ToString}; // PARSER CONTEXT // ================================================================================================ /// AST Parser context that holds internal state to generate correct ASTs. pub struct ParserContext<'a> { - pub imports: &'a BTreeMap, + pub import_info: &'a mut ModuleImports, pub local_procs: LocalProcMap, pub reexported_procs: ReExportedProcMap, pub local_constants: LocalConstMap, @@ -24,7 +22,7 @@ impl ParserContext<'_> { // -------------------------------------------------------------------------------------------- /// Parses an if-else statement from the provided token stream into an AST node. - fn parse_if(&self, tokens: &mut TokenStream) -> Result { + fn parse_if(&mut self, tokens: &mut TokenStream) -> Result { // record start of the if-else block and consume the 'if' token let if_start = tokens.pos(); let if_token = tokens.read().expect("no if token"); @@ -99,7 +97,7 @@ impl ParserContext<'_> { } /// Parses a while statement from the provided token stream into an AST node. - fn parse_while(&self, tokens: &mut TokenStream) -> Result { + fn parse_while(&mut self, tokens: &mut TokenStream) -> Result { // record start of the while block and consume the 'while' token let while_start = tokens.pos(); let while_token = tokens.read().expect("no while token"); @@ -130,7 +128,7 @@ impl ParserContext<'_> { } /// Parses a repeat statement from the provided token stream into an AST node. - fn parse_repeat(&self, tokens: &mut TokenStream) -> Result { + fn parse_repeat(&mut self, tokens: &mut TokenStream) -> Result { // record start of the repeat block and consume the 'repeat' token let repeat_start = tokens.pos(); let repeat_token = tokens.read().expect("no repeat token"); @@ -164,7 +162,7 @@ impl ParserContext<'_> { // -------------------------------------------------------------------------------------------- /// Parse an `exec` token into an instruction node. - fn parse_exec(&self, token: &Token) -> Result { + fn parse_exec(&mut self, token: &Token) -> Result { match token.parse_invocation(token.parts()[0])? { InvocationTarget::MastRoot(_) => Err(ParsingError::exec_with_mast_root(token)), InvocationTarget::ProcedureName(proc_name) => { @@ -173,7 +171,7 @@ impl ParserContext<'_> { Ok(Node::Instruction(inner)) } InvocationTarget::ProcedurePath { name, module } => { - let proc_id = self.get_imported_proc_id(name, module, token)?; + let proc_id = self.import_info.add_invoked_proc(&name, module, token)?; let inner = Instruction::ExecImported(proc_id); Ok(Node::Instruction(inner)) } @@ -181,7 +179,7 @@ impl ParserContext<'_> { } /// Parse a `call` token into an instruction node. - fn parse_call(&self, token: &Token) -> Result { + fn parse_call(&mut self, token: &Token) -> Result { match token.parse_invocation(token.parts()[0])? { InvocationTarget::MastRoot(root_hash) => { let inner = Instruction::CallMastRoot(root_hash); @@ -193,7 +191,7 @@ impl ParserContext<'_> { Ok(Node::Instruction(inner)) } InvocationTarget::ProcedurePath { name, module } => { - let proc_id = self.get_imported_proc_id(name, module, token)?; + let proc_id = self.import_info.add_invoked_proc(&name, module, token)?; let inner = Instruction::CallImported(proc_id); Ok(Node::Instruction(inner)) } @@ -205,7 +203,7 @@ impl ParserContext<'_> { match token.parse_invocation(token.parts()[0])? { InvocationTarget::MastRoot(_) => Err(ParsingError::syscall_with_mast_root(token)), InvocationTarget::ProcedureName(proc_name) => { - let proc_id = ProcedureId::from_kernel_name(proc_name); + let proc_id = ProcedureId::from_kernel_name(proc_name.as_ref()); let inner = Instruction::SysCall(proc_id); Ok(Node::Instruction(inner)) } @@ -244,12 +242,12 @@ impl ParserContext<'_> { if is_reexport { // parse procedure re-export and add it to the list of re-exported procedures let proc = self.parse_reexported_procedure(tokens)?; - self.reexported_procs.insert(proc.name.to_string(), proc); + self.reexported_procs.insert(proc.name.clone(), proc); } else { // parse the procedure body and add it to the list of local procedures let proc = self.parse_procedure(tokens)?; let proc_idx = self.local_procs.len() as u16; - self.local_procs.insert(proc.name.to_string(), (proc_idx, proc)); + self.local_procs.insert(proc.name.clone(), (proc_idx, proc)); } } @@ -264,14 +262,14 @@ impl ParserContext<'_> { /// - Procedure declaration or procedure body is malformed. /// - A procedure with the same name has already been either declared or re-exported from this /// context. - fn parse_procedure(&self, tokens: &mut TokenStream) -> Result { + fn parse_procedure(&mut self, tokens: &mut TokenStream) -> Result { let proc_start = tokens.pos(); // parse procedure declaration, make sure the procedure with the same name hasn't been // declared previously, and consume the `proc` or `export` token. let header = tokens.read().expect("missing procedure header"); let (name, num_locals, is_export) = header.parse_proc()?; - if self.contains_proc_name(name.as_str()) { + if self.contains_proc_name(&name) { return Err(ParsingError::duplicate_proc_name(header, name.as_str())); } let start = *header.location(); @@ -334,14 +332,14 @@ impl ParserContext<'_> { // been declared previously let header = tokens.read().expect("missing procedure header"); let (proc_name, ref_name, module) = header.parse_reexported_proc()?; - if self.contains_proc_name(proc_name.as_str()) { + if self.contains_proc_name(&proc_name) { return Err(ParsingError::duplicate_proc_name(header, proc_name.as_str())); } // check if the module from which the procedure is re-exported was imported let module_path = self - .imports - .get(module) + .import_info + .get_module_path(module) .ok_or(ParsingError::procedure_module_not_imported(header, module))?; // consume the `export` token @@ -369,7 +367,7 @@ impl ParserContext<'_> { /// Nodes are added to the list until `if`, `else`, `while`, `repeat`, `end`, `export`, `proc`, /// or `begin` tokens are encountered, or an error occurs. pub fn parse_body( - &self, + &mut self, tokens: &mut TokenStream, break_on_else: bool, ) -> Result { @@ -434,7 +432,7 @@ impl ParserContext<'_> { // -------------------------------------------------------------------------------------------- /// Parses a token into an instruction node. - fn parse_op_token(&self, op: &Token) -> Result { + fn parse_op_token(&mut self, op: &Token) -> Result { use Instruction::*; // based on the instruction, invoke the correct parser for the operation @@ -632,35 +630,20 @@ impl ParserContext<'_> { /// /// # Errors /// Returns an error if a local procedure with the specified name has not been parsed ye. - fn get_local_proc_index(&self, proc_name: &str, token: &Token) -> Result { - self.local_procs - .get(proc_name) - .ok_or_else(|| ParsingError::undefined_local_proc(token, proc_name)) - .map(|(index, _)| *index) - } - - /// Returns procedure ID of a procedure imported from the specified module. - /// - /// # Errors - /// Return an error if the module with the specified name has not been imported via the `use` - /// statement. - fn get_imported_proc_id( + fn get_local_proc_index( &self, - proc_name: &str, - module_name: &str, + proc_name: ProcedureName, token: &Token, - ) -> Result { - let module_path = self - .imports - .get(module_name) - .ok_or_else(|| ParsingError::procedure_module_not_imported(token, module_name))?; - let proc_id = ProcedureId::from_name(proc_name, module_path); - Ok(proc_id) + ) -> Result { + self.local_procs + .get(&proc_name) + .ok_or_else(|| ParsingError::undefined_local_proc(token, proc_name.as_ref())) + .map(|(index, _)| *index) } /// Returns true if a procedure with the specified name is present in the set of local or /// re-exported procedures. - fn contains_proc_name(&self, proc_name: &str) -> bool { + fn contains_proc_name(&self, proc_name: &ProcedureName) -> bool { self.local_procs.contains_key(proc_name) || self.reexported_procs.contains_key(proc_name) } } diff --git a/assembly/src/ast/parsers/mod.rs b/assembly/src/ast/parsers/mod.rs index 5e7c6f558c..cd1d80bdcc 100644 --- a/assembly/src/ast/parsers/mod.rs +++ b/assembly/src/ast/parsers/mod.rs @@ -1,8 +1,8 @@ use super::{ - bound_into_included_u64, AdviceInjectorNode, BTreeMap, CodeBody, Deserializable, Felt, - Instruction, InvocationTarget, LabelError, LibraryPath, LocalConstMap, LocalProcMap, Node, - ParsingError, ProcedureAst, ProcedureId, ReExportedProcMap, RpoDigest, SliceReader, StarkField, - String, ToString, Token, TokenStream, Vec, MAX_BODY_LEN, MAX_DOCS_LEN, MAX_IMPORTS, + bound_into_included_u64, AdviceInjectorNode, CodeBody, Deserializable, Felt, Instruction, + InvocationTarget, LabelError, LibraryPath, LocalConstMap, LocalProcMap, ModuleImports, Node, + ParsingError, ProcedureAst, ProcedureId, ProcedureName, ReExportedProcMap, RpoDigest, + SliceReader, StarkField, String, ToString, Token, TokenStream, Vec, MAX_BODY_LEN, MAX_DOCS_LEN, MAX_LABEL_LEN, MAX_STACK_WORD_OFFSET, }; use core::{fmt::Display, ops::RangeBounds}; @@ -25,37 +25,6 @@ pub use labels::{ // PARSERS FUNCTIONS // ================================================================================================ -/// Parses all `use` statements into a map of imports which maps a module name (e.g., "u64") to -/// its fully-qualified path (e.g., "std::math::u64"). -pub fn parse_imports( - tokens: &mut TokenStream, -) -> Result, ParsingError> { - let mut imports = BTreeMap::::new(); - // read tokens from the token stream until all `use` tokens are consumed - while let Some(token) = tokens.read() { - match token.parts()[0] { - Token::USE => { - let module_path = token.parse_use()?; - let module_name = module_path.last(); - if imports.contains_key(module_name) { - return Err(ParsingError::duplicate_module_import(token, &module_path)); - } - - imports.insert(module_name.to_string(), module_path); - - // consume the `use` token - tokens.advance(); - } - _ => break, - } - } - - if imports.len() > MAX_IMPORTS { - return Err(ParsingError::too_many_imports(imports.len(), MAX_IMPORTS)); - } - Ok(imports) -} - /// Parses all `const` statements into a map which maps a const name to a value pub fn parse_constants(tokens: &mut TokenStream) -> Result { // instantiate new constant map for this module diff --git a/assembly/src/ast/tests.rs b/assembly/src/ast/tests.rs index 60e4da4a56..bda1166589 100644 --- a/assembly/src/ast/tests.rs +++ b/assembly/src/ast/tests.rs @@ -1,6 +1,7 @@ use super::{ AstSerdeOptions, BTreeMap, CodeBody, Felt, Instruction, LocalProcMap, ModuleAst, Node, - ParsingError, ProcedureAst, ProcedureId, ProgramAst, SourceLocation, Token, + ParsingError, ProcedureAst, ProcedureId, ProcedureName, ProgramAst, SourceLocation, String, + ToString, Token, }; use vm_core::utils::SliceReader; @@ -85,6 +86,10 @@ fn test_ast_parsing_program_u32() { assert_program_output(source, BTreeMap::new(), nodes); } +fn str_to_proc_name(name: &str) -> ProcedureName { + ProcedureName::try_from(name).unwrap() +} + #[test] fn test_ast_parsing_program_proc() { let source = "\ @@ -101,7 +106,7 @@ fn test_ast_parsing_program_proc() { let mut procedures: LocalProcMap = BTreeMap::new(); procedures.insert( - String::from("foo"), + str_to_proc_name("foo"), ( 0, ProcedureAst::new( @@ -118,7 +123,7 @@ fn test_ast_parsing_program_proc() { ), ); procedures.insert( - String::from("bar"), + str_to_proc_name("bar"), ( 1, ProcedureAst::new( @@ -149,7 +154,7 @@ fn test_ast_parsing_module() { end"; let mut procedures: LocalProcMap = BTreeMap::new(); procedures.insert( - String::from("foo"), + str_to_proc_name("foo"), ( 0, ProcedureAst::new( @@ -280,7 +285,7 @@ fn test_ast_parsing_module_nested_if() { let proc_body_locations = [SourceLocation::new(2, 9), SourceLocation::new(3, 9), SourceLocation::new(14, 5)]; procedures.insert( - String::from("foo"), + str_to_proc_name("foo"), ( 0, ProcedureAst::new( @@ -369,7 +374,7 @@ fn test_ast_parsing_module_sequential_if() { SourceLocation::new(14, 5), ]; procedures.insert( - String::from("foo"), + str_to_proc_name("foo"), ( 0, ProcedureAst::new( @@ -564,7 +569,7 @@ This comment is intentionally longer than 256 characters, since we need to be su of the comments is correctly parsed. There was a bug here earlier." .to_string(); procedures.insert( - String::from("foo"), + str_to_proc_name("foo"), ( 0, ProcedureAst::new( @@ -582,7 +587,7 @@ of the comments is correctly parsed. There was a bug here earlier." ); procedures.insert( - String::from("bar"), + str_to_proc_name("bar"), ( 1, ProcedureAst::new( @@ -605,7 +610,7 @@ consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolor aliqua." .to_string(); procedures.insert( - String::from("baz"), + str_to_proc_name("baz"), ( 2, ProcedureAst::new( @@ -647,7 +652,7 @@ of the comments is correctly parsed. There was a bug here earlier." proc ); } - let module_serialized = module.to_bytes(AstSerdeOptions::new(false)); + let module_serialized = module.to_bytes(AstSerdeOptions::new(true)); let module_deserialized = ModuleAst::from_bytes(module_serialized.as_slice()).unwrap(); let module = clear_procs_loc_module(module); @@ -727,7 +732,7 @@ fn test_ast_parsing_module_docs_fail() { #[test] fn test_ast_program_serde_simple() { let source = "begin push.0xabc234 push.0 assertz end"; - assert_correct_program_serialization(source, false); + assert_correct_program_serialization(source, true); } #[test] @@ -743,7 +748,7 @@ fn test_ast_program_serde_local_procs() { exec.foo exec.bar end"; - assert_correct_program_serialization(source, false); + assert_correct_program_serialization(source, true); } #[test] @@ -755,7 +760,7 @@ fn test_ast_program_serde_exported_procs() { export.bar.2 padw end"; - assert_correct_module_serialization(source, false); + assert_correct_module_serialization(source, true); } #[test] @@ -787,7 +792,7 @@ fn test_ast_program_serde_control_flow() { end end"; - assert_correct_program_serialization(source, false); + assert_correct_program_serialization(source, true); } #[test] @@ -966,7 +971,7 @@ fn clear_procs_loc_program(mut program: ProgramAst) -> ProgramAst { /// Serialization of imports is optional, so if they are not serialized, then they have to be /// cleared before testing for equality fn clear_imports_module(module: &mut ModuleAst) { - module.imports.clear(); + module.clear_imports(); } /// Clears the program's imports. @@ -974,7 +979,7 @@ fn clear_imports_module(module: &mut ModuleAst) { /// Serialization of imports is optional, so if they are not serialized, then they have to be /// cleared before testing for equality fn clear_imports_program(program: &mut ProgramAst) { - program.imports.clear(); + program.clear_imports(); } fn assert_correct_program_serialization(source: &str, serialize_imports: bool) { @@ -1005,7 +1010,7 @@ fn assert_correct_program_serialization(source: &str, serialize_imports: bool) { .load_source_locations(&mut SliceReader::new(&locations)) .unwrap(); if !serialize_imports { - program_deserialized.imports = program.imports.clone(); + program_deserialized.import_info = program.import_info.clone(); } assert_eq!(program, program_deserialized); } @@ -1036,7 +1041,7 @@ fn assert_correct_module_serialization(source: &str, serialize_imports: bool) { .load_source_locations(&mut SliceReader::new(&locations)) .unwrap(); if !serialize_imports { - module_deserialized.imports = module.imports.clone(); + module_deserialized.import_info = module.import_info.clone(); } assert_eq!(module, module_deserialized); } diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 9a9c67a1a7..a3c0a34038 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -550,6 +550,20 @@ impl ParsingError { } } + pub fn too_many_imported_procs_invoked( + token: &Token, + num_procs: usize, + max_procs: usize, + ) -> Self { + ParsingError { + message: format!( + "a module cannot invoke more than {max_procs} imported procedures, but had {num_procs}" + ), + location: *token.location(), + op: token.to_string(), + } + } + // IMPORTS AND MODULES // -------------------------------------------------------------------------------------------- diff --git a/assembly/src/library/masl.rs b/assembly/src/library/masl.rs index e248b9c83f..c37f556d18 100644 --- a/assembly/src/library/masl.rs +++ b/assembly/src/library/masl.rs @@ -9,8 +9,9 @@ use core::slice::Iter; // ================================================================================================ // -/// Serialization options for [ModuleAst]. Imports are part of the ModuleAst serialization. -const AST_SERDE_OPTIONS: AstSerdeOptions = AstSerdeOptions { +/// Serialization options for [ModuleAst]. Imports and information about imported procedures are +/// part of the ModuleAst serialization by default. +const AST_DEFAULT_SERDE_OPTIONS: AstSerdeOptions = AstSerdeOptions { serialize_imports: true, }; @@ -250,7 +251,7 @@ mod use_std { let ast = ModuleAst::parse(&contents)?; // add dependencies of this module to the dependencies of this library - for path in ast.imports().values() { + for path in ast.import_paths() { let ns = LibraryNamespace::new(path.first())?; deps.insert(ns); } @@ -290,7 +291,7 @@ impl Serializable for MaslLibrary { LibraryPath::strip_first(&module.path) .expect("module path consists of a single component") .write_into(target); - module.ast.write_into(target, AST_SERDE_OPTIONS); + module.ast.write_into(target, AST_DEFAULT_SERDE_OPTIONS); }); // optionally write the locations into the target. given the modules count is already @@ -321,7 +322,7 @@ impl Deserializable for MaslLibrary { let path = LibraryPath::read_from(source)? .prepend(&namespace) .map_err(|err| DeserializationError::InvalidValue(format!("{err}")))?; - let ast = ModuleAst::read_from(source, AST_SERDE_OPTIONS)?; + let ast = ModuleAst::read_from(source, AST_DEFAULT_SERDE_OPTIONS)?; modules.push(Module { path, ast }); } diff --git a/assembly/src/procedures/mod.rs b/assembly/src/procedures/mod.rs index decc397846..da61695f4c 100644 --- a/assembly/src/procedures/mod.rs +++ b/assembly/src/procedures/mod.rs @@ -131,8 +131,16 @@ impl TryFrom for ProcedureName { type Error = LabelError; fn try_from(name: String) -> Result { + Self::try_from(name.as_ref()) + } +} + +impl TryFrom<&str> for ProcedureName { + type Error = LabelError; + + fn try_from(name: &str) -> Result { Ok(Self { - name: (PROCEDURE_LABEL_PARSER.parse_label(&name)?).to_string(), + name: (PROCEDURE_LABEL_PARSER.parse_label(name)?).to_string(), }) } } From 69f6ccb45bd8281accba5eb36b7c32c0dbfd9764 Mon Sep 17 00:00:00 2001 From: "Augusto F. Hack" Date: Thu, 13 Jul 2023 16:09:07 +0200 Subject: [PATCH 017/120] docs: small word fix --- docs/src/design/stack/main.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/design/stack/main.md b/docs/src/design/stack/main.md index 3c946ec2d4..70ebe67976 100644 --- a/docs/src/design/stack/main.md +++ b/docs/src/design/stack/main.md @@ -98,7 +98,7 @@ If an operation removes an item from the stack, we say that the operation caused ![](../../assets/design/stack/stack_1st_left_shift.png) -Overall, the during the left shift we do the following: +Overall, during the left shift we do the following: * When stack depth is greater than $16$: * Decrement stack depth by $1$. From 532fa20b59aaedf4ca4d2def558e362e4ed068bf Mon Sep 17 00:00:00 2001 From: "Augusto F. Hack" Date: Fri, 7 Jul 2023 16:11:52 +0200 Subject: [PATCH 018/120] cli: add command to compile libraries --- miden/src/cli/bundle.rs | 53 +++++++++++++++++++++++++++++++++++++++++ miden/src/cli/mod.rs | 2 ++ miden/src/main.rs | 2 ++ 3 files changed, 57 insertions(+) create mode 100644 miden/src/cli/bundle.rs diff --git a/miden/src/cli/bundle.rs b/miden/src/cli/bundle.rs new file mode 100644 index 0000000000..e63147d7a4 --- /dev/null +++ b/miden/src/cli/bundle.rs @@ -0,0 +1,53 @@ +use assembly::{LibraryNamespace, MaslLibrary, Version}; +use std::path::PathBuf; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +#[structopt( + name = "Compile Library", + about = "Bundles .masm files into a single .masl library" +)] +pub struct BundleCmd { + /// Path to a directory containg the `.masm` files which are part of the library + #[structopt(parse(from_os_str))] + dir: PathBuf, + /// Defines the top-level namespace, e.g. `mylib`, oherwise the directory name is used. + #[structopt(short, long)] + namespace: Option, + /// Version of you library, defaults to `0.1.0`. + #[structopt(short, long, default_value = "0.1.0")] + version: String, +} + +impl BundleCmd { + pub fn execute(&self) -> Result<(), String> { + println!("============================================================"); + println!("Compile library"); + println!("============================================================"); + + let namespace = match &self.namespace { + Some(namespace) => namespace.to_string(), + None => self + .dir + .file_name() + .expect("dir must be a folder") + .to_string_lossy() + .into_owned(), + }; + + let library_namespace = + LibraryNamespace::try_from(namespace.clone()).expect("invalid base namespace"); + let version = Version::try_from(self.version.as_ref()).expect("invalid cargo version"); + let locations = true; // store & load locations by default + let stdlib = + MaslLibrary::read_from_dir(self.dir.clone(), library_namespace, locations, version) + .map_err(|e| e.to_string())?; + + // write the masl output + stdlib.write_to_dir(self.dir.clone()).map_err(|e| e.to_string())?; + + println!("Compiled library {}", namespace); + + Ok(()) + } +} diff --git a/miden/src/cli/mod.rs b/miden/src/cli/mod.rs index f285d3a73c..af0b6b2d32 100644 --- a/miden/src/cli/mod.rs +++ b/miden/src/cli/mod.rs @@ -1,3 +1,4 @@ +mod bundle; mod compile; mod data; mod debug; @@ -6,6 +7,7 @@ mod repl; mod run; mod verify; +pub use bundle::BundleCmd; pub use compile::CompileCmd; pub use data::InputFile; pub use debug::DebugCmd; diff --git a/miden/src/main.rs b/miden/src/main.rs index eed714b1f9..bc5e370bf6 100644 --- a/miden/src/main.rs +++ b/miden/src/main.rs @@ -20,6 +20,7 @@ pub struct Cli { pub enum Actions { Analyze(tools::Analyze), Compile(cli::CompileCmd), + Bundle(cli::BundleCmd), Debug(cli::DebugCmd), Example(examples::ExampleOptions), Prove(cli::ProveCmd), @@ -35,6 +36,7 @@ impl Cli { match &self.action { Actions::Analyze(analyze) => analyze.execute(), Actions::Compile(compile) => compile.execute(), + Actions::Bundle(compile) => compile.execute(), Actions::Debug(debug) => debug.execute(), Actions::Example(example) => example.execute(), Actions::Prove(prove) => prove.execute(), From 18a1295fcca36e28280ac4b73abefc9bf97eefbc Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 17 Jul 2023 13:40:25 -0700 Subject: [PATCH 019/120] fix: stack depth constraint for syscall operation --- air/src/constraints/stack/mod.rs | 13 +++++++-- air/src/constraints/stack/overflow/mod.rs | 32 +++++++++++++---------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/air/src/constraints/stack/mod.rs b/air/src/constraints/stack/mod.rs index add95e0da3..41ddbbcfec 100644 --- a/air/src/constraints/stack/mod.rs +++ b/air/src/constraints/stack/mod.rs @@ -3,7 +3,7 @@ use super::super::{ TransitionConstraintDegree, CLK_COL_IDX, DECODER_TRACE_OFFSET, FMP_COL_IDX, ONE, STACK_AUX_TRACE_OFFSET, STACK_TRACE_OFFSET, ZERO, }; -use crate::decoder::{IS_CALL_FLAG_COL_IDX, USER_OP_HELPERS_OFFSET}; +use crate::decoder::{IS_CALL_FLAG_COL_IDX, IS_SYSCALL_FLAG_COL_IDX, USER_OP_HELPERS_OFFSET}; use crate::utils::{are_equal, is_binary}; use vm_core::{stack::STACK_TOP_SIZE, utils::collections::Vec, StackOutputs, StarkField}; @@ -33,7 +33,7 @@ pub const NUM_GENERAL_CONSTRAINTS: usize = 17; /// The degrees of constraints in the general stack operations. Each operation being executed /// either shifts the stack to the left, right or doesn't effect it at all. Therefore, majority -/// of the general transtitions of a stack item would be common across the operations and composite +/// of the general transitions of a stack item would be common across the operations and composite /// flags were introduced to compute the individual stack item transition. A particular item lets say /// at depth ith in the next stack frame can be transitioned into from ith depth (no shift op) or /// (i+1)th depth(left shift) or (i-1)th depth(right shift) in the current frame. Therefore, the VM @@ -357,6 +357,10 @@ trait EvaluationFrameExt { /// Returns the value if the `h6` helper register in the decoder which is set to ONE if the /// ending block is a `CALL` block. fn is_call_end(&self) -> E; + + /// Returns the value if the `h7` helper register in the decoder which is set to ONE if the + /// ending block is a `SYSCALL` block. + fn is_syscall_end(&self) -> E; } impl EvaluationFrameExt for &EvaluationFrame { @@ -423,4 +427,9 @@ impl EvaluationFrameExt for &EvaluationFrame { fn is_call_end(&self) -> E { self.current()[DECODER_TRACE_OFFSET + IS_CALL_FLAG_COL_IDX] } + + #[inline] + fn is_syscall_end(&self) -> E { + self.current()[DECODER_TRACE_OFFSET + IS_SYSCALL_FLAG_COL_IDX] + } } diff --git a/air/src/constraints/stack/overflow/mod.rs b/air/src/constraints/stack/overflow/mod.rs index d9b203144c..0761a93846 100644 --- a/air/src/constraints/stack/overflow/mod.rs +++ b/air/src/constraints/stack/overflow/mod.rs @@ -43,13 +43,13 @@ pub fn enforce_constraints( ) -> usize { let mut index = 0; - // Enforce constaints of the stack depth transition. + // Enforce constraints of the stack depth transition. index += enforce_stack_depth_constraints(frame, result, op_flag); - // Enforce constaints of the overflow flag constraints. + // Enforce constraints of the overflow flag constraints. index += enforce_overflow_flag_constraints(frame, &mut result[index..], op_flag); - // Enforce constaints of the stack bookeeping b1 item. + // Enforce constraints of the stack bookkeeping b1 item. index += enforce_overflow_index_constraints(frame, &mut result[index..], op_flag); index @@ -62,12 +62,13 @@ pub fn enforce_constraints( /// following constraints are enforced: /// - If the operation is a no shift op, then, depth wouldn't change. /// - If the operation is a right shift op, then, depth should increment by 1. -/// - If the operation is a left shift op, then, depth should be decresed by 1 provided the existing -/// depth of the stack is not 16. In the case of depth being 16, depth will not be updated. -/// - If the current op being executed is `CALL`, then, the depth should be reseted to 16. +/// - If the operation is a left shift op, then, depth should be decreased by 1 provided the +/// existing depth of the stack is not 16. In the case of depth being 16, depth will not be +/// updated. +/// - If the current op being executed is `CALL` or `SYSCALL`, then the depth should be reset to 16. /// -/// TODO- This skips the operation when `END` is exiting a `CALL` block. It should be handled later in -/// multiset constraints. +/// TODO: This skips the operation when `END` is exiting for a `CALL` or a `SYSCALL` block. It +/// should be handled later in multiset constraints. pub fn enforce_stack_depth_constraints( frame: &EvaluationFrame, result: &mut [E], @@ -75,13 +76,16 @@ pub fn enforce_stack_depth_constraints( ) -> usize { let depth = frame.stack_depth(); let depth_next = frame.stack_depth_next(); - let no_shift_part = - (depth_next - depth) * (E::ONE - op_flag.call() - (op_flag.end() * frame.is_call_end())); + + let call_or_syscall = op_flag.call() + op_flag.syscall(); + let call_or_syscall_end = op_flag.end() * (frame.is_call_end() + frame.is_syscall_end()); + + let no_shift_part = (depth_next - depth) * (E::ONE - call_or_syscall - call_or_syscall_end); let left_shift_part = op_flag.left_shift() * op_flag.overflow(); let right_shift_part = op_flag.right_shift(); - let call_part = op_flag.call() * (depth_next - E::from(16u32)); + let call_part = call_or_syscall * (depth_next - E::from(16u32)); - // Enforces constraints of the transtition of depth of the stack. + // Enforces constraints of the transition of depth of the stack. result[0] = no_shift_part + left_shift_part - right_shift_part + call_part; 1 @@ -116,11 +120,11 @@ pub fn enforce_overflow_index_constraints( let overflow_next = frame.stack_overflow_addr_next(); let last_stack_item_next = frame.stack_item_next(15); - // enforces that the bookeeping index b1 is set to the current clk value. + // enforces that the bookkeeping index b1 is set to the current clk value. result[0] = (overflow_next - frame.clk()) * op_flag.right_shift(); // enforces that the last stack item in the next frame has been updated with z ZERO when the - // depth of the stack is 16 and the current operatio being executed is a left shift op. + // depth of the stack is 16 and the current operation being executed is a left shift op. result[1] = (E::ONE - op_flag.overflow()) * op_flag.left_shift() * last_stack_item_next; 1 From 09186fd5298b93b98d3ab66a0c4eb6a005049ab8 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 17 Jul 2023 20:38:12 -0700 Subject: [PATCH 020/120] fix: typos in bundle command --- miden/src/cli/bundle.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/miden/src/cli/bundle.rs b/miden/src/cli/bundle.rs index e63147d7a4..89819b81e3 100644 --- a/miden/src/cli/bundle.rs +++ b/miden/src/cli/bundle.rs @@ -8,13 +8,13 @@ use structopt::StructOpt; about = "Bundles .masm files into a single .masl library" )] pub struct BundleCmd { - /// Path to a directory containg the `.masm` files which are part of the library + /// Path to a directory containing the `.masm` files which are part of the library. #[structopt(parse(from_os_str))] dir: PathBuf, - /// Defines the top-level namespace, e.g. `mylib`, oherwise the directory name is used. + /// Defines the top-level namespace, e.g. `mylib`, otherwise the directory name is used. #[structopt(short, long)] namespace: Option, - /// Version of you library, defaults to `0.1.0`. + /// Version of the library, defaults to `0.1.0`. #[structopt(short, long, default_value = "0.1.0")] version: String, } @@ -22,7 +22,7 @@ pub struct BundleCmd { impl BundleCmd { pub fn execute(&self) -> Result<(), String> { println!("============================================================"); - println!("Compile library"); + println!("Build library"); println!("============================================================"); let namespace = match &self.namespace { @@ -38,15 +38,19 @@ impl BundleCmd { let library_namespace = LibraryNamespace::try_from(namespace.clone()).expect("invalid base namespace"); let version = Version::try_from(self.version.as_ref()).expect("invalid cargo version"); - let locations = true; // store & load locations by default - let stdlib = - MaslLibrary::read_from_dir(self.dir.clone(), library_namespace, locations, version) - .map_err(|e| e.to_string())?; + let with_source_locations = true; + let stdlib = MaslLibrary::read_from_dir( + self.dir.clone(), + library_namespace, + with_source_locations, + version, + ) + .map_err(|e| e.to_string())?; // write the masl output stdlib.write_to_dir(self.dir.clone()).map_err(|e| e.to_string())?; - println!("Compiled library {}", namespace); + println!("Built library {}", namespace); Ok(()) } From a7c35cce430ae22f886067a29ee23ca63514ef48 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 17 Jul 2023 20:48:51 -0700 Subject: [PATCH 021/120] fix: new clippy errors --- assembly/src/assembler/span_builder.rs | 2 +- assembly/src/library/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assembly/src/assembler/span_builder.rs b/assembly/src/assembler/span_builder.rs index a711e24c29..44aadfdf0b 100644 --- a/assembly/src/assembler/span_builder.rs +++ b/assembly/src/assembler/span_builder.rs @@ -98,7 +98,7 @@ impl SpanBuilder { /// /// This indicates that the provided instruction should be tracked and the cycle count for /// this instruction will be computed when the call to set_instruction_cycle_count() is made. - pub fn track_instruction(&mut self, instruction: &Instruction, ctx: &mut AssemblyContext) { + pub fn track_instruction(&mut self, instruction: &Instruction, ctx: &AssemblyContext) { let context_name = ctx.current_context_name().to_string(); let num_cycles = 0; let op = instruction.to_string(); diff --git a/assembly/src/library/mod.rs b/assembly/src/library/mod.rs index c5b1ee4be0..e74809bfc1 100644 --- a/assembly/src/library/mod.rs +++ b/assembly/src/library/mod.rs @@ -152,7 +152,7 @@ impl Module { impl PartialOrd for Module { fn partial_cmp(&self, other: &Self) -> Option { - self.path.partial_cmp(&other.path) + Some(self.cmp(other)) } } From f2d9e8f4c63e7810a56e97e7f3842b21009feb7d Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Tue, 18 Jul 2023 22:35:00 +0300 Subject: [PATCH 022/120] Add execution options for processor and prover (#991) * feat: implement ExecutionOptions for the processor and prover * refactor: move to another file, add validation * refactor: improve comments, names and format --- air/src/errors.rs | 27 +++++ air/src/lib.rs | 8 +- air/src/options.rs | 169 +++++++++++++++++++++++++++++ air/src/proof.rs | 100 +---------------- miden/README.md | 16 ++- miden/benches/program_execution.rs | 10 +- miden/src/cli/prove.rs | 38 +++++-- miden/src/cli/run.rs | 25 ++++- miden/src/examples/mod.rs | 10 +- miden/src/lib.rs | 2 +- processor/README.md | 9 +- processor/src/lib.rs | 3 + prover/README.md | 6 +- prover/src/gpu.rs | 4 +- prover/src/lib.rs | 17 ++- stdlib/tests/crypto/stark/mod.rs | 4 +- test-utils/src/lib.rs | 23 ++-- 17 files changed, 318 insertions(+), 153 deletions(-) create mode 100644 air/src/errors.rs create mode 100644 air/src/options.rs diff --git a/air/src/errors.rs b/air/src/errors.rs new file mode 100644 index 0000000000..b8c9114653 --- /dev/null +++ b/air/src/errors.rs @@ -0,0 +1,27 @@ +use super::String; +use core::fmt::{Display, Formatter}; + +// EXECUTION ERROR +// ================================================================================================ + +#[derive(Debug)] +pub enum ExecutionOptionsError { + ExpectedCyclesTooBig(u32, u32), + OtherErrors(String), +} + +impl Display for ExecutionOptionsError { + fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), core::fmt::Error> { + use ExecutionOptionsError::*; + + match self { + ExpectedCyclesTooBig(max, expected) => { + write!(f, "The expected number of cycles must be smaller than the maximum number of cycles: maximum is {max}, but expectd is {expected}") + } + OtherErrors(error) => write!(f, "{error}"), + } + } +} + +#[cfg(feature = "std")] +impl std::error::Error for ExecutionOptionsError {} diff --git a/air/src/lib.rs b/air/src/lib.rs index 4e5c1bcb5a..18c667e2ad 100644 --- a/air/src/lib.rs +++ b/air/src/lib.rs @@ -5,7 +5,7 @@ extern crate alloc; use vm_core::{ - utils::{collections::Vec, ByteWriter, Serializable}, + utils::{collections::Vec, string::String, ByteWriter, Serializable}, ExtensionOf, ProgramInfo, StackInputs, StackOutputs, ONE, ZERO, }; use winter_air::{ @@ -20,6 +20,8 @@ use constraints::{chiplets, range}; pub mod trace; use trace::*; +mod errors; +mod options; mod proof; mod utils; @@ -28,7 +30,9 @@ use utils::TransitionConstraintRange; // EXPORTS // ================================================================================================ -pub use proof::{ExecutionProof, HashFunction, ProofOptions}; +pub use errors::ExecutionOptionsError; +pub use options::{ExecutionOptions, ProvingOptions}; +pub use proof::{ExecutionProof, HashFunction}; pub use vm_core::{ utils::{DeserializationError, ToElements}, Felt, FieldElement, StarkField, diff --git a/air/src/options.rs b/air/src/options.rs new file mode 100644 index 0000000000..b94e3536c4 --- /dev/null +++ b/air/src/options.rs @@ -0,0 +1,169 @@ +use super::{ExecutionOptionsError, HashFunction}; +use winter_air::{FieldExtension, ProofOptions as WinterProofOptions}; + +// PROVING OPTIONS +// ================================================================================================ + +/// A set of parameters specifying how Miden VM execution proofs are to be generated. +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct ProvingOptions { + pub exec_options: ExecutionOptions, + pub proof_options: WinterProofOptions, + pub hash_fn: HashFunction, +} + +impl ProvingOptions { + // CONSTRUCTOR + // -------------------------------------------------------------------------------------------- + + /// Creates a new instance of [ProvingOptions] from the specified parameters. + pub fn new( + num_queries: usize, + blowup_factor: usize, + grinding_factor: u32, + field_extension: FieldExtension, + fri_folding_factor: usize, + fri_remainder_max_degree: usize, + hash_fn: HashFunction, + ) -> Self { + let proof_options = WinterProofOptions::new( + num_queries, + blowup_factor, + grinding_factor, + field_extension, + fri_folding_factor, + fri_remainder_max_degree, + ); + let exec_options = ExecutionOptions::default(); + Self { + exec_options, + proof_options, + hash_fn, + } + } + + /// Creates a new preset instance of [ProvingOptions] targeting 96-bit security level. + /// + /// If `recursive` flag is set to true, proofs will be generated using an arithmetization- + /// friendly hash function (RPO). Such proofs are well-suited for recursive proof verification, + /// but may take significantly longer to generate. + pub fn with_96_bit_security(recursive: bool) -> Self { + if recursive { + let proof_options = WinterProofOptions::new(27, 8, 16, FieldExtension::Quadratic, 4, 7); + Self { + exec_options: ExecutionOptions::default(), + proof_options, + hash_fn: HashFunction::Rpo256, + } + } else { + let proof_options = + WinterProofOptions::new(27, 8, 16, FieldExtension::Quadratic, 8, 255); + Self { + exec_options: ExecutionOptions::default(), + proof_options, + hash_fn: HashFunction::Blake3_192, + } + } + } + + /// Creates a new preset instance of [ProvingOptions] targeting 128-bit security level. + /// + /// If `recursive` flag is set to true, proofs will be generated using an arithmetization- + /// friendly hash function (RPO). Such proofs are well-suited for recursive proof verification, + /// but may take significantly longer to generate. + pub fn with_128_bit_security(recursive: bool) -> Self { + if recursive { + let proof_options = WinterProofOptions::new(27, 16, 21, FieldExtension::Cubic, 4, 7); + Self { + exec_options: ExecutionOptions::default(), + proof_options, + hash_fn: HashFunction::Rpo256, + } + } else { + let proof_options = WinterProofOptions::new(27, 16, 21, FieldExtension::Cubic, 8, 255); + Self { + exec_options: ExecutionOptions::default(), + proof_options, + hash_fn: HashFunction::Blake3_256, + } + } + } + + /// Sets [ExecutionOptions] for this [ProvingOptions]. + /// + /// This sets the maximum number of cycles a program is allowed to execute as well as + /// the number of cycles the program is expected to execute. + pub fn with_execution_options(mut self, exec_options: ExecutionOptions) -> Self { + self.exec_options = exec_options; + self + } + + // PUBLIC ACCESSORS + // -------------------------------------------------------------------------------------------- + + /// Returns the hash function to be used in STARK proof generation. + pub const fn hash_fn(&self) -> HashFunction { + self.hash_fn + } + + /// Returns the execution options specified for this [ProvingOptions] + pub const fn execution_options(&self) -> &ExecutionOptions { + &self.exec_options + } +} + +impl Default for ProvingOptions { + fn default() -> Self { + Self::with_96_bit_security(false) + } +} + +impl From for WinterProofOptions { + fn from(options: ProvingOptions) -> Self { + options.proof_options + } +} + +// EXECUTION OPTIONS +// ================================================================================================ + +/// A set of parameters specifying execution parameters of the VM. +/// +/// - `max_cycles` specifies the maximum number of cycles a program is allowed to execute. +/// - `expected_cycles` specifies the number of cycles a program is expected to execute. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ExecutionOptions { + max_cycles: Option, + expected_cycles: u32, +} + +impl Default for ExecutionOptions { + fn default() -> Self { + ExecutionOptions { + max_cycles: None, + expected_cycles: 64, + } + } +} + +impl ExecutionOptions { + // CONSTRUCTOR + // -------------------------------------------------------------------------------------------- + + /// Creates a new instance of [ExecutionOptions] from the specified parameters. + pub fn new( + max_cycles: Option, + expected_cycles: u32, + ) -> Result { + if max_cycles.is_some_and(|max_cycles| max_cycles < expected_cycles) { + return Err(ExecutionOptionsError::ExpectedCyclesTooBig( + max_cycles.unwrap(), + expected_cycles, + )); + } + Ok(ExecutionOptions { + max_cycles, + expected_cycles, + }) + } +} diff --git a/air/src/proof.rs b/air/src/proof.rs index abca3611f3..7f83908a51 100644 --- a/air/src/proof.rs +++ b/air/src/proof.rs @@ -3,7 +3,7 @@ use vm_core::{ crypto::hash::{Blake3_192, Blake3_256, Hasher, Rpo256}, utils::collections::Vec, }; -use winter_air::{proof::StarkProof, FieldExtension, ProofOptions as WinterProofOptions}; +use winter_air::proof::StarkProof; // EXECUTION PROOF // ================================================================================================ @@ -81,104 +81,6 @@ impl ExecutionProof { } } -// PROOF OPTIONS -// ================================================================================================ - -/// A set of parameters specifying how Miden VM execution proofs are to be generated. -#[derive(Debug, Clone, Eq, PartialEq)] -pub struct ProofOptions { - pub options: WinterProofOptions, - pub hash_fn: HashFunction, -} - -impl ProofOptions { - // CONSTRUCTOR - // -------------------------------------------------------------------------------------------- - - /// Creates a new instance of [ProofOptions] from the specified parameters. - pub fn new( - num_queries: usize, - blowup_factor: usize, - grinding_factor: u32, - field_extension: FieldExtension, - fri_folding_factor: usize, - fri_max_remainder_size: usize, - hash_fn: HashFunction, - ) -> Self { - let options = WinterProofOptions::new( - num_queries, - blowup_factor, - grinding_factor, - field_extension, - fri_folding_factor, - fri_max_remainder_size, - ); - Self { options, hash_fn } - } - - /// Creates a new preset instance of [ProofOptions] targeting 96-bit security level. - /// - /// If `recursive` flag is set to true, proofs will be generated using an arithmetization- - /// friendly hash function (RPO). Such proofs are well-suited for recursive proof verification, - /// but may take significantly longer to generate. - pub fn with_96_bit_security(recursive: bool) -> Self { - if recursive { - let options = WinterProofOptions::new(27, 8, 16, FieldExtension::Quadratic, 4, 7); - Self { - hash_fn: HashFunction::Rpo256, - options, - } - } else { - let options = WinterProofOptions::new(27, 8, 16, FieldExtension::Quadratic, 8, 255); - Self { - hash_fn: HashFunction::Blake3_192, - options, - } - } - } - - /// Creates a new preset instance of [ProofOptions] targeting 128-bit security level. - /// - /// If `recursive` flag is set to true, proofs will be generated using an arithmetization- - /// friendly hash function (RPO). Such proofs are well-suited for recursive proof verification, - /// but may take significantly longer to generate. - pub fn with_128_bit_security(recursive: bool) -> Self { - if recursive { - let options = WinterProofOptions::new(27, 16, 21, FieldExtension::Cubic, 4, 7); - Self { - hash_fn: HashFunction::Rpo256, - options, - } - } else { - let options = WinterProofOptions::new(27, 16, 21, FieldExtension::Cubic, 8, 255); - Self { - hash_fn: HashFunction::Blake3_256, - options, - } - } - } - - // PUBLIC ACCESSORS - // -------------------------------------------------------------------------------------------- - - /// Returns the hash function to be used in STARK proof generation. - pub const fn hash_fn(&self) -> HashFunction { - self.hash_fn - } -} - -impl Default for ProofOptions { - fn default() -> Self { - Self::with_96_bit_security(false) - } -} - -impl From for WinterProofOptions { - fn from(options: ProofOptions) -> Self { - options.options - } -} - // HASH FUNCTION // ================================================================================================ diff --git a/miden/README.md b/miden/README.md index 9efe8ec4c8..4d7ac47db9 100644 --- a/miden/README.md +++ b/miden/README.md @@ -42,6 +42,7 @@ The `execute_iter()` function returns a `VmStateIterator` which can be used to i For example: ```rust use miden::{Assembler, execute, execute_iter, MemAdviceProvider, StackInputs}; +use processor::ExecutionOptions; // instantiate the assembler let assembler = Assembler::default(); @@ -55,8 +56,11 @@ let stack_inputs = StackInputs::default(); // instantiate an empty advice provider let mut advice_provider = MemAdviceProvider::default(); +// instantiate default execution options +let exec_options = ExecutionOptions::default(); + // execute the program with no inputs -let trace = execute(&program, stack_inputs.clone(), &mut advice_provider).unwrap(); +let trace = execute(&program, stack_inputs.clone(), &mut advice_provider, exec_options).unwrap(); // now, execute the same program in debug mode and iterate over VM states for vm_state in execute_iter(&program, stack_inputs, advice_provider) { @@ -73,7 +77,7 @@ To execute a program on Miden VM and generate a proof that the program was execu * `program: &Program` - a reference to a Miden program to be executed. * `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. * `advice_provider: AdviceProvider` - an instance of an advice provider that yields secret, non-deterministic inputs to the prover. -* `options: ProofOptions` - config parameters for proof generation. The default options target 96-bit security level. +* `options: ProvingOptions` - config parameters for proof generation. The default options target 96-bit security level. If the program is executed successfully, the function returns a tuple with 2 elements: @@ -83,7 +87,7 @@ If the program is executed successfully, the function returns a tuple with 2 ele #### Proof generation example Here is a simple example of executing a program which pushes two numbers onto the stack and computes their sum: ```rust -use miden::{Assembler, MemAdviceProvider, ProofOptions, prove, StackInputs}; +use miden::{Assembler, MemAdviceProvider, ProvingOptions, prove, StackInputs}; // instantiate the assembler let assembler = Assembler::default(); @@ -96,7 +100,7 @@ let (outputs, proof) = prove( &program, StackInputs::default(), // we won't provide any inputs MemAdviceProvider::default(), // we won't provide advice inputs - ProofOptions::default(), // we'll be using default options + ProvingOptions::default(), // we'll be using default options ) .unwrap(); @@ -155,7 +159,7 @@ add // stack state: 3 2 ``` Notice that except for the first 2 operations which initialize the stack, the sequence of `swap dup.1 add` operations repeats over and over. In fact, we can repeat these operations an arbitrary number of times to compute an arbitrary Fibonacci number. In Rust, it would look like this (this is actually a simplified version of the example in [fibonacci.rs](src/examples/src/fibonacci.rs)): ```rust -use miden::{Assembler, MemAdviceProvider, ProofOptions, StackInputs}; +use miden::{Assembler, MemAdviceProvider, ProvingOptions, StackInputs}; // set the number of terms to compute let n = 50; @@ -183,7 +187,7 @@ let (outputs, proof) = miden::prove( &program, stack_inputs, advice_provider, - ProofOptions::default(), // use default proof options + ProvingOptions::default(), // use default proving options ) .unwrap(); diff --git a/miden/benches/program_execution.rs b/miden/benches/program_execution.rs index bde9b3e4b6..51ba1f01b8 100644 --- a/miden/benches/program_execution.rs +++ b/miden/benches/program_execution.rs @@ -1,5 +1,6 @@ use criterion::{criterion_group, criterion_main, Criterion}; use miden::{execute, Assembler, MemAdviceProvider, StackInputs}; +use processor::ExecutionOptions; use std::time::Duration; use stdlib::StdLibrary; @@ -18,7 +19,14 @@ fn program_execution(c: &mut Criterion) { .with_library(&StdLibrary::default()) .expect("failed to load stdlib"); let program = assembler.compile(source).expect("Failed to compile test source."); - bench.iter(|| execute(&program, StackInputs::default(), MemAdviceProvider::default())); + bench.iter(|| { + execute( + &program, + StackInputs::default(), + MemAdviceProvider::default(), + ExecutionOptions::default(), + ) + }); }); group.finish(); diff --git a/miden/src/cli/prove.rs b/miden/src/cli/prove.rs index b06dc55e5b..2f90800e57 100644 --- a/miden/src/cli/prove.rs +++ b/miden/src/cli/prove.rs @@ -1,5 +1,6 @@ use super::data::{Debug, InputFile, Libraries, OutputFile, ProgramFile, ProofFile}; -use miden::ProofOptions; +use miden::ProvingOptions; +use processor::{ExecutionOptions, ExecutionOptionsError}; use std::{io::Write, path::PathBuf, time::Instant}; use structopt::StructOpt; @@ -11,10 +12,22 @@ pub struct ProveCmd { #[structopt(short = "a", long = "assembly", parse(from_os_str))] assembly_file: PathBuf, + /// Number of cycles the program is expected to consume + #[structopt(short = "e", long = "exp-cycles", default_value = "64")] + expected_cycles: u32, + /// Path to input file #[structopt(short = "i", long = "input", parse(from_os_str))] input_file: Option, + /// Paths to .masl library files + #[structopt(short = "l", long = "libraries", parse(from_os_str))] + library_paths: Vec, + + /// Maximum number of cycles a program is allowed to consume + #[structopt(short = "m", long = "max-cycles")] + max_cycles: Option, + /// Number of outputs #[structopt(short = "n", long = "num-outputs", default_value = "16")] num_outputs: usize, @@ -27,24 +40,23 @@ pub struct ProveCmd { #[structopt(short = "p", long = "proof", parse(from_os_str))] proof_file: Option, - /// Security level for execution proofs generated by the VM - #[structopt(short = "s", long = "security", default_value = "96bits")] - security: String, - /// Enable generation of proofs suitable for recursive verification #[structopt(short = "r", long = "recursive")] recursive: bool, - /// Paths to .masl library files - #[structopt(short = "l", long = "libraries", parse(from_os_str))] - library_paths: Vec, + /// Security level for execution proofs generated by the VM + #[structopt(short = "s", long = "security", default_value = "96bits")] + security: String, } impl ProveCmd { - pub fn get_proof_options(&self) -> ProofOptions { + pub fn get_proof_options(&self) -> Result { + let exec_options = ExecutionOptions::new(self.max_cycles, self.expected_cycles)?; match self.security.as_str() { - "96bits" => ProofOptions::with_96_bit_security(self.recursive), - "128bits" => ProofOptions::with_128_bit_security(self.recursive), + "96bits" => Ok(ProvingOptions::with_96_bit_security(self.recursive) + .with_execution_options(exec_options)), + "128bits" => Ok(ProvingOptions::with_128_bit_security(self.recursive) + .with_execution_options(exec_options)), other => panic!("{} is not a valid security setting", other), } } @@ -77,9 +89,11 @@ impl ProveCmd { let stack_inputs = input_data.parse_stack_inputs()?; let advice_provider = input_data.parse_advice_provider()?; + let proving_options = self.get_proof_options().map_err(|err| format!("{err}"))?; + // execute program and generate proof let (stack_outputs, proof) = - prover::prove(&program, stack_inputs, advice_provider, self.get_proof_options()) + prover::prove(&program, stack_inputs, advice_provider, proving_options) .map_err(|err| format!("Failed to prove program - {:?}", err))?; println!( diff --git a/miden/src/cli/run.rs b/miden/src/cli/run.rs index e8423c0567..78535d63e9 100644 --- a/miden/src/cli/run.rs +++ b/miden/src/cli/run.rs @@ -1,4 +1,5 @@ use super::data::{Debug, InputFile, Libraries, OutputFile, ProgramFile}; +use processor::ExecutionOptions; use std::{path::PathBuf, time::Instant}; use structopt::StructOpt; @@ -8,18 +9,30 @@ pub struct RunCmd { /// Path to .masm assembly file #[structopt(short = "a", long = "assembly", parse(from_os_str))] assembly_file: PathBuf, + + /// Number of cycles the program is expected to consume + #[structopt(short = "e", long = "exp-cycles", default_value = "64")] + expected_cycles: u32, + /// Path to input file #[structopt(short = "i", long = "input", parse(from_os_str))] input_file: Option, + + /// Paths to .masl library files + #[structopt(short = "l", long = "libraries", parse(from_os_str))] + library_paths: Vec, + + /// Maximum number of cycles a program is allowed to consume + #[structopt(short = "m", long = "max-cycles")] + max_cycles: Option, + /// Number of ouptuts #[structopt(short = "n", long = "num-outputs", default_value = "16")] num_outputs: usize, + /// Path to output file #[structopt(short = "o", long = "output", parse(from_os_str))] output_file: Option, - /// Paths to .masl library files - #[structopt(short = "l", long = "libraries", parse(from_os_str))] - library_paths: Vec, } impl RunCmd { @@ -37,6 +50,10 @@ impl RunCmd { // load input data from file let input_data = InputFile::read(&self.input_file, &self.assembly_file)?; + // get execution options + let execution_options = ExecutionOptions::new(self.max_cycles, self.expected_cycles) + .map_err(|err| format!("{err}"))?; + // fetch the stack and program inputs from the arguments let stack_inputs = input_data.parse_stack_inputs()?; let advice_provider = input_data.parse_advice_provider()?; @@ -46,7 +63,7 @@ impl RunCmd { let now = Instant::now(); // execute program and generate outputs - let trace = processor::execute(&program, stack_inputs, advice_provider) + let trace = processor::execute(&program, stack_inputs, advice_provider, execution_options) .map_err(|err| format!("Failed to generate exection trace = {:?}", err))?; println!("done ({} steps in {} ms)", trace.get_trace_len(), now.elapsed().as_millis()); diff --git a/miden/src/examples/mod.rs b/miden/src/examples/mod.rs index 6cd9a1452a..93c0c50b9b 100644 --- a/miden/src/examples/mod.rs +++ b/miden/src/examples/mod.rs @@ -1,4 +1,4 @@ -use miden::{AdviceProvider, ExecutionProof, Program, ProgramInfo, ProofOptions, StackInputs}; +use miden::{AdviceProvider, ExecutionProof, Program, ProgramInfo, ProvingOptions, StackInputs}; use std::io::Write; use std::time::Instant; use structopt::StructOpt; @@ -49,10 +49,10 @@ pub enum ExampleType { } impl ExampleOptions { - pub fn get_proof_options(&self) -> ProofOptions { + pub fn get_proof_options(&self) -> ProvingOptions { match self.security.as_str() { - "96bits" => ProofOptions::with_96_bit_security(self.recursive), - "128bits" => ProofOptions::with_128_bit_security(self.recursive), + "96bits" => ProvingOptions::with_96_bit_security(self.recursive), + "128bits" => ProvingOptions::with_128_bit_security(self.recursive), other => panic!("{} is not a valid security level", other), } } @@ -139,7 +139,7 @@ where } = example; let (mut outputs, proof) = - miden::prove(&program, stack_inputs.clone(), advice_provider, ProofOptions::default()) + miden::prove(&program, stack_inputs.clone(), advice_provider, ProvingOptions::default()) .unwrap(); assert_eq!( diff --git a/miden/src/lib.rs b/miden/src/lib.rs index c4f052544d..816c1ca81b 100644 --- a/miden/src/lib.rs +++ b/miden/src/lib.rs @@ -12,6 +12,6 @@ pub use processor::{ }; pub use prover::{ math, prove, Digest, ExecutionProof, FieldExtension, HashFunction, InputError, Program, - ProofOptions, StackOutputs, StarkProof, Word, + ProvingOptions, StackOutputs, StarkProof, Word, }; pub use verifier::{verify, VerificationError}; diff --git a/processor/README.md b/processor/README.md index 1b89293af8..643c7e71a5 100644 --- a/processor/README.md +++ b/processor/README.md @@ -15,7 +15,7 @@ The `execute_iter()` function returns a `VmStateIterator` which can be used to i For example: ```Rust use miden_assembly::Assembler; -use miden_processor::{execute, execute_iter, MemAdviceProvider, StackInputs}; +use miden_processor::{execute, execute_iter, ExecutionOptions, MemAdviceProvider, StackInputs, }; // instantiate the assembler let assembler = Assembler::default(); @@ -29,11 +29,14 @@ let stack_inputs = StackInputs::default(); // instantiate an empty advice provider let mut advice_provider = MemAdviceProvider::default(); +// instantiate default execution options +let exec_options = ExecutionOptions::default(); + // execute the program with no inputs -let trace = execute(&program, stack_inputs.clone(), &mut advice_provider).unwrap(); +let trace = execute(&program, stack_inputs.clone(), &mut advice_provider, exec_options).unwrap(); // now, execute the same program in debug mode and iterate over VM states -for vm_state in execute_iter(&program, stack_inputs, advice_provider) { +for vm_state in execute_iter(&program, stack_inputs, advice_provider, exec_options) { match vm_state { Ok(vm_state) => println!("{:?}", vm_state), Err(_) => println!("something went terribly wrong!"), diff --git a/processor/src/lib.rs b/processor/src/lib.rs index be4b4c7e9a..c6eb96107f 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -8,6 +8,7 @@ use miden_air::trace::{ CHIPLETS_WIDTH, DECODER_TRACE_WIDTH, MIN_TRACE_LEN, RANGE_CHECK_TRACE_WIDTH, STACK_TRACE_WIDTH, SYS_TRACE_WIDTH, }; +pub use miden_air::{ExecutionOptions, ExecutionOptionsError}; pub use vm_core::{ chiplets::hasher::Digest, errors::InputError, utils::DeserializationError, AssemblyOp, Kernel, Operation, Program, ProgramInfo, QuadExtension, StackInputs, StackOutputs, Word, @@ -111,11 +112,13 @@ pub fn execute
      ( program: &Program, stack_inputs: StackInputs, advice_provider: A, + _options: ExecutionOptions, ) -> Result where A: AdviceProvider, { let mut process = Process::new(program.kernel().clone(), stack_inputs, advice_provider); + // TODO: use ExecutionOptions to limit program execution let stack_outputs = process.execute(program)?; let trace = ExecutionTrace::new(process, stack_outputs); assert_eq!(&program.hash(), trace.program_hash(), "inconsistent program hash"); diff --git a/prover/README.md b/prover/README.md index 43193963a0..e26405a4d4 100644 --- a/prover/README.md +++ b/prover/README.md @@ -7,7 +7,7 @@ This crate exposes a `prove()` function which can be used to execute Miden VM pr * `program: &Program` - a reference to a Miden program to be executed. * `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. * `advice_provider: AdviceProvider` - an instance of an advice provider that yields secret, non-deterministic inputs to the prover. -* `options: &ProofOptions` - config parameters for proof generation. The default options target 96-bit security level. +* `options: &ProvingOptions` - config parameters for proof generation. The default options target 96-bit security level. If the program is executed successfully, the function returns a tuple with 2 elements: @@ -18,7 +18,7 @@ If the program is executed successfully, the function returns a tuple with 2 ele Here is a simple example of executing a program which pushes two numbers onto the stack and computes their sum: ```Rust use miden_assembly::Assembler; -use miden_prover::{prove, ProofOptions, StackInputs, MemAdviceProvider}; +use miden_prover::{prove, ProvingOptions, StackInputs, MemAdviceProvider}; // instantiate the assembler let assembler = Assembler::default(); @@ -31,7 +31,7 @@ let (outputs, proof) = prove( &program, StackInputs::default(), // we won't provide any stack inputs MemAdviceProvider::default(), // we won't provide any advice values - &ProofOptions::default(), // we'll be using default options + &ProvingOptions::default(), // we'll be using default options ) .unwrap(); diff --git a/prover/src/gpu.rs b/prover/src/gpu.rs index a7811f6a54..6c15c40402 100644 --- a/prover/src/gpu.rs +++ b/prover/src/gpu.rs @@ -324,7 +324,7 @@ where #[cfg(test)] mod tests { use super::*; - use air::{ProofOptions, StarkField}; + use air::{ProvingOptions, StarkField}; use processor::{crypto::RpoRandomCoin, StackInputs, StackOutputs}; use winter_prover::math::fields::CubeExtension; @@ -404,7 +404,7 @@ mod tests { fn create_test_prover() -> ExecutionProver { ExecutionProver::new( - ProofOptions::with_128_bit_security(true), + ProvingOptions::with_128_bit_security(true), StackInputs::default(), StackOutputs::default(), ) diff --git a/prover/src/lib.rs b/prover/src/lib.rs index d3061fbce4..0f379e2634 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -24,7 +24,7 @@ mod gpu; // EXPORTS // ================================================================================================ -pub use air::{DeserializationError, ExecutionProof, FieldExtension, HashFunction, ProofOptions}; +pub use air::{DeserializationError, ExecutionProof, FieldExtension, HashFunction, ProvingOptions}; pub use processor::{ crypto, math, utils, AdviceInputs, AdviceProvider, Digest, ExecutionError, InputError, MemAdviceProvider, Program, StackInputs, StackOutputs, Word, @@ -34,8 +34,8 @@ pub use winter_prover::StarkProof; // PROVER // ================================================================================================ -/// Executes and proves the specified `program` and returns the result together with a STARK-based proof of -/// the program's execution. +/// Executes and proves the specified `program` and returns the result together with a STARK-based +/// proof of the program's execution. /// /// * `inputs` specifies the initial state of the stack as well as non-deterministic (secret) /// inputs for the VM. @@ -47,7 +47,7 @@ pub fn prove( program: &Program, stack_inputs: StackInputs, advice_provider: A, - options: ProofOptions, + options: ProvingOptions, ) -> Result<(StackOutputs, ExecutionProof), ExecutionError> where A: AdviceProvider, @@ -55,7 +55,12 @@ where // execute the program to create an execution trace #[cfg(feature = "std")] let now = Instant::now(); - let trace = processor::execute(program, stack_inputs.clone(), advice_provider)?; + let trace = processor::execute( + program, + stack_inputs.clone(), + advice_provider, + *options.execution_options(), + )?; #[cfg(feature = "std")] debug!( "Generated execution trace of {} columns and {} steps in {} ms", @@ -118,7 +123,7 @@ where R: RandomCoin, { pub fn new( - options: ProofOptions, + options: ProvingOptions, stack_inputs: StackInputs, stack_outputs: StackOutputs, ) -> Self { diff --git a/stdlib/tests/crypto/stark/mod.rs b/stdlib/tests/crypto/stark/mod.rs index a00031eccf..811aea89be 100644 --- a/stdlib/tests/crypto/stark/mod.rs +++ b/stdlib/tests/crypto/stark/mod.rs @@ -6,7 +6,7 @@ use crate::build_test; use assembly::Assembler; use miden_air::{FieldExtension, HashFunction, PublicInputs}; use test_utils::{ - prove, AdviceInputs, MemAdviceProvider, ProgramInfo, ProofOptions, StackInputs, VerifierError, + prove, AdviceInputs, MemAdviceProvider, ProgramInfo, ProvingOptions, StackInputs, VerifierError, }; // Note: Changes to MidenVM may cause this test to fail when some of the assumptions documented @@ -57,7 +57,7 @@ pub fn generate_recursive_verifier_data( let advice_provider = MemAdviceProvider::from(advice_inputs); let options = - ProofOptions::new(43, 8, 12, FieldExtension::Quadratic, 4, 7, HashFunction::Rpo256); + ProvingOptions::new(43, 8, 12, FieldExtension::Quadratic, 4, 7, HashFunction::Rpo256); let (stack_outputs, proof) = prove(&program, stack_inputs.clone(), advice_provider, options).unwrap(); diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 8fe87ddfa1..1846f2a7ef 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -19,10 +19,10 @@ pub use vm_core::chiplets::hasher::{hash_elements, STATE_WIDTH}; pub use assembly::{Library, MaslLibrary}; pub use processor::{ - AdviceInputs, AdviceProvider, ExecutionError, ExecutionTrace, Process, StackInputs, - VmStateIterator, + AdviceInputs, AdviceProvider, ExecutionError, ExecutionOptions, ExecutionTrace, Process, + StackInputs, VmStateIterator, }; -pub use prover::{prove, MemAdviceProvider, ProofOptions}; +pub use prover::{prove, MemAdviceProvider, ProvingOptions}; pub use test_case::test_case; pub use verifier::{ProgramInfo, VerifierError}; pub use vm_core::{ @@ -223,7 +223,12 @@ impl Test { pub fn execute(&self) -> Result { let program = self.compile(); let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); - processor::execute(&program, self.stack_inputs.clone(), advice_provider) + processor::execute( + &program, + self.stack_inputs.clone(), + advice_provider, + ExecutionOptions::default(), + ) } /// Compiles the test's source to a Program and executes it with the tests inputs. Returns the @@ -244,9 +249,13 @@ impl Test { let stack_inputs = StackInputs::try_from_values(pub_inputs).unwrap(); let program = self.compile(); let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); - let (mut stack_outputs, proof) = - prover::prove(&program, stack_inputs.clone(), advice_provider, ProofOptions::default()) - .unwrap(); + let (mut stack_outputs, proof) = prover::prove( + &program, + stack_inputs.clone(), + advice_provider, + ProvingOptions::default(), + ) + .unwrap(); let program_info = ProgramInfo::from(program); if test_fail { From a83d9c56a4c178c981b66cc33b05f949d59725f6 Mon Sep 17 00:00:00 2001 From: frisitano Date: Tue, 18 Jul 2023 11:46:50 +0200 Subject: [PATCH 023/120] feat: introduce error handling for StackOutputs constructor --- core/src/errors.rs | 29 ++++++++++++++++ core/src/stack/mod.rs | 5 ++- core/src/stack/outputs.rs | 69 ++++++++++++++++++++++++++------------ miden/src/cli/data.rs | 3 +- miden/src/cli/verify.rs | 2 +- processor/src/stack/mod.rs | 1 + 6 files changed, 84 insertions(+), 25 deletions(-) diff --git a/core/src/errors.rs b/core/src/errors.rs index 355f80e394..1a1e98ceb0 100644 --- a/core/src/errors.rs +++ b/core/src/errors.rs @@ -25,3 +25,32 @@ impl fmt::Display for InputError { #[cfg(feature = "std")] impl std::error::Error for InputError {} + +// OUTPUT ERROR +// ================================================================================================ +#[derive(Clone, Debug)] +pub enum OutputError { + InvalidOverflowAddress(u64), + InvalidOverflowAddressLength(usize, usize), + InvalidStackElement(u64), +} + +impl fmt::Display for OutputError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use OutputError::*; + match self { + InvalidOverflowAddress(address) => { + write!(f, "overflow addresses contains {address} that is not a valid field element") + } + InvalidOverflowAddressLength(actual, expected) => { + write!(f, "overflow addresses length is {actual}, but expected {expected}") + } + InvalidStackElement(element) => { + write!(f, "stack contains {element} that is not a valid field element") + } + } + } +} + +#[cfg(feature = "std")] +impl std::error::Error for OutputError {} diff --git a/core/src/stack/mod.rs b/core/src/stack/mod.rs index d52ad88e19..56d3147005 100644 --- a/core/src/stack/mod.rs +++ b/core/src/stack/mod.rs @@ -1,4 +1,7 @@ -use super::{errors::InputError, Felt, StackTopState, StarkField, ToElements}; +use super::{ + errors::{InputError, OutputError}, + Felt, StackTopState, StarkField, ToElements, +}; use winter_utils::{ collections::{vec, Vec}, ByteWriter, Serializable, diff --git a/core/src/stack/outputs.rs b/core/src/stack/outputs.rs index 4e5b73eb9e..a1f7baa028 100644 --- a/core/src/stack/outputs.rs +++ b/core/src/stack/outputs.rs @@ -1,5 +1,6 @@ use super::{ - ByteWriter, Felt, Serializable, StackTopState, StarkField, ToElements, Vec, STACK_TOP_SIZE, + ByteWriter, Felt, OutputError, Serializable, StackTopState, StarkField, ToElements, Vec, + STACK_TOP_SIZE, }; // STACK OUTPUTS @@ -30,30 +31,54 @@ pub struct StackOutputs { impl StackOutputs { // CONSTRUCTOR // -------------------------------------------------------------------------------------------- - pub fn new(stack: Vec, overflow_addrs: Vec) -> Self { - debug_assert!( - are_valid_elements(&stack), - "stack outputs contain values that are not valid field elements", - ); - debug_assert!( - are_valid_elements(&overflow_addrs), - "overflow address outputs contain values that are not valid field elements", - ); - - Self { + /// Constructs a new [StackOutputs] struct from the provided stack elements and overflow + /// addresses. + /// + /// # Errors + /// - If any of the provided stack elements are invalid field elements. + /// - If any of the provided overflow addresses are invalid field elements. + /// - If the number of stack elements is greater than `STACK_TOP_SIZE` (16) and `overflow_addrs` + /// does not contain exactly `stack.len() + 1 - STACK_TOP_SIZE` elements. + pub fn new(mut stack: Vec, overflow_addrs: Vec) -> Result { + // Validate stack elements + if let Some(element) = find_invalid_elements(&stack) { + return Err(OutputError::InvalidStackElement(element)); + } + + // Validate overflow address elements + if let Some(element) = find_invalid_elements(&overflow_addrs) { + return Err(OutputError::InvalidOverflowAddress(element)); + } + + // pad stack to the `STACK_TOP_SIZE` + if stack.len() < STACK_TOP_SIZE { + stack.resize(STACK_TOP_SIZE, 0); + } + + // validate overflow_addrs length + let expected_overflow_addrs_len = if stack.len() > STACK_TOP_SIZE { + stack.len() + 1 - STACK_TOP_SIZE + } else { + 0 + }; + if overflow_addrs.len() != expected_overflow_addrs_len { + return Err(OutputError::InvalidOverflowAddressLength( + overflow_addrs.len(), + expected_overflow_addrs_len, + )); + } + + Ok(Self { stack, overflow_addrs, - } + }) } - pub fn from_elements(stack: Vec, overflow_addrs: Vec) -> Self { + pub fn from_elements(stack: Vec, overflow_addrs: Vec) -> Result { let stack = stack.iter().map(|&v| v.as_int()).collect::>(); let overflow_addrs = overflow_addrs.iter().map(|&v| v.as_int()).collect::>(); - Self { - stack, - overflow_addrs, - } + Self::new(stack, overflow_addrs) } // PUBLIC ACCESSORS @@ -129,14 +154,14 @@ impl StackOutputs { // HELPER FUNCTIONS // ================================================================================================ -/// Verify that each element in the provided slice of outputs is a valid field element. -fn are_valid_elements(outputs: &[u64]) -> bool { +/// Find and return the first invalid field element in the provided vector of elements. +fn find_invalid_elements(outputs: &[u64]) -> Option { for val in outputs { if *val >= Felt::MODULUS { - return false; + return Some(*val); } } - true + None } impl Serializable for StackOutputs { diff --git a/miden/src/cli/data.rs b/miden/src/cli/data.rs index b698b0fa70..7213c1079c 100644 --- a/miden/src/cli/data.rs +++ b/miden/src/cli/data.rs @@ -316,7 +316,7 @@ impl OutputFile { } /// Converts outputs vectors for stack and overflow addresses to [StackOutputs]. - pub fn stack_outputs(&self) -> StackOutputs { + pub fn stack_outputs(&self) -> Result { let stack = self.stack.iter().map(|v| v.parse::().unwrap()).collect::>(); let overflow_addrs = self @@ -326,6 +326,7 @@ impl OutputFile { .collect::>(); StackOutputs::new(stack, overflow_addrs) + .map_err(|e| format!("Construct stack outputs failed {e}")) } } diff --git a/miden/src/cli/verify.rs b/miden/src/cli/verify.rs index cca8552135..5f36937cc9 100644 --- a/miden/src/cli/verify.rs +++ b/miden/src/cli/verify.rs @@ -49,7 +49,7 @@ impl VerifyCmd { let program_info = ProgramInfo::new(program_hash, kernel); // verify proof - verifier::verify(program_info, stack_inputs, outputs_data.stack_outputs(), proof) + verifier::verify(program_info, stack_inputs, outputs_data.stack_outputs()?, proof) .map_err(|err| format!("Program failed verification! - {}", err))?; println!("Verification complete in {} ms", now.elapsed().as_millis()); diff --git a/processor/src/stack/mod.rs b/processor/src/stack/mod.rs index ae972fb762..fce8cf00e5 100644 --- a/processor/src/stack/mod.rs +++ b/processor/src/stack/mod.rs @@ -141,6 +141,7 @@ impl Stack { self.trace.append_state_into(&mut stack_items, self.clk); self.overflow.append_into(&mut stack_items); StackOutputs::from_elements(stack_items, self.overflow.get_addrs()) + .expect("processor stack handling logic is valid") } // TRACE ACCESSORS AND MUTATORS From e2ac9225fb146fa4b2da80fef228812822e4d7a2 Mon Sep 17 00:00:00 2001 From: Jacob Johannsen Date: Thu, 29 Jun 2023 16:58:34 +0200 Subject: [PATCH 024/120] Ast formatter --- assembly/src/ast/format.rs | 134 +++++++++++++++++++++++++++ assembly/src/ast/imports.rs | 12 ++- assembly/src/ast/mod.rs | 96 +++++++++++++++++++- assembly/src/ast/nodes/format.rs | 151 +++++++++++++++++++++++++++++++ assembly/src/ast/nodes/mod.rs | 29 ++---- assembly/src/library/path.rs | 8 +- assembly/src/procedures/mod.rs | 6 ++ 7 files changed, 406 insertions(+), 30 deletions(-) create mode 100644 assembly/src/ast/format.rs create mode 100644 assembly/src/ast/nodes/format.rs diff --git a/assembly/src/ast/format.rs b/assembly/src/ast/format.rs new file mode 100644 index 0000000000..a8634fe1dc --- /dev/null +++ b/assembly/src/ast/format.rs @@ -0,0 +1,134 @@ +use super::{ + CodeBody, FormattableNode, InvokedProcsMap, LibraryPath, ProcedureAst, ProcedureId, + ProcedureName, Vec, +}; +use core::fmt; + +const INDENT_STRING: &str = " "; + +/// Context for the Ast formatter +/// +/// The context keeps track of the current indentation level, as well as the declared and imported +/// procedures in the program/module being formatted. +pub struct AstFormatterContext<'a> { + indent_level: usize, + local_procs: &'a Vec, + imported_procs: &'a InvokedProcsMap, +} + +impl<'a> AstFormatterContext<'a> { + pub fn new( + local_procs: &'a Vec, + imported_procs: &'a InvokedProcsMap, + ) -> AstFormatterContext<'a> { + Self { + indent_level: 0, + local_procs, + imported_procs, + } + } + + /// Build a context for the inner scope, e.g., the body of a while loop + pub fn inner_scope_context(&self) -> Self { + Self { + indent_level: self.indent_level + 1, + local_procs: self.local_procs, + imported_procs: self.imported_procs, + } + } + + /// Add indentation to the current line in the formatter + pub fn indent(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + for _ in 0..self.indent_level { + write!(f, "{INDENT_STRING}")?; + } + Ok(()) + } + + /// Get the name of the local procedure with the given index. + /// + /// # Panics + /// Panics if the index is not associated with a procedure name + pub fn local_proc(&self, index: usize) -> &ProcedureName { + assert!(index < self.local_procs.len(), "Local procedure with index {index} not found"); + &self.local_procs[index].name + } + + /// Get the name of the imported procedure with the given id/hash. + /// + /// # Panics + /// Panics if the id/hash is not associated with an imported procedure + pub fn imported_proc(&self, id: &ProcedureId) -> &(ProcedureName, LibraryPath) { + self.imported_procs + .get(id) + .expect("Imported procedure with id/hash {id} not found") + } +} + +// FORMATTING OF PROCEDURES +// ================================================================================================ +pub struct FormattableProcedureAst<'a> { + proc: &'a ProcedureAst, + context: &'a AstFormatterContext<'a>, +} + +impl<'a> FormattableProcedureAst<'a> { + pub fn new( + proc: &'a ProcedureAst, + context: &'a AstFormatterContext<'a>, + ) -> FormattableProcedureAst<'a> { + Self { proc, context } + } +} + +impl fmt::Display for FormattableProcedureAst<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // Docs + self.context.indent(f)?; + if let Some(ref doc) = self.proc.docs { + writeln!(f, "#! {doc}")?; + } + // Procedure header + self.context.indent(f)?; + if self.proc.is_export { + write!(f, "export.")?; + } else { + write!(f, "proc.")?; + } + writeln!(f, "{}.{}", self.proc.name, self.proc.num_locals)?; + // Body + write!( + f, + "{}", + FormattableCodeBody::new(&self.proc.body, &self.context.inner_scope_context()) + )?; + // Procedure footer + self.context.indent(f)?; + writeln!(f, "end") + } +} + +// FORMATTING OF CODE BODIES +// ================================================================================================ +pub struct FormattableCodeBody<'a> { + body: &'a CodeBody, + context: &'a AstFormatterContext<'a>, +} + +impl<'a> FormattableCodeBody<'a> { + pub fn new( + body: &'a CodeBody, + context: &'a AstFormatterContext<'a>, + ) -> FormattableCodeBody<'a> { + Self { body, context } + } +} + +impl fmt::Display for FormattableCodeBody<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + for node in self.body.nodes() { + write!(f, "{}", FormattableNode::new(node, self.context))?; + } + Ok(()) + } +} diff --git a/assembly/src/ast/imports.rs b/assembly/src/ast/imports.rs index a0e0f416e4..4895a9a759 100644 --- a/assembly/src/ast/imports.rs +++ b/assembly/src/ast/imports.rs @@ -1,14 +1,13 @@ use super::{ - BTreeMap, ByteReader, ByteWriter, Deserializable, DeserializationError, LibraryPath, - ParsingError, ProcedureId, ProcedureName, Serializable, String, ToString, Token, TokenStream, - Vec, MAX_IMPORTS, MAX_INVOKED_IMPORTED_PROCS, + BTreeMap, ByteReader, ByteWriter, Deserializable, DeserializationError, InvokedProcsMap, + LibraryPath, ParsingError, ProcedureId, ProcedureName, Serializable, String, ToString, Token, + TokenStream, Vec, MAX_IMPORTS, MAX_INVOKED_IMPORTED_PROCS, }; // TYPE ALIASES // ================================================================================================ type ImportedModulesMap = BTreeMap; -type InvokedProcsMap = BTreeMap; // MODULE IMPORTS // ================================================================================================ @@ -89,6 +88,11 @@ impl ModuleImports { self.imports.values().collect() } + /// Returns a reference to the invoked procedure map which maps procedure IDs to their names. + pub fn invoked_procs(&self) -> &InvokedProcsMap { + &self.invoked_procs + } + // STATE MUTATORS // -------------------------------------------------------------------------------------------- diff --git a/assembly/src/ast/mod.rs b/assembly/src/ast/mod.rs index 35d764f1ad..d30ae6f355 100644 --- a/assembly/src/ast/mod.rs +++ b/assembly/src/ast/mod.rs @@ -9,17 +9,21 @@ use super::{ Serializable, SliceReader, StarkField, String, ToString, Token, TokenStream, Vec, MAX_LABEL_LEN, }; -use core::{iter, str::from_utf8}; +use core::{fmt, iter, str::from_utf8}; use vm_core::utils::bound_into_included_u64; pub use super::tokens::SourceLocation; mod nodes; +use nodes::FormattableNode; pub use nodes::{AdviceInjectorNode, Instruction, Node}; mod code_body; pub use code_body::CodeBody; +mod format; +use format::*; + mod imports; pub use imports::ModuleImports; @@ -66,6 +70,7 @@ const MAX_STACK_WORD_OFFSET: u8 = 12; type LocalProcMap = BTreeMap; type LocalConstMap = BTreeMap; type ReExportedProcMap = BTreeMap; +type InvokedProcsMap = BTreeMap; // EXECUTABLE PROGRAM AST // ================================================================================================ @@ -211,7 +216,6 @@ impl ProgramAst { let local_procs = sort_procs_into_vec(context.local_procs); let (nodes, locations) = body.into_parts(); - Ok(Self::new(nodes, local_procs)? .with_source_locations(locations, start) .with_import_info(import_info)) @@ -325,6 +329,46 @@ impl ProgramAst { } } +impl fmt::Display for ProgramAst { + /// Writes this [ProgramAst] as formatted MASM code into the formatter. + /// + /// The formatted code puts each instruction on a separate line and preserves correct indentation + /// for instruction blocks. + /// + /// # Panics + /// Panics if import info is not associated with this program. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + assert!(self.import_info.is_some(), "Program imports not instantiated"); + + // Imports + if let Some(ref info) = self.import_info { + let paths = info.import_paths(); + for path in paths.iter() { + writeln!(f, "use.{path}")?; + } + if !paths.is_empty() { + writeln!(f)?; + } + } + + let tmp_procs = InvokedProcsMap::new(); + let invoked_procs = + self.import_info.as_ref().map(|info| info.invoked_procs()).unwrap_or(&tmp_procs); + + let context = AstFormatterContext::new(&self.local_procs, invoked_procs); + + // Local procedures + for proc in self.local_procs.iter() { + writeln!(f, "{}", FormattableProcedureAst::new(proc, &context))?; + } + + // Main progrma + writeln!(f, "begin")?; + write!(f, "{}", FormattableCodeBody::new(&self.body, &context.inner_scope_context()))?; + writeln!(f, "end") + } +} + // MODULE AST // ================================================================================================ @@ -594,6 +638,54 @@ impl ModuleAst { } } +impl fmt::Display for ModuleAst { + /// Writes this [ModuleAst] as formatted MASM code into the formatter. + /// + /// The formatted code puts each instruction on a separate line and preserves correct indentation + /// for instruction blocks. + /// + /// # Panics + /// Panics if import info is not associated with this module. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + assert!(self.import_info.is_some(), "Program imports not instantiated"); + + // Docs + if let Some(ref doc) = self.docs { + writeln!(f, "#! {doc}")?; + writeln!(f)?; + } + + // Imports + if let Some(ref info) = self.import_info { + let paths = info.import_paths(); + for path in paths.iter() { + writeln!(f, "use.{path}")?; + } + if !paths.is_empty() { + writeln!(f)?; + } + } + + // Re-exports + for proc in self.reexported_procs.iter() { + writeln!(f, "export.{}", proc.name)?; + writeln!(f)?; + } + + // Local procedures + let tmp_procs = InvokedProcsMap::new(); + let invoked_procs = + self.import_info.as_ref().map(|info| info.invoked_procs()).unwrap_or(&tmp_procs); + + let context = AstFormatterContext::new(&self.local_procs, invoked_procs); + + for proc in self.local_procs.iter() { + writeln!(f, "{}", FormattableProcedureAst::new(proc, &context))?; + } + Ok(()) + } +} + // PROCEDURE AST // ================================================================================================ diff --git a/assembly/src/ast/nodes/format.rs b/assembly/src/ast/nodes/format.rs new file mode 100644 index 0000000000..0136820fc6 --- /dev/null +++ b/assembly/src/ast/nodes/format.rs @@ -0,0 +1,151 @@ +use super::{AstFormatterContext, FormattableCodeBody, Instruction, Node}; +use core::fmt; + +// FORMATTING OF NODES +// ================================================================================================ +pub struct FormattableNode<'a> { + node: &'a Node, + context: &'a AstFormatterContext<'a>, +} + +impl<'a> FormattableNode<'a> { + pub fn new(node: &'a Node, context: &'a AstFormatterContext<'a>) -> Self { + Self { node, context } + } +} + +impl fmt::Display for FormattableNode<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self.node { + Node::Instruction(i) => { + write!(f, "{}", FormattableInstruction::new(i, self.context)) + } + Node::IfElse { + true_case, + false_case, + } => { + self.context.indent(f)?; + writeln!(f, "if.true")?; + write!( + f, + "{}", + FormattableCodeBody::new(true_case, &self.context.inner_scope_context()) + )?; + if !false_case.nodes().is_empty() { + // No false branch - don't output else branch + self.context.indent(f)?; + writeln!(f, "else")?; + + write!( + f, + "{}", + FormattableCodeBody::new(false_case, &self.context.inner_scope_context()) + )?; + } + self.context.indent(f)?; + writeln!(f, "end") + } + Node::Repeat { times, body } => { + self.context.indent(f)?; + writeln!(f, "repeat.{times}")?; + + write!( + f, + "{}", + FormattableCodeBody::new(body, &self.context.inner_scope_context()) + )?; + + self.context.indent(f)?; + writeln!(f, "end") + } + Node::While { body } => { + self.context.indent(f)?; + writeln!(f, "while.true")?; + + write!( + f, + "{}", + FormattableCodeBody::new(body, &self.context.inner_scope_context()) + )?; + + self.context.indent(f)?; + writeln!(f, "end") + } + } + } +} + +// FORMATTING OF INSTRUCTIONS WITH INDENTATION +// ================================================================================================ +pub struct FormattableInstruction<'a> { + instruction: &'a Instruction, + context: &'a AstFormatterContext<'a>, +} + +impl<'a> FormattableInstruction<'a> { + pub fn new(instruction: &'a Instruction, context: &'a AstFormatterContext<'a>) -> Self { + Self { + instruction, + context, + } + } +} + +impl fmt::Display for FormattableInstruction<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.context.indent(f)?; + match self.instruction { + // procedure calls are represented by indices or hashes, so must be handled specially + Instruction::ExecLocal(index) => { + let proc_name = self.context.local_proc(*index as usize); + write!(f, "exec.{proc_name}")?; + } + Instruction::CallLocal(index) => { + let proc_name = self.context.local_proc(*index as usize); + write!(f, "call.{proc_name}")?; + } + Instruction::ExecImported(proc_id) => { + let (_, path) = self.context.imported_proc(proc_id); + write!(f, "exec.{path}")?; + } + Instruction::CallImported(proc_id) => { + let (_, path) = self.context.imported_proc(proc_id); + write!(f, "call.{path}")?; + } + Instruction::SysCall(proc_id) => { + let (_, path) = self.context.imported_proc(proc_id); + write!(f, "syscall.{path}")?; + } + Instruction::CallMastRoot(root) => { + write!(f, "call.")?; + display_hex_bytes(f, &root.as_bytes())?; + } + _ => { + // Not a procedure call. Use the normal formatting + write!(f, "{}", self.instruction)?; + } + } + writeln!(f) + } +} + +// HELPER FUNCTIONS +// ================================================================================================ + +/// Builds a hex string from a byte slice +pub fn display_hex_bytes(f: &mut fmt::Formatter<'_>, bytes: &[u8]) -> fmt::Result { + write!(f, "0x")?; + for byte in bytes { + write!(f, "{byte:02x}")?; + } + Ok(()) +} + +/// Builds a string from input vector to display push operation +pub fn display_push_vec(f: &mut fmt::Formatter<'_>, values: &[T]) -> fmt::Result { + write!(f, "push")?; + for elem in values { + write!(f, ".{elem}")?; + } + Ok(()) +} diff --git a/assembly/src/ast/nodes/mod.rs b/assembly/src/ast/nodes/mod.rs index a8ed52a0bc..2eed169b34 100644 --- a/assembly/src/ast/nodes/mod.rs +++ b/assembly/src/ast/nodes/mod.rs @@ -1,9 +1,14 @@ -use super::{CodeBody, Felt, ProcedureId, RpoDigest, ToString, Vec}; +use super::{ + AstFormatterContext, CodeBody, Felt, FormattableCodeBody, ProcedureId, RpoDigest, ToString, Vec, +}; use core::fmt; mod advice; pub use advice::AdviceInjectorNode; +mod format; +pub use format::*; + mod serde; // NODES @@ -556,7 +561,6 @@ impl fmt::Display for Instruction { Self::FriExt2Fold4 => write!(f, "fri_ext2fold4"), // ----- exec / call ------------------------------------------------------------------ - // TODO: print exec/call instructions with procedures names, not indexes or id's Self::ExecLocal(index) => write!(f, "exec.{index}"), Self::ExecImported(proc_id) => write!(f, "exec.{proc_id}"), Self::CallLocal(index) => write!(f, "call.{index}"), @@ -573,27 +577,6 @@ impl fmt::Display for Instruction { } } -// HELPER FUNCTIONS -// ================================================================================================ - -/// Builds a hex string from a byte slice -pub fn display_hex_bytes(f: &mut fmt::Formatter<'_>, bytes: &[u8]) -> fmt::Result { - write!(f, "0x")?; - for byte in bytes { - write!(f, "{byte:02x}")?; - } - Ok(()) -} - -/// Builds a string from input vector to display push operation -fn display_push_vec(f: &mut fmt::Formatter<'_>, values: &[T]) -> fmt::Result { - write!(f, "push")?; - for elem in values { - write!(f, ".{elem}")?; - } - Ok(()) -} - // TESTS // ================================================================================================ diff --git a/assembly/src/library/path.rs b/assembly/src/library/path.rs index 7c4ad3210a..393b854cb1 100644 --- a/assembly/src/library/path.rs +++ b/assembly/src/library/path.rs @@ -2,7 +2,7 @@ use super::{ ByteReader, ByteWriter, Deserializable, DeserializationError, PathError, Serializable, String, ToString, MAX_LABEL_LEN, }; -use core::{ops::Deref, str::from_utf8}; +use core::{fmt, ops::Deref, str::from_utf8}; // CONSTANTS // ================================================================================================ @@ -312,6 +312,12 @@ impl Deserializable for LibraryPath { } } +impl fmt::Display for LibraryPath { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.path) + } +} + // HELPER FUNCTIONS // ================================================================================================ diff --git a/assembly/src/procedures/mod.rs b/assembly/src/procedures/mod.rs index da61695f4c..ec5501a801 100644 --- a/assembly/src/procedures/mod.rs +++ b/assembly/src/procedures/mod.rs @@ -182,6 +182,12 @@ impl Deserializable for ProcedureName { } } +impl fmt::Display for ProcedureName { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.name) + } +} + // PROCEDURE ID // ================================================================================================ From d0e2ba2c6c78cfec4cb8f5c23407027bbfc1599e Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Wed, 19 Jul 2023 23:17:19 -0700 Subject: [PATCH 025/120] chore: updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e6998269a..f2b2b1c2a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). - Added `get_mapped_values()` and `get_store_subset()` methods to the `AdviceProvider` trait (#987). +- Improved handling of invalid/incomplete parameters in `StackOutputs` constructors (#1010). ## 0.6.1 (2023-06-29) From a4a1a32a42150d3a3fae868c3ce1d7ef4ec40dcb Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Wed, 19 Jul 2023 23:38:59 -0700 Subject: [PATCH 026/120] chore: update rustyline dependency to v12.0 --- miden/Cargo.toml | 2 +- miden/src/cli/debug/mod.rs | 4 ++-- miden/src/repl/mod.rs | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/miden/Cargo.toml b/miden/Cargo.toml index a5127dcce0..121d02cc4e 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -49,7 +49,7 @@ hex = { version = "0.4", optional = true } log = { version = "0.4", default-features = false } processor = { package = "miden-processor", path = "../processor", version = "0.7", default-features = false } prover = { package = "miden-prover", path = "../prover", version = "0.7", default-features = false } -rustyline = { version = "10.0.0", default-features = false, optional = true} +rustyline = { version = "12.0", default-features = false, optional = true } serde = {version = "1.0.117", optional = true } serde_derive = {version = "1.0.117", optional = true } serde_json = {version = "1.0.59", optional = true } diff --git a/miden/src/cli/debug/mod.rs b/miden/src/cli/debug/mod.rs index 03f2536b4f..ba588643a2 100644 --- a/miden/src/cli/debug/mod.rs +++ b/miden/src/cli/debug/mod.rs @@ -1,5 +1,5 @@ use super::data::{Debug, InputFile, Libraries, ProgramFile}; -use rustyline::{error::ReadlineError, Config, EditMode, Editor}; +use rustyline::{error::ReadlineError, Config, DefaultEditor, EditMode}; use std::path::PathBuf; use structopt::StructOpt; @@ -60,7 +60,7 @@ impl DebugCmd { // initialize readline let mut rl = - Editor::<()>::with_config(rl_config).expect("Readline couldn't be initialized"); + DefaultEditor::with_config(rl_config).expect("Readline couldn't be initialized"); println!("Welcome! Enter `h` for help."); diff --git a/miden/src/repl/mod.rs b/miden/src/repl/mod.rs index 23ce5feb31..f210065cf5 100644 --- a/miden/src/repl/mod.rs +++ b/miden/src/repl/mod.rs @@ -3,7 +3,7 @@ use miden::{ math::{Felt, StarkField}, MemAdviceProvider, StackInputs, Word, }; -use rustyline::{error::ReadlineError, Editor}; +use rustyline::{error::ReadlineError, DefaultEditor}; /// This work is in continuation to the amazing work done by team `Scribe` /// [here](https://github.com/ControlCplusControlV/Scribe/blob/main/transpiler/src/repl.rs#L8) @@ -140,7 +140,7 @@ pub fn start_repl() { let mut memory: Vec<(u64, Word)> = Vec::new(); // initializing readline. - let mut rl = Editor::<()>::new().expect("Readline couldn't be initialized"); + let mut rl = DefaultEditor::new().expect("Readline couldn't be initialized"); loop { let program = format!( "begin\n{}\nend", @@ -232,7 +232,7 @@ pub fn start_repl() { } else if line == "!stack" { should_print_stack = true; } else { - rl.add_history_entry(line.clone()); + rl.add_history_entry(line.clone()).expect("Failed to add a history entry"); program_lines.push(line.clone()); should_print_stack = true; } From b9dfc66400ec8218400dd54f3cc22057ef790836 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Wed, 19 Jul 2023 23:46:08 -0700 Subject: [PATCH 027/120] chore: add dependabot.yml --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..791a4ef739 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "cargo" + directory: "/" + schedule: + interval: "weekly" \ No newline at end of file From 1343f91e301e989e9f071c595106a38a8918876e Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Thu, 20 Jul 2023 10:47:28 -0700 Subject: [PATCH 028/120] refactor: track RpoDigests in CallSet instead of ProcedureIds --- assembly/src/assembler/context.rs | 30 ++++++++--------- .../src/assembler/instruction/procedures.rs | 16 ++++------ assembly/src/assembler/mod.rs | 4 +-- assembly/src/assembler/procedure_cache.rs | 5 ++- assembly/src/assembler/tests.rs | 2 +- assembly/src/errors.rs | 4 +-- assembly/src/procedures/mod.rs | 32 +++++++++++-------- 7 files changed, 46 insertions(+), 47 deletions(-) diff --git a/assembly/src/assembler/context.rs b/assembly/src/assembler/context.rs index 11ac586354..74b8492613 100644 --- a/assembly/src/assembler/context.rs +++ b/assembly/src/assembler/context.rs @@ -1,6 +1,6 @@ use super::{ AssemblyError, CallSet, CodeBlock, CodeBlockTable, Kernel, LibraryPath, Procedure, - ProcedureCache, ProcedureId, ToString, Vec, + ProcedureCache, ProcedureId, RpoDigest, ToString, Vec, }; use crate::ProcedureName; @@ -103,13 +103,13 @@ impl AssemblyContext { // if we are compiling a kernel and this is the last module on the module stack, then // it must be the Kernel module; thus, we build a Kernel struct from the procedures // exported from the kernel module - let hashes = module_ctx + let proc_roots = module_ctx .compiled_procs .iter() .filter(|proc| proc.is_export()) - .map(|proc| proc.code_root().hash()) + .map(|proc| proc.mast_root()) .collect::>(); - self.kernel = Some(Kernel::new(&hashes)); + self.kernel = Some(Kernel::new(&proc_roots)); } // return compiled procedures and callset from the module @@ -247,13 +247,13 @@ impl AssemblyContext { // procedures can be either in the specified procedure cache (for procedures imported from // other modules) or in the module's procedures (for procedures defined locally). let mut cb_table = CodeBlockTable::default(); - for proc_id in main_module_context.callset.iter() { + for mast_root in main_module_context.callset.iter() { let proc = proc_cache - .get_by_id(proc_id) - .or_else(|| main_module_context.find_local_proc(proc_id)) - .ok_or(AssemblyError::CallSetProcedureNotFound(*proc_id))?; + .get_by_hash(mast_root) + .or_else(|| main_module_context.find_local_proc(mast_root)) + .ok_or(AssemblyError::CallSetProcedureNotFound(*mast_root))?; - cb_table.insert(proc.code_root().clone()); + cb_table.insert(proc.code().clone()); } Ok(cb_table) @@ -333,10 +333,10 @@ impl ModuleContext { self.path.is_exec_path() } - /// Returns a [Procedure] with the specified ID, or None if a compiled procedure with such ID - /// could not be found in this context. - pub fn find_local_proc(&self, proc_id: &ProcedureId) -> Option<&Procedure> { - self.compiled_procs.iter().find(|proc| proc.id() == proc_id) + /// Returns a [Procedure] with the specified MAST root, or None if a compiled procedure with + /// such MAST root could not be found in this context. + pub fn find_local_proc(&self, mast_root: &RpoDigest) -> Option<&Procedure> { + self.compiled_procs.iter().find(|proc| proc.mast_root() == *mast_root) } // PROCEDURE PROCESSORS @@ -423,7 +423,7 @@ impl ModuleContext { // if the called procedure was not inlined, we include it in the current callset as well if !inlined { - context.callset.insert(*called_proc.id()); + context.callset.insert(called_proc.mast_root()); } Ok(called_proc) } @@ -444,7 +444,7 @@ impl ModuleContext { // if the called procedure was not inlined, we include it in the current callset as well if !inlined { - context.callset.insert(*called_proc.id()); + context.callset.insert(called_proc.mast_root()); } } diff --git a/assembly/src/assembler/instruction/procedures.rs b/assembly/src/assembler/instruction/procedures.rs index 277bb6bd60..e06504af57 100644 --- a/assembly/src/assembler/instruction/procedures.rs +++ b/assembly/src/assembler/instruction/procedures.rs @@ -18,7 +18,7 @@ impl Assembler { // operations from that SPAN block to the span builder instead of returning a code block // return the code block of the procedure - Ok(Some(proc.code_root().clone())) + Ok(Some(proc.code().clone())) } pub(super) fn exec_imported( @@ -42,7 +42,7 @@ impl Assembler { // operations from that SPAN block to the span builder instead of returning a code block // return the code block of the procedure - Ok(Some(proc.code_root().clone())) + Ok(Some(proc.code().clone())) } pub(super) fn call_local( @@ -56,8 +56,7 @@ impl Assembler { let proc = context.register_local_call(index, false)?; // create a new CALL block for the procedure call and return - let digest = proc.code_root().hash(); - Ok(Some(CodeBlock::new_call(digest))) + Ok(Some(CodeBlock::new_call(proc.mast_root()))) } pub(super) fn call_mast_root( @@ -80,8 +79,7 @@ impl Assembler { context.register_external_call(proc, false)?; // create a new CALL block for the procedure call and return - let digest = proc.code_root().hash(); - Ok(Some(CodeBlock::new_call(digest))) + Ok(Some(CodeBlock::new_call(proc.mast_root()))) } pub(super) fn call_imported( @@ -102,8 +100,7 @@ impl Assembler { context.register_external_call(proc, false)?; // create a new CALL block for the procedure call and return - let digest = proc.code_root().hash(); - Ok(Some(CodeBlock::new_call(digest))) + Ok(Some(CodeBlock::new_call(proc.mast_root()))) } pub(super) fn syscall( @@ -129,7 +126,6 @@ impl Assembler { context.register_external_call(proc, false)?; // create a new SYSCALL block for the procedure call and return - let digest = proc.code_root().hash(); - Ok(Some(CodeBlock::new_syscall(digest))) + Ok(Some(CodeBlock::new_syscall(proc.mast_root()))) } } diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index 5e4f2d3745..ba2e2f8540 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -226,10 +226,10 @@ impl Assembler { // which has been invoked via a local call instruction. for proc in module_procs.into_iter() { if proc.is_export() { - proc_roots.push(proc.code_root().hash()); + proc_roots.push(proc.mast_root()); } - if proc.is_export() || module_callset.contains(proc.id()) { + if proc.is_export() || module_callset.contains(&proc.mast_root()) { // this is safe because we fail if the cache is borrowed. self.proc_cache .try_borrow_mut() diff --git a/assembly/src/assembler/procedure_cache.rs b/assembly/src/assembler/procedure_cache.rs index af037d1e19..9e34d4c530 100644 --- a/assembly/src/assembler/procedure_cache.rs +++ b/assembly/src/assembler/procedure_cache.rs @@ -57,8 +57,7 @@ impl ProcedureCache { match self.proc_map.entry(*proc.id()) { Entry::Occupied(_) => Err(AssemblyError::duplicate_proc_id(proc.id())), Entry::Vacant(entry) => { - let mast_root = proc.code_root().hash(); - self.mast_map.entry(mast_root).or_insert(*proc.id()); + self.mast_map.entry(proc.mast_root()).or_insert(*proc.id()); entry.insert(proc); Ok(()) } @@ -102,7 +101,7 @@ impl ProcedureCache { self.proc_aliases.insert(alias_proc_id, proc_id); let proc = self.proc_map.get(&proc_id).expect("procedure not in cache"); - Ok(proc.code_root().hash()) + Ok(proc.mast_root()) } // TEST HELPERS diff --git a/assembly/src/assembler/tests.rs b/assembly/src/assembler/tests.rs index a5d34faf09..15ca21bafb 100644 --- a/assembly/src/assembler/tests.rs +++ b/assembly/src/assembler/tests.rs @@ -74,7 +74,7 @@ fn nested_blocks() { .borrow() .values() .next() - .map(|p| CodeBlock::new_syscall(p.code_root().hash())) + .map(|p| CodeBlock::new_syscall(p.mast_root())) .unwrap(); let program = r#" diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index a3c0a34038..1eb191300e 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -13,7 +13,7 @@ use vm_core::utils::write_hex_bytes; pub enum AssemblyError { CallInKernel(String), CallerOutOKernel, - CallSetProcedureNotFound(ProcedureId), + CallSetProcedureNotFound(RpoDigest), CircularModuleDependency(Vec), DivisionByZero, DuplicateProcName(String, String), @@ -123,7 +123,7 @@ impl fmt::Display for AssemblyError { match self { CallInKernel(proc_name) => write!(f, "call instruction used kernel procedure '{proc_name}'"), CallerOutOKernel => write!(f, "caller instruction used outside of kernel"), - CallSetProcedureNotFound(proc_id) => write!(f, "callset procedure not found in assembler cache for procedure '{proc_id}'"), + CallSetProcedureNotFound(mast_root) => write!(f, "callset procedure not found in assembler cache for procedure with MAST root {mast_root}"), CircularModuleDependency(dep_chain) => write!(f, "circular module dependency in the following chain: {dep_chain:?}"), DivisionByZero => write!(f, "division by zero"), DuplicateProcName(proc_name, module_path) => write!(f, "duplicate proc name '{proc_name}' in module {module_path}"), diff --git a/assembly/src/procedures/mod.rs b/assembly/src/procedures/mod.rs index ec5501a801..699d63b40b 100644 --- a/assembly/src/procedures/mod.rs +++ b/assembly/src/procedures/mod.rs @@ -1,7 +1,7 @@ use super::{ - crypto::hash::Blake3_160, BTreeSet, ByteReader, ByteWriter, CodeBlock, Deserializable, - DeserializationError, LabelError, LibraryPath, Serializable, String, ToString, - PROCEDURE_LABEL_PARSER, + crypto::hash::{Blake3_160, RpoDigest}, + BTreeSet, ByteReader, ByteWriter, CodeBlock, Deserializable, DeserializationError, LabelError, + LibraryPath, Serializable, String, ToString, PROCEDURE_LABEL_PARSER, }; use core::{ fmt, @@ -64,18 +64,22 @@ impl Procedure { } /// Returns the number of memory locals reserved by the procedure. - #[allow(dead_code)] pub fn num_locals(&self) -> u32 { self.num_locals } - /// Returns a root of this procedure's MAST. - pub fn code_root(&self) -> &CodeBlock { + /// Returns the root of this procedure's MAST. + pub fn mast_root(&self) -> RpoDigest { + self.code_root.hash() + } + + /// Returns a reference to the MAST of this procedure. + pub fn code(&self) -> &CodeBlock { &self.code_root } - /// Returns a reference to a set of all procedures (identified by their IDs) which may be - /// called during the execution of this procedure. + /// Returns a reference to a set of all procedures (identified by their MAST roots) which may + /// be called during the execution of this procedure. pub fn callset(&self) -> &CallSet { &self.callset } @@ -285,15 +289,15 @@ impl Deserializable for ProcedureId { /// Contains a list of all procedures which may be invoked from a procedure via call or syscall /// instructions. #[derive(Debug, Default, Clone, PartialEq, Eq)] -pub struct CallSet(BTreeSet); +pub struct CallSet(BTreeSet); impl CallSet { - pub fn contains(&self, proc_id: &ProcedureId) -> bool { - self.0.contains(proc_id) + pub fn contains(&self, mast_root: &RpoDigest) -> bool { + self.0.contains(mast_root) } - pub fn insert(&mut self, proc_id: ProcedureId) { - self.0.insert(proc_id); + pub fn insert(&mut self, mast_root: RpoDigest) { + self.0.insert(mast_root); } pub fn append(&mut self, other: &CallSet) { @@ -304,7 +308,7 @@ impl CallSet { } impl ops::Deref for CallSet { - type Target = BTreeSet; + type Target = BTreeSet; fn deref(&self) -> &Self::Target { &self.0 From 6b5c73e1eb3e1470b83631326a68edaa0b2f81a9 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Thu, 20 Jul 2023 16:01:14 -0700 Subject: [PATCH 029/120] refactor: change procedure cache to track unnamed procedures --- assembly/src/assembler/context.rs | 22 +++-- .../src/assembler/instruction/procedures.rs | 3 - assembly/src/assembler/mod.rs | 4 +- assembly/src/assembler/procedure_cache.rs | 79 +++++++++------- assembly/src/errors.rs | 6 ++ assembly/src/lib.rs | 2 +- assembly/src/procedures/mod.rs | 93 +++++++++++++++---- 7 files changed, 144 insertions(+), 65 deletions(-) diff --git a/assembly/src/assembler/context.rs b/assembly/src/assembler/context.rs index 74b8492613..283373d921 100644 --- a/assembly/src/assembler/context.rs +++ b/assembly/src/assembler/context.rs @@ -1,8 +1,7 @@ use super::{ - AssemblyError, CallSet, CodeBlock, CodeBlockTable, Kernel, LibraryPath, Procedure, - ProcedureCache, ProcedureId, RpoDigest, ToString, Vec, + AssemblyError, CallSet, CodeBlock, CodeBlockTable, Kernel, LibraryPath, NamedProcedure, + Procedure, ProcedureCache, ProcedureId, ProcedureName, RpoDigest, ToString, Vec, }; -use crate::ProcedureName; // ASSEMBLY CONTEXT // ================================================================================================ @@ -97,7 +96,7 @@ impl AssemblyContext { /// /// This pops the module off the module stack and return all local procedures of the module /// (both exported and internal) together with the combined callset of module's procedures. - pub fn complete_module(&mut self) -> (Vec, CallSet) { + pub fn complete_module(&mut self) -> (Vec, CallSet) { let module_ctx = self.module_stack.pop().expect("no modules"); if self.is_kernel && self.module_stack.is_empty() { // if we are compiling a kernel and this is the last module on the module stack, then @@ -287,7 +286,7 @@ struct ModuleContext { /// is currently being compiled is at the top of this list. proc_stack: Vec, /// List of local procedures which have already been compiled for this module. - compiled_procs: Vec, + compiled_procs: Vec, /// Fully qualified path of this module. path: LibraryPath, /// A combined callset of all procedure callsets in this module. @@ -336,7 +335,10 @@ impl ModuleContext { /// Returns a [Procedure] with the specified MAST root, or None if a compiled procedure with /// such MAST root could not be found in this context. pub fn find_local_proc(&self, mast_root: &RpoDigest) -> Option<&Procedure> { - self.compiled_procs.iter().find(|proc| proc.mast_root() == *mast_root) + self.compiled_procs + .iter() + .find(|proc| proc.mast_root() == *mast_root) + .map(|proc| proc.inner()) } // PROCEDURE PROCESSORS @@ -356,7 +358,7 @@ impl ModuleContext { ) -> Result<(), AssemblyError> { // make sure a procedure with this name as not been compiled yet and is also not currently // on the stack of procedures being compiled - if self.compiled_procs.iter().any(|p| p.label() == name) + if self.compiled_procs.iter().any(|p| p.name() == name) || self.proc_stack.iter().any(|p| &p.name == name) { return Err(AssemblyError::duplicate_proc_name(name, &self.path)); @@ -425,7 +427,7 @@ impl ModuleContext { if !inlined { context.callset.insert(called_proc.mast_root()); } - Ok(called_proc) + Ok(called_proc.inner()) } /// Registers a call to the specified external procedure (i.e., a procedure which is not a part @@ -503,7 +505,7 @@ impl ProcedureContext { &self.name } - pub fn into_procedure(self, id: ProcedureId, code_root: CodeBlock) -> Procedure { + pub fn into_procedure(self, id: ProcedureId, code_root: CodeBlock) -> NamedProcedure { let Self { name, is_export, @@ -511,6 +513,6 @@ impl ProcedureContext { callset, } = self; - Procedure::new(id, name, is_export, num_locals as u32, code_root, callset) + NamedProcedure::new(id, name, is_export, num_locals as u32, code_root, callset) } } diff --git a/assembly/src/assembler/instruction/procedures.rs b/assembly/src/assembler/instruction/procedures.rs index e06504af57..d08d510015 100644 --- a/assembly/src/assembler/instruction/procedures.rs +++ b/assembly/src/assembler/instruction/procedures.rs @@ -32,7 +32,6 @@ impl Assembler { // get the procedure from the assembler let proc_cache = self.proc_cache.borrow(); let proc = proc_cache.get_by_id(proc_id).expect("procedure not in cache"); - debug_assert!(proc.is_export(), "not imported procedure"); // register and "inlined" call to the procedure; this updates the callset of the // procedure currently being compiled @@ -72,7 +71,6 @@ impl Assembler { let proc = proc_cache .get_by_hash(root) .ok_or(AssemblyError::proc_mast_root_not_found(root))?; - debug_assert!(proc.is_export(), "not imported procedure"); // register and "non-inlined" call to the procedure; this updates the callset of the // procedure currently being compiled @@ -93,7 +91,6 @@ impl Assembler { // get the procedure from the assembler let proc_cache = self.proc_cache.borrow(); let proc = proc_cache.get_by_id(proc_id).expect("procedure not in cache"); - debug_assert!(proc.is_export(), "not imported procedure"); // register and "non-inlined" call to the procedure; this updates the callset of the // procedure currently being compiled diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index ba2e2f8540..93a938366b 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -3,8 +3,8 @@ use super::{ btree_map, crypto::hash::RpoDigest, AssemblyError, BTreeMap, CallSet, CodeBlock, CodeBlockTable, Felt, Kernel, Library, - LibraryError, LibraryPath, Module, Operation, Procedure, ProcedureId, ProcedureName, Program, - ToString, Vec, ONE, ZERO, + LibraryError, LibraryPath, Module, NamedProcedure, Operation, Procedure, ProcedureId, + ProcedureName, Program, ToString, Vec, ONE, ZERO, }; use core::{borrow::Borrow, cell::RefCell}; use vm_core::{utils::group_vector_elements, Decorator, DecoratorList}; diff --git a/assembly/src/assembler/procedure_cache.rs b/assembly/src/assembler/procedure_cache.rs index 9e34d4c530..92fa6271a9 100644 --- a/assembly/src/assembler/procedure_cache.rs +++ b/assembly/src/assembler/procedure_cache.rs @@ -1,14 +1,16 @@ -use super::{btree_map::Entry, AssemblyError, BTreeMap, Procedure, ProcedureId, RpoDigest}; +use super::{ + btree_map::Entry, AssemblyError, BTreeMap, NamedProcedure, Procedure, ProcedureId, RpoDigest, +}; // PROCEDURE CACHE // ================================================================================================ /// The [ProcedureCache] is responsible for caching [Procedure]s. It allows [Procedure]s to be -/// fetched using both [ProcedureId] and [RpoDigest]. +/// fetched using both procedure ID and procedure hash (i.e., MAST root of the procedure). #[derive(Debug, Default)] pub struct ProcedureCache { - proc_map: BTreeMap, - mast_map: BTreeMap, + procedures: BTreeMap, + proc_id_map: BTreeMap, proc_aliases: BTreeMap, } @@ -17,26 +19,33 @@ impl ProcedureCache { // -------------------------------------------------------------------------------------------- /// Returns a [Procedure] reference corresponding to the [ProcedureId]. pub fn get_by_id(&self, id: &ProcedureId) -> Option<&Procedure> { - // first check the procedure map, and if a procedure is not found there, try to look it - // up by its alias - match self.proc_map.get(id) { - Some(proc) => { + // first try to map the procedure ID to MAST root, and if a direct map is not found there, + // try to look it up by its alias + match self.proc_id_map.get(id) { + Some(mast_root) => { debug_assert!(!self.proc_aliases.contains_key(id), "duplicate procedure ID"); - Some(proc) + // if there is an entry in the proc_id_map, there also must be an entry in the + // procedures map + Some(self.procedures.get(mast_root).expect("missing procedure")) } - None => self.proc_aliases.get(id).and_then(|proc_id| self.proc_map.get(proc_id)), + None => self.proc_aliases.get(id).map(|proc_id| { + // if an alias entry was found, there must be an entry in the proc_id_map and an + // entry in the procedures map + let mast_root = self.proc_id_map.get(proc_id).expect("missing MAST root"); + self.procedures.get(mast_root).expect("missing procedure") + }), } } /// Returns a [Procedure] reference corresponding to the MAST root ([RpoDigest]). - pub fn get_by_hash(&self, root: &RpoDigest) -> Option<&Procedure> { - self.mast_map.get(root).and_then(|proc_id| self.proc_map.get(proc_id)) + pub fn get_by_hash(&self, mast_root: &RpoDigest) -> Option<&Procedure> { + self.procedures.get(mast_root) } /// Returns true if the [ProcedureCache] contains a [Procedure] for the specified /// [ProcedureId]. pub fn contains_id(&self, id: &ProcedureId) -> bool { - self.proc_map.contains_key(id) || self.proc_aliases.contains_key(id) + self.proc_id_map.contains_key(id) || self.proc_aliases.contains_key(id) } // MUTATORS @@ -45,20 +54,30 @@ impl ProcedureCache { /// Inserts a [Procedure] into the [ProcedureCache]. /// /// # Errors - /// Returns an error if a procedure with the same ID is already in the cache. - pub fn insert(&mut self, proc: Procedure) -> Result<(), AssemblyError> { - // if a re-exported procedure with the same id is already in the cache, return an error - if self.proc_aliases.contains_key(proc.id()) { + /// Returns an error if: + /// - A procedure with the same ID is already in the cache. + /// - A procedure with the same MAST root but conflicting procedure metadata exists in the + /// cache. + pub fn insert(&mut self, proc: NamedProcedure) -> Result<(), AssemblyError> { + // if a procedure with the same id is already in the cache, return an error + if self.contains_id(proc.id()) { return Err(AssemblyError::duplicate_proc_id(proc.id())); } - // If the entry is `Vacant` then insert the Procedure. If the `ProcedureId` is already in - // the cache (i.e. it is a duplicate) then return an error. - match self.proc_map.entry(*proc.id()) { - Entry::Occupied(_) => Err(AssemblyError::duplicate_proc_id(proc.id())), + // If the entry is `Vacant` then insert the Procedure. If the procedure with the same MAST + // was inserted previously, make sure it doesn't conflict with the new procedure. + match self.procedures.entry(proc.mast_root()) { + Entry::Occupied(cached_proc_entry) => { + let cached_proc = cached_proc_entry.get(); + if proc.num_locals() != cached_proc.num_locals() { + Err(AssemblyError::conflicting_num_locals(proc.name())) + } else { + Ok(()) + } + } Entry::Vacant(entry) => { - self.mast_map.entry(proc.mast_root()).or_insert(*proc.id()); - entry.insert(proc); + self.proc_id_map.entry(*proc.id()).or_insert(proc.mast_root()); + entry.insert(proc.into_inner()); Ok(()) } } @@ -82,16 +101,14 @@ impl ProcedureCache { ) -> Result { // if a procedure with the same id is already in the cache (either as regular procedure or // as an alias), return an error - if self.proc_map.contains_key(&alias_proc_id) - || self.proc_aliases.contains_key(&alias_proc_id) - { + if self.contains_id(&alias_proc_id) { return Err(AssemblyError::duplicate_proc_id(&alias_proc_id)); } // we expect that the procedure being aliased is in cache; if it is neither in the // procedure map, nor in alias map, panic. in case the procedure being aliased is itself // an alias, this also flattens the reference chain. - let proc_id = if self.proc_map.contains_key(&ref_proc_id) { + let proc_id = if self.proc_id_map.contains_key(&ref_proc_id) { ref_proc_id } else { *self.proc_aliases.get(&ref_proc_id).expect("procedure ID not in cache") @@ -99,9 +116,9 @@ impl ProcedureCache { // add an entry to the alias map and get the procedure for this alias self.proc_aliases.insert(alias_proc_id, proc_id); - let proc = self.proc_map.get(&proc_id).expect("procedure not in cache"); + let mast_root = self.proc_id_map.get(&proc_id).expect("procedure not in cache"); - Ok(proc.mast_root()) + Ok(*mast_root) } // TEST HELPERS @@ -110,12 +127,12 @@ impl ProcedureCache { /// Returns an iterator over the [Procedure]s in the [ProcedureCache]. #[cfg(test)] pub fn values(&self) -> impl Iterator { - self.proc_map.values() + self.procedures.values() } /// Returns the number of [Procedure]s in the [ProcedureCache]. #[cfg(test)] pub fn len(&self) -> usize { - self.mast_map.len() + self.procedures.len() } } diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 1eb191300e..9ee15a94c8 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -15,6 +15,7 @@ pub enum AssemblyError { CallerOutOKernel, CallSetProcedureNotFound(RpoDigest), CircularModuleDependency(Vec), + ConflictingNumLocals(String), DivisionByZero, DuplicateProcName(String, String), DuplicateProcId(ProcedureId), @@ -50,6 +51,10 @@ impl AssemblyError { Self::CircularModuleDependency(dep_chain.to_vec()) } + pub fn conflicting_num_locals(proc_name: &str) -> Self { + Self::ConflictingNumLocals(proc_name.to_string()) + } + pub fn division_by_zero() -> Self { Self::DivisionByZero } @@ -125,6 +130,7 @@ impl fmt::Display for AssemblyError { CallerOutOKernel => write!(f, "caller instruction used outside of kernel"), CallSetProcedureNotFound(mast_root) => write!(f, "callset procedure not found in assembler cache for procedure with MAST root {mast_root}"), CircularModuleDependency(dep_chain) => write!(f, "circular module dependency in the following chain: {dep_chain:?}"), + ConflictingNumLocals(proc_name) => write!(f, "procedure `{proc_name}` has the same MAST as another procedure but different number of locals"), DivisionByZero => write!(f, "division by zero"), DuplicateProcName(proc_name, module_path) => write!(f, "duplicate proc name '{proc_name}' in module {module_path}"), DuplicateProcId(proc_id) => write!(f, "duplicate proc id {proc_id}"), diff --git a/assembly/src/lib.rs b/assembly/src/lib.rs index 59b9f19d54..cb3eff7172 100644 --- a/assembly/src/lib.rs +++ b/assembly/src/lib.rs @@ -19,7 +19,7 @@ mod library; pub use library::{Library, LibraryNamespace, LibraryPath, MaslLibrary, Module, Version}; mod procedures; -use procedures::{CallSet, Procedure}; +use procedures::{CallSet, NamedProcedure, Procedure}; pub use procedures::{ProcedureId, ProcedureName}; pub mod ast; diff --git a/assembly/src/procedures/mod.rs b/assembly/src/procedures/mod.rs index 699d63b40b..f1b896c04a 100644 --- a/assembly/src/procedures/mod.rs +++ b/assembly/src/procedures/mod.rs @@ -12,36 +12,81 @@ use core::{ // PROCEDURE // ================================================================================================ -/// Contains metadata and MAST of a procedure. +/// Miden assembly procedure consisting of procedure MAST and basic metadata. +/// +/// Procedure metadata includes: +/// - Number of procedure locals available to the procedure. +/// - A set of MAST roots of procedures which are invoked from this procedure. #[derive(Clone, Debug)] pub struct Procedure { - id: ProcedureId, - label: ProcedureName, - is_export: bool, num_locals: u32, - code_root: CodeBlock, + code: CodeBlock, callset: CallSet, } impl Procedure { + /// Returns the number of memory locals reserved by the procedure. + pub fn num_locals(&self) -> u32 { + self.num_locals + } + + /// Returns the root of this procedure's MAST. + pub fn mast_root(&self) -> RpoDigest { + self.code.hash() + } + + /// Returns a reference to the MAST of this procedure. + pub fn code(&self) -> &CodeBlock { + &self.code + } + + /// Returns a reference to a set of all procedures (identified by their MAST roots) which may + /// be called during the execution of this procedure. + pub fn callset(&self) -> &CallSet { + &self.callset + } +} + +// NAMED PROCEDURE +// ================================================================================================ + +/// A named Miden assembly procedure consisting of procedure MAST and procedure metadata. +/// +/// Procedure metadata includes: +/// - Procedure name. +/// - Procedure ID which is computed as a hash of the procedure's fully qualified path. +/// - A boolean flag indicating whether the procedure is exported from a module. +/// - Number of procedure locals available to the procedure. +/// - A set of MAST roots of procedures which are invoked from this procedure. +#[derive(Clone, Debug)] +pub struct NamedProcedure { + id: ProcedureId, + name: ProcedureName, + is_export: bool, + procedure: Procedure, +} + +impl NamedProcedure { // CONSTRUCTOR // -------------------------------------------------------------------------------------------- /// Returns a new [Procedure] instantiated with the specified properties. pub fn new( id: ProcedureId, - label: ProcedureName, + name: ProcedureName, is_export: bool, num_locals: u32, - code_root: CodeBlock, + code: CodeBlock, callset: CallSet, ) -> Self { - Procedure { + NamedProcedure { id, - label, + name, is_export, - num_locals, - code_root, - callset, + procedure: Procedure { + num_locals, + code, + callset, + }, } } @@ -54,8 +99,8 @@ impl Procedure { } /// Returns a label of this procedure. - pub fn label(&self) -> &ProcedureName { - &self.label + pub fn name(&self) -> &ProcedureName { + &self.name } /// Returns `true` if this is an exported procedure. @@ -65,23 +110,35 @@ impl Procedure { /// Returns the number of memory locals reserved by the procedure. pub fn num_locals(&self) -> u32 { - self.num_locals + self.procedure.num_locals } /// Returns the root of this procedure's MAST. pub fn mast_root(&self) -> RpoDigest { - self.code_root.hash() + self.procedure.code.hash() } /// Returns a reference to the MAST of this procedure. pub fn code(&self) -> &CodeBlock { - &self.code_root + &self.procedure.code } /// Returns a reference to a set of all procedures (identified by their MAST roots) which may /// be called during the execution of this procedure. pub fn callset(&self) -> &CallSet { - &self.callset + &self.procedure.callset + } + + /// Returns the inner procedure containing all procedure attributes except for procedure name + /// and ID. + pub fn inner(&self) -> &Procedure { + &self.procedure + } + + /// Converts this procedure into its inner procedure containing all procedure attributes except + /// for procedure name and ID. + pub fn into_inner(self) -> Procedure { + self.procedure } } From 7a3609aefb4b078615266630527df8872abb66b0 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Fri, 21 Jul 2023 01:29:56 -0700 Subject: [PATCH 030/120] feat: allow the assembler to produce programs with phantom calls --- CHANGELOG.md | 1 + assembly/src/assembler/context.rs | 45 ++++++++++++++++--- .../src/assembler/instruction/procedures.rs | 28 ++++++------ assembly/src/assembler/mod.rs | 23 ++++++---- assembly/src/errors.rs | 16 +++---- assembly/src/library/mod.rs | 2 +- assembly/src/tests.rs | 19 ++++++-- 7 files changed, 88 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2b2b1c2a4..3ff6a92866 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). - Added `get_mapped_values()` and `get_store_subset()` methods to the `AdviceProvider` trait (#987). - Improved handling of invalid/incomplete parameters in `StackOutputs` constructors (#1010). +- Allowed the assembler to produce programs with "phantom" calls (#1019). ## 0.6.1 (2023-06-29) diff --git a/assembly/src/assembler/context.rs b/assembly/src/assembler/context.rs index 283373d921..e3f7284ec3 100644 --- a/assembly/src/assembler/context.rs +++ b/assembly/src/assembler/context.rs @@ -16,6 +16,7 @@ pub struct AssemblyContext { module_stack: Vec, is_kernel: bool, kernel: Option, + allow_phantom_calls: bool, } /// Describes which type of Miden assembly modules can be compiled with a given [AssemblyContext]. @@ -29,6 +30,7 @@ pub enum AssemblyContextType { impl AssemblyContext { // CONSTRUCTORS // -------------------------------------------------------------------------------------------- + /// Returns a new [AssemblyContext]. /// /// The `context_type` specifies how the context will be used and the [AssemblyContext] is @@ -45,9 +47,23 @@ impl AssemblyContext { module_stack: modules, is_kernel: context_type == AssemblyContextType::Kernel, kernel: None, + allow_phantom_calls: false, } } + /// Sets the flag specifying whether phantom calls are allowed in this context. + /// + /// # Panics + /// Panics if the context was instantiated for compiling a kernel module as procedure calls + /// are not allowed in kernel modules in general. + pub fn with_phantom_calls(mut self, allow_phantom_calls: bool) -> Self { + if self.is_kernel { + assert!(!allow_phantom_calls); + } + self.allow_phantom_calls = allow_phantom_calls; + self + } + // PUBLIC ACCESSORS // -------------------------------------------------------------------------------------------- @@ -140,8 +156,8 @@ impl AssemblyContext { /// Completes compilation of the current procedure and adds the compiled procedure to the list /// of the current module's compiled procedures. - pub fn complete_proc(&mut self, code_root: CodeBlock) { - self.module_stack.last_mut().expect("no modules").complete_proc(code_root); + pub fn complete_proc(&mut self, code: CodeBlock) { + self.module_stack.last_mut().expect("no modules").complete_proc(code); } // CALL PROCESSORS @@ -205,6 +221,22 @@ impl AssemblyContext { Ok(()) } + /// Registers a "phantom" call to the procedure with the specified MAST root. + /// + /// A phantom call indicates that code for the procedure is not available. Executing a phantom + /// call will result in a runtime error. However, the VM may be able to execute a program with + /// phantom calls as long as the branches containing them are not taken. + /// + /// # Errors + /// Returns an error if phantom calls are not allowed in this assembly context. + pub fn register_phantom_call(&mut self, mast_root: RpoDigest) -> Result<(), AssemblyError> { + if !self.allow_phantom_calls { + Err(AssemblyError::phantom_calls_not_allowed(mast_root)) + } else { + Ok(()) + } + } + // CONTEXT FINALIZERS // -------------------------------------------------------------------------------------------- @@ -356,7 +388,7 @@ impl ModuleContext { is_export: bool, num_locals: u16, ) -> Result<(), AssemblyError> { - // make sure a procedure with this name as not been compiled yet and is also not currently + // make sure a procedure with this name has not been compiled yet and is also not currently // on the stack of procedures being compiled if self.compiled_procs.iter().any(|p| p.name() == name) || self.proc_stack.iter().any(|p| &p.name == name) @@ -364,8 +396,7 @@ impl ModuleContext { return Err(AssemblyError::duplicate_proc_name(name, &self.path)); } - let name = ProcedureName::try_from(name.to_string())?; - self.proc_stack.push(ProcedureContext::new(name, is_export, num_locals)); + self.proc_stack.push(ProcedureContext::new(name.clone(), is_export, num_locals)); Ok(()) } @@ -375,7 +406,7 @@ impl ModuleContext { /// compiled procedure, and adds it to the list of compiled procedures. /// /// This also updates module callset to include the callset of the newly compiled procedure. - pub fn complete_proc(&mut self, code_root: CodeBlock) { + pub fn complete_proc(&mut self, code: CodeBlock) { let proc_context = self.proc_stack.pop().expect("no procedures"); // build an ID for the procedure as follows: @@ -388,7 +419,7 @@ impl ModuleContext { ProcedureId::from_index(proc_idx, &self.path) }; - let proc = proc_context.into_procedure(proc_id, code_root); + let proc = proc_context.into_procedure(proc_id, code); self.callset.append(proc.callset()); self.compiled_procs.push(proc); } diff --git a/assembly/src/assembler/instruction/procedures.rs b/assembly/src/assembler/instruction/procedures.rs index d08d510015..fcd3d8ce48 100644 --- a/assembly/src/assembler/instruction/procedures.rs +++ b/assembly/src/assembler/instruction/procedures.rs @@ -33,7 +33,7 @@ impl Assembler { let proc_cache = self.proc_cache.borrow(); let proc = proc_cache.get_by_id(proc_id).expect("procedure not in cache"); - // register and "inlined" call to the procedure; this updates the callset of the + // register an "inlined" call to the procedure; this updates the callset of the // procedure currently being compiled context.register_external_call(proc, true)?; @@ -49,7 +49,7 @@ impl Assembler { index: u16, context: &mut AssemblyContext, ) -> Result, AssemblyError> { - // register an "non-inlined" call to the procedure at the specified index in the module + // register a "non-inlined" call to the procedure at the specified index in the module // currently being complied; this updates the callset of the procedure currently being // compiled let proc = context.register_local_call(index, false)?; @@ -60,24 +60,22 @@ impl Assembler { pub(super) fn call_mast_root( &self, - root: &RpoDigest, + mast_root: &RpoDigest, context: &mut AssemblyContext, ) -> Result, AssemblyError> { // get the procedure from the assembler let proc_cache = self.proc_cache.borrow(); - // TODO: consider relaxing the restriction that mast roots must exist in the procedure - // cache; see https://github.com/0xPolygonMiden/miden-vm/pull/911/files#r1202962206 - let proc = proc_cache - .get_by_hash(root) - .ok_or(AssemblyError::proc_mast_root_not_found(root))?; - - // register and "non-inlined" call to the procedure; this updates the callset of the - // procedure currently being compiled - context.register_external_call(proc, false)?; + // if the procedure with the specified MAST root exists in procedure cache, register a + // "non-inlined" call to the procedure (to update the callset of the procedure currently + // being compiled); otherwise, register a "phantom" call. + match proc_cache.get_by_hash(mast_root) { + Some(proc) => context.register_external_call(proc, false)?, + None => context.register_phantom_call(*mast_root)?, + } // create a new CALL block for the procedure call and return - Ok(Some(CodeBlock::new_call(proc.mast_root()))) + Ok(Some(CodeBlock::new_call(*mast_root))) } pub(super) fn call_imported( @@ -92,7 +90,7 @@ impl Assembler { let proc_cache = self.proc_cache.borrow(); let proc = proc_cache.get_by_id(proc_id).expect("procedure not in cache"); - // register and "non-inlined" call to the procedure; this updates the callset of the + // register a "non-inlined" call to the procedure; this updates the callset of the // procedure currently being compiled context.register_external_call(proc, false)?; @@ -118,7 +116,7 @@ impl Assembler { // a kernel procedure must be empty. debug_assert!(proc.callset().is_empty(), "non-empty callset for a kernel procedure"); - // register and "non-inlined" call to the procedure; this updates the callset of the + // register a "non-inlined" call to the procedure; this updates the callset of the // procedure currently being compiled context.register_external_call(proc, false)?; diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index 93a938366b..40b0f39bc7 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -116,6 +116,7 @@ impl Assembler { // PROGRAM COMPILER // -------------------------------------------------------------------------------------------- + /// Compiles the provided source code into a [Program]. The resulting program can be executed /// on Miden VM. /// @@ -141,7 +142,7 @@ impl Assembler { } /// Compiles the provided [ProgramAst] into a program and returns the program root - /// ([CodeBlock]). Mutates the provided context by adding all of the call targets of + /// ([CodeBlock]). Mutates the provided context by adding all of the call targets of /// the program to the [CallSet]. /// /// # Errors @@ -172,6 +173,7 @@ impl Assembler { Ok(program_root) } + // MODULE COMPILER // -------------------------------------------------------------------------------------------- @@ -252,7 +254,7 @@ impl Assembler { ) -> Result<(), AssemblyError> { context.begin_proc(&proc.name, proc.is_export, proc.num_locals)?; - let code_root = if proc.num_locals > 0 { + let code = if proc.num_locals > 0 { // for procedures with locals, we need to update fmp register before and after the // procedure body is executed. specifically: // - to allocate procedure locals we need to increment fmp by the number of locals @@ -267,7 +269,7 @@ impl Assembler { self.compile_body(proc.body.nodes().iter(), context, None)? }; - context.complete_proc(code_root); + context.complete_proc(code); Ok(()) } @@ -407,10 +409,10 @@ struct BodyWrapper { epilogue: Vec, } -// UTILITY FUNCTIONS +// HELPER FUNCTIONS // ================================================================================================ -pub fn combine_blocks(mut blocks: Vec) -> CodeBlock { +fn combine_blocks(mut blocks: Vec) -> CodeBlock { debug_assert!(!blocks.is_empty(), "cannot combine empty block list"); // merge consecutive Span blocks. let mut merged_blocks: Vec = Vec::with_capacity(blocks.len()); @@ -432,7 +434,7 @@ pub fn combine_blocks(mut blocks: Vec) -> CodeBlock { merged_blocks.push(combine_spans(&mut contiguous_spans)); } - // build a binary tree of blocks joining them using Join blocks + // build a binary tree of blocks joining them using JOIN blocks let mut blocks = merged_blocks; while blocks.len() > 1 { let last_block = if blocks.len() % 2 == 0 { None } else { blocks.pop() }; @@ -453,8 +455,11 @@ pub fn combine_blocks(mut blocks: Vec) -> CodeBlock { blocks.remove(0) } -/// Returns a CodeBlock [Span] from sequence of Span blocks provided as input. -pub fn combine_spans(spans: &mut Vec) -> CodeBlock { +/// Combines a vector of SPAN blocks into a single SPAN block. +/// +/// # Panics +/// Panics if any of the provided blocks is not a SPAN block. +fn combine_spans(spans: &mut Vec) -> CodeBlock { if spans.len() == 1 { return spans.remove(0); } @@ -470,7 +475,7 @@ pub fn combine_spans(spans: &mut Vec) -> CodeBlock { ops.extend_from_slice(batch.ops()); } } else { - panic!("Codeblock was expected to be a Span Block, got {block:?}."); + panic!("CodeBlock was expected to be a Span Block, got {block:?}."); } }); CodeBlock::new_span_with_decorators(ops, decorators) diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 9ee15a94c8..9f307f56a9 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -3,7 +3,6 @@ use super::{ ToString, Token, Vec, }; use core::fmt; -use vm_core::utils::write_hex_bytes; // ASSEMBLY ERROR // ================================================================================================ @@ -20,7 +19,6 @@ pub enum AssemblyError { DuplicateProcName(String, String), DuplicateProcId(ProcedureId), ExportedProcInProgram(String), - ProcMastRootNotFound(RpoDigest), ImportedProcModuleNotFound(ProcedureId), ImportedProcNotFoundInModule(ProcedureId, String), InvalidProgramAssemblyContext, @@ -29,6 +27,7 @@ pub enum AssemblyError { LocalProcNotFound(u16, String), ParsingError(String), ParamOutOfBounds(u64, u64, u64), + PhantomCallsNotAllowed(RpoDigest), ProcedureNameError(String), SysCallInKernel(String), LibraryError(String), @@ -71,10 +70,6 @@ impl AssemblyError { Self::ExportedProcInProgram(proc_name.to_string()) } - pub fn proc_mast_root_not_found(root: &RpoDigest) -> Self { - Self::ProcMastRootNotFound(*root) - } - pub fn imported_proc_module_not_found(proc_id: &ProcedureId) -> Self { Self::ImportedProcModuleNotFound(*proc_id) } @@ -95,6 +90,10 @@ impl AssemblyError { Self::ParamOutOfBounds(value, min, max) } + pub fn phantom_calls_not_allowed(mast_root: RpoDigest) -> Self { + Self::PhantomCallsNotAllowed(mast_root) + } + pub fn syscall_in_kernel(kernel_proc_name: &str) -> Self { Self::SysCallInKernel(kernel_proc_name.to_string()) } @@ -144,10 +143,7 @@ impl fmt::Display for AssemblyError { LibraryError(err) | ParsingError(err) | ProcedureNameError(err) => write!(f, "{err}"), LocalProcNotFound(proc_idx, module_path) => write!(f, "procedure at index {proc_idx} not found in module {module_path}"), ParamOutOfBounds(value, min, max) => write!(f, "parameter value must be greater than or equal to {min} and less than or equal to {max}, but was {value}"), - ProcMastRootNotFound(digest) => { - write!(f, "procedure mast root not found for digest - ")?; - write_hex_bytes(f, &digest.as_bytes()) - }, + PhantomCallsNotAllowed(mast_root) => write!(f, "cannot call phantom procedure with MAST root 0x{mast_root}: phantom calls not allowed"), SysCallInKernel(proc_name) => write!(f, "syscall instruction used in kernel procedure '{proc_name}'"), } } diff --git a/assembly/src/library/mod.rs b/assembly/src/library/mod.rs index e74809bfc1..4bc34d7ea8 100644 --- a/assembly/src/library/mod.rs +++ b/assembly/src/library/mod.rs @@ -89,7 +89,7 @@ impl Module { Self { path, ast } } - /// Create a new kernel module from a AST using the constant [`LibraryPath::kernel_path`]. + /// Create a new kernel module from a AST using the constant [LibraryPath::kernel_path]. pub fn kernel(ast: ModuleAst) -> Self { Self { path: LibraryPath::kernel_path(), diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 3b2ddaf448..6ddc3a0eb7 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -1,6 +1,7 @@ use crate::{ ast::{ModuleAst, ProgramAst}, - Assembler, AssemblyContextType, Library, LibraryNamespace, LibraryPath, Module, Version, + Assembler, AssemblyContext, AssemblyContextType, Library, LibraryNamespace, LibraryPath, + Module, Version, }; use core::slice::Iter; @@ -588,14 +589,24 @@ fn program_with_invalid_rpo_digest_call() { } #[test] -fn program_with_mast_root_call_that_does_not_exist() { +fn program_with_phantom_mast_call() { let assembler = super::Assembler::default(); + let source = "begin call.0xc2545da99d3a1f3f38d957c7893c44d78998d8ea8b11aba7e22c8c2b2a213dae end"; - let result = assembler.compile(source); + let ast = ProgramAst::parse(source).unwrap(); + + // phantom calls not allowed + let mut context = AssemblyContext::new(AssemblyContextType::Program).with_phantom_calls(false); + let result = assembler.compile_in_context(&ast, &mut context); let err = result.err().unwrap(); - let expected_error = "procedure mast root not found for digest - 0xc2545da99d3a1f3f38d957c7893c44d78998d8ea8b11aba7e22c8c2b2a213dae"; + let expected_error = "cannot call phantom procedure with MAST root 0xc2545da99d3a1f3f38d957c7893c44d78998d8ea8b11aba7e22c8c2b2a213dae: phantom calls not allowed"; assert_eq!(expected_error, err.to_string()); + + // phantom calls allowed + let mut context = AssemblyContext::new(AssemblyContextType::Program).with_phantom_calls(true); + let result = assembler.compile_in_context(&ast, &mut context); + assert!(result.is_ok()); } // IMPORTS From 44606620baea13de7c3a9a13ec744bbc4e73703b Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Tue, 4 Jul 2023 04:00:46 +0300 Subject: [PATCH 031/120] feat: impl cycle limit and expected memory consumption --- CHANGELOG.md | 1 + air/src/errors.rs | 5 ++++ air/src/options.rs | 35 +++++++++++++++++++------ miden/src/cli/prove.rs | 15 +++++------ miden/src/cli/run.rs | 8 +++--- miden/src/examples/mod.rs | 23 +++++++++++----- miden/tests/integration/cli/cli_test.rs | 10 ++++++- processor/src/chiplets/tests.rs | 7 ++--- processor/src/decoder/tests.rs | 10 ++++--- processor/src/decorators/tests.rs | 8 +++--- processor/src/errors.rs | 4 +++ processor/src/lib.rs | 25 ++++++++++++------ processor/src/operations/mod.rs | 28 +++++++++++++++----- processor/src/system/mod.rs | 14 ++++++++-- processor/src/system/tests.rs | 21 +++++++++++++++ processor/src/trace/tests/mod.rs | 8 +++--- stdlib/tests/mem/mod.rs | 5 ++-- test-utils/src/lib.rs | 16 ++++++++--- 18 files changed, 181 insertions(+), 62 deletions(-) create mode 100644 processor/src/system/tests.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index f2b2b1c2a4..43a3ac5e7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). - Added `get_mapped_values()` and `get_store_subset()` methods to the `AdviceProvider` trait (#987). +- [BREAKING] Added options to specify maximum number of cycles and expected number of cycles for a program (#998). - Improved handling of invalid/incomplete parameters in `StackOutputs` constructors (#1010). ## 0.6.1 (2023-06-29) diff --git a/air/src/errors.rs b/air/src/errors.rs index b8c9114653..ce9c50b8be 100644 --- a/air/src/errors.rs +++ b/air/src/errors.rs @@ -1,4 +1,5 @@ use super::String; +use crate::trace::MIN_TRACE_LEN; use core::fmt::{Display, Formatter}; // EXECUTION ERROR @@ -7,6 +8,7 @@ use core::fmt::{Display, Formatter}; #[derive(Debug)] pub enum ExecutionOptionsError { ExpectedCyclesTooBig(u32, u32), + MaxCycleNumTooSmall(u32), OtherErrors(String), } @@ -18,6 +20,9 @@ impl Display for ExecutionOptionsError { ExpectedCyclesTooBig(max, expected) => { write!(f, "The expected number of cycles must be smaller than the maximum number of cycles: maximum is {max}, but expectd is {expected}") } + MaxCycleNumTooSmall(max) => { + write!(f, "The maximum number of cycles must be greater than the minimum number of cycles: minimum is {MIN_TRACE_LEN}, but maximum is {max}") + } OtherErrors(error) => write!(f, "{error}"), } } diff --git a/air/src/options.rs b/air/src/options.rs index b94e3536c4..4cbc995a60 100644 --- a/air/src/options.rs +++ b/air/src/options.rs @@ -1,4 +1,5 @@ use super::{ExecutionOptionsError, HashFunction}; +use crate::trace::MIN_TRACE_LEN; use winter_air::{FieldExtension, ProofOptions as WinterProofOptions}; // PROVING OPTIONS @@ -133,15 +134,15 @@ impl From for WinterProofOptions { /// - `expected_cycles` specifies the number of cycles a program is expected to execute. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ExecutionOptions { - max_cycles: Option, + max_cycles: u32, expected_cycles: u32, } impl Default for ExecutionOptions { fn default() -> Self { ExecutionOptions { - max_cycles: None, - expected_cycles: 64, + max_cycles: u32::MAX, + expected_cycles: MIN_TRACE_LEN as u32, } } } @@ -151,19 +152,37 @@ impl ExecutionOptions { // -------------------------------------------------------------------------------------------- /// Creates a new instance of [ExecutionOptions] from the specified parameters. + /// + /// If the `max_cycles` is `None` the maximum number of cycles will be set to `u32::MAX` pub fn new( max_cycles: Option, expected_cycles: u32, ) -> Result { - if max_cycles.is_some_and(|max_cycles| max_cycles < expected_cycles) { - return Err(ExecutionOptionsError::ExpectedCyclesTooBig( - max_cycles.unwrap(), - expected_cycles, - )); + let max_cycles = max_cycles.unwrap_or(u32::MAX); + if max_cycles < MIN_TRACE_LEN as u32 { + return Err(ExecutionOptionsError::MaxCycleNumTooSmall(expected_cycles)); + } + if max_cycles < expected_cycles { + return Err(ExecutionOptionsError::ExpectedCyclesTooBig(max_cycles, expected_cycles)); } + + // Round up the expected number of cycles to the next power of two. If it is smaller than + // MIN_TRACE_LEN -- pad expected number to it. + let expected_cycles = expected_cycles.next_power_of_two().max(MIN_TRACE_LEN as u32); + Ok(ExecutionOptions { max_cycles, expected_cycles, }) } + + /// Returns maximum number of cycles + pub fn max_cycles(&self) -> u32 { + self.max_cycles + } + + /// Returns number of the expected cycles + pub fn expected_cycles(&self) -> u32 { + self.expected_cycles + } } diff --git a/miden/src/cli/prove.rs b/miden/src/cli/prove.rs index 2f90800e57..11e37893a7 100644 --- a/miden/src/cli/prove.rs +++ b/miden/src/cli/prove.rs @@ -25,8 +25,8 @@ pub struct ProveCmd { library_paths: Vec, /// Maximum number of cycles a program is allowed to consume - #[structopt(short = "m", long = "max-cycles")] - max_cycles: Option, + #[structopt(short = "m", long = "max-cycles", default_value = "4294967295")] + max_cycles: u32, /// Number of outputs #[structopt(short = "n", long = "num-outputs", default_value = "16")] @@ -51,14 +51,13 @@ pub struct ProveCmd { impl ProveCmd { pub fn get_proof_options(&self) -> Result { - let exec_options = ExecutionOptions::new(self.max_cycles, self.expected_cycles)?; - match self.security.as_str() { - "96bits" => Ok(ProvingOptions::with_96_bit_security(self.recursive) - .with_execution_options(exec_options)), - "128bits" => Ok(ProvingOptions::with_128_bit_security(self.recursive) - .with_execution_options(exec_options)), + let exec_options = ExecutionOptions::new(Some(self.max_cycles), self.expected_cycles)?; + Ok(match self.security.as_str() { + "96bits" => ProvingOptions::with_96_bit_security(self.recursive), + "128bits" => ProvingOptions::with_128_bit_security(self.recursive), other => panic!("{} is not a valid security setting", other), } + .with_execution_options(exec_options)) } pub fn execute(&self) -> Result<(), String> { diff --git a/miden/src/cli/run.rs b/miden/src/cli/run.rs index 78535d63e9..c7fe6aba46 100644 --- a/miden/src/cli/run.rs +++ b/miden/src/cli/run.rs @@ -23,8 +23,8 @@ pub struct RunCmd { library_paths: Vec, /// Maximum number of cycles a program is allowed to consume - #[structopt(short = "m", long = "max-cycles")] - max_cycles: Option, + #[structopt(short = "m", long = "max-cycles", default_value = "4294967295")] + max_cycles: u32, /// Number of ouptuts #[structopt(short = "n", long = "num-outputs", default_value = "16")] @@ -51,7 +51,7 @@ impl RunCmd { let input_data = InputFile::read(&self.input_file, &self.assembly_file)?; // get execution options - let execution_options = ExecutionOptions::new(self.max_cycles, self.expected_cycles) + let execution_options = ExecutionOptions::new(Some(self.max_cycles), self.expected_cycles) .map_err(|err| format!("{err}"))?; // fetch the stack and program inputs from the arguments @@ -64,7 +64,7 @@ impl RunCmd { // execute program and generate outputs let trace = processor::execute(&program, stack_inputs, advice_provider, execution_options) - .map_err(|err| format!("Failed to generate exection trace = {:?}", err))?; + .map_err(|err| format!("Failed to generate execution trace = {:?}", err))?; println!("done ({} steps in {} ms)", trace.get_trace_len(), now.elapsed().as_millis()); diff --git a/miden/src/examples/mod.rs b/miden/src/examples/mod.rs index 93c0c50b9b..f22d92ccad 100644 --- a/miden/src/examples/mod.rs +++ b/miden/src/examples/mod.rs @@ -1,4 +1,5 @@ use miden::{AdviceProvider, ExecutionProof, Program, ProgramInfo, ProvingOptions, StackInputs}; +use processor::{ExecutionOptions, ExecutionOptionsError}; use std::io::Write; use std::time::Instant; use structopt::StructOpt; @@ -28,13 +29,21 @@ pub struct ExampleOptions { #[structopt(subcommand)] pub example: ExampleType, - /// Security level for execution proofs generated by the VM - #[structopt(short = "s", long = "security", default_value = "96bits")] - security: String, + /// Number of cycles the program is expected to consume + #[structopt(short = "e", long = "exp-cycles", default_value = "64")] + expected_cycles: u32, + + /// Maximum number of cycles a program is allowed to consume + #[structopt(short = "m", long = "max-cycles", default_value = "4294967295")] + max_cycles: u32, /// Enable generation of proofs suitable for recursive verification #[structopt(short = "r", long = "recursive")] recursive: bool, + + /// Security level for execution proofs generated by the VM + #[structopt(short = "s", long = "security", default_value = "96bits")] + security: String, } #[derive(StructOpt, Debug)] @@ -49,12 +58,14 @@ pub enum ExampleType { } impl ExampleOptions { - pub fn get_proof_options(&self) -> ProvingOptions { - match self.security.as_str() { + pub fn get_proof_options(&self) -> Result { + let exec_options = ExecutionOptions::new(Some(self.max_cycles), self.expected_cycles)?; + Ok(match self.security.as_str() { "96bits" => ProvingOptions::with_96_bit_security(self.recursive), "128bits" => ProvingOptions::with_128_bit_security(self.recursive), other => panic!("{} is not a valid security level", other), } + .with_execution_options(exec_options)) } pub fn execute(&self) -> Result<(), String> { @@ -66,7 +77,7 @@ impl ExampleOptions { .filter_level(log::LevelFilter::Debug) .init(); - let proof_options = self.get_proof_options(); + let proof_options = self.get_proof_options().map_err(|err| format!("{err}"))?; // instantiate and prepare the example let example = match self.example { diff --git a/miden/tests/integration/cli/cli_test.rs b/miden/tests/integration/cli/cli_test.rs index eda1172ad1..9a304d2cba 100644 --- a/miden/tests/integration/cli/cli_test.rs +++ b/miden/tests/integration/cli/cli_test.rs @@ -16,7 +16,15 @@ fn cli_run() -> Result<(), Box> { let mut cmd = bin_under_test.command(); - cmd.arg("run").arg("-a").arg("examples/fib/fib.masm").arg("-n").arg("1"); + cmd.arg("run") + .arg("-a") + .arg("examples/fib/fib.masm") + .arg("-n") + .arg("1") + .arg("-m") + .arg("4096") + .arg("-e") + .arg("4096"); let output = cmd.unwrap(); diff --git a/processor/src/chiplets/tests.rs b/processor/src/chiplets/tests.rs index 545c9d3f16..aec54bd884 100644 --- a/processor/src/chiplets/tests.rs +++ b/processor/src/chiplets/tests.rs @@ -1,6 +1,6 @@ use crate::{ - utils::get_trace_len, CodeBlock, ExecutionTrace, Kernel, MemAdviceProvider, Operation, Process, - StackInputs, Vec, + utils::get_trace_len, CodeBlock, ExecutionOptions, ExecutionTrace, Kernel, MemAdviceProvider, + Operation, Process, StackInputs, Vec, }; use miden_air::trace::{ chiplets::{ @@ -112,7 +112,8 @@ fn build_trace( ) -> (ChipletsTrace, usize) { let stack_inputs = StackInputs::try_from_values(stack_inputs.iter().copied()).unwrap(); let advice_provider = MemAdviceProvider::default(); - let mut process = Process::new(kernel, stack_inputs, advice_provider); + let mut process = + Process::new(kernel, stack_inputs, advice_provider, ExecutionOptions::default()); let program = CodeBlock::new_span(operations); process.execute_code_block(&program, &CodeBlockTable::default()).unwrap(); diff --git a/processor/src/decoder/tests.rs b/processor/src/decoder/tests.rs index df3b9b21e5..e65d346680 100644 --- a/processor/src/decoder/tests.rs +++ b/processor/src/decoder/tests.rs @@ -1,7 +1,7 @@ use super::{ super::{ - utils::get_trace_len, ExecutionTrace, Felt, Kernel, MemAdviceProvider, Operation, Process, - StackInputs, Word, + utils::get_trace_len, ExecutionOptions, ExecutionTrace, Felt, Kernel, MemAdviceProvider, + Operation, Process, StackInputs, Word, }, build_op_group, AuxTraceHints, BlockHashTableRow, BlockStackTableRow, BlockTableUpdate, ExecutionContextInfo, OpGroupTableRow, OpGroupTableUpdate, @@ -1500,7 +1500,8 @@ fn set_user_op_helpers_many() { fn build_trace(stack_inputs: &[u64], program: &CodeBlock) -> (DecoderTrace, AuxTraceHints, usize) { let stack_inputs = StackInputs::try_from_values(stack_inputs.iter().copied()).unwrap(); let advice_provider = MemAdviceProvider::default(); - let mut process = Process::new(Kernel::default(), stack_inputs, advice_provider); + let mut process = + Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); process.execute_code_block(program, &CodeBlockTable::default()).unwrap(); let (trace, aux_hints) = ExecutionTrace::test_finalize_trace(process); @@ -1527,7 +1528,8 @@ fn build_call_trace( }; let advice_provider = MemAdviceProvider::default(); let stack_inputs = crate::StackInputs::default(); - let mut process = Process::new(kernel, stack_inputs, advice_provider); + let mut process = + Process::new(kernel, stack_inputs, advice_provider, ExecutionOptions::default()); // build code block table let mut cb_table = CodeBlockTable::default(); diff --git a/processor/src/decorators/tests.rs b/processor/src/decorators/tests.rs index 88623cd7c7..17aee7542c 100644 --- a/processor/src/decorators/tests.rs +++ b/processor/src/decorators/tests.rs @@ -1,5 +1,5 @@ use super::{ - super::{AdviceInputs, Felt, FieldElement, Kernel, Operation, StarkField}, + super::{AdviceInputs, ExecutionOptions, Felt, FieldElement, Kernel, Operation, StarkField}, Process, }; use crate::{MemAdviceProvider, StackInputs, Word}; @@ -30,7 +30,8 @@ fn push_merkle_node() { let stack_inputs = StackInputs::try_from_values(stack_inputs).unwrap(); let advice_inputs = AdviceInputs::default().with_merkle_store(store); let advice_provider = MemAdviceProvider::from(advice_inputs); - let mut process = Process::new(Kernel::default(), stack_inputs, advice_provider); + let mut process = + Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); process.execute_op(Operation::Noop).unwrap(); // push the node onto the advice stack @@ -185,7 +186,8 @@ fn assert_case_smtget( .with_merkle_store(store) .with_map([(node.into_bytes(), mapped)]); let advice_provider = MemAdviceProvider::from(advice_inputs); - let mut process = Process::new(Kernel::default(), stack_inputs, advice_provider); + let mut process = + Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); // call the injector and clear the stack process.execute_op(Operation::Noop).unwrap(); diff --git a/processor/src/errors.rs b/processor/src/errors.rs index d6a10de95a..e95c0c5649 100644 --- a/processor/src/errors.rs +++ b/processor/src/errors.rs @@ -19,6 +19,7 @@ pub enum ExecutionError { AdviceStackReadFailed(u32), CallerNotInSyscall, CodeBlockNotFound(Digest), + CycleLimitExceeded(u32), DivideByZero(u32), Ext2InttError(Ext2InttError), FailedAssertion(u32), @@ -61,6 +62,9 @@ impl Display for ExecutionError { "Failed to execute code block with root {hex}; the block could not be found" ) } + CycleLimitExceeded(max_cycles) => { + write!(f, "Exceeded the allowed number of cycles (max cycles = {max_cycles})") + } DivideByZero(clk) => write!(f, "Division by zero at clock cycle {clk}"), Ext2InttError(err) => write!(f, "Failed to execute Ext2Intt operation: {err}"), FailedAssertion(clk) => write!(f, "Assertion failed at clock cycle {clk}"), diff --git a/processor/src/lib.rs b/processor/src/lib.rs index c6eb96107f..ecedcddea1 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -112,13 +112,13 @@ pub fn execute( program: &Program, stack_inputs: StackInputs, advice_provider: A, - _options: ExecutionOptions, + options: ExecutionOptions, ) -> Result where A: AdviceProvider, { - let mut process = Process::new(program.kernel().clone(), stack_inputs, advice_provider); - // TODO: use ExecutionOptions to limit program execution + let mut process = + Process::new(program.kernel().clone(), stack_inputs, advice_provider, options); let stack_outputs = process.execute(program)?; let trace = ExecutionTrace::new(process, stack_outputs); assert_eq!(&program.hash(), trace.program_hash(), "inconsistent program hash"); @@ -161,6 +161,7 @@ where range: RangeChecker, chiplets: Chiplets, advice_provider: A, + max_cycles: u32, } impl Process @@ -170,13 +171,18 @@ where // CONSTRUCTORS // -------------------------------------------------------------------------------------------- /// Creates a new process with the provided inputs. - pub fn new(kernel: Kernel, stack_inputs: StackInputs, advice_provider: A) -> Self { - Self::initialize(kernel, stack_inputs, advice_provider, false) + pub fn new( + kernel: Kernel, + stack_inputs: StackInputs, + advice_provider: A, + execution_options: ExecutionOptions, + ) -> Self { + Self::initialize(kernel, stack_inputs, advice_provider, false, execution_options) } /// Creates a new process with provided inputs and debug options enabled. pub fn new_debug(kernel: Kernel, stack_inputs: StackInputs, advice_provider: A) -> Self { - Self::initialize(kernel, stack_inputs, advice_provider, true) + Self::initialize(kernel, stack_inputs, advice_provider, true, ExecutionOptions::default()) } fn initialize( @@ -184,14 +190,16 @@ where stack: StackInputs, advice_provider: A, in_debug_mode: bool, + execution_options: ExecutionOptions, ) -> Self { Self { - system: System::new(MIN_TRACE_LEN), + system: System::new(execution_options.expected_cycles() as usize), decoder: Decoder::new(in_debug_mode), - stack: Stack::new(&stack, MIN_TRACE_LEN, in_debug_mode), + stack: Stack::new(&stack, execution_options.expected_cycles() as usize, in_debug_mode), range: RangeChecker::new(), chiplets: Chiplets::new(kernel), advice_provider, + max_cycles: execution_options.max_cycles(), } } @@ -473,4 +481,5 @@ where pub range: RangeChecker, pub chiplets: Chiplets, pub advice_provider: A, + pub max_cycles: u32, } diff --git a/processor/src/operations/mod.rs b/processor/src/operations/mod.rs index f4fe6e95a7..75bd3dfe71 100644 --- a/processor/src/operations/mod.rs +++ b/processor/src/operations/mod.rs @@ -149,17 +149,18 @@ where Operation::FriE2F4 => self.op_fri_ext2fold4()?, } - self.advance_clock(); + self.advance_clock()?; Ok(()) } /// Increments the clock cycle for all components of the process. - fn advance_clock(&mut self) { - self.system.advance_clock(); + fn advance_clock(&mut self) -> Result<(), ExecutionError> { + self.system.advance_clock(self.max_cycles)?; self.stack.advance_clock(); self.chiplets.advance_clock(); self.advice_provider.advance_clock(); + Ok(()) } /// Makes sure there is enough memory allocated for the trace to accommodate a new clock cycle. @@ -178,7 +179,12 @@ impl Process { /// initialized with the provided values. fn new_dummy(stack_inputs: super::StackInputs) -> Self { let advice_provider = super::MemAdviceProvider::default(); - let mut process = Self::new(Kernel::default(), stack_inputs, advice_provider); + let mut process = Self::new( + Kernel::default(), + stack_inputs, + advice_provider, + super::ExecutionOptions::default(), + ); process.execute_op(Operation::Noop).unwrap(); process } @@ -196,7 +202,12 @@ impl Process { .with_stack_values(advice_stack.iter().copied()) .unwrap(); let advice_provider = super::MemAdviceProvider::from(advice_inputs); - let mut process = Self::new(Kernel::default(), stack_inputs, advice_provider); + let mut process = Self::new( + Kernel::default(), + stack_inputs, + advice_provider, + super::ExecutionOptions::default(), + ); process.execute_op(Operation::Noop).unwrap(); process } @@ -224,7 +235,12 @@ impl Process { advice_inputs: super::AdviceInputs, ) -> Self { let advice_provider = super::MemAdviceProvider::from(advice_inputs); - let mut process = Self::new(Kernel::default(), stack_inputs, advice_provider); + let mut process = Self::new( + Kernel::default(), + stack_inputs, + advice_provider, + super::ExecutionOptions::default(), + ); process.decoder.add_dummy_trace_row(); process.execute_op(Operation::Noop).unwrap(); process diff --git a/processor/src/system/mod.rs b/processor/src/system/mod.rs index 37268516c2..93836af078 100644 --- a/processor/src/system/mod.rs +++ b/processor/src/system/mod.rs @@ -1,4 +1,7 @@ -use super::{Felt, FieldElement, StarkField, SysTrace, Vec, Word, ONE, ZERO}; +use super::{ExecutionError, Felt, FieldElement, StarkField, SysTrace, Vec, Word, ONE, ZERO}; + +#[cfg(test)] +mod tests; // CONSTANTS // ================================================================================================ @@ -132,9 +135,14 @@ impl System { // -------------------------------------------------------------------------------------------- /// Increments the clock cycle. - pub fn advance_clock(&mut self) { + pub fn advance_clock(&mut self, max_cycles: u32) -> Result<(), ExecutionError> { self.clk += 1; + // Check that maximum number of cycles is not exceeded. + if self.clk > max_cycles { + return Err(ExecutionError::CycleLimitExceeded(max_cycles)); + } + let clk = self.clk as usize; self.clk_trace[clk] = Felt::from(self.clk); @@ -146,6 +154,8 @@ impl System { self.fn_hash_trace[1][clk] = self.fn_hash[1]; self.fn_hash_trace[2][clk] = self.fn_hash[2]; self.fn_hash_trace[3][clk] = self.fn_hash[3]; + + Ok(()) } /// Sets the value of free memory pointer for the next clock cycle. diff --git a/processor/src/system/tests.rs b/processor/src/system/tests.rs new file mode 100644 index 0000000000..a6c4688d57 --- /dev/null +++ b/processor/src/system/tests.rs @@ -0,0 +1,21 @@ +#[cfg(test)] +mod tests { + use crate::{ExecutionOptions, Kernel, MemAdviceProvider, Operation, Process, StackInputs}; + + // Check that process returns an error if a maximum number of cycles is exceeded. + #[test] + fn cycles_num_exceeded() { + let stack = StackInputs::default(); + let advice_provider = MemAdviceProvider::default(); + let mut process = Process::new( + Kernel::default(), + stack, + advice_provider, + ExecutionOptions::new(Some(64), 64).unwrap(), + ); + for _ in 0..64 { + process.execute_op(Operation::Noop).unwrap(); + } + assert!(process.execute_op(Operation::Noop).is_err()); + } +} diff --git a/processor/src/trace/tests/mod.rs b/processor/src/trace/tests/mod.rs index ba7c880299..1a81e9296b 100644 --- a/processor/src/trace/tests/mod.rs +++ b/processor/src/trace/tests/mod.rs @@ -2,7 +2,7 @@ use super::{ super::chiplets::init_state_from_words, ExecutionTrace, Felt, FieldElement, LookupTableRow, Process, Trace, Vec, NUM_RAND_ROWS, }; -use crate::{AdviceInputs, MemAdviceProvider, StackInputs}; +use crate::{AdviceInputs, ExecutionOptions, MemAdviceProvider, StackInputs}; use rand_utils::rand_array; use vm_core::{ code_blocks::CodeBlock, CodeBlockTable, Kernel, Operation, StackOutputs, Word, ONE, ZERO, @@ -20,7 +20,8 @@ mod stack; pub fn build_trace_from_block(program: &CodeBlock, stack_inputs: &[u64]) -> ExecutionTrace { let stack_inputs = StackInputs::try_from_values(stack_inputs.iter().copied()).unwrap(); let advice_provider = MemAdviceProvider::default(); - let mut process = Process::new(Kernel::default(), stack_inputs, advice_provider); + let mut process = + Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); process.execute_code_block(program, &CodeBlockTable::default()).unwrap(); ExecutionTrace::new(process, StackOutputs::default()) } @@ -41,7 +42,8 @@ pub fn build_trace_from_ops_with_inputs( advice_inputs: AdviceInputs, ) -> ExecutionTrace { let advice_provider = MemAdviceProvider::from(advice_inputs); - let mut process = Process::new(Kernel::default(), stack_inputs, advice_provider); + let mut process = + Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); let program = CodeBlock::new_span(operations); process.execute_code_block(&program, &CodeBlockTable::default()).unwrap(); ExecutionTrace::new(process, StackOutputs::default()) diff --git a/stdlib/tests/mem/mod.rs b/stdlib/tests/mem/mod.rs index c390a2644a..b61aa4e915 100644 --- a/stdlib/tests/mem/mod.rs +++ b/stdlib/tests/mem/mod.rs @@ -1,6 +1,6 @@ use test_utils::{ - build_expected_hash, build_expected_perm, stack_to_ints, AdviceInputs, MemAdviceProvider, - Process, StackInputs, ONE, ZERO, + build_expected_hash, build_expected_perm, stack_to_ints, AdviceInputs, ExecutionOptions, + MemAdviceProvider, Process, StackInputs, ONE, ZERO, }; #[test] @@ -31,6 +31,7 @@ fn test_memcopy() { program.kernel().clone(), StackInputs::default(), MemAdviceProvider::from(AdviceInputs::default()), + ExecutionOptions::default(), ); process.execute(&program).unwrap(); diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 1846f2a7ef..1c3249f8a7 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -164,8 +164,12 @@ impl Test { let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); // execute the test - let mut process = - Process::new(program.kernel().clone(), self.stack_inputs.clone(), advice_provider); + let mut process = Process::new( + program.kernel().clone(), + self.stack_inputs.clone(), + advice_provider, + ExecutionOptions::default(), + ); process.execute(&program).unwrap(); // validate the memory state @@ -236,8 +240,12 @@ impl Test { pub fn execute_process(&self) -> Result, ExecutionError> { let program = self.compile(); let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); - let mut process = - Process::new(program.kernel().clone(), self.stack_inputs.clone(), advice_provider); + let mut process = Process::new( + program.kernel().clone(), + self.stack_inputs.clone(), + advice_provider, + ExecutionOptions::default(), + ); process.execute(&program)?; Ok(process) } From d9015bd9ffc125686b74849a21dd5a2e42a422cc Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Sat, 22 Jul 2023 03:16:14 +0000 Subject: [PATCH 032/120] feat: add support for nested modules --- CHANGELOG.md | 1 + assembly/src/errors.rs | 10 +++ assembly/src/library/masl.rs | 20 ++++++ assembly/src/library/path.rs | 6 +- assembly/src/library/tests.rs | 114 +++++++++++++++++++++++++++++++++- stdlib/build.rs | 2 +- 6 files changed, 150 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ff6a92866..ebd6a5418b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ #### Assembly - Added ability to attach doc comments to re-exported procedures (#994). +- Added support for nested modules (#992). #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 9f307f56a9..5c27becbc3 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -922,6 +922,7 @@ pub enum PathError { ComponentTooLong { component: String, max_len: usize }, EmptyComponent, EmptyPath, + InvalidComponentName { component: String }, PathTooLong { path: String, max_len: usize }, TooFewComponents { path: String, min_components: usize }, } @@ -959,6 +960,12 @@ impl PathError { min_components, } } + + pub(crate) fn component_invalid_name(component: &str) -> PathError { + Self::InvalidComponentName { + component: component.into(), + } + } } impl fmt::Display for PathError { @@ -980,6 +987,9 @@ impl fmt::Display for PathError { EmptyPath => { write!(f, "path cannot be an empty string") } + InvalidComponentName { component } => { + write!(f, "'{component}' keyword is not allowed in the library path") + } PathTooLong { path, max_len } => { write!(f, "path `{path}` contains over {max_len} characters") } diff --git a/assembly/src/library/masl.rs b/assembly/src/library/masl.rs index c37f556d18..e322d36a9c 100644 --- a/assembly/src/library/masl.rs +++ b/assembly/src/library/masl.rs @@ -156,6 +156,14 @@ mod use_std { let module_path = LibraryPath::new(&namespace) .map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{err}")))?; + // mod.masm is not allowed in the root directory + if path.as_ref().join("mod.masm").exists() { + return Err(io::Error::new( + io::ErrorKind::Other, + "mod.masm is not allowed in the root directory", + )); + } + let modules = read_from_dir_helper( Default::default(), path, @@ -246,6 +254,17 @@ mod use_std { io::Error::new(io::ErrorKind::Other, "invalid directory entry!") })?; + // check if a directory with the same name exists in the directory + if path.with_file_name(name).is_dir() { + return Err(io::Error::new( + io::ErrorKind::Other, + format!( + "file and directory with the same name '{}' are not allowed", + name + ), + )); + } + // read & parse file let contents = fs::read_to_string(&path)?; let ast = ModuleAst::parse(&contents)?; @@ -260,6 +279,7 @@ mod use_std { let module = module_path .append(name) .map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{err}")))?; + if state.insert(module, ast).is_some() { unreachable!( "the filesystem is inconsistent as it produced duplicated module paths" diff --git a/assembly/src/library/path.rs b/assembly/src/library/path.rs index 393b854cb1..6a609305a8 100644 --- a/assembly/src/library/path.rs +++ b/assembly/src/library/path.rs @@ -32,6 +32,8 @@ impl LibraryPath { /// Path for an executable module. pub const EXEC_PATH: &str = "#exec"; + pub const MOD: &str = "mod"; + // CONSTRUCTORS // -------------------------------------------------------------------------------------------- @@ -203,7 +205,7 @@ impl LibraryPath { .path .rsplit_once(Self::PATH_DELIM) .expect("failed to split path on module delimiter") - .1; + .0; Ok(Self { path: rem.to_string(), @@ -332,6 +334,8 @@ fn validate_path_len(path: &str) -> Result<(), PathError> { fn validate_component(component: &str) -> Result<(), PathError> { if component.is_empty() { Err(PathError::EmptyComponent) + } else if component == LibraryPath::MOD { + Err(PathError::component_invalid_name(component)) } else if component.len() > MAX_LABEL_LEN { Err(PathError::component_too_long(component, MAX_LABEL_LEN)) } else if !component.chars().next().unwrap().is_ascii_alphabetic() { diff --git a/assembly/src/library/tests.rs b/assembly/src/library/tests.rs index d6bcf8ffc9..0f60516511 100644 --- a/assembly/src/library/tests.rs +++ b/assembly/src/library/tests.rs @@ -1,4 +1,6 @@ -use super::{LibraryNamespace, LibraryPath, MaslLibrary, Module, ModuleAst, Version}; +use super::{ + super::Assembler, LibraryNamespace, LibraryPath, MaslLibrary, Module, ModuleAst, Version, +}; use vm_core::utils::{Deserializable, Serializable, SliceReader}; #[test] @@ -56,3 +58,113 @@ fn masl_locations_serialization() { bundle.clear_locations(); assert_eq!(bundle, deserialized); } + +#[test] +fn nested_modules() { + // declare foo module + let foo = r#" + export.foo + add + end + export.foo_mul + mul + end + "#; + let path = LibraryPath::new("test::test::foo").unwrap(); + let ast = ModuleAst::parse(foo).unwrap(); + let foo = Module::new(path, ast); + + // declare mod module + let mod_mod = r#" + use.test::test::foo + + # foo procedures re-exported from mod + export.foo::foo + export.foo::foo_mul + + # exported procedures + export.test_mul_add + mul + add + end + "#; + + let path = LibraryPath::new("test::test").unwrap(); + let ast = ModuleAst::parse(mod_mod).unwrap(); + let mod_mod = Module::new(path, ast); + + // declare bar module + let bar = r#" + use.test::test + + export.test::foo + + export.bar + mtree_get + end + + export.bar_mul + mul + end + "#; + let path = LibraryPath::new("test::test::bar").unwrap(); + let ast = ModuleAst::parse(bar).unwrap(); + let bar = Module::new(path, ast); + + let modules = [foo, bar, mod_mod].to_vec(); + + // create the bundle with locations + let namespace = LibraryNamespace::new("test").unwrap(); + let version = Version::MIN; + let locations = true; + let bundle = + MaslLibrary::new(namespace.clone(), version, locations, modules.clone(), Vec::new()) + .unwrap(); + + // serialize/deserialize the bundle + let mut bytes = Vec::new(); + bundle.write_into(&mut bytes); + let deserialized = MaslLibrary::read_from(&mut SliceReader::new(&bytes)).unwrap(); + assert_eq!(bundle, deserialized); + + // create the bundle without locations + let locations = false; + let mut bundle = MaslLibrary::new(namespace, version, locations, modules, Vec::new()).unwrap(); + + // serialize/deserialize the bundle + let mut bytes = Vec::new(); + bundle.write_into(&mut bytes); + let deserialized = MaslLibrary::read_from(&mut SliceReader::new(&bytes)).unwrap(); + + // bundle with and without locations should not be equal + assert_ne!(bundle, deserialized, "sanity check"); + + // clear locations and check equality + bundle.clear_locations(); + assert_eq!(bundle, deserialized); + + // use library in a program + let source = r#" + use.test::test + use.test::test::bar + begin + # bar procedure + exec.bar::bar + + # foo procedure re-exported from mod further re-exported from bar + exec.bar::foo + + # foo_mul procedure re-exported from mod + exec.test::foo_mul + + # testmul procedure exported from test + exec.test::test_mul_add + end + "#; + + let assembler = Assembler::default() + .with_library(&deserialized) + .expect("failed to load library"); + + assembler.compile(source).expect("Failed to compile test source"); +} diff --git a/stdlib/build.rs b/stdlib/build.rs index 55ad0977bb..26142196b2 100644 --- a/stdlib/build.rs +++ b/stdlib/build.rs @@ -55,7 +55,7 @@ trait Renderer { fn render(stdlib: &ModuleMap, output_dir: &str); } -// Writes Miden standard library modules documentation markdown files based on the available modules and comments. +/// Writes Miden standard library modules documentation markdown files based on the available modules and comments. pub fn build_stdlib_docs(module_map: &ModuleMap, output_dir: &str) { // Remove functions folder to re-generate fs::remove_dir_all(output_dir).unwrap(); From 89a918da8ca6a96e91658502965932094c6e63c6 Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Sat, 22 Jul 2023 03:19:08 +0000 Subject: [PATCH 033/120] remove test --- assembly/src/errors.rs | 10 --- assembly/src/library/masl.rs | 12 +++- assembly/src/library/path.rs | 4 -- assembly/src/library/tests.rs | 114 +------------------------------ stdlib/asm/crypto/stark/mod.masm | 26 +++++++ stdlib/docs/crypto/stark.md | 5 ++ 6 files changed, 41 insertions(+), 130 deletions(-) create mode 100644 stdlib/asm/crypto/stark/mod.masm create mode 100644 stdlib/docs/crypto/stark.md diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 5c27becbc3..9f307f56a9 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -922,7 +922,6 @@ pub enum PathError { ComponentTooLong { component: String, max_len: usize }, EmptyComponent, EmptyPath, - InvalidComponentName { component: String }, PathTooLong { path: String, max_len: usize }, TooFewComponents { path: String, min_components: usize }, } @@ -960,12 +959,6 @@ impl PathError { min_components, } } - - pub(crate) fn component_invalid_name(component: &str) -> PathError { - Self::InvalidComponentName { - component: component.into(), - } - } } impl fmt::Display for PathError { @@ -987,9 +980,6 @@ impl fmt::Display for PathError { EmptyPath => { write!(f, "path cannot be an empty string") } - InvalidComponentName { component } => { - write!(f, "'{component}' keyword is not allowed in the library path") - } PathTooLong { path, max_len } => { write!(f, "path `{path}` contains over {max_len} characters") } diff --git a/assembly/src/library/masl.rs b/assembly/src/library/masl.rs index e322d36a9c..19733d6197 100644 --- a/assembly/src/library/masl.rs +++ b/assembly/src/library/masl.rs @@ -62,6 +62,8 @@ impl MaslLibrary { pub const LIBRARY_EXTENSION: &str = "masl"; /// File extension for the Assembly Module. pub const MODULE_EXTENSION: &str = "masm"; + /// Name of the root module. + pub const MOD: &str = "mod"; // CONSTRUCTOR // -------------------------------------------------------------------------------------------- @@ -276,9 +278,13 @@ mod use_std { } // build module path and add it to the map of modules - let module = module_path - .append(name) - .map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{err}")))?; + let module = if name == MaslLibrary::MOD { + module_path.clone() + } else { + module_path + .append(name) + .map_err(|err| io::Error::new(io::ErrorKind::Other, format!("{err}")))? + }; if state.insert(module, ast).is_some() { unreachable!( diff --git a/assembly/src/library/path.rs b/assembly/src/library/path.rs index 6a609305a8..6b4093756c 100644 --- a/assembly/src/library/path.rs +++ b/assembly/src/library/path.rs @@ -32,8 +32,6 @@ impl LibraryPath { /// Path for an executable module. pub const EXEC_PATH: &str = "#exec"; - pub const MOD: &str = "mod"; - // CONSTRUCTORS // -------------------------------------------------------------------------------------------- @@ -334,8 +332,6 @@ fn validate_path_len(path: &str) -> Result<(), PathError> { fn validate_component(component: &str) -> Result<(), PathError> { if component.is_empty() { Err(PathError::EmptyComponent) - } else if component == LibraryPath::MOD { - Err(PathError::component_invalid_name(component)) } else if component.len() > MAX_LABEL_LEN { Err(PathError::component_too_long(component, MAX_LABEL_LEN)) } else if !component.chars().next().unwrap().is_ascii_alphabetic() { diff --git a/assembly/src/library/tests.rs b/assembly/src/library/tests.rs index 0f60516511..d6bcf8ffc9 100644 --- a/assembly/src/library/tests.rs +++ b/assembly/src/library/tests.rs @@ -1,6 +1,4 @@ -use super::{ - super::Assembler, LibraryNamespace, LibraryPath, MaslLibrary, Module, ModuleAst, Version, -}; +use super::{LibraryNamespace, LibraryPath, MaslLibrary, Module, ModuleAst, Version}; use vm_core::utils::{Deserializable, Serializable, SliceReader}; #[test] @@ -58,113 +56,3 @@ fn masl_locations_serialization() { bundle.clear_locations(); assert_eq!(bundle, deserialized); } - -#[test] -fn nested_modules() { - // declare foo module - let foo = r#" - export.foo - add - end - export.foo_mul - mul - end - "#; - let path = LibraryPath::new("test::test::foo").unwrap(); - let ast = ModuleAst::parse(foo).unwrap(); - let foo = Module::new(path, ast); - - // declare mod module - let mod_mod = r#" - use.test::test::foo - - # foo procedures re-exported from mod - export.foo::foo - export.foo::foo_mul - - # exported procedures - export.test_mul_add - mul - add - end - "#; - - let path = LibraryPath::new("test::test").unwrap(); - let ast = ModuleAst::parse(mod_mod).unwrap(); - let mod_mod = Module::new(path, ast); - - // declare bar module - let bar = r#" - use.test::test - - export.test::foo - - export.bar - mtree_get - end - - export.bar_mul - mul - end - "#; - let path = LibraryPath::new("test::test::bar").unwrap(); - let ast = ModuleAst::parse(bar).unwrap(); - let bar = Module::new(path, ast); - - let modules = [foo, bar, mod_mod].to_vec(); - - // create the bundle with locations - let namespace = LibraryNamespace::new("test").unwrap(); - let version = Version::MIN; - let locations = true; - let bundle = - MaslLibrary::new(namespace.clone(), version, locations, modules.clone(), Vec::new()) - .unwrap(); - - // serialize/deserialize the bundle - let mut bytes = Vec::new(); - bundle.write_into(&mut bytes); - let deserialized = MaslLibrary::read_from(&mut SliceReader::new(&bytes)).unwrap(); - assert_eq!(bundle, deserialized); - - // create the bundle without locations - let locations = false; - let mut bundle = MaslLibrary::new(namespace, version, locations, modules, Vec::new()).unwrap(); - - // serialize/deserialize the bundle - let mut bytes = Vec::new(); - bundle.write_into(&mut bytes); - let deserialized = MaslLibrary::read_from(&mut SliceReader::new(&bytes)).unwrap(); - - // bundle with and without locations should not be equal - assert_ne!(bundle, deserialized, "sanity check"); - - // clear locations and check equality - bundle.clear_locations(); - assert_eq!(bundle, deserialized); - - // use library in a program - let source = r#" - use.test::test - use.test::test::bar - begin - # bar procedure - exec.bar::bar - - # foo procedure re-exported from mod further re-exported from bar - exec.bar::foo - - # foo_mul procedure re-exported from mod - exec.test::foo_mul - - # testmul procedure exported from test - exec.test::test_mul_add - end - "#; - - let assembler = Assembler::default() - .with_library(&deserialized) - .expect("failed to load library"); - - assembler.compile(source).expect("Failed to compile test source"); -} diff --git a/stdlib/asm/crypto/stark/mod.masm b/stdlib/asm/crypto/stark/mod.masm new file mode 100644 index 0000000000..f047cf1f19 --- /dev/null +++ b/stdlib/asm/crypto/stark/mod.masm @@ -0,0 +1,26 @@ +use.std::crypto::stark::verifier + +#! Verify a STARK proof attesting to the correct execution of a program in the Miden VM. +#! The following simplifying assumptions are currently made: +#! - The blowup is set to 8. +#! - The maximal allowed degree of the remainder polynomial is 7. +#! - Only the input and output stacks, assumed of fixed size equal to 16, are handled in regards +#! to public inputs. +#! - There are two trace segments, main and auxiliary. It is assumed that the main trace segment +#! is 73 columns wide while the auxiliary trace segment is 9 columns wide. +#! - The OOD evaluation frame is composed of two interleaved rows, current and next, each composed +#! of 73 elements representing the main trace portion and 9 elements for the auxiliary trace one. +#! - To boost soundness, the protocol is run on a quadratic extension field and this means that +#! the OOD evaluation frame is composed of elements in a quadratic extension field i.e. tuples. +#! Similarly, elements of the auxiliary trace are quadratic extension field elements. +#! - The following procedure makes use of global memory address beyond 3 * 2^30 and these are +#! defined in `constants.masm`. +#! +#! Input: [log(trace_length), num_queries, log(blowup), grinding] +#! Output: [] +#! Cycles: +#! 1- Remainder codeword size 32: +#! 5000 + num_queries * (40 + num_fri_layers * 76 + 26 + 463) + 83 * num_fri_layers + 10 * log(trace_length) + 1633 +#! 2- Remainder codeword size 64: +#! 5000 + num_queries * (40 + num_fri_layers * 76 + 26 + 463) + 83 * num_fri_layers + 10 * log(trace_length) + 3109 +export.verifier::verify \ No newline at end of file diff --git a/stdlib/docs/crypto/stark.md b/stdlib/docs/crypto/stark.md new file mode 100644 index 0000000000..8edfa7008c --- /dev/null +++ b/stdlib/docs/crypto/stark.md @@ -0,0 +1,5 @@ + +## std::crypto::stark +| Procedure | Description | +| ----------- | ------------- | +| verify | Verify a STARK proof attesting to the correct execution of a program in the Miden VM.

      The following simplifying assumptions are currently made:

      - The blowup is set to 8.

      - The maximal allowed degree of the remainder polynomial is 7.

      - Only the input and output stacks, assumed of fixed size equal to 16, are handled in regards

      to public inputs.

      - There are two trace segments, main and auxiliary. It is assumed that the main trace segment

      is 73 columns wide while the auxiliary trace segment is 9 columns wide.

      - The OOD evaluation frame is composed of two interleaved rows, current and next, each composed

      of 73 elements representing the main trace portion and 9 elements for the auxiliary trace one.

      - To boost soundness, the protocol is run on a quadratic extension field and this means that

      the OOD evaluation frame is composed of elements in a quadratic extension field i.e. tuples.

      Similarly, elements of the auxiliary trace are quadratic extension field elements.

      - The following procedure makes use of global memory address beyond 3 * 2^30 and these are

      defined in `constants.masm`.

      Input: [log(trace_length), num_queries, log(blowup), grinding]

      Output: []

      Cycles:

      1- Remainder codeword size 32:

      5000 + num_queries * (40 + num_fri_layers * 76 + 26 + 463) + 83 * num_fri_layers + 10 * log(trace_length) + 1633

      2- Remainder codeword size 64:

      5000 + num_queries * (40 + num_fri_layers * 76 + 26 + 463) + 83 * num_fri_layers + 10 * log(trace_length) + 3109 | From f15e84ea902e57a260adb0cedf91245266078354 Mon Sep 17 00:00:00 2001 From: frisitano Date: Mon, 24 Jul 2023 10:16:14 +0200 Subject: [PATCH 034/120] fix: duplicate mast root diffent proc id --- assembly/src/assembler/procedure_cache.rs | 3 +- assembly/src/tests.rs | 42 +++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/assembly/src/assembler/procedure_cache.rs b/assembly/src/assembler/procedure_cache.rs index 92fa6271a9..f6a4931064 100644 --- a/assembly/src/assembler/procedure_cache.rs +++ b/assembly/src/assembler/procedure_cache.rs @@ -72,11 +72,12 @@ impl ProcedureCache { if proc.num_locals() != cached_proc.num_locals() { Err(AssemblyError::conflicting_num_locals(proc.name())) } else { + self.proc_id_map.insert(*proc.id(), proc.mast_root()); Ok(()) } } Entry::Vacant(entry) => { - self.proc_id_map.entry(*proc.id()).or_insert(proc.mast_root()); + self.proc_id_map.insert(*proc.id(), proc.mast_root()); entry.insert(proc.into_inner()); Ok(()) } diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 6ddc3a0eb7..2b571f33f3 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -663,6 +663,48 @@ fn program_with_one_import_and_hex_call() { assert_eq!(expected, format!("{program}")); } +#[test] +fn program_with_two_imported_procs_with_same_mast_root() { + const NAMESPACE: &str = "dummy"; + const MODULE: &str = "math::u256"; + const PROCEDURE: &str = r#" + export.iszero_unsafe_dup + eq.0 + repeat.7 + swap + eq.0 + and + end + end + + export.iszero_unsafe + eq.0 + repeat.7 + swap + eq.0 + and + end + end"#; + + let namespace = LibraryNamespace::try_from(NAMESPACE.to_string()).unwrap(); + let path = LibraryPath::try_from(MODULE.to_string()).unwrap().prepend(&namespace).unwrap(); + let ast = ModuleAst::parse(PROCEDURE).unwrap(); + let modules = vec![Module { path, ast }]; + let library = DummyLibrary::new(namespace, modules); + + let assembler = super::Assembler::default().with_library(&library).unwrap(); + let source = format!( + r#" + use.{NAMESPACE}::{MODULE} + begin + push.4 push.3 + exec.u256::iszero_unsafe + exec.u256::iszero_unsafe_dup + end"# + ); + assert!(assembler.compile(source).is_ok()); +} + #[test] fn program_with_reexported_proc_in_same_library() { // exprted proc is in same library From 2e7287997c265666a6b9cacdf7a9ccfb7e38667f Mon Sep 17 00:00:00 2001 From: frisitano Date: Tue, 4 Jul 2023 17:01:06 +0100 Subject: [PATCH 035/120] feat: Modifications to RecordingAdviceProvider to support TransactionResult in miden-base --- core/Cargo.toml | 2 +- processor/src/advice/inputs.rs | 12 +++++ processor/src/advice/providers.rs | 81 ++++++++++++++++++++----------- 3 files changed, 66 insertions(+), 29 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index c5160608ea..651d7e4ef2 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -21,7 +21,7 @@ std = ["math/std", "winter-utils/std"] [dependencies] math = { package = "winter-math", version = "0.6", default-features = false } -crypto = { package = "miden-crypto", version = "0.6", default-features = false } +crypto = { package = "miden-crypto", git = "https://github.com/0xPolygonMiden/crypto.git", branch = "next", default-features = false } winter-crypto = { package = "winter-crypto", version = "0.6", default-features = false } winter-utils = { package = "winter-utils", version = "0.6", default-features = false } diff --git a/processor/src/advice/inputs.rs b/processor/src/advice/inputs.rs index 7213ad6b9a..175cc36b0e 100644 --- a/processor/src/advice/inputs.rs +++ b/processor/src/advice/inputs.rs @@ -14,6 +14,7 @@ use super::{BTreeMap, Felt, InnerNodeInfo, InputError, MerkleStore, Vec}; /// 2. Key-mapped element lists which can be pushed onto the advice stack. /// 3. Merkle store, which is used to provide nondeterministic inputs for instructions that /// operates with Merkle trees. +#[cfg(not(feature = "internals"))] #[derive(Clone, Debug, Default)] pub struct AdviceInputs { stack: Vec, @@ -122,3 +123,14 @@ impl AdviceInputs { (stack, map, store) } } + +// INTERNALS +// ================================================================================================ + +#[cfg(feature = "internals")] +#[derive(Clone, Debug, Default)] +pub struct AdviceInputs { + pub stack: Vec, + pub map: BTreeMap<[u8; 32], Vec>, + pub store: MerkleStore, +} diff --git a/processor/src/advice/providers.rs b/processor/src/advice/providers.rs index 9360388e81..11b350b654 100644 --- a/processor/src/advice/providers.rs +++ b/processor/src/advice/providers.rs @@ -307,6 +307,22 @@ impl AdviceProvider for MemAdviceProvider { } } +impl MemAdviceProvider { + // FINALIZATION + // -------------------------------------------------------------------------------------------- + /// Consumes the [MemAdviceProvider] and returns a (Vec, SimpleAdviceMap, MerkleStore), + /// containing the stack, map, store respectively, of the advice provider. + pub fn into_parts(self) -> (Vec, SimpleAdviceMap, MerkleStore) { + let BaseAdviceProvider { + step: _step, + stack, + map, + store, + } = self.provider; + (stack, map, store) + } +} + // RECORDING ADVICE PROVIDER // ================================================================================================ @@ -320,34 +336,6 @@ pub struct RecAdviceProvider { init_stack: Vec, } -impl RecAdviceProvider { - /// Consumes the advice provider and returns a [AdviceInputs] instance which can be used to - /// re-execute the program. - /// - /// The returned [AdviceInputs] instance will contain only the non-deterministic inputs which - /// were requested during program execution. - pub fn into_proof(self) -> AdviceInputs { - let Self { - provider, - init_stack, - } = self; - let BaseAdviceProvider { - step: _, - stack: _, - map, - store, - } = provider; - - let map = map.into_proof(); - let store = store.into_inner().into_proof(); - - AdviceInputs::default() - .with_stack(init_stack) - .with_map(map) - .with_merkle_store(store.into()) - } -} - impl From for RecAdviceProvider { fn from(inputs: AdviceInputs) -> Self { let init_stack = inputs.stack().to_vec(); @@ -443,3 +431,40 @@ impl AdviceProvider for RecAdviceProvider { self.provider.advance_clock() } } + +impl RecAdviceProvider { + // FINALIZATION + // -------------------------------------------------------------------------------------------- + + /// Consumes the advice provider and returns an (AdviceInputs, Vec, SimpleAdviceMap, + /// MerkleStore) tuple. + /// + /// The [AdviceInputs] can be used to re-execute the program. The returned [AdviceInputs] + /// instance will contain only the non-deterministic inputs which were requested during program + /// execution. + /// + /// The Vec, SimpleAdviceMap, MerkleStore represent the stack, map, and Merkle store of + /// the advice provider at the time of finalization. + pub fn finalize(self) -> (AdviceInputs, Vec, SimpleAdviceMap, MerkleStore) { + let Self { + provider, + init_stack, + } = self; + let BaseAdviceProvider { + step: _step, + stack, + map, + store, + } = provider; + + let (map, map_proof) = map.finalize(); + let (store, store_proof) = store.into_inner().finalize(); + + let proof = AdviceInputs::default() + .with_stack(init_stack) + .with_map(map_proof) + .with_merkle_store(store_proof.into()); + + (proof, stack, map, store.into()) + } +} From f9997ef61c5eaa4921aa251f35c8a69f827c823f Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Mon, 26 Jun 2023 18:54:13 +0300 Subject: [PATCH 036/120] refactor: replace MerklePathSet with PartialMerkleTree --- core/src/lib.rs | 4 +- processor/src/advice/merkle_set.rs | 104 ------------------ stdlib/tests/crypto/fri/channel.rs | 4 +- stdlib/tests/crypto/fri/mod.rs | 12 +- stdlib/tests/crypto/fri/verifier_fri_e2f4.rs | 34 +++--- .../stark/verifier_recursive/channel.rs | 53 +++++---- .../crypto/stark/verifier_recursive/mod.rs | 16 +-- test-utils/src/crypto.rs | 4 +- 8 files changed, 64 insertions(+), 167 deletions(-) delete mode 100644 processor/src/advice/merkle_set.rs diff --git a/core/src/lib.rs b/core/src/lib.rs index a1484c8c90..d491e4de67 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -12,8 +12,8 @@ pub mod crypto { pub mod merkle { pub use ::crypto::merkle::{ DefaultMerkleStore, EmptySubtreeRoots, InnerNodeInfo, MerkleError, MerklePath, - MerklePathSet, MerkleStore, MerkleTree, Mmr, MmrPeaks, NodeIndex, RecordingMerkleStore, - SimpleSmt, StoreNode, + MerkleStore, MerkleTree, Mmr, MmrPeaks, NodeIndex, PartialMerkleTree, + RecordingMerkleStore, SimpleSmt, StoreNode, }; } diff --git a/processor/src/advice/merkle_set.rs b/processor/src/advice/merkle_set.rs deleted file mode 100644 index fc71d4b79c..0000000000 --- a/processor/src/advice/merkle_set.rs +++ /dev/null @@ -1,104 +0,0 @@ -use super::{MerkleError, MerklePath, MerklePathSet, MerkleTree, NodeIndex, SimpleSmt, Vec, Word}; - -// MERKLE SET -// ================================================================================================ - -/// TODO: add docs -#[derive(Clone, Debug)] -pub enum MerkleSet { - MerkleTree(MerkleTree), - SparseMerkleTree(SimpleSmt), - MerklePathSet(MerklePathSet), -} - -impl MerkleSet { - // CONSTRUCTORS - // -------------------------------------------------------------------------------------------- - - /// Returns a new [MerkleSet] instantiated as a Merkle tree from the provided leaves. - /// - /// For more information, check `[MerkleTree::new]`. - pub fn new_merkle_tree(leaves: Vec) -> Result { - MerkleTree::new(leaves).map(Self::MerkleTree) - } - - /// Returns a new [MerkleSet] instantiated as a Sparse Merkle Tree from the provided leaves. - /// - /// For more information, check `[SimpleSmt::new]`. - pub fn new_sparse_merkle_tree( - keys: Vec, - values: Vec, - depth: u8, - ) -> Result { - SimpleSmt::new(depth)? - .with_leaves(keys.into_iter().zip(values.into_iter())) - .map(Self::SparseMerkleTree) - } - - // PUBLIC ACCESSORS - // -------------------------------------------------------------------------------------------- - - /// Returns a root of this merkle set. - pub fn root(&self) -> Word { - match self { - Self::MerkleTree(tree) => tree.root(), - Self::SparseMerkleTree(tree) => tree.root(), - Self::MerklePathSet(set) => set.root(), - } - } - - /// Returns the maximum depth of this merkle set. - pub fn depth(&self) -> u8 { - match self { - Self::MerkleTree(tree) => tree.depth(), - Self::SparseMerkleTree(tree) => tree.depth(), - Self::MerklePathSet(set) => set.depth(), - } - } - - /// Returns a node located at the specified index. - /// - /// For more information, check the following concrete implementations: - /// - `[MerkleTree::get_node]` - /// - `[SimpleSmt::get_node]` - /// - `[MerklePathSet::get_node]` - pub fn get_node(&self, index: NodeIndex) -> Result { - match self { - Self::MerkleTree(tree) => tree.get_node(index), - Self::SparseMerkleTree(tree) => tree.get_node(&index), - Self::MerklePathSet(set) => set.get_node(index), - } - } - - /// Returns a Merkle path to a node located at the specified index. The node itself is not - /// included in the path. - /// - /// For more information, check the following concrete implementations: - /// - `[MerkleTree::get_path]` - /// - `[SimpleSmt::get_path]` - /// - `[MerklePathSet::get_path]` - pub fn get_path(&self, index: NodeIndex) -> Result { - match self { - Self::MerkleTree(tree) => tree.get_path(index), - Self::SparseMerkleTree(tree) => tree.get_path(index), - Self::MerklePathSet(set) => set.get_path(index), - } - } - - // DATA MUTATORS - // -------------------------------------------------------------------------------------------- - - /// Replaces the leaf at the specified index with the provided value. - /// - /// For more information, check the following concrete implementations: - /// - `[MerkleTree::update_leaf]` - /// - `[SimpleSmt::update_leaf]` - /// - `[MerklePathSet::update_leaf]` - pub fn update_leaf(&mut self, index: u64, value: Word) -> Result<(), MerkleError> { - match self { - Self::MerkleTree(tree) => tree.update_leaf(index, value), - Self::SparseMerkleTree(tree) => tree.update_leaf(index, value), - Self::MerklePathSet(set) => set.update_leaf(index, value), - } - } -} diff --git a/stdlib/tests/crypto/fri/channel.rs b/stdlib/tests/crypto/fri/channel.rs index 8bd254c74d..749bdfb7dd 100644 --- a/stdlib/tests/crypto/fri/channel.rs +++ b/stdlib/tests/crypto/fri/channel.rs @@ -1,5 +1,5 @@ use test_utils::{ - crypto::{BatchMerkleProof, ElementHasher, Hasher as HasherTrait, MerklePathSet}, + crypto::{BatchMerkleProof, ElementHasher, Hasher as HasherTrait, PartialMerkleTree}, math::fft, serde::DeserializationError, Felt, FieldElement, StarkField, @@ -12,7 +12,7 @@ pub trait UnBatch { positions: &[usize], domain_size: usize, layer_commitments: Vec<::Digest>, - ) -> (Vec, Vec<([u8; 32], Vec)>); + ) -> (Vec, Vec<([u8; 32], Vec)>); } pub struct MidenFriVerifierChannel> { diff --git a/stdlib/tests/crypto/fri/mod.rs b/stdlib/tests/crypto/fri/mod.rs index 4ffa9078a4..9a7ff60196 100644 --- a/stdlib/tests/crypto/fri/mod.rs +++ b/stdlib/tests/crypto/fri/mod.rs @@ -26,7 +26,7 @@ fn fri_fold4_ext2_remainder32() { let domain_size = 1 << depth; let FriResult { - merkle_sets, + partial_trees, advice_maps, positions, alphas, @@ -49,8 +49,8 @@ fn fri_fold4_ext2_remainder32() { let domain_generator = Felt::get_root_of_unity(domain_size.ilog2()).as_int(); let mut store = MerkleStore::new(); - for path_set in &merkle_sets { - store.add_merkle_path_set(&path_set).unwrap(); + for partial_tree in &partial_trees { + store.extend(partial_tree.inner_nodes()); } let test = build_test!(source, &[domain_generator], &advice_stack, store, advice_map.clone()); @@ -74,7 +74,7 @@ fn fri_fold4_ext2_remainder64() { let domain_size = 1 << depth; let FriResult { - merkle_sets, + partial_trees, advice_maps, positions, alphas, @@ -97,8 +97,8 @@ fn fri_fold4_ext2_remainder64() { let domain_generator = Felt::get_root_of_unity(domain_size.ilog2()).as_int(); let mut store = MerkleStore::new(); - for path_set in &merkle_sets { - store.add_merkle_path_set(&path_set).unwrap(); + for partial_tree in &partial_trees { + store.extend(partial_tree.inner_nodes()); } let test = build_test!(source, &[domain_generator], &advice_stack, store, advice_map.clone()); diff --git a/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs b/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs index 6c1a2bc925..44637e4448 100644 --- a/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs +++ b/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs @@ -5,7 +5,7 @@ use processor::{ Digest as MidenDigest, }; use test_utils::{ - crypto::{MerklePath, MerklePathSet, NodeIndex, Rpo256 as MidenHasher}, + crypto::{MerklePath, NodeIndex, PartialMerkleTree, Rpo256 as MidenHasher}, group_vector_elements, math::fft, Felt, FieldElement, IntoBytes, QuadFelt as QuadExt, StarkField, ZERO, @@ -16,7 +16,7 @@ use winter_fri::{ pub struct FriResult { /// contains the Merkle authentication paths used to authenticate the queries. - pub merkle_sets: Vec, + pub partial_trees: Vec, /// used to unhash Merkle nodes to a sequence of field elements representing the query-values. pub advice_maps: Vec<([u8; 32], Vec)>, @@ -99,9 +99,9 @@ pub fn fri_prove_verify_fold4_ext2(trace_length_e: usize) -> Result { + Ok(((partial_trees, advice_maps), all_position_evaluation, alphas)) => { return Ok(FriResult { - merkle_sets, + partial_trees, advice_maps, positions: all_position_evaluation, alphas, @@ -146,7 +146,8 @@ fn verify_proof( domain_size: usize, positions: &[usize], options: &FriOptions, -) -> Result<((Vec, Vec<([u8; 32], Vec)>), Vec, Vec), VerifierError> { +) -> Result<((Vec, Vec<([u8; 32], Vec)>), Vec, Vec), VerifierError> +{ let mut channel = MidenFriVerifierChannel::::new( proof, commitments.clone(), @@ -243,8 +244,10 @@ impl FriVerifierFold4Ext2 { channel: &mut MidenFriVerifierChannel, evaluations: &[QuadExt], positions: &[usize], - ) -> Result<((Vec, Vec<([u8; 32], Vec)>), Vec, Vec), VerifierError> - { + ) -> Result< + ((Vec, Vec<([u8; 32], Vec)>), Vec, Vec), + VerifierError, + > { // 1 ----- verify the recursive components of the FRI proof ----------------------------------- let positions = positions.to_vec(); let evaluations = evaluations.to_vec(); @@ -291,7 +294,7 @@ impl FriVerifierFold4Ext2 { fn iterate_query_fold_4_quad_ext( layer_alphas: &Vec, - m_path_sets: &Vec, + partial_trees: &Vec, key_val_map: &Vec<([u8; 32], Vec)>, position: usize, number_of_layers: usize, @@ -325,7 +328,7 @@ fn iterate_query_fold_4_quad_ext( let tree_depth = target_domain_size.ilog2(); - let query_nodes = m_path_sets[depth] + let query_nodes = partial_trees[depth] .get_node(NodeIndex::new(tree_depth as u8, position_index as u64).unwrap()) .unwrap(); let query_values = &key_val_map @@ -395,14 +398,14 @@ impl UnBatch for MidenFriVerifierChannel, - ) -> (Vec, Vec<([u8; 32], Vec)>) { + ) -> (Vec, Vec<([u8; 32], Vec)>) { let queries = self.layer_queries().clone(); let mut current_domain_size = domain_size; let mut positions = positions_.to_vec(); let depth = layer_commitments.len() - 1; let mut adv_key_map = vec![]; - let mut sets = vec![]; + let mut partial_trees = vec![]; let mut layer_proofs = self.layer_proofs(); for i in 0..depth { let mut folded_positions = fold_positions(&positions, current_domain_size, N); @@ -425,8 +428,6 @@ impl UnBatch for MidenFriVerifierChannel = unbatched_proof.into_iter().map(|list| list.into()).collect(); - let new_set = MerklePathSet::new((current_domain_size / N).ilog2() as u8); - let iter_pos = folded_positions.iter_mut().map(|a| *a as u64); let nodes_tmp = nodes.clone(); let iter_nodes = nodes_tmp.iter(); @@ -436,8 +437,9 @@ impl UnBatch for MidenFriVerifierChannel for MidenFriVerifierChannel Result<(Vec<([u8; 32], Vec)>, Vec), VerifierError> { + ) -> Result<(Vec<([u8; 32], Vec)>, Vec), VerifierError> { let queries = self.trace_queries.take().expect("already read"); - let mut sets = Vec::new(); + let mut trees = Vec::new(); let proofs: Vec<_> = queries.query_proofs.into_iter().collect(); let main_queries = queries.main_states.clone(); @@ -174,14 +174,14 @@ impl VerifierChannel { .rows() .map(|a| QuadExt::slice_as_base_elements(a).to_vec()) .collect(); - let (main_trace_set, mut main_trace_adv_map) = - unbatch_to_path_set(positions.to_vec(), main_queries_vec, proofs[0].clone()); - let (aux_trace_set, mut aux_trace_adv_map) = - unbatch_to_path_set(positions.to_vec(), aux_queries_vec, proofs[1].clone()); - sets.push(main_trace_set); - sets.push(aux_trace_set); + let (main_trace_pmt, mut main_trace_adv_map) = + unbatch_to_partial_mt(positions.to_vec(), main_queries_vec, proofs[0].clone()); + let (aux_trace_pmt, mut aux_trace_adv_map) = + unbatch_to_partial_mt(positions.to_vec(), aux_queries_vec, proofs[1].clone()); + trees.push(main_trace_pmt); + trees.push(aux_trace_pmt); main_trace_adv_map.append(&mut aux_trace_adv_map); - Ok((main_trace_adv_map, sets)) + Ok((main_trace_adv_map, trees)) } /// Returns constraint evaluations at the specified positions of the LDE domain. This also @@ -190,7 +190,7 @@ impl VerifierChannel { pub fn read_constraint_evaluations( &mut self, positions: &[usize], - ) -> Result<(Vec<([u8; 32], Vec)>, MerklePathSet), VerifierError> { + ) -> Result<(Vec<([u8; 32], Vec)>, PartialMerkleTree), VerifierError> { let queries = self.constraint_queries.take().expect("already read"); let proof = queries.query_proofs; @@ -199,10 +199,10 @@ impl VerifierChannel { .rows() .map(|a| a.iter().flat_map(|x| QuadExt::to_base_elements(*x).to_owned()).collect()) .collect(); - let (constraint_set, constraint_adv_map) = - unbatch_to_path_set(positions.to_vec(), queries_, proof); + let (constraint_pmt, constraint_adv_map) = + unbatch_to_partial_mt(positions.to_vec(), queries_, proof); - Ok((constraint_adv_map, constraint_set)) + Ok((constraint_adv_map, constraint_pmt)) } // Get the FRI layer challenges alpha @@ -224,14 +224,14 @@ impl VerifierChannel { positions_: &[usize], domain_size: usize, layer_commitments: Vec, - ) -> (Vec, Vec<([u8; 32], Vec)>) { + ) -> (Vec, Vec<([u8; 32], Vec)>) { let queries = self.fri_layer_queries.clone(); let mut current_domain_size = domain_size; let mut positions = positions_.to_vec(); let depth = layer_commitments.len() - 1; let mut adv_key_map = Vec::new(); - let mut sets = Vec::new(); + let mut partial_trees = Vec::new(); let mut layer_proofs = self.layer_proofs(); for i in 0..depth { let mut folded_positions = fold_positions(&positions, current_domain_size, N); @@ -254,8 +254,6 @@ impl VerifierChannel { let paths: Vec = unbatched_proof.into_iter().map(|list| list.into()).collect(); - let new_set = MerklePathSet::new((current_domain_size / N).ilog2() as u8); - let iter_pos = folded_positions.iter_mut().map(|a| *a as u64); let nodes_tmp = nodes.clone(); let iter_nodes = nodes_tmp.iter(); @@ -265,8 +263,9 @@ impl VerifierChannel { tmp_vec.push((p, RpoDigest::from(*node), path)); } - let new_set = new_set.with_paths(tmp_vec).expect("should not fail from paths"); - sets.push(new_set); + let new_pmt = + PartialMerkleTree::with_paths(tmp_vec).expect("should not fail from paths"); + partial_trees.push(new_pmt); let _empty: () = nodes .into_iter() @@ -283,7 +282,7 @@ impl VerifierChannel { current_domain_size = current_domain_size / N; } - (sets, adv_key_map) + (partial_trees, adv_key_map) } } @@ -474,13 +473,12 @@ impl TraceOodFrame { // HELPER FUNCTIONS // ================================================================================================ -pub fn unbatch_to_path_set( +pub fn unbatch_to_partial_mt( mut positions: Vec, queries: Vec>, proof: BatchMerkleProof, -) -> (MerklePathSet, Vec<([u8; 32], Vec)>) { +) -> (PartialMerkleTree, Vec<([u8; 32], Vec)>) { let mut unbatched_proof = proof.into_paths(&positions).unwrap(); - let depth = unbatched_proof[0].len() as u8; let mut adv_key_map = Vec::new(); let nodes: Vec<[Felt; 4]> = unbatched_proof .iter_mut() @@ -493,8 +491,6 @@ pub fn unbatch_to_path_set( let paths: Vec = unbatched_proof.into_iter().map(|list| list.into()).collect(); - let new_set = MerklePathSet::new(depth - 1); - let iter_pos = positions.iter_mut().map(|a| *a as u64); let nodes_tmp = nodes.clone(); let iter_nodes = nodes_tmp.iter(); @@ -513,5 +509,8 @@ pub fn unbatch_to_path_set( }) .collect(); - (new_set.with_paths(tmp_vec).expect("should not fail from paths"), adv_key_map) + ( + PartialMerkleTree::with_paths(tmp_vec).expect("should not fail from paths"), + adv_key_map, + ) } diff --git a/stdlib/tests/crypto/stark/verifier_recursive/mod.rs b/stdlib/tests/crypto/stark/verifier_recursive/mod.rs index 83c4d9bef1..ae280a2b4d 100644 --- a/stdlib/tests/crypto/stark/verifier_recursive/mod.rs +++ b/stdlib/tests/crypto/stark/verifier_recursive/mod.rs @@ -123,15 +123,15 @@ pub fn generate_advice_inputs( } // draw pseudo-random query positions for the LDE domain from the public coin. - // this is needed in order to construct Merkle path sets + // this is needed in order to construct Partial Merkle Trees let query_positions = public_coin .draw_integers(air.options().num_queries(), air.lde_domain_size()) .map_err(|_| VerifierError::RandomCoinError)?; // read advice maps and Merkle paths related to trace and constraint composition polynomial evaluations - let (mut advice_map, mut m_path_sets_traces) = + let (mut advice_map, mut partial_trees_traces) = channel.read_queried_trace_states(&query_positions)?; - let (mut adv_map_constraint, m_path_set_constraint) = + let (mut adv_map_constraint, partial_tree_constraint) = channel.read_constraint_evaluations(&query_positions)?; let domain_size = (air.trace_poly_degree() + 1) * BLOWUP_FACTOR; @@ -139,12 +139,12 @@ pub fn generate_advice_inputs( // consolidate advice maps advice_map.append(&mut adv_map_constraint); advice_map.append(&mut ress.1); - let mut m_path_sets_fri = ress.0; - m_path_sets_fri.append(&mut m_path_sets_traces); - m_path_sets_fri.push(m_path_set_constraint); + let mut partial_trees_fri = ress.0; + partial_trees_fri.append(&mut partial_trees_traces); + partial_trees_fri.push(partial_tree_constraint); let mut store = MerkleStore::new(); - for path_set in &m_path_sets_fri { - store.add_merkle_path_set(&path_set).unwrap(); + for partial_tree in &partial_trees_fri { + store.extend(partial_tree.inner_nodes()); } Ok(VerifierData { initial_stack, diff --git a/test-utils/src/crypto.rs b/test-utils/src/crypto.rs index 61a841a9c8..6de063a6f1 100644 --- a/test-utils/src/crypto.rs +++ b/test-utils/src/crypto.rs @@ -6,8 +6,8 @@ use super::{Felt, FieldElement, StarkField, Vec, Word}; pub use vm_core::crypto::{ hash::{Rpo256, RpoDigest}, merkle::{ - EmptySubtreeRoots, MerkleError, MerklePath, MerklePathSet, MerkleStore, MerkleTree, Mmr, - MmrPeaks, NodeIndex, SimpleSmt, + EmptySubtreeRoots, MerkleError, MerklePath, MerkleStore, MerkleTree, Mmr, MmrPeaks, + NodeIndex, PartialMerkleTree, SimpleSmt, }, }; From 98aa1cc5a8b7649028d4a8398523601989d7a069 Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Mon, 31 Jul 2023 15:32:16 +0200 Subject: [PATCH 037/120] feat(stdlib): Add sha256::hash_memory(addr, len) --- stdlib/asm/crypto/hashes/sha256.masm | 62 ++++++++++++++++++++++++++++ stdlib/docs/crypto/hashes/sha256.md | 1 + 2 files changed, 63 insertions(+) diff --git a/stdlib/asm/crypto/hashes/sha256.masm b/stdlib/asm/crypto/hashes/sha256.masm index 92ccc82357..8bcabbedf7 100644 --- a/stdlib/asm/crypto/hashes/sha256.masm +++ b/stdlib/asm/crypto/hashes/sha256.masm @@ -1555,3 +1555,65 @@ export.hash_1to1 exec.prepare_message_schedule_and_consume end + +#! Given a memory address and a message length in bytes, compute its sha256 digest +#! +#! - There must be space for writing the padding after the message in memory +#! - The padding space after the message must be all zeros before this procedure is called +#! +#! Input: [addr, len, ...] +#! Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...] +export.hash_memory.12 + # loc.0 (input address) + loc_store.0 + + # loc.1 (input length) + loc_store.1 + + # loc.2 (padded length): len(x) + (55 - len(x)) % 64 + 9 + push.55 loc_load.1 u32wrapping_sub push.63 u32checked_and + loc_load.1 u32checked_add u32checked_add.9 loc_store.2 + + # loc.3 (last u32): addr + newlen/16 - 1 + loc_load.2 u32checked_div.16 loc_load.0 u32wrapping_add u32wrapping_sub.1 loc_store.3 + + # loc.4 (u32 aligned padding byte): 0x80000000 >> ((len % 4) * 8) + loc_load.1 u32checked_mod.4 u32checked_mul.8 push.0x80000000 swap u32checked_shr loc_store.4 + + # loc.5 (memory offset of first padding byte): (len / 4) % 4 + loc_load.1 u32checked_div.4 u32checked_mod.4 loc_store.5 + + # loc.6 (memory address of first padding byte): addr + (len / 16) + loc_load.0 loc_load.1 u32checked_div.16 u32checked_add loc_store.6 + + # loc.7 (number of remaining 512-bit blocks to consume): padded_length // 64 + loc_load.2 u32checked_div.64 loc_store.7 + + # Set the first byte after the message to 0x80 + padw loc_load.6 mem_loadw loc_store.8 loc_store.9 loc_store.10 loc_store.11 + locaddr.8 loc_load.5 u32wrapping_add dup mem_load loc_load.4 u32wrapping_add swap mem_store + loc_load.11 loc_load.10 loc_load.9 loc_load.8 loc_load.6 mem_storew dropw + + # Set message bit length at end of padding + padw loc_load.3 mem_loadw + movup.3 drop loc_load.1 u32checked_mul.8 movdn.3 + loc_load.3 mem_storew dropw + + # Sha256 init + push.0x5be0cd19.0x1f83d9ab.0x9b05688c.0x510e527f + push.0xa54ff53a.0x3c6ef372.0xbb67ae85.0x6a09e667 + + # Consume sha256 blocks + loc_load.7 u32checked_neq.0 + while.true + padw loc_load.0 u32checked_add.3 mem_loadw movdnw.2 + padw loc_load.0 u32checked_add.2 mem_loadw movdnw.2 + padw loc_load.0 u32checked_add.1 mem_loadw movdnw.2 + padw loc_load.0 u32checked_add.0 mem_loadw movdnw.2 + exec.prepare_message_schedule_and_consume + + loc_load.0 u32checked_add.4 loc_store.0 + loc_load.7 u32checked_sub.1 dup loc_store.7 + u32checked_neq.0 + end +end diff --git a/stdlib/docs/crypto/hashes/sha256.md b/stdlib/docs/crypto/hashes/sha256.md index 0d2ca114c5..22e986ea0d 100644 --- a/stdlib/docs/crypto/hashes/sha256.md +++ b/stdlib/docs/crypto/hashes/sha256.md @@ -5,3 +5,4 @@ | prepare_message_schedule_and_consume | Computes whole message schedule of 64 message words and consumes them into hash state.

      Input: [state0, state1, state2, state3, state4, state5, state6, state7, msg0, msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9, msg10, msg11, msg12, msg13, msg14, msg15]

      Output: [state0', state1', state2', state3', state4', state5', state6', state7']

      Where:

      - state0 through state7 are the hash state (in terms of 8 SHA256 words)

      - msg0 through msg15 are the 64 -bytes input message (in terms of 16 SHA256 words)

      See https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2.hpp#L89-L113

      & https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2_256.hpp#L148-L187 ( loop body execution ) | | hash_2to1 | Given 64 -bytes input, this routine computes 32 -bytes SHA256 digest

      Input: [m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...]

      Where: m[0,16) = 32 -bit word

      Note, each SHA256 word is 32 -bit wide, so that's how input is expected.

      As you've 64 -bytes, consider packing 4 consecutive bytes into single word,

      maintaining big endian byte order.

      SHA256 digest is represented in terms of eight 32 -bit words ( big endian byte order ). | | hash_1to1 | Given 32 -bytes input, this routine computes 32 -bytes SHA256 digest

      Expected stack state:

      Input: [m0, m1, m2, m3, m4, m5, m6, m7, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...]

      Where: m[0,8) = 32 -bit word

      Note, each SHA256 word is 32 -bit wide, so that's how input is expected.

      As you've 32 -bytes, consider packing 4 consecutive bytes into single word,

      maintaining big endian byte order.

      SHA256 digest is represented in terms of eight 32 -bit words ( big endian byte order ). | +| hash_memory | Given a memory address and a message length in bytes, compute its sha256 digest

      - There must be space for writing the padding after the message in memory

      - The padding space after the message must be all zeros

      Input: [addr, len, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...] | From 69a50f1c5b73e1a925a4163785f36ecef786f8b0 Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Mon, 31 Jul 2023 16:57:29 +0200 Subject: [PATCH 038/120] feat(stdlib): Improve comments in sha256::hash_memory --- stdlib/asm/crypto/hashes/sha256.masm | 14 +++++++------- stdlib/docs/crypto/hashes/sha256.md | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/stdlib/asm/crypto/hashes/sha256.masm b/stdlib/asm/crypto/hashes/sha256.masm index 8bcabbedf7..1c8fd90cab 100644 --- a/stdlib/asm/crypto/hashes/sha256.masm +++ b/stdlib/asm/crypto/hashes/sha256.masm @@ -1570,23 +1570,23 @@ export.hash_memory.12 # loc.1 (input length) loc_store.1 - # loc.2 (padded length): len(x) + (55 - len(x)) % 64 + 9 + # loc.2 (padded length): input_length + (55 - input_length) % 64 + 9 push.55 loc_load.1 u32wrapping_sub push.63 u32checked_and loc_load.1 u32checked_add u32checked_add.9 loc_store.2 - # loc.3 (last u32): addr + newlen/16 - 1 + # loc.3 (last memory address in padding): input_address + padded_length / 16 - 1 loc_load.2 u32checked_div.16 loc_load.0 u32wrapping_add u32wrapping_sub.1 loc_store.3 - # loc.4 (u32 aligned padding byte): 0x80000000 >> ((len % 4) * 8) + # loc.4 (u32 aligned padding byte): 0x80000000 >> ((input_length % 4) * 8) loc_load.1 u32checked_mod.4 u32checked_mul.8 push.0x80000000 swap u32checked_shr loc_store.4 - # loc.5 (memory offset of first padding byte): (len / 4) % 4 + # loc.5 (memory offset of first padding byte): (input_length / 4) % 4 loc_load.1 u32checked_div.4 u32checked_mod.4 loc_store.5 - # loc.6 (memory address of first padding byte): addr + (len / 16) + # loc.6 (memory address of first padding byte): input_address + (len / 16) loc_load.0 loc_load.1 u32checked_div.16 u32checked_add loc_store.6 - # loc.7 (number of remaining 512-bit blocks to consume): padded_length // 64 + # loc.7 (number of remaining 512-bit blocks to consume): padded_length / 64 loc_load.2 u32checked_div.64 loc_store.7 # Set the first byte after the message to 0x80 @@ -1594,7 +1594,7 @@ export.hash_memory.12 locaddr.8 loc_load.5 u32wrapping_add dup mem_load loc_load.4 u32wrapping_add swap mem_store loc_load.11 loc_load.10 loc_load.9 loc_load.8 loc_load.6 mem_storew dropw - # Set message bit length at end of padding + # Set message length in bits at end of padding padw loc_load.3 mem_loadw movup.3 drop loc_load.1 u32checked_mul.8 movdn.3 loc_load.3 mem_storew dropw diff --git a/stdlib/docs/crypto/hashes/sha256.md b/stdlib/docs/crypto/hashes/sha256.md index 22e986ea0d..e45dd6359b 100644 --- a/stdlib/docs/crypto/hashes/sha256.md +++ b/stdlib/docs/crypto/hashes/sha256.md @@ -5,4 +5,4 @@ | prepare_message_schedule_and_consume | Computes whole message schedule of 64 message words and consumes them into hash state.

      Input: [state0, state1, state2, state3, state4, state5, state6, state7, msg0, msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9, msg10, msg11, msg12, msg13, msg14, msg15]

      Output: [state0', state1', state2', state3', state4', state5', state6', state7']

      Where:

      - state0 through state7 are the hash state (in terms of 8 SHA256 words)

      - msg0 through msg15 are the 64 -bytes input message (in terms of 16 SHA256 words)

      See https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2.hpp#L89-L113

      & https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2_256.hpp#L148-L187 ( loop body execution ) | | hash_2to1 | Given 64 -bytes input, this routine computes 32 -bytes SHA256 digest

      Input: [m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...]

      Where: m[0,16) = 32 -bit word

      Note, each SHA256 word is 32 -bit wide, so that's how input is expected.

      As you've 64 -bytes, consider packing 4 consecutive bytes into single word,

      maintaining big endian byte order.

      SHA256 digest is represented in terms of eight 32 -bit words ( big endian byte order ). | | hash_1to1 | Given 32 -bytes input, this routine computes 32 -bytes SHA256 digest

      Expected stack state:

      Input: [m0, m1, m2, m3, m4, m5, m6, m7, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...]

      Where: m[0,8) = 32 -bit word

      Note, each SHA256 word is 32 -bit wide, so that's how input is expected.

      As you've 32 -bytes, consider packing 4 consecutive bytes into single word,

      maintaining big endian byte order.

      SHA256 digest is represented in terms of eight 32 -bit words ( big endian byte order ). | -| hash_memory | Given a memory address and a message length in bytes, compute its sha256 digest

      - There must be space for writing the padding after the message in memory

      - The padding space after the message must be all zeros

      Input: [addr, len, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...] | +| hash_memory | Given a memory address and a message length in bytes, compute its sha256 digest

      - There must be space for writing the padding after the message in memory

      - The padding space after the message must be all zeros before this procedure is called

      Input: [addr, len, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...] | From 6c3412f0296a0a183a501d059ff3a51f2341b60d Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Tue, 1 Aug 2023 17:27:29 -0700 Subject: [PATCH 039/120] chore: update std::collections::smt get procedures to work with the latest miden-crypto --- core/src/lib.rs | 2 +- .../src/decorators/adv_stack_injectors.rs | 12 +- stdlib/asm/collections/smt.masm | 146 +++--- stdlib/docs/collections/smt.md | 2 +- stdlib/tests/collections/smt.rs | 441 +++++------------- test-utils/src/crypto.rs | 2 +- 6 files changed, 187 insertions(+), 418 deletions(-) diff --git a/core/src/lib.rs b/core/src/lib.rs index d491e4de67..de450db38f 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -13,7 +13,7 @@ pub mod crypto { pub use ::crypto::merkle::{ DefaultMerkleStore, EmptySubtreeRoots, InnerNodeInfo, MerkleError, MerklePath, MerkleStore, MerkleTree, Mmr, MmrPeaks, NodeIndex, PartialMerkleTree, - RecordingMerkleStore, SimpleSmt, StoreNode, + RecordingMerkleStore, SimpleSmt, StoreNode, TieredSmt, }; } diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors.rs index bbfae917ff..1d9a2e6f2d 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors.rs @@ -282,14 +282,12 @@ where /// Where: /// - f0 is a boolean flag set to `1` if the depth is `16` or `48`. /// - f1 is a boolean flag set to `1` if the depth is `16` or `32`. - /// - K is the remaining key word; will be zeroed if the tree don't contain a mapped value - /// for the key. + /// - K is the key; will be zeroed if the tree don't contain a mapped value for the key. /// - V is the value word; will be zeroed if the tree don't contain a mapped value for the key. - /// - f2 is a boolean flag set to `1` if a remaining key is not zero. + /// - f2 is a boolean flag set to `1` if the key is not zero. /// /// # Errors - /// Will return an error if: - /// - The provided Merkle root doesn't exist on the advice provider + /// Will return an error if the provided Merkle root doesn't exist on the advice provider. /// /// # Panics /// Will panic as unimplemented if the target depth is `64`. @@ -306,7 +304,7 @@ where // because of `48`. using a lookup table is far more efficient than if/else if/else. let depth = SMT_NORMALIZED_DEPTHS[depth as usize]; if depth == 64 { - unimplemented!("the functionality is unimplemented for depth 64 as the bottom tier will have a special treatment to embed multiple key/value pairs onto a single node"); + unimplemented!("handling of bottom tier is not yet implemented"); } // fetch the node value @@ -325,7 +323,7 @@ where // push a flag indicating that a remaining key exists self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - // map is expected to contain `node |-> {K', V}` + // map is expected to contain `node |-> {K, V}` self.advice_provider.push_stack(AdviceSource::Map { key: node, include_len: false, diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index e80a7e0bdc..b7f93a4112 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -16,84 +16,80 @@ const.EMPTY_48_1=5634734408638476525 const.EMPTY_48_2=9233115969432897632 const.EMPTY_48_3=1437907447409278328 -#! Produces a remaining path key and index for depth 16 +#! Extracts 16 most significant bits from the passed-in value. #! #! Input: [v, ...] -#! Output: [(v << 16) >> 16, v >> 48, ...] +#! Output: [v >> 48, ...] #! -#! Cycles: 7 -proc.split_16 +#! Cycles: 6 +proc.get_top_16_bits u32split - u32unchecked_divmod.65536 - mul.4294967296 - movup.2 - add + swap drop + u32unchecked_shr.16 end -#! Produces a remaining path key and index for depth 48 +#! Extracts 48 most significant bits from the passed-in value. #! #! Input: [v, ...] -#! Output: [v >> 16, (v << 48) >> 48, ...] +#! Output: [v >> 16, ...] #! #! Cycles: 9 -proc.split_48 +proc.get_top_48_bits u32split swap - u32unchecked_divmod.65536 + u32unchecked_shr.16 swap - movup.2 mul.65536 add end -#! Get the leaf value for depth 16 +#! Get the leaf value for depth 16. #! #! Input: [K, R, ...] #! Output: [V, R, ...] #! -#! Cycles: 86 +#! Cycles: 85 proc.get16.2 - # compute the remaining path (9 cycles) - exec.split_16 swap movdn.4 - # => [K', i, R, ...] + # compute index of the node by extracting top 16 bits from the key (8 cycles) + dup exec.get_top_16_bits movdn.4 + # => [K, i, R, ...] # save [0, 0, 0, 0] into loc[0] (7 cycles) padw loc_storew.0 - # load Ka from advice provider and compare it to K' (16 cycles) - # Ka is expected to be the remaining key for the node stored at - # depth; it could be either equal to K', or could be something - # different + # load Ka from advice provider and compare it to K (16 cycles) + # Ka is expected to be the key for the node stored at depth 16; it could be either equal + # to K, or could be something different adv_loadw eqw - # => [Ka ?= K', Ka, K', i, R, ...] + # => [Ka ?= K, Ka, K, i, R, ...] # move the comparison result out of the way (1 cycle) movdn.8 - # => [Ka, K', Ka ?= K', i, R, ...] + # => [Ka, K, Ka ?= K, i, R, ...] # load the value from adv provider and prepare hash (6 cycles) push.0.16.0.0 swapw.2 adv_loadw - # => [V, Ka, D, Ka ?= K', i, R, ...] + # => [V, Ka, D, Ka ?= K, i, R, ...] # save the value into loc[1] (4 cycles) loc_storew.1 - # => [V, Ka, D, Ka ?= K', i, R, ...] + # => [V, Ka, D, Ka ?= K, i, R, ...] - # compute hash(K', V, domain=16) (10 cycles) + # compute the value of the node as hash(K, V, domain=16) (10 cycles) hperm dropw swapw dropw - # => [N, Ka ?= K', i, R, ...] + # => [N, Ka ?= K, i, R, ...] # push the root of the empty subtree (5 cycles) push.EMPTY_16_0.EMPTY_16_1.EMPTY_16_2.EMPTY_16_3 swapw - # => [N, E, Ka ?= K', i, R, ...] + # => [N, E, Ka ?= K, i, R, ...] # read the flag if the node is empty subtree (5 cycles) adv_push.1 movdn.8 dup.8 - # => [not_empty?, N, E, not_empty?, Ka ?= K', i, R, ...] + # => [not_empty?, N, E, not_empty?, Ka ?= K, i, R, ...] # conditionally select node (5 cycles) cdropw - # => [N', not_empty?, Ka ?= K', i, R, ...] + # => [N', not_empty?, Ka ?= K, i, R, ...] # compute the flag indicating if value is not zero (3 cycles) movup.5 movup.5 and @@ -111,8 +107,8 @@ proc.get16.2 movup.4 drop movup.4 drop movup.8 # => [take_val?, N', R, ...] - # compute the address of the return value based on `take_val` - # and return it, being either zero or V (3 cycles) + # compute the address of the return value based on `take_val` and return it, being either + # zero or V (3 cycles) locaddr.0 add # => [addr, N', R, ...] @@ -121,54 +117,53 @@ proc.get16.2 # => [V, R, ...] end -#! Get the leaf value for depth 32 +#! Get the leaf value for depth 32. #! #! Input: [K, R, ...] #! Output: [V, R, ...] #! -#! Cycles: 79 +#! Cycles: 81 proc.get32.2 - # compute the remaining path (2 cycles) - u32split movdn.4 - # => [K', i, R, ...] + # compute index of the node by extracting top 16 bits from the key (4 cycles) + dup u32split movdn.5 drop + # => [K, i, R, ...] # save [0, 0, 0, 0] into loc[0] (7 cycles) padw loc_storew.0 - # load Ka from advice provider and compare it to K' (16 cycles) - # Ka is expected to be the remaining key for the node stored at - # depth; it could be either equal to K', or could be something - # different + # load Ka from advice provider and compare it to K (16 cycles) + # Ka is expected to be the key for the node stored at depth 32; it could be either equal + # to K, or could be something different adv_loadw eqw - # => [Ka ?= K', Ka, K', i, R, ...] + # => [Ka ?= K, Ka, K, i, R, ...] # move the comparison result out of the way (1 cycle) movdn.8 - # => [Ka, K', Ka ?= K', i, R, ...] + # => [Ka, K, Ka ?= K, i, R, ...] # load the value from adv provider and prepare hash (6 cycles) push.0.32.0.0 swapw.2 adv_loadw - # => [V, Ka, D, Ka ?= K', i, R, ...] + # => [V, Ka, D, Ka ?= K, i, R, ...] # save the value into loc[1] (4 cycles) loc_storew.1 - # => [V, Ka, D, Ka ?= K', i, R, ...] + # => [V, Ka, D, Ka ?= K, i, R, ...] - # compute hash(K', V, domain=32) (10 cycles) + # compute the value of the node as hash(K, V, domain=32) (10 cycles) hperm dropw swapw dropw - # => [N, Ka ?= K', i, R, ...] + # => [N, Ka ?= K, i, R, ...] # push the root of the empty subtree (5 cycles) push.EMPTY_32_0.EMPTY_32_1.EMPTY_32_2.EMPTY_32_3 swapw - # => [N, E, Ka ?= K', i, R, ...] + # => [N, E, Ka ?= K, i, R, ...] # read the flag if the node is empty subtree (5 cycles) adv_push.1 movdn.8 dup.8 - # => [not_empty?, N, E, not_empty?, Ka ?= K', i, R, ...] + # => [not_empty?, N, E, not_empty?, Ka ?= K, i, R, ...] # conditionally select node (5 cycles) cdropw - # => [N', not_empty?, Ka ?= K', i, R, ...] + # => [N', not_empty?, Ka ?= K, i, R, ...] # compute the flag indicating if value is not zero (3 cycles) movup.5 movup.5 and @@ -186,8 +181,8 @@ proc.get32.2 movup.4 drop movup.4 drop movup.8 # => [take_val?, N', R, ...] - # compute the address of the return value based on `take_val` - # and return it, being either zero or V (3 cycles) + # compute the address of the return value based on `take_val` and return it, being either + # zero or V (3 cycles) locaddr.0 add # => [addr, N', R, ...] @@ -196,54 +191,53 @@ proc.get32.2 # => [V, R, ...] end -#! Get the leaf value for depth 48 +#! Get the leaf value for depth 48. #! #! Input: [K, R, ...] #! Output: [V, R, ...] #! -#! Cycles: 87 +#! Cycles: 88 proc.get48.2 - # compute the remaining path (10 cycles) - exec.split_48 movdn.4 - # => [K', i, R, ...] + # compute index of the node by extracting top 48 bits from the key (11 cycles) + dup exec.get_top_48_bits movdn.4 + # => [K, i, R, ...] # save [0, 0, 0, 0] into loc[0] (7 cycles) padw loc_storew.0 - # load Ka from advice provider and compare it to K' (16 cycles) - # Ka is expected to be the remaining key for the node stored at - # depth; it could be either equal to K', or could be something - # different + # load Ka from advice provider and compare it to K (16 cycles) + # Ka is expected to be the remaining key for the node stored at depth 48; it could be either + # equal to K, or could be something different adv_loadw eqw - # => [Ka ?= K', Ka, K', i, R, ...] + # => [Ka ?= K, Ka, K, i, R, ...] # move the comparison result out of the way (1 cycle) movdn.8 - # => [Ka, K', Ka ?= K', i, R, ...] + # => [Ka, K, Ka ?= K, i, R, ...] # load the value from adv provider and prepare hash (6 cycles) push.0.48.0.0 swapw.2 adv_loadw - # => [V, Ka, D, Ka ?= K', i, R, ...] + # => [V, Ka, D, Ka ?= K, i, R, ...] # save the value into loc[1] (4 cycles) loc_storew.1 - # => [V, Ka, D, Ka ?= K', i, R, ...] + # => [V, Ka, D, Ka ?= K, i, R, ...] - # compute hash(K', V, domain=48) (10 cycles) + # compute the value of the node as hash(K, V, domain=48) (10 cycles) hperm dropw swapw dropw - # => [N, Ka ?= K', i, R, ...] + # => [N, Ka ?= K, i, R, ...] # push the root of the empty subtree (5 cycles) push.EMPTY_48_0.EMPTY_48_1.EMPTY_48_2.EMPTY_48_3 swapw - # => [N, E, Ka ?= K', i, R, ...] + # => [N, E, Ka ?= K, i, R, ...] # read the flag if the node is empty subtree (5 cycles) adv_push.1 movdn.8 dup.8 - # => [not_empty?, N, E, not_empty?, Ka ?= K', i, R, ...] + # => [not_empty?, N, E, not_empty?, Ka ?= K, i, R, ...] # conditionally select node (5 cycles) cdropw - # => [N', not_empty?, Ka ?= K', i, R, ...] + # => [N', not_empty?, Ka ?= K, i, R, ...] # compute the flag indicating if value is not zero (3 cycles) movup.5 movup.5 and @@ -261,8 +255,8 @@ proc.get48.2 movup.4 drop movup.4 drop movup.8 # => [take_val?, N', R, ...] - # compute the address of the return value based on `take_val` - # and return it, being either zero or V (3 cycles) + # compute the address of the return value based on `take_val` and return it, being either + # zero or V (3 cycles) locaddr.0 add # => [addr, N', R, ...] @@ -278,9 +272,9 @@ end #! Input: [K, R, ...] #! Output: [V, R, ...] #! -#! Depth 16: 92 cycles -#! Depth 32: 95 cycles -#! Depth 48: 93 cycles +#! Depth 16: 91 cycles +#! Depth 32: 87 cycles +#! Depth 48: 94 cycles export.get # invoke adv and fetch target depth flags adv.push_smtget adv_push.2 diff --git a/stdlib/docs/collections/smt.md b/stdlib/docs/collections/smt.md index 4ff46cf688..85ee7a889d 100644 --- a/stdlib/docs/collections/smt.md +++ b/stdlib/docs/collections/smt.md @@ -2,4 +2,4 @@ ## std::collections::smt | Procedure | Description | | ----------- | ------------- | -| get | Returns the value stored under the specified key in a Sparse Merkle Tree with the specified root.

      If the value for a given key has not been set, the returned `V` will consist of all zeroes.

      Input: [K, R, ...]

      Output: [V, R, ...]

      Depth 16: 92 cycles

      Depth 32: 95 cycles

      Depth 48: 93 cycles | +| get | Returns the value stored under the specified key in a Sparse Merkle Tree with the specified root.

      If the value for a given key has not been set, the returned `V` will consist of all zeroes.

      Input: [K, R, ...]

      Output: [V, R, ...]

      Depth 16: 91 cycles

      Depth 32: 87 cycles

      Depth 48: 94 cycles | diff --git a/stdlib/tests/collections/smt.rs b/stdlib/tests/collections/smt.rs index abee6c2817..9618368cd9 100644 --- a/stdlib/tests/collections/smt.rs +++ b/stdlib/tests/collections/smt.rs @@ -1,289 +1,120 @@ use crate::build_test; use test_utils::{ - crypto::{get_smt_remaining_key, EmptySubtreeRoots, MerkleStore, NodeIndex, Rpo256}, - rand::{seeded_element, seeded_word}, - Felt, IntoBytes, StarkField, Word, + crypto::{MerkleStore, RpoDigest, TieredSmt}, + Felt, StarkField, Word, ONE, ZERO, }; -#[test] -fn smtget_single_leaf_depth_16() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // append a leaf - let path = seeded_element(&mut seed).as_int(); - let leaf = SmtLeaf::new(&mut seed, path, 16); - let root = leaf.insert(&mut store, root); - - // run the test - let advice_map = build_advice_map([leaf]); - assert_smt_get_opens_correctly(leaf.key, leaf.value, root, store, &advice_map); -} - -#[test] -fn smtget_absent_leaf_depth_16() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // generate two paths that diverges at depth 16 - let a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; - let b = 0b10000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; - - // generate two leaves from the paths - let a = SmtLeaf::new(&mut seed, a, 16); - let b = SmtLeaf::new(&mut seed, b, 16); - - // append only `b` to the store - let root = b.insert(&mut store, root); - - // sanity check if `b` is properly returned - let advice_map = build_advice_map([b]); - assert_smt_get_opens_correctly(b.key, b.value, root, store.clone(), &advice_map); - - // `a` should return zeroes as it was not inserted - assert_smt_get_opens_correctly(a.key, Word::default(), root, store.clone(), &advice_map); -} - -#[test] -fn smtget_absent_leaf_with_conflicting_path_at_depth_16() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // generate two paths that diverges after depth 16 - let a = 0b00000000_00000000_01111111_11111111_11111111_11111111_11111111_11111111_u64; - let b = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; - - // generate two leaves from the paths - let a = SmtLeaf::new(&mut seed, a, 16); - let b = SmtLeaf::new(&mut seed, b, 16); - - // append only `b` to the store - let root = b.insert(&mut store, root); - - // sanity check if `b` is properly returned - let advice_map = build_advice_map([b]); - assert_smt_get_opens_correctly(b.key, b.value, root, store.clone(), &advice_map); - - // `a` should return zeroes as it was not inserted - assert_smt_get_opens_correctly(a.key, Word::default(), root, store.clone(), &advice_map); -} - -#[test] -fn smtget_single_leaf_depth_32() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // append a leaf - let path = seeded_element(&mut seed).as_int(); - let leaf = SmtLeaf::new(&mut seed, path, 32); - let root = leaf.insert(&mut store, root); - - // run the test - let advice_map = build_advice_map([leaf]); - assert_smt_get_opens_correctly(leaf.key, leaf.value, root, store, &advice_map); -} - -#[test] -fn smtget_absent_leaf_depth_32() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // generate two paths that diverges at depth 32 - let a = 0b00000000_00000000_00000000_00000000_11111111_11111111_11111111_11111111_u64; - let b = 0b00000000_00000000_10000000_00000000_11111111_11111111_11111111_11111111_u64; - - // generate two leaves from the paths - let a = SmtLeaf::new(&mut seed, a, 32); - let b = SmtLeaf::new(&mut seed, b, 32); - - // append only `b` to the store - let root = b.insert(&mut store, root); - - // sanity check if `b` is properly returned - let advice_map = build_advice_map([b]); - assert_smt_get_opens_correctly(b.key, b.value, root, store.clone(), &advice_map); - - // `a` should return zeroes as it was not inserted - assert_smt_get_opens_correctly(a.key, Word::default(), root, store.clone(), &advice_map); -} - -#[test] -fn smtget_absent_leaf_with_conflicting_path_at_depth_32() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // generate two paths that diverges after depth 32 - let a = 0b00000000_00000000_00000000_00000000_01111111_11111111_11111111_11111111_u64; - let b = 0b00000000_00000000_00000000_00000000_11111111_11111111_11111111_11111111_u64; - - // generate two leaves from the paths - let a = SmtLeaf::new(&mut seed, a, 32); - let b = SmtLeaf::new(&mut seed, b, 32); - - // append only `b` to the store - let root = b.insert(&mut store, root); - - // sanity check if `b` is properly returned - let advice_map = build_advice_map([b]); - assert_smt_get_opens_correctly(b.key, b.value, root, store.clone(), &advice_map); - - // `a` should return zeroes as it was not inserted - assert_smt_get_opens_correctly(a.key, Word::default(), root, store.clone(), &advice_map); -} - -#[test] -fn smtget_single_leaf_depth_48() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); +// CONSTANTS +// ================================================================================================ - // append a leaf - let path = seeded_element(&mut seed).as_int(); - let leaf = SmtLeaf::new(&mut seed, path, 48); - let root = leaf.insert(&mut store, root); +const EMPTY_VALUE: Word = TieredSmt::EMPTY_VALUE; - // run the test - let advice_map = build_advice_map([leaf]); - assert_smt_get_opens_correctly(leaf.key, leaf.value, root, store, &advice_map); -} +// RETRIEVAL TESTS +// ================================================================================================ #[test] -fn smtget_absent_leaf_depth_48() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // generate two paths that diverges at depth 48 - let a = 0b00000000_00000000_00000000_00000000_00000000_00000000_11111111_11111111_u64; - let b = 0b00000000_00000000_00000000_00000000_10000000_00000000_11111111_11111111_u64; - - // generate two leaves from the paths - let a = SmtLeaf::new(&mut seed, a, 48); - let b = SmtLeaf::new(&mut seed, b, 48); - - // append only `b` to the store - let root = b.insert(&mut store, root); - - // sanity check if `b` is properly returned - let advice_map = build_advice_map([b]); - assert_smt_get_opens_correctly(b.key, b.value, root, store.clone(), &advice_map); - - // `a` should return zeroes as it was not inserted - assert_smt_get_opens_correctly(a.key, Word::default(), root, store.clone(), &advice_map); +fn smtget_depth_16() { + let mut smt = TieredSmt::default(); + + // create a key + let raw_a = 0b_01010101_01101100_00011111_11111111_10010110_10010011_11100000_00000000_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + + // make sure we get an empty value for this key + assert_smt_get_opens_correctly(&smt, key_a, EMPTY_VALUE); + + // insert a value under this key and make sure we get it back when queried + let val_a = [ONE, ONE, ONE, ONE]; + smt.insert(key_a, val_a); + assert_smt_get_opens_correctly(&smt, key_a, val_a); + + // make sure that another key still returns empty value + let raw_b = 0b_01111101_01101100_00011111_11111111_10010110_10010011_11100000_00000000_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + assert_smt_get_opens_correctly(&smt, key_b, EMPTY_VALUE); + + // make sure that another key with the same 16-bit prefix returns an empty value + let raw_c = 0b_01010101_01101100_11111111_11111111_10010110_10010011_11100000_00000000_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + assert_smt_get_opens_correctly(&smt, key_c, EMPTY_VALUE); } #[test] -fn smtget_absent_leaf_with_conflicting_path_at_depth_48() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // generate two paths that diverges after depth 48 - let a = 0b00000000_00000000_00000000_00000000_00000000_00000000_01111111_11111111_u64; - let b = 0b00000000_00000000_00000000_00000000_00000000_00000000_11111111_11111111_u64; - - // generate two leaves from the paths - let a = SmtLeaf::new(&mut seed, a, 48); - let b = SmtLeaf::new(&mut seed, b, 48); - - // append only `b` to the store - let root = b.insert(&mut store, root); - - // sanity check if `b` is properly returned - let advice_map = build_advice_map([b]); - assert_smt_get_opens_correctly(b.key, b.value, root, store.clone(), &advice_map); - - // `a` should return zeroes as it was not inserted - assert_smt_get_opens_correctly(a.key, Word::default(), root, store.clone(), &advice_map); +fn smtget_depth_32() { + let mut smt = TieredSmt::default(); + + // populate the tree with two key-value pairs sharing the same 16-bit prefix for the keys + let raw_a = 0b_01010101_01010101_00011111_11111111_10010110_10010011_11100000_00000000_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ONE, ONE, ONE]; + smt.insert(key_a, val_a); + + let raw_b = 0b_01010101_01010101_11100000_11111111_10010110_10010011_11100000_00000000_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ZERO, ONE, ONE, ONE]; + smt.insert(key_b, val_b); + + // make sure the values for these keys are retrieved correctly + assert_smt_get_opens_correctly(&smt, key_a, val_a); + assert_smt_get_opens_correctly(&smt, key_b, val_b); + + // make sure another key with the same 16-bit prefix returns an empty value + let raw_c = 0b_01010101_01010101_11100111_11111111_10010110_10010011_11100000_00000000_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + assert_smt_get_opens_correctly(&smt, key_c, EMPTY_VALUE); + + // make sure keys with the same 32-bit prefixes return empty value + let raw_d = 0b_01010101_01010101_00011111_11111111_11111110_10010011_11100000_00000000_u64; + let key_d = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_d)]); + assert_smt_get_opens_correctly(&smt, key_d, EMPTY_VALUE); + + // make sure keys with the same 32-bit prefixes return empty value + let raw_e = 0b_01010101_01010101_11100000_11111111_10011111_10010011_11100000_00000000_u64; + let key_e = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_e)]); + assert_smt_get_opens_correctly(&smt, key_e, EMPTY_VALUE); } #[test] -fn smtget_opens_correctly_from_tree_with_multiple_leaves() { - // setup the base values - let mut seed = 1 << 40; - let (root, mut store) = setup(); - - // define some paths - let a_3 = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; - let b_3 = 0b10000000_00000000_01111111_11111111_11111111_11111111_11111111_11111111_u64; - let c_3 = 0b10000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; - let d_3 = 0b11000000_00000000_00000000_00000000_01111111_11111111_11111111_11111111_u64; - let e_3 = 0b11000000_00000000_00000000_00000000_11111111_11111111_11111111_11111111_u64; - - // `a` has no conflicts on depth `16` (first tier) - let a = SmtLeaf::new(&mut seed, a_3, 16); - - // `b` conflicts with `c` up to `16`; the target tier is `32` - let b = SmtLeaf::new(&mut seed, b_3, 32); - let c = SmtLeaf::new(&mut seed, c_3, 32); - - // `d` conflicts with `e` up to `32`; the target tier is `48` - let d = SmtLeaf::new(&mut seed, d_3, 48); - let e = SmtLeaf::new(&mut seed, e_3, 48); - - // append all leaves to the storage - let root = a.insert(&mut store, root); - let root = b.insert(&mut store, root); - let root = c.insert(&mut store, root); - let root = d.insert(&mut store, root); - let root = e.insert(&mut store, root); - - // assert all nodes are returned - let advice_map = build_advice_map([a, b, c, d, e]); - assert_smt_get_opens_correctly(a.key, a.value, root, store.clone(), &advice_map); - assert_smt_get_opens_correctly(b.key, b.value, root, store.clone(), &advice_map); - assert_smt_get_opens_correctly(c.key, c.value, root, store.clone(), &advice_map); - assert_smt_get_opens_correctly(d.key, d.value, root, store.clone(), &advice_map); - assert_smt_get_opens_correctly(e.key, e.value, root, store.clone(), &advice_map); - - // assert similar siblings returns zeroes - let x = 0b00000000_00000000_10111111_11111111_11111111_11111111_11111111_11111111_u64; - let y = 0b10000000_00000000_10111111_11111111_11111111_11111111_11111111_11111111_u64; - let z = 0b11000000_00000000_00000000_00000000_10111111_11111111_11111111_11111111_u64; - - // `x` is the same path of `a` for the included part of `a` (i.e. until depth `16) - let mut key = a.key; - key[3] = Felt::new(x); - assert_smt_get_opens_correctly(key, Word::default(), root, store.clone(), &advice_map); - - // `y` is the same path of `c` until depth `32` - let mut key = c.key; - key[3] = Felt::new(y); - assert_smt_get_opens_correctly(key, Word::default(), root, store.clone(), &advice_map); - - // `z` is the same path of `e` until depth `48` - let mut key = e.key; - key[3] = Felt::new(z); - assert_smt_get_opens_correctly(key, Word::default(), root, store.clone(), &advice_map); +fn smtget_depth_48() { + let mut smt = TieredSmt::default(); + + // populate the tree with two key-value pairs sharing the same 32-bit prefix for the keys + let raw_a = 0b_01010101_01010101_00011111_11111111_10010110_10010011_11100000_00000000_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ONE, ONE, ONE]; + smt.insert(key_a, val_a); + + let raw_b = 0b_01010101_01010101_00011111_11111111_11111111_10010011_11100000_00000000_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ZERO, ONE, ONE, ONE]; + smt.insert(key_b, val_b); + + // make sure the values for these keys are retrieved correctly + assert_smt_get_opens_correctly(&smt, key_a, val_a); + assert_smt_get_opens_correctly(&smt, key_b, val_b); + + // make sure another key with the same 32-bit prefix returns an empty value + let raw_c = 0b_01010101_01010101_00011111_11111111_00000000_10010011_11100000_00000000_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + assert_smt_get_opens_correctly(&smt, key_c, EMPTY_VALUE); + + // make sure keys with the same 48-bit prefixes return empty value + let raw_d = 0b_01010101_01010101_00011111_11111111_10010110_10010011_00000111_00000000_u64; + let key_d = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_d)]); + assert_smt_get_opens_correctly(&smt, key_d, EMPTY_VALUE); + + // make sure keys with the same 48-bit prefixes return empty value + let raw_e = 0b_01010101_01010101_00011111_11111111_11111111_10010011_000001011_00000000_u64; + let key_e = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_e)]); + assert_smt_get_opens_correctly(&smt, key_e, EMPTY_VALUE); } // TEST HELPERS // ================================================================================================ -/// Common initial test setup -/// -/// Returns the set of empty digests for SMT, the initial root, and an empty MerkleStore -fn setup() -> (Word, MerkleStore) { - let empty = EmptySubtreeRoots::empty_hashes(64); - let root = Word::from(empty[0]); - let store = MerkleStore::new(); - (root, store) -} - -/// Asserts key/value opens to root, provided the advice map and store -fn assert_smt_get_opens_correctly( - key: Word, - value: Word, - root: Word, - store: MerkleStore, - advice_map: &[([u8; 32], Vec)], -) { +/// Asserts key/value opens to root for the provided Tiered Sparse Merkle tree. +fn assert_smt_get_opens_correctly(smt: &TieredSmt, key: RpoDigest, value: Word) { + let root = smt.root(); let source = r#" use.std::collections::smt @@ -311,72 +142,18 @@ fn assert_smt_get_opens_correctly( root[1].as_int(), root[0].as_int(), ]; - let advice_stack = []; - build_test!(source, &initial_stack, &advice_stack, store, advice_map.iter().cloned()) - .expect_stack(&expected_output); -} -/// Builds the advice map from the given leaves -fn build_advice_map(leaves: I) -> Vec<([u8; 32], Vec)> -where - I: IntoIterator, -{ - leaves - .into_iter() - .map(|leaf| { - let node = leaf.node.into_bytes(); - let mapped = leaf.remaining_key.into_iter().chain(leaf.value.into_iter()).collect(); - (node, mapped) + let store = MerkleStore::from(smt); + let advice_map = smt + .upper_leaves() + .map(|(node, key, value)| { + let mut elements = key.as_elements().to_vec(); + elements.extend(&value); + (node.as_bytes(), elements) }) - .collect() -} - -/// A representation of the post-insertion state of a leaf -#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] -pub struct SmtLeaf { - /// Key - pub key: Word, - /// Remaining key for the depth - pub remaining_key: Word, - /// Generated value - pub value: Word, - /// Index in which the node was inserted - pub index: NodeIndex, - /// Computed node value - pub node: Word, -} - -impl SmtLeaf { - /// Creates a new leaf, generating a random key/value from the seed and replacing the last limb - /// of the key by `path`. - /// - /// The node value and remaining key will be defined by `depth`. - pub fn new(seed: &mut u64, path: u64, depth: u8) -> Self { - // generate a random pair - let mut key = seeded_word(seed); - let value = seeded_word(seed); + .collect::>(); - // override the limb that defines the SMT path - key[3] = Felt::new(path); - - // compute the target index, remaining key, and node value - let index = NodeIndex::new(depth, path >> (64 - depth)).unwrap(); - let remaining_key = get_smt_remaining_key(key, depth); - let depth = Felt::from(depth); - let node = Rpo256::merge_in_domain(&[remaining_key.into(), value.into()], depth).into(); - - // return the values - SmtLeaf { - key, - remaining_key, - value, - index, - node, - } - } - - /// Insert the leaf onto the [MerkleStore], returning the new root value. - pub fn insert(&self, store: &mut MerkleStore, root: Word) -> Word { - store.set_node(root.into(), self.index, self.node.into()).unwrap().root.into() - } + let advice_stack = []; + build_test!(source, &initial_stack, &advice_stack, store, advice_map.into_iter()) + .expect_stack(&expected_output); } diff --git a/test-utils/src/crypto.rs b/test-utils/src/crypto.rs index 6de063a6f1..e06c516098 100644 --- a/test-utils/src/crypto.rs +++ b/test-utils/src/crypto.rs @@ -7,7 +7,7 @@ pub use vm_core::crypto::{ hash::{Rpo256, RpoDigest}, merkle::{ EmptySubtreeRoots, MerkleError, MerklePath, MerkleStore, MerkleTree, Mmr, MmrPeaks, - NodeIndex, PartialMerkleTree, SimpleSmt, + NodeIndex, PartialMerkleTree, SimpleSmt, TieredSmt, }, }; From a105511c4816a5b8353aac66c300e5a160834f0f Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Thu, 3 Aug 2023 09:04:14 -0700 Subject: [PATCH 040/120] chore: fix clippy issues --- assembly/src/assembler/instruction/u32_ops.rs | 8 ++++---- assembly/src/tokens/stream.rs | 15 +++++++-------- processor/src/chiplets/memory/mod.rs | 11 ++--------- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/assembly/src/assembler/instruction/u32_ops.rs b/assembly/src/assembler/instruction/u32_ops.rs index e0306e7ad1..775496ca16 100644 --- a/assembly/src/assembler/instruction/u32_ops.rs +++ b/assembly/src/assembler/instruction/u32_ops.rs @@ -293,7 +293,7 @@ pub fn u32rotr( imm: Option, ) -> Result, AssemblyError> { match (imm, op_mode) { - (Some(imm), U32OpMode::Checked) if imm == 0 => { + (Some(0), U32OpMode::Checked) => { // if rotation is performed by 0, just verify that stack top is u32 span.push_ops([Pad, U32assert2, Drop]); return Ok(None); @@ -302,7 +302,7 @@ pub fn u32rotr( validate_param(imm, 1..=MAX_U32_ROTATE_VALUE)?; span.push_ops([Push(Felt::new(1 << (32 - imm))), U32assert2]); } - (Some(imm), U32OpMode::Unchecked) if imm == 0 => { + (Some(0), U32OpMode::Unchecked) => { // if rotation is performed by 0, do nothing (Noop) span.push_op(Noop); return Ok(None); @@ -470,7 +470,7 @@ fn prepare_bitwise( final_ops: [Operation; 2], ) -> Result, AssemblyError> { match (imm, op_mode) { - (Some(imm), U32OpMode::Checked) if imm == 0 => { + (Some(0), U32OpMode::Checked) => { // if shift/rotation is performed by 0, just verify that stack top is u32 span.push_ops([Pad, U32assert2, Drop]); return Ok(None); @@ -479,7 +479,7 @@ fn prepare_bitwise( validate_param(imm, 1..=MAX_VALUE)?; span.push_ops([Push(Felt::new(1 << imm)), U32assert2]); } - (Some(imm), U32OpMode::Unchecked) if imm == 0 => { + (Some(0), U32OpMode::Unchecked) => { // if shift/rotation is performed by 0, do nothing (Noop) span.push_op(Noop); return Ok(None); diff --git a/assembly/src/tokens/stream.rs b/assembly/src/tokens/stream.rs index 534fa20dbf..795b21770f 100644 --- a/assembly/src/tokens/stream.rs +++ b/assembly/src/tokens/stream.rs @@ -160,13 +160,12 @@ impl<'a> fmt::Display for TokenStream<'a> { fn build_comment(docs: &[&str]) -> Option { let last = docs.len().saturating_sub(1); - let docs: String = docs - .iter() - .enumerate() - .map(|(i, d)| { - let lb = if last == i { "" } else { "\n" }; - format!("{d}{lb}") - }) - .collect(); + let docs: String = docs.iter().enumerate().fold(String::new(), |mut res, (i, l)| { + res.push_str(l); + if i != last { + res.push('\n'); + } + res + }); (!docs.is_empty()).then_some(docs) } diff --git a/processor/src/chiplets/memory/mod.rs b/processor/src/chiplets/memory/mod.rs index a655f6a5df..41c254dfe1 100644 --- a/processor/src/chiplets/memory/mod.rs +++ b/processor/src/chiplets/memory/mod.rs @@ -133,20 +133,13 @@ impl Memory { /// returned. This effectively implies that memory is initialized to ZERO. pub fn read(&mut self, ctx: u32, addr: Felt, clk: u32) -> Word { self.num_trace_rows += 1; - self.trace - .entry(ctx) - .or_insert_with(MemorySegmentTrace::default) - .read(addr, Felt::from(clk)) + self.trace.entry(ctx).or_default().read(addr, Felt::from(clk)) } /// Writes the provided word at the specified context/address. pub fn write(&mut self, ctx: u32, addr: Felt, clk: u32, value: Word) { self.num_trace_rows += 1; - self.trace.entry(ctx).or_insert_with(MemorySegmentTrace::default).write( - addr, - Felt::from(clk), - value, - ); + self.trace.entry(ctx).or_default().write(addr, Felt::from(clk), value); } // EXECUTION TRACE GENERATION From 31ce97f69327f206a56e4563b67dd59f21792ea6 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Tue, 1 Aug 2023 21:09:45 +0300 Subject: [PATCH 041/120] feat: implement TraceInfo struct --- processor/src/chiplets/tests.rs | 2 +- processor/src/decoder/tests.rs | 4 +- processor/src/trace/mod.rs | 32 +++++++-- processor/src/trace/utils.rs | 112 ++++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+), 8 deletions(-) diff --git a/processor/src/chiplets/tests.rs b/processor/src/chiplets/tests.rs index aec54bd884..79aa5cb20e 100644 --- a/processor/src/chiplets/tests.rs +++ b/processor/src/chiplets/tests.rs @@ -117,7 +117,7 @@ fn build_trace( let program = CodeBlock::new_span(operations); process.execute_code_block(&program, &CodeBlockTable::default()).unwrap(); - let (trace, _) = ExecutionTrace::test_finalize_trace(process); + let (trace, _, _) = ExecutionTrace::test_finalize_trace(process); let trace_len = get_trace_len(&trace) - ExecutionTrace::NUM_RAND_ROWS; ( diff --git a/processor/src/decoder/tests.rs b/processor/src/decoder/tests.rs index e65d346680..b43206810e 100644 --- a/processor/src/decoder/tests.rs +++ b/processor/src/decoder/tests.rs @@ -1504,7 +1504,7 @@ fn build_trace(stack_inputs: &[u64], program: &CodeBlock) -> (DecoderTrace, AuxT Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); process.execute_code_block(program, &CodeBlockTable::default()).unwrap(); - let (trace, aux_hints) = ExecutionTrace::test_finalize_trace(process); + let (trace, aux_hints, _) = ExecutionTrace::test_finalize_trace(process); let trace_len = get_trace_len(&trace) - ExecutionTrace::NUM_RAND_ROWS; ( @@ -1540,7 +1540,7 @@ fn build_call_trace( process.execute_code_block(program, &cb_table).unwrap(); - let (trace, aux_hints) = ExecutionTrace::test_finalize_trace(process); + let (trace, aux_hints, _) = ExecutionTrace::test_finalize_trace(process); let trace_len = get_trace_len(&trace) - ExecutionTrace::NUM_RAND_ROWS; let sys_trace = trace[SYS_TRACE_RANGE] diff --git a/processor/src/trace/mod.rs b/processor/src/trace/mod.rs index a94d9dbfab..49842e1d1e 100644 --- a/processor/src/trace/mod.rs +++ b/processor/src/trace/mod.rs @@ -17,7 +17,10 @@ use winter_prover::{crypto::RandomCoin, EvaluationFrame, Trace, TraceLayout}; use vm_core::StarkField; mod utils; -pub use utils::{build_lookup_table_row_values, AuxColumnBuilder, LookupTableRow, TraceFragment}; +pub use utils::{ + build_lookup_table_row_values, AuxColumnBuilder, ChipletsLengths, LookupTableRow, + TraceFragment, TraceInfo, +}; mod decoder; @@ -47,6 +50,7 @@ pub struct AuxTraceHints { /// components. /// - Hints used during auxiliary trace segment construction. /// - Metadata needed by the STARK prover. +#[allow(dead_code)] pub struct ExecutionTrace { meta: Vec, layout: TraceLayout, @@ -54,6 +58,7 @@ pub struct ExecutionTrace { aux_trace_hints: AuxTraceHints, program_info: ProgramInfo, stack_outputs: StackOutputs, + trace_info: TraceInfo, } impl ExecutionTrace { @@ -80,7 +85,7 @@ impl ExecutionTrace { // create a new program info instance with the underlying kernel let kernel = process.kernel().clone(); let program_info = ProgramInfo::new(program_hash, kernel); - let (main_trace, aux_trace_hints) = finalize_trace(process, rng); + let (main_trace, aux_trace_hints, trace_info) = finalize_trace(process, rng); Self { meta: Vec::new(), @@ -89,6 +94,7 @@ impl ExecutionTrace { aux_trace_hints, program_info, stack_outputs, + trace_info, } } @@ -164,7 +170,7 @@ impl ExecutionTrace { } #[cfg(test)] - pub fn test_finalize_trace
      (process: Process) -> (Vec>, AuxTraceHints) + pub fn test_finalize_trace(process: Process) -> (Vec>, AuxTraceHints, TraceInfo) where A: AdviceProvider, { @@ -263,7 +269,10 @@ impl Trace for ExecutionTrace { /// - Inserting random values in the last row of all columns. This helps ensure that there /// are no repeating patterns in each column and each column contains a least two distinct /// values. This, in turn, ensures that polynomial degrees of all columns are stable. -fn finalize_trace(process: Process, mut rng: RpoRandomCoin) -> (Vec>, AuxTraceHints) +fn finalize_trace( + process: Process, + mut rng: RpoRandomCoin, +) -> (Vec>, AuxTraceHints, TraceInfo) where A: AdviceProvider, { @@ -293,6 +302,19 @@ where "trace length must be at least {MIN_TRACE_LEN}, but was {trace_len}", ); + let trace_info = TraceInfo::new( + clk as usize, + range_table_len, + ChipletsLengths::new( + chiplets.bitwise_start(), + chiplets.memory_start() - chiplets.bitwise_start(), + chiplets.kernel_rom_start() - chiplets.memory_start(), + chiplets.padding_start() - chiplets.kernel_rom_start(), + ), + max_len, + trace_len, + ); + // combine all trace segments into the main trace let system_trace = system.into_trace(trace_len, NUM_RAND_ROWS); let decoder_trace = decoder.into_trace(trace_len, NUM_RAND_ROWS); @@ -324,5 +346,5 @@ where chiplets: chiplets_trace.aux_builder, }; - (trace, aux_trace_hints) + (trace, aux_trace_hints, trace_info) } diff --git a/processor/src/trace/utils.rs b/processor/src/trace/utils.rs index 8b06a5496c..350e79a828 100644 --- a/processor/src/trace/utils.rs +++ b/processor/src/trace/utils.rs @@ -237,6 +237,118 @@ impl HintCycle for u64 { } } +// TRACE INFO +// ================================================================================================ + +/// Contains the data about lengths of the trace parts. +/// +/// - `main_trace_len` contains the length of the main trace. +/// - `range_table_len` contains the length of the range checker table. +/// - `chiplet_lenghts` contains the trace lenghts of the all chiplets (hasher, bitwise, memory, +/// kernel ROM) +/// - `max_len` contains the trace length required to hold all execution trace steps (maximum +/// length among range table length, main trace length and chiplets trace length). +/// - `padded_len` contains `max_len` padded to the next power of two. +#[allow(dead_code)] +pub struct TraceInfo { + main_trace_len: usize, + range_table_len: usize, + chiplets_lenghts: ChipletsLengths, + max_len: usize, + padded_len: usize, +} + +#[allow(dead_code)] +impl TraceInfo { + pub fn new( + main_trace_len: usize, + range_table_len: usize, + chiplets_lenghts: ChipletsLengths, + max_len: usize, + padded_len: usize, + ) -> Self { + TraceInfo { + main_trace_len, + range_table_len, + chiplets_lenghts, + max_len, + padded_len, + } + } + + /// Returns length of the main trace + pub fn main_trace_len(&self) -> usize { + self.main_trace_len + } + + /// Returns length of the range table + pub fn range_table_len(&self) -> usize { + self.range_table_len + } + + /// Returns [ChipletsLengths] which contains trace lengths of all chilplets. + pub fn chiplets_lenghts(&self) -> ChipletsLengths { + self.chiplets_lenghts + } + + /// Returns maximum trace length + pub fn max_len(&self) -> usize { + self.max_len + } + + // Returns final padded trace length + pub fn padded_len(&self) -> usize { + self.padded_len + } +} + +/// Contains trace lengths of all chilplets: hasher, bitwise, memory and kernel ROM trace +/// lenghts. +#[derive(Clone, Copy)] +pub struct ChipletsLengths { + hasher_chiplet_len: usize, + bitwise_chiplet_len: usize, + memory_chiplet_len: usize, + kernel_rom_len: usize, +} + +#[allow(dead_code)] +impl ChipletsLengths { + pub fn new( + hasher_chiplet_len: usize, + bitwise_chiplet_len: usize, + memory_chiplet_len: usize, + kernel_rom_len: usize, + ) -> Self { + ChipletsLengths { + hasher_chiplet_len, + bitwise_chiplet_len, + memory_chiplet_len, + kernel_rom_len, + } + } + + /// Returns the lenght of the hasher trace + pub fn hasher_chiplet_len(&self) -> usize { + self.hasher_chiplet_len + } + + /// Returns the lenght of the bitwise trace + pub fn bitwise_chiplet_len(&self) -> usize { + self.bitwise_chiplet_len + } + + /// Returns the lenght of the memory trace + pub fn memory_chiplet_len(&self) -> usize { + self.memory_chiplet_len + } + + /// Returns the lenght of the kernel ROM trace + pub fn kernel_rom_len(&self) -> usize { + self.kernel_rom_len + } +} + // TEST HELPERS // ================================================================================================ #[cfg(test)] From 8b671b5dd7eeebbf0999ec96cca2c8978f673f40 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Fri, 4 Aug 2023 15:01:47 +0300 Subject: [PATCH 042/120] refactor: add accessor, fix typos --- processor/src/trace/mod.rs | 27 ++++++++------- processor/src/trace/utils.rs | 64 ++++++++++++------------------------ 2 files changed, 37 insertions(+), 54 deletions(-) diff --git a/processor/src/trace/mod.rs b/processor/src/trace/mod.rs index 49842e1d1e..bde854e373 100644 --- a/processor/src/trace/mod.rs +++ b/processor/src/trace/mod.rs @@ -19,7 +19,7 @@ use vm_core::StarkField; mod utils; pub use utils::{ build_lookup_table_row_values, AuxColumnBuilder, ChipletsLengths, LookupTableRow, - TraceFragment, TraceInfo, + TraceFragment, TraceLenSummary, }; mod decoder; @@ -50,7 +50,6 @@ pub struct AuxTraceHints { /// components. /// - Hints used during auxiliary trace segment construction. /// - Metadata needed by the STARK prover. -#[allow(dead_code)] pub struct ExecutionTrace { meta: Vec, layout: TraceLayout, @@ -58,7 +57,7 @@ pub struct ExecutionTrace { aux_trace_hints: AuxTraceHints, program_info: ProgramInfo, stack_outputs: StackOutputs, - trace_info: TraceInfo, + trace_len_summary: TraceLenSummary, } impl ExecutionTrace { @@ -85,7 +84,7 @@ impl ExecutionTrace { // create a new program info instance with the underlying kernel let kernel = process.kernel().clone(); let program_info = ProgramInfo::new(program_hash, kernel); - let (main_trace, aux_trace_hints, trace_info) = finalize_trace(process, rng); + let (main_trace, aux_trace_hints, trace_len_summary) = finalize_trace(process, rng); Self { meta: Vec::new(), @@ -94,7 +93,7 @@ impl ExecutionTrace { aux_trace_hints, program_info, stack_outputs, - trace_info, + trace_len_summary, } } @@ -149,6 +148,11 @@ impl ExecutionTrace { self.main_trace.num_rows() } + /// Returns a summary of the lengths of main, range and chiplet traces. + pub fn get_len_summary(&self) -> &TraceLenSummary { + &self.trace_len_summary + } + // HELPER METHODS // -------------------------------------------------------------------------------------------- @@ -170,7 +174,9 @@ impl ExecutionTrace { } #[cfg(test)] - pub fn test_finalize_trace(process: Process) -> (Vec>, AuxTraceHints, TraceInfo) + pub fn test_finalize_trace( + process: Process, + ) -> (Vec>, AuxTraceHints, TraceLenSummary) where A: AdviceProvider, { @@ -272,7 +278,7 @@ impl Trace for ExecutionTrace { fn finalize_trace( process: Process, mut rng: RpoRandomCoin, -) -> (Vec>, AuxTraceHints, TraceInfo) +) -> (Vec>, AuxTraceHints, TraceLenSummary) where A: AdviceProvider, { @@ -302,7 +308,8 @@ where "trace length must be at least {MIN_TRACE_LEN}, but was {trace_len}", ); - let trace_info = TraceInfo::new( + // get the lengths of the traces: main, range, and chiplets + let trace_len_summary = TraceLenSummary::new( clk as usize, range_table_len, ChipletsLengths::new( @@ -311,8 +318,6 @@ where chiplets.kernel_rom_start() - chiplets.memory_start(), chiplets.padding_start() - chiplets.kernel_rom_start(), ), - max_len, - trace_len, ); // combine all trace segments into the main trace @@ -346,5 +351,5 @@ where chiplets: chiplets_trace.aux_builder, }; - (trace, aux_trace_hints, trace_info) + (trace, aux_trace_hints, trace_len_summary) } diff --git a/processor/src/trace/utils.rs b/processor/src/trace/utils.rs index 350e79a828..1cc7fd4a37 100644 --- a/processor/src/trace/utils.rs +++ b/processor/src/trace/utils.rs @@ -237,42 +237,31 @@ impl HintCycle for u64 { } } -// TRACE INFO +// TRACE LENGTH SUMMARY // ================================================================================================ /// Contains the data about lengths of the trace parts. /// /// - `main_trace_len` contains the length of the main trace. /// - `range_table_len` contains the length of the range checker table. -/// - `chiplet_lenghts` contains the trace lenghts of the all chiplets (hasher, bitwise, memory, +/// - `chiplet_lengths` contains the trace lengths of the all chiplets (hash, bitwise, memory, /// kernel ROM) -/// - `max_len` contains the trace length required to hold all execution trace steps (maximum -/// length among range table length, main trace length and chiplets trace length). -/// - `padded_len` contains `max_len` padded to the next power of two. -#[allow(dead_code)] -pub struct TraceInfo { +pub struct TraceLenSummary { main_trace_len: usize, range_table_len: usize, - chiplets_lenghts: ChipletsLengths, - max_len: usize, - padded_len: usize, + chiplets_lengths: ChipletsLengths, } -#[allow(dead_code)] -impl TraceInfo { +impl TraceLenSummary { pub fn new( main_trace_len: usize, range_table_len: usize, - chiplets_lenghts: ChipletsLengths, - max_len: usize, - padded_len: usize, + chiplets_lengths: ChipletsLengths, ) -> Self { - TraceInfo { + TraceLenSummary { main_trace_len, range_table_len, - chiplets_lenghts, - max_len, - padded_len, + chiplets_lengths, } } @@ -287,63 +276,52 @@ impl TraceInfo { } /// Returns [ChipletsLengths] which contains trace lengths of all chilplets. - pub fn chiplets_lenghts(&self) -> ChipletsLengths { - self.chiplets_lenghts - } - - /// Returns maximum trace length - pub fn max_len(&self) -> usize { - self.max_len - } - - // Returns final padded trace length - pub fn padded_len(&self) -> usize { - self.padded_len + pub fn chiplets_lengths(&self) -> ChipletsLengths { + self.chiplets_lengths } } -/// Contains trace lengths of all chilplets: hasher, bitwise, memory and kernel ROM trace -/// lenghts. +/// Contains trace lengths of all chilplets: hash, bitwise, memory and kernel ROM trace +/// lengths. #[derive(Clone, Copy)] pub struct ChipletsLengths { - hasher_chiplet_len: usize, + hash_chiplet_len: usize, bitwise_chiplet_len: usize, memory_chiplet_len: usize, kernel_rom_len: usize, } -#[allow(dead_code)] impl ChipletsLengths { pub fn new( - hasher_chiplet_len: usize, + hash_chiplet_len: usize, bitwise_chiplet_len: usize, memory_chiplet_len: usize, kernel_rom_len: usize, ) -> Self { ChipletsLengths { - hasher_chiplet_len, + hash_chiplet_len, bitwise_chiplet_len, memory_chiplet_len, kernel_rom_len, } } - /// Returns the lenght of the hasher trace - pub fn hasher_chiplet_len(&self) -> usize { - self.hasher_chiplet_len + /// Returns the length of the hash chiplet trace + pub fn hash_chiplet_len(&self) -> usize { + self.hash_chiplet_len } - /// Returns the lenght of the bitwise trace + /// Returns the length of the bitwise trace pub fn bitwise_chiplet_len(&self) -> usize { self.bitwise_chiplet_len } - /// Returns the lenght of the memory trace + /// Returns the length of the memory trace pub fn memory_chiplet_len(&self) -> usize { self.memory_chiplet_len } - /// Returns the lenght of the kernel ROM trace + /// Returns the length of the kernel ROM trace pub fn kernel_rom_len(&self) -> usize { self.kernel_rom_len } From 66bb63c629bc1d57a4d1876c02e6aad6823d7431 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Fri, 4 Aug 2023 23:27:19 +0300 Subject: [PATCH 043/120] refactor: improve names, constructor, add getters --- CHANGELOG.md | 1 + processor/src/trace/mod.rs | 14 ++------- processor/src/trace/utils.rs | 57 +++++++++++++++++++++--------------- 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f81f5833c8..8ae85e0694 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - [BREAKING] Added options to specify maximum number of cycles and expected number of cycles for a program (#998). - Improved handling of invalid/incomplete parameters in `StackOutputs` constructors (#1010). - Allowed the assembler to produce programs with "phantom" calls (#1019). +- Added `TraceLenSummary` struct which holds information about traces lengths to the `ExecutionTrace` (#1029). ## 0.6.1 (2023-06-29) diff --git a/processor/src/trace/mod.rs b/processor/src/trace/mod.rs index bde854e373..73abf11ea4 100644 --- a/processor/src/trace/mod.rs +++ b/processor/src/trace/mod.rs @@ -149,7 +149,7 @@ impl ExecutionTrace { } /// Returns a summary of the lengths of main, range and chiplet traces. - pub fn get_len_summary(&self) -> &TraceLenSummary { + pub fn trace_len_summary(&self) -> &TraceLenSummary { &self.trace_len_summary } @@ -309,16 +309,8 @@ where ); // get the lengths of the traces: main, range, and chiplets - let trace_len_summary = TraceLenSummary::new( - clk as usize, - range_table_len, - ChipletsLengths::new( - chiplets.bitwise_start(), - chiplets.memory_start() - chiplets.bitwise_start(), - chiplets.kernel_rom_start() - chiplets.memory_start(), - chiplets.padding_start() - chiplets.kernel_rom_start(), - ), - ); + let trace_len_summary = + TraceLenSummary::new(clk as usize, range_table_len, ChipletsLengths::new(&chiplets)); // combine all trace segments into the main trace let system_trace = system.into_trace(trace_len, NUM_RAND_ROWS); diff --git a/processor/src/trace/utils.rs b/processor/src/trace/utils.rs index 1cc7fd4a37..23c3d32e88 100644 --- a/processor/src/trace/utils.rs +++ b/processor/src/trace/utils.rs @@ -1,4 +1,5 @@ -use super::{ColMatrix, Felt, FieldElement, Vec}; +use super::{ColMatrix, Felt, FieldElement, Vec, NUM_RAND_ROWS}; +use crate::chiplets::Chiplets; use core::slice; use vm_core::utils::uninit_vector; @@ -243,25 +244,25 @@ impl HintCycle for u64 { /// Contains the data about lengths of the trace parts. /// /// - `main_trace_len` contains the length of the main trace. -/// - `range_table_len` contains the length of the range checker table. -/// - `chiplet_lengths` contains the trace lengths of the all chiplets (hash, bitwise, memory, +/// - `range_trace_len` contains the length of the range checker trace. +/// - `chiplets_trace_len` contains the trace lengths of the all chiplets (hash, bitwise, memory, /// kernel ROM) pub struct TraceLenSummary { main_trace_len: usize, - range_table_len: usize, - chiplets_lengths: ChipletsLengths, + range_trace_len: usize, + chiplets_trace_len: ChipletsLengths, } impl TraceLenSummary { pub fn new( main_trace_len: usize, - range_table_len: usize, - chiplets_lengths: ChipletsLengths, + range_trace_len: usize, + chiplets_trace_len: ChipletsLengths, ) -> Self { TraceLenSummary { main_trace_len, - range_table_len, - chiplets_lengths, + range_trace_len, + chiplets_trace_len, } } @@ -271,13 +272,28 @@ impl TraceLenSummary { } /// Returns length of the range table - pub fn range_table_len(&self) -> usize { - self.range_table_len + pub fn range_trace_len(&self) -> usize { + self.range_trace_len } /// Returns [ChipletsLengths] which contains trace lengths of all chilplets. - pub fn chiplets_lengths(&self) -> ChipletsLengths { - self.chiplets_lengths + pub fn chiplets_trace_len(&self) -> ChipletsLengths { + self.chiplets_trace_len + } + + /// Returns the maximum of all component lengths. + pub fn trace_len(&self) -> usize { + let chiplets_len = self.chiplets_trace_len.hash_chiplet_len() + + self.chiplets_trace_len.bitwise_chiplet_len() + + self.chiplets_trace_len.memory_chiplet_len() + + self.chiplets_trace_len.kernel_rom_len() + + 1; + self.range_trace_len.max(self.main_trace_len).max(chiplets_len) + } + + /// Returns `trace_len` rounded up to the next power of two. + pub fn padded_trace_len(&self) -> usize { + (self.trace_len() + NUM_RAND_ROWS).next_power_of_two() } } @@ -292,17 +308,12 @@ pub struct ChipletsLengths { } impl ChipletsLengths { - pub fn new( - hash_chiplet_len: usize, - bitwise_chiplet_len: usize, - memory_chiplet_len: usize, - kernel_rom_len: usize, - ) -> Self { + pub fn new(chiplets: &Chiplets) -> Self { ChipletsLengths { - hash_chiplet_len, - bitwise_chiplet_len, - memory_chiplet_len, - kernel_rom_len, + hash_chiplet_len: chiplets.bitwise_start(), + bitwise_chiplet_len: chiplets.memory_start() - chiplets.bitwise_start(), + memory_chiplet_len: chiplets.kernel_rom_start() - chiplets.memory_start(), + kernel_rom_len: chiplets.padding_start() - chiplets.kernel_rom_start(), } } From d6fae848344b9104388ca4400da91f415199b645 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Sat, 5 Aug 2023 00:54:51 +0300 Subject: [PATCH 044/120] Implement basic arithmetic on constant values (#1026) * feat: implement basic arithmetic on constant values * refactor: move to the new file, improve parsing * refactor: impl operation iterator * reafctor: improve code, add test * refactor: improve test, add div by zero check * docs: add constant expressions to docs, update changelog --- CHANGELOG.md | 1 + assembly/src/ast/parsers/constants.rs | 370 ++++++++++++++++++ assembly/src/ast/parsers/mod.rs | 22 +- assembly/src/errors.rs | 8 + assembly/src/tests.rs | 96 ++++- assembly/src/tokens/mod.rs | 8 + .../user_docs/assembly/code_organization.md | 5 +- 7 files changed, 500 insertions(+), 10 deletions(-) create mode 100644 assembly/src/ast/parsers/constants.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index f81f5833c8..5b36062347 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ #### Assembly - Added ability to attach doc comments to re-exported procedures (#994). - Added support for nested modules (#992). +- Added support for the arithmetic expressions in constant values (#1026). #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). diff --git a/assembly/src/ast/parsers/constants.rs b/assembly/src/ast/parsers/constants.rs new file mode 100644 index 0000000000..16ce7ee61e --- /dev/null +++ b/assembly/src/ast/parsers/constants.rs @@ -0,0 +1,370 @@ +use super::{Felt, LocalConstMap, ParsingError, StarkField, String, Token, Vec}; +use core::fmt::Display; + +// CONSTANT VALUE EXPRESSIONS +// ================================================================================================ + +const OPERATORS: [char; 6] = ['+', '-', '*', '/', '(', ')']; + +/// An operation used in constant expressions +#[derive(Debug, PartialEq, Clone, Copy)] +enum Operation { + Add, + Sub, + Mul, + FeltDiv, + IntDiv, + LPar, + RPar, + Value(Felt), +} + +impl Display for Operation { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + use Operation::*; + + match self { + Add => write!(f, "+"), + Sub => write!(f, "-"), + Mul => write!(f, "*"), + FeltDiv => write!(f, "/"), + IntDiv => write!(f, "//"), + LPar => write!(f, "("), + RPar => write!(f, ")"), + Value(v) => write!(f, "{}", v), + } + } +} + +/// Calculates expression in the constant value. +pub fn calculate_const_value( + op: &Token, + expression: &str, + constants: &LocalConstMap, +) -> Result { + let postfix_expression = build_postfix_expression(op, expression, constants)?; + evaluate_postfix_expression(op, expression, postfix_expression) +} + +/// Parses constant value expression and transforms it into the postfix notation +fn build_postfix_expression( + op: &Token, + expression: &str, + constants: &LocalConstMap, +) -> Result, ParsingError> { + let mut stack = Vec::new(); + let mut postfix_expression = Vec::new(); + + let mut operation_iterator = OperationIterator::new(op, expression, constants); + + while let Some(operation) = operation_iterator.next()? { + match operation { + // if we get some value push it to the postfix expression + Operation::Value(_) => postfix_expression.push(operation), + // if we get `(` push it on the stack + Operation::LPar => stack.push(Operation::LPar), + // if we get `)` push operators from the stack to the postfix expression untill we + // get `(` on stack + Operation::RPar => { + while stack.last() != Some(&Operation::LPar) { + postfix_expression.push(stack.pop().unwrap()); + } + // pop the `(` from stack + stack.pop(); + } + // if stack is empty or the last operator on stack is `(` or we got an operator + // with higher priority than stack top operator -- push obtained operator to the + // stack + _ if stack.is_empty() + || stack.last() == Some(&Operation::LPar) + || left_has_greater_precedence(&operation, stack.last().unwrap()) => + { + stack.push(operation) + } + // if the obtained operator has priority equal or lower than stack top operator + // push the operators from the stack to the postfix expression until stack is empty + // or we get from the stack an operation with lower priority + _ => { + postfix_expression.push(stack.pop().unwrap()); + while stack.last().is_some() + && !left_has_greater_precedence(&operation, stack.last().unwrap()) + { + postfix_expression.push(stack.pop().unwrap()); + } + stack.push(operation); + } + } + } + + // push remaining on the stack operators to the postfix expression + while let Some(element) = stack.pop() { + postfix_expression.push(element); + } + + Ok(postfix_expression) +} + +/// Evaluates constant expression represented in postfix notation +fn evaluate_postfix_expression( + op: &Token, + expression: &str, + postfix_expression: Vec, +) -> Result { + let mut stack = Vec::new(); + + for operation in postfix_expression.iter() { + match operation { + // if the operation is a value + Operation::Value(value) => stack.push(*value), + // if the operation is an operator + _ => { + let right = stack.pop().expect("stack is empty"); + let left = stack.pop().expect("stack is empty"); + stack.push(compute_statement(op, left, right, operation)?); + } + } + } + + // get the result from the stack + stack.pop().ok_or_else(|| { + ParsingError::invalid_const_value( + op, + expression, + &format!("constant expression {} is incorrect", op), + ) + }) +} + +// HELPER FUNCTIONS +// ================================================================================================ + +/// Used to iterate over operations in `expressions` string. +/// +/// `original_expression` stay unchanged during `next` method. It is used to obtain original +/// expression for ParsingError. +struct OperationIterator<'a> { + op: &'a Token<'a>, + original_expression: &'a str, + expression: &'a str, + constants: &'a LocalConstMap, +} + +impl<'a> OperationIterator<'a> { + /// Returns a new instance of the [OperationIterator]. + pub fn new(op: &'a Token<'a>, expression: &'a str, constants: &'a LocalConstMap) -> Self { + OperationIterator { + op, + original_expression: expression, + expression, + constants, + } + } + + /// Parses and returns next [Operation] in the expression string. + pub fn next(&mut self) -> Result, ParsingError> { + let mut parsed_value = String::new(); + let mut char_iter = self.expression.chars(); + match char_iter.next() { + Some('+') => { + self.expression = &self.expression[1..]; + Ok(Some(Operation::Add)) + } + Some('-') => { + self.expression = &self.expression[1..]; + Ok(Some(Operation::Sub)) + } + Some('(') => { + self.expression = &self.expression[1..]; + Ok(Some(Operation::LPar)) + } + Some(')') => { + self.expression = &self.expression[1..]; + Ok(Some(Operation::RPar)) + } + Some('*') => { + self.expression = &self.expression[1..]; + Ok(Some(Operation::Mul)) + } + Some('/') => match char_iter.next() { + Some('/') => { + self.expression = &self.expression[2..]; + Ok(Some(Operation::IntDiv)) + } + _ => { + self.expression = &self.expression[1..]; + Ok(Some(Operation::FeltDiv)) + } + }, + Some(value) => { + parsed_value.push(value); + let mut next_char = char_iter.next(); + self.expression = &self.expression[1..]; + while next_char.is_some() && !OPERATORS.contains(&next_char.unwrap()) { + parsed_value.push(next_char.unwrap()); + next_char = char_iter.next(); + self.expression = &self.expression[1..]; + } + Ok(Some(parse_operand( + self.op, + self.original_expression, + self.constants, + parsed_value, + )?)) + } + None => Ok(None), + } + } +} + +/// Returns the number in `value` or the constant value if the value is the name of the constant. +fn parse_operand( + op: &Token, + expression: &str, + constants: &LocalConstMap, + value: String, +) -> Result { + let parsed_number = value.parse::(); + // if the parsed value is a number push it on the stack + if let Ok(parsed_number) = parsed_number { + Ok(Operation::Value(Felt::new(parsed_number))) + } + // if it is a name of the constant get its value from the `constants` map + else { + let parsed_number = constants.get(&value).ok_or_else(|| { + ParsingError::invalid_const_value( + op, + expression, + &format!("constant with name {} was not initialized", value), + ) + })?; + Ok(Operation::Value(Felt::new(*parsed_number))) + } +} + +/// Returns `true` if th left operator has higher priority than the right, `false` otherwise. +fn left_has_greater_precedence(left: &Operation, right: &Operation) -> bool { + use Operation::*; + + let left_level = match left { + Mul | FeltDiv | IntDiv => 2, + Add | Sub => 1, + _ => 0, + }; + let right_level = match right { + Mul | FeltDiv | IntDiv => 2, + Add | Sub => 1, + _ => 0, + }; + left_level > right_level +} + +/// Computes the expression based on provided `operator` character. +fn compute_statement( + op: &Token, + left: Felt, + right: Felt, + operator: &Operation, +) -> Result { + use Operation::*; + match operator { + Add => Ok(left + right), + Sub => Ok(left - right), + Mul => Ok(left * right), + IntDiv => { + if right.as_int() == 0 { + return Err(ParsingError::const_division_by_zero(op)); + } + Ok(Felt::new(left.as_int() / right.as_int())) + } + FeltDiv => { + if right.as_int() == 0 { + return Err(ParsingError::const_division_by_zero(op)); + } + Ok(left / right) + } + _ => unreachable!(), + } +} + +// TESTS +// ================================================================================================ +#[cfg(test)] +mod tests { + use super::{Felt, LocalConstMap, Token}; + use crate::ast::parsers::constants::{ + build_postfix_expression, evaluate_postfix_expression, Operation, + }; + use Operation::*; + + #[test] + fn test_build_postfix_expression() { + let constants = LocalConstMap::from([("A".to_string(), 3), ("B".to_string(), 10)]); + + let expression = "51-A+22"; + let result = build_postfix_expression(&Token::new_dummy(), expression, &constants).unwrap(); + let expected = + vec![Value(Felt::new(51)), Value(Felt::new(3)), Sub, Value(Felt::new(22)), Add]; + assert_eq!(result, expected); + + let expression = "12*3+(2*B-(A/3+1))-2*3"; + let result = build_postfix_expression(&Token::new_dummy(), expression, &constants).unwrap(); + let expected = vec![ + Value(Felt::new(12)), + Value(Felt::new(3)), + Mul, + Value(Felt::new(2)), + Value(Felt::new(10)), + Mul, + Value(Felt::new(3)), + Value(Felt::new(3)), + FeltDiv, + Value(Felt::new(1)), + Add, + Sub, + Add, + Value(Felt::new(2)), + Value(Felt::new(3)), + Mul, + Sub, + ]; + assert_eq!(result, expected); + } + + #[test] + fn test_evaluate_postfix_expression() { + let expression = "51-A+22"; + let postfix_expression = + vec![Value(Felt::new(51)), Value(Felt::new(3)), Sub, Value(Felt::new(22)), Add]; + let result = + evaluate_postfix_expression(&Token::new_dummy(), expression, postfix_expression) + .unwrap(); + let expected = Felt::new(70); + assert_eq!(result, expected); + + let expression = "12*3+(2*B-(A/3+1))-2*3"; + let postfix_expression = vec![ + Value(Felt::new(12)), + Value(Felt::new(3)), + Mul, + Value(Felt::new(2)), + Value(Felt::new(10)), + Mul, + Value(Felt::new(3)), + Value(Felt::new(3)), + FeltDiv, + Value(Felt::new(1)), + Add, + Sub, + Add, + Value(Felt::new(2)), + Value(Felt::new(3)), + Mul, + Sub, + ]; + let result = + evaluate_postfix_expression(&Token::new_dummy(), expression, postfix_expression) + .unwrap(); + let expected = Felt::new(48); + assert_eq!(result, expected); + } +} diff --git a/assembly/src/ast/parsers/mod.rs b/assembly/src/ast/parsers/mod.rs index cd1d80bdcc..884e57a3b4 100644 --- a/assembly/src/ast/parsers/mod.rs +++ b/assembly/src/ast/parsers/mod.rs @@ -13,6 +13,9 @@ pub mod io_ops; pub mod stack_ops; pub mod u32_ops; +pub mod constants; +pub use constants::calculate_const_value; + mod context; pub use context::ParserContext; @@ -34,7 +37,7 @@ pub fn parse_constants(tokens: &mut TokenStream) -> Result { - let (name, value) = parse_constant(token)?; + let (name, value) = parse_constant(token, &constants)?; if constants.contains_key(&name) { return Err(ParsingError::duplicate_const_name(token, &name)); @@ -51,7 +54,7 @@ pub fn parse_constants(tokens: &mut TokenStream) -> Result Result<(String, u64), ParsingError> { +fn parse_constant(token: &Token, constants: &LocalConstMap) -> Result<(String, u64), ParsingError> { match token.num_parts() { 0 => unreachable!(), 1 => Err(ParsingError::missing_param(token)), @@ -64,7 +67,7 @@ fn parse_constant(token: &Token) -> Result<(String, u64), ParsingError> { let name = CONSTANT_LABEL_PARSER .parse_label(const_declaration[0]) .map_err(|err| ParsingError::invalid_const_name(token, err))?; - let value = parse_const_value(token, const_declaration[1])?; + let value = parse_const_value(token, const_declaration[1], constants)?; Ok((name.to_string(), value)) } _ => Err(ParsingError::extra_param(token)), @@ -78,10 +81,15 @@ fn parse_constant(token: &Token) -> Result<(String, u64), ParsingError> { // ================================================================================================ /// Parses a constant value and ensures it falls within bounds specified by the caller -fn parse_const_value(op: &Token, const_value: &str) -> Result { - let result = const_value - .parse::() - .map_err(|err| ParsingError::invalid_const_value(op, const_value, &err.to_string()))?; +fn parse_const_value( + op: &Token, + const_value: &str, + constants: &LocalConstMap, +) -> Result { + let result = match const_value.parse::() { + Ok(value) => value, + Err(_) => calculate_const_value(op, const_value, constants)?.as_int(), + }; let range = 0..Felt::MODULUS; range.contains(&result).then_some(result).ok_or_else(|| ParsingError::invalid_const_value(op, const_value, format!( diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 9f307f56a9..7d307667e3 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -252,6 +252,14 @@ impl ParsingError { } } + pub fn const_division_by_zero(token: &Token) -> Self { + ParsingError { + message: format!("constant expression {token} contains division by zero"), + location: *token.location(), + op: token.to_string(), + } + } + // INVALID / MALFORMED INSTRUCTIONS // -------------------------------------------------------------------------------------------- diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 2b571f33f3..197db63b7b 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -194,6 +194,100 @@ fn multiple_constants_push() { assert_eq!(expected, format!("{program}")); } +#[test] +fn constant_numeric_expression() { + let assembler = super::Assembler::default(); + let source = "const.TEST_CONSTANT=11-2+4*(12-(10+1))+9+8//4*2 \ + begin \ + push.TEST_CONSTANT \ + end \ + "; + let expected = "\ + begin \ + span \ + push(26) \ + end \ + end"; + let program = assembler.compile(source).unwrap(); + assert_eq!(expected, format!("{program}")); +} + +#[test] +fn constant_alphanumeric_expression() { + let assembler = super::Assembler::default(); + let source = "const.TEST_CONSTANT_1=(18-1+10)*6-((13+7)*2) \ + const.TEST_CONSTANT_2=11-2+4*(12-(10+1))+9 + const.TEST_CONSTANT_3=(TEST_CONSTANT_1-(TEST_CONSTANT_2+10))//5+3 + begin \ + push.TEST_CONSTANT_3 \ + end \ + "; + let expected = "\ + begin \ + span \ + push(21) \ + end \ + end"; + let program = assembler.compile(source).unwrap(); + assert_eq!(expected, format!("{program}")); +} + +#[test] +fn constant_field_division() { + let assembler = super::Assembler::default(); + let source = "const.TEST_CONSTANT=(17//4)/4*(1//2)+2 \ + begin \ + push.TEST_CONSTANT \ + end \ + "; + let expected = "\ + begin \ + span \ + push(2) \ + end \ + end"; + let program = assembler.compile(source).unwrap(); + assert_eq!(expected, format!("{program}")); +} + +#[test] +fn constant_err_const_not_initialized() { + let assembler = super::Assembler::default(); + let source = "const.TEST_CONSTANT=5+A \ + begin \ + push.TEST_CONSTANT \ + end"; + let result = assembler.compile(source); + assert!(result.is_err()); + let err = result.err().unwrap(); + let expected_error = "malformed constant `const.TEST_CONSTANT=5+A` - invalid value: `5+A` - reason: constant with name A was not initialized"; + assert_eq!(expected_error, err.to_string()); +} + +#[test] +fn constant_err_div_by_zero() { + let assembler = super::Assembler::default(); + let source = "const.TEST_CONSTANT=5/0 \ + begin \ + push.TEST_CONSTANT \ + end"; + let result = assembler.compile(source); + assert!(result.is_err()); + let err = result.err().unwrap(); + let expected_error = "constant expression const.TEST_CONSTANT=5/0 contains division by zero"; + assert_eq!(expected_error, err.to_string()); + + let source = "const.TEST_CONSTANT=5//0 \ + begin \ + push.TEST_CONSTANT \ + end"; + let result = assembler.compile(source); + assert!(result.is_err()); + let err = result.err().unwrap(); + let expected_error = "constant expression const.TEST_CONSTANT=5//0 contains division by zero"; + assert_eq!(expected_error, err.to_string()); +} + #[test] fn constants_must_be_uppercase() { let assembler = super::Assembler::default(); @@ -234,7 +328,7 @@ fn constant_must_be_valid_felt() { assert!(result.is_err()); let err = result.err().unwrap(); let expected_error = "malformed constant `const.CONSTANT=1122INVALID` - invalid value: \ - `1122INVALID` - reason: invalid digit found in string"; + `1122INVALID` - reason: constant with name 1122INVALID was not initialized"; assert_eq!(expected_error, err.to_string()); } diff --git a/assembly/src/tokens/mod.rs b/assembly/src/tokens/mod.rs index 4b1f858591..f0a96e58e8 100644 --- a/assembly/src/tokens/mod.rs +++ b/assembly/src/tokens/mod.rs @@ -70,6 +70,14 @@ impl<'a> Token<'a> { } } + /// Returns a new token intended for use in tests + pub fn new_dummy() -> Self { + Self { + parts: vec!["dummy_token"], + location: SourceLocation::new(0, 0), + } + } + // PUBLIC ACCESSORS // -------------------------------------------------------------------------------------------- diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index 089540ee58..abb0b3b9cb 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -109,13 +109,14 @@ In addition to the locally-defined procedure `foo`, the above module also export ### Constants Miden assembly supports constant declarations. These constants are scoped to the module they are defined in and can be used as immediate parameters for Miden assembly instructions. Constants are supported as immediate values for the following instructions: `push`, `locaddr`, `loc_load`, `loc_loadw`, `loc_store`, `loc_storew`, `mem_load`, `mem_loadw`, `mem_store`, `mem_storew`. -Constants must be declared right after module imports and before any procedures or program bodies. A constant's name must start with an upper-case letter and can contain any combination of numbers, upper-case ASCII letters, and underscores (`_`). The number of characters in a constant name cannot exceed 100. +Constants must be declared right after module imports and before any procedures or program bodies. A constant's name must start with an upper-case letter and can contain any combination of numbers, upper-case ASCII letters, and underscores (`_`). The number of characters in a constant name cannot exceed 100. +A constant's value must be in the range between $0$ and $2^{64} - 2^{32}$ (both inclusive) and can be defined by an arithmetic expression using `+`, `-`, `*`, `/`, `//`, `(`, `)` operators and references to the previously defined constants. Here `/` is a field division and `//` is an integer division. Note that the arithmetic expression cannot contain spaces. ``` use.std::math::u64 const.CONSTANT_1=100 -const.CONSTANT_2=200 +const.CONSTANT_2=200+(CONSTANT_1-50) const.ADDR_1=3 begin From 1bd70f4595dc4aa0786a3a7bab760ec747e530b7 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Sat, 5 Aug 2023 01:03:22 +0300 Subject: [PATCH 045/120] docs: add paragraph for constant value --- docs/src/user_docs/assembly/code_organization.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index abb0b3b9cb..65ee845bc5 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -110,6 +110,7 @@ In addition to the locally-defined procedure `foo`, the above module also export Miden assembly supports constant declarations. These constants are scoped to the module they are defined in and can be used as immediate parameters for Miden assembly instructions. Constants are supported as immediate values for the following instructions: `push`, `locaddr`, `loc_load`, `loc_loadw`, `loc_store`, `loc_storew`, `mem_load`, `mem_loadw`, `mem_store`, `mem_storew`. Constants must be declared right after module imports and before any procedures or program bodies. A constant's name must start with an upper-case letter and can contain any combination of numbers, upper-case ASCII letters, and underscores (`_`). The number of characters in a constant name cannot exceed 100. + A constant's value must be in the range between $0$ and $2^{64} - 2^{32}$ (both inclusive) and can be defined by an arithmetic expression using `+`, `-`, `*`, `/`, `//`, `(`, `)` operators and references to the previously defined constants. Here `/` is a field division and `//` is an integer division. Note that the arithmetic expression cannot contain spaces. ``` From d631be415b99401d88ef8960d23fb1f28c691020 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Sat, 5 Aug 2023 01:01:12 +0300 Subject: [PATCH 046/120] refacor: add trace_len() for chiplets --- processor/src/trace/utils.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/processor/src/trace/utils.rs b/processor/src/trace/utils.rs index 23c3d32e88..1673d95e43 100644 --- a/processor/src/trace/utils.rs +++ b/processor/src/trace/utils.rs @@ -283,12 +283,9 @@ impl TraceLenSummary { /// Returns the maximum of all component lengths. pub fn trace_len(&self) -> usize { - let chiplets_len = self.chiplets_trace_len.hash_chiplet_len() - + self.chiplets_trace_len.bitwise_chiplet_len() - + self.chiplets_trace_len.memory_chiplet_len() - + self.chiplets_trace_len.kernel_rom_len() - + 1; - self.range_trace_len.max(self.main_trace_len).max(chiplets_len) + self.range_trace_len + .max(self.main_trace_len) + .max(self.chiplets_trace_len.trace_len()) } /// Returns `trace_len` rounded up to the next power of two. @@ -336,6 +333,17 @@ impl ChipletsLengths { pub fn kernel_rom_len(&self) -> usize { self.kernel_rom_len } + + /// Returns the length of the trace required to accommodate chiplet components and 1 + /// mandatory padding row required for ensuring sufficient trace length for auxiliary connector + /// columns that rely on the memory chiplet. + pub fn trace_len(&self) -> usize { + self.hash_chiplet_len() + + self.bitwise_chiplet_len() + + self.memory_chiplet_len() + + self.kernel_rom_len() + + 1 + } } // TEST HELPERS From 32598b8d1bf97d17f3ec442b6b92e71a627d1199 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 22 May 2023 02:20:33 -0700 Subject: [PATCH 047/120] feat: add smtinsert advice injector --- core/src/operations/decorators/advice.rs | 4 + processor/src/decorators/mod.rs | 1 + processor/src/decorators/tests.rs | 120 +++++++++++++++++++---- 3 files changed, 108 insertions(+), 17 deletions(-) diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index d583c22f57..c939cdbc80 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -181,6 +181,9 @@ pub enum AdviceInjector { /// Where KEY is computed as hash(A || B, domain), where domain is provided via the immediate /// value. HdwordToMap { domain: Felt }, + + /// TODO: add docs + SmtInsert, } impl fmt::Display for AdviceInjector { @@ -202,6 +205,7 @@ impl fmt::Display for AdviceInjector { Self::Ext2Inv => write!(f, "ext2_inv"), Self::Ext2Intt => write!(f, "ext2_intt"), Self::SmtGet => write!(f, "smt_get"), + Self::SmtInsert => write!(f, "smt_insert"), Self::MemToMap => write!(f, "mem_to_map"), Self::HdwordToMap { domain } => write!(f, "hdword_to_map.{domain}"), } diff --git a/processor/src/decorators/mod.rs b/processor/src/decorators/mod.rs index 27b92166fa..25c7a28580 100644 --- a/processor/src/decorators/mod.rs +++ b/processor/src/decorators/mod.rs @@ -45,6 +45,7 @@ where AdviceInjector::Ext2Inv => self.push_ext2_inv_result(), AdviceInjector::Ext2Intt => self.push_ext2_intt_result(), AdviceInjector::SmtGet => self.push_smtget_inputs(), + AdviceInjector::SmtInsert => todo!(), AdviceInjector::MemToMap => self.insert_mem_values_into_adv_map(), AdviceInjector::HdwordToMap { domain } => self.insert_hdword_into_adv_map(*domain), } diff --git a/processor/src/decorators/tests.rs b/processor/src/decorators/tests.rs index 17aee7542c..4b9848f1b1 100644 --- a/processor/src/decorators/tests.rs +++ b/processor/src/decorators/tests.rs @@ -7,7 +7,7 @@ use test_utils::{crypto::get_smt_remaining_key, rand::seeded_word}; use vm_core::{ crypto::{ hash::{Rpo256, RpoDigest}, - merkle::{EmptySubtreeRoots, MerkleStore, MerkleTree, NodeIndex}, + merkle::{EmptySubtreeRoots, MerkleStore, MerkleTree, NodeIndex, TieredSmt}, }, utils::IntoBytes, AdviceInjector, Decorator, ONE, ZERO, @@ -60,6 +60,9 @@ fn push_merkle_node() { assert_eq!(expected_stack, process.stack.trace_state()); } +// SMTGET TESTS +// ================================================================================================ + #[test] fn push_smtget() { // setup the test @@ -144,8 +147,62 @@ fn push_smtget() { } } +// SMTINSERT TESTS +// ================================================================================================ + +#[test] +fn inject_smtinsert() { + let mut smt = TieredSmt::default(); + + // --- insert into empty tree --------------------------------------------- + + let raw_a = 0b_01101001_01101100_00011111_11111111_10010110_10010011_11100000_00000000_u64; + let key_a = build_key(raw_a); + let val_a = [ONE, ZERO, ZERO, ZERO]; + + // insertion should happen at depth 16 and thus 16_or_32 and 16_or_48 flags should be set to ONE; + // since we are replacing a node which is an empty subtree, the is_empty flag should also be ONE + let expected_stack = [ONE, ONE, ONE]; + let process = prepare_smt_insert(key_a, val_a, &smt, expected_stack.len()); + assert_eq!(build_expected(&expected_stack), process.stack.trace_state()); + + // --- update same key with different value ------------------------------- + + let val_b = [ONE, ONE, ZERO, ZERO]; + smt.insert(key_a.into(), val_b); + + // we are updating a node at depth 16 and thus 16_or_32 and 16_or_48 flags should be set to ONE; + // since we are updating an existing leaf, the is_empty flag should be set to ZERO + let expected_stack = [ZERO, ONE, ONE]; + let process = prepare_smt_insert(key_a, val_b, &smt, expected_stack.len()); + assert_eq!(build_expected(&expected_stack), process.stack.trace_state()); +} + +fn prepare_smt_insert( + key: Word, + value: Word, + smt: &TieredSmt, + adv_stack_depth: usize, +) -> Process { + let root: Word = smt.root().into(); + let store = MerkleStore::from(smt); + + let stack_inputs = build_stack_inputs(value, key, root); + let advice_inputs = AdviceInputs::default().with_merkle_store(store); + let mut process = build_process(stack_inputs, advice_inputs); + + process.execute_op(Operation::Noop).unwrap(); + process + .execute_decorator(&Decorator::Advice(AdviceInjector::SmtInsert)) + .unwrap(); + + move_adv_to_stack(&mut process, adv_stack_depth); + + process +} + // HELPER FUNCTIONS -// -------------------------------------------------------------------------------------------- +// ================================================================================================ fn init_leaf(value: u64) -> Word { [Felt::new(value), Felt::ZERO, Felt::ZERO, Felt::ZERO] @@ -169,17 +226,7 @@ fn assert_case_smtget( expected_stack: &[Felt], ) { // build the process - let stack_inputs = StackInputs::try_from_values([ - root[0].as_int(), - root[1].as_int(), - root[2].as_int(), - root[3].as_int(), - key[0].as_int(), - key[1].as_int(), - key[2].as_int(), - key[3].as_int(), - ]) - .unwrap(); + let stack_inputs = build_stack_inputs(key, root, Word::default()); let remaining = get_smt_remaining_key(key, depth); let mapped = remaining.into_iter().chain(value.into_iter()).collect(); let advice_inputs = AdviceInputs::default() @@ -192,13 +239,52 @@ fn assert_case_smtget( // call the injector and clear the stack process.execute_op(Operation::Noop).unwrap(); process.execute_decorator(&Decorator::Advice(AdviceInjector::SmtGet)).unwrap(); - for _ in 0..8 { + + // replace operand stack contents with the data on the advice stack + move_adv_to_stack(&mut process, expected_stack.len()); + + assert_eq!(build_expected(expected_stack), process.stack.trace_state()); +} + +fn build_process( + stack_inputs: StackInputs, + adv_inputs: AdviceInputs, +) -> Process { + let advice_provider = MemAdviceProvider::from(adv_inputs); + Process::new(Kernel::default(), stack_inputs, advice_provider) +} + +fn build_stack_inputs(w0: Word, w1: Word, w2: Word) -> StackInputs { + StackInputs::try_from_values([ + w2[0].as_int(), + w2[1].as_int(), + w2[2].as_int(), + w2[3].as_int(), + w1[0].as_int(), + w1[1].as_int(), + w1[2].as_int(), + w1[3].as_int(), + w0[0].as_int(), + w0[1].as_int(), + w0[2].as_int(), + w0[3].as_int(), + ]) + .unwrap() +} + +fn build_key(prefix: u64) -> Word { + [ONE, ONE, ONE, Felt::new(prefix)] +} + +/// Removes all items from the operand stack and pushes the specified number of values from +/// the advice tack onto it. +fn move_adv_to_stack(process: &mut Process, adv_stack_depth: usize) { + let stack_depth = process.stack.depth(); + for _ in 0..stack_depth { process.execute_op(Operation::Drop).unwrap(); } - // expect the stack output - for _ in 0..expected_stack.len() { + for _ in 0..adv_stack_depth { process.execute_op(Operation::AdvPop).unwrap(); } - assert_eq!(build_expected(expected_stack), process.stack.trace_state()); } From eb083f8b77415f5bd0c0c1ea86b84af9ac0ae8fd Mon Sep 17 00:00:00 2001 From: grjte Date: Thu, 27 Jul 2023 17:07:28 -0400 Subject: [PATCH 048/120] feat(air): migrate range checker bus to LogUp --- air/src/constraints/chiplets/memory/mod.rs | 29 --- air/src/constraints/chiplets/mod.rs | 1 - air/src/constraints/mod.rs | 103 +++++++++++ air/src/constraints/range.rs | 203 +++++++++------------ air/src/constraints/stack/op_flags/mod.rs | 2 +- air/src/trace/decoder/mod.rs | 5 + air/src/trace/mod.rs | 6 +- air/src/trace/range.rs | 14 +- 8 files changed, 199 insertions(+), 164 deletions(-) diff --git a/air/src/constraints/chiplets/memory/mod.rs b/air/src/constraints/chiplets/memory/mod.rs index 94643a3a9c..e0120aa758 100644 --- a/air/src/constraints/chiplets/memory/mod.rs +++ b/air/src/constraints/chiplets/memory/mod.rs @@ -355,32 +355,3 @@ impl EvaluationFrameExt for &EvaluationFrame { self.selector_next(1) } } - -// EXTERNAL ACCESSORS -// ================================================================================================ -/// Trait to allow other processors to easily access the memory column values they need for -/// constraint calculations. -pub trait MemoryFrameExt { - // --- Column accessors ----------------------------------------------------------------------- - - /// The value of the lower 16-bits of the delta value being tracked between two consecutive - /// context IDs, addresses, or clock cycles in the current row. - fn memory_d0(&self) -> E; - /// The value of the upper 16-bits of the delta value being tracked between two consecutive - /// context IDs, addresses, or clock cycles in the current row. - fn memory_d1(&self) -> E; -} - -impl MemoryFrameExt for &EvaluationFrame { - // --- Column accessors ----------------------------------------------------------------------- - - #[inline(always)] - fn memory_d0(&self) -> E { - self.current()[MEMORY_D0_COL_IDX] - } - - #[inline(always)] - fn memory_d1(&self) -> E { - self.current()[MEMORY_D1_COL_IDX] - } -} diff --git a/air/src/constraints/chiplets/mod.rs b/air/src/constraints/chiplets/mod.rs index 7c960148ad..9810f91cec 100644 --- a/air/src/constraints/chiplets/mod.rs +++ b/air/src/constraints/chiplets/mod.rs @@ -6,7 +6,6 @@ use crate::utils::{are_equal, binary_not, is_binary}; mod bitwise; mod hasher; mod memory; -pub use memory::MemoryFrameExt; // CONSTANTS // ================================================================================================ diff --git a/air/src/constraints/mod.rs b/air/src/constraints/mod.rs index 5d55b79a6c..0b4330ca0e 100644 --- a/air/src/constraints/mod.rs +++ b/air/src/constraints/mod.rs @@ -1,3 +1,106 @@ +use super::{EvaluationFrame, ExtensionOf, Felt, FieldElement}; +use crate::trace::{ + chiplets::{MEMORY_D0_COL_IDX, MEMORY_D1_COL_IDX}, + decoder::{DECODER_OP_BITS_OFFSET, DECODER_USER_OP_HELPERS_OFFSET}, +}; +use crate::utils::binary_not; + pub mod chiplets; pub mod range; pub mod stack; + +// ACCESSORS +// ================================================================================================ +/// Trait to allow other processors to easily access the column values they need for constraint +/// calculations. +pub trait MainFrameExt +where + F: FieldElement, + E: FieldElement + ExtensionOf, +{ + /// Returns true when a u32 stack operation that requires range checks is being performed. + fn u32_rc_op(&self) -> F; + + // --- Range check lookup accessors ----------------------------------------------------------------------- + + /// The value required for the first memory lookup when the memory chiplet requests range + /// checks. The value returned is the denominator used for including the value into the LogUp + /// lookup: (alpha - d0). The value d0 which is being range-checked is the lower 16-bits of the + /// delta value being tracked between two consecutive context IDs, addresses, or clock cycles in + /// the current row. + fn lookup_mv0(&self, alpha: E) -> E; + /// The value required for the second memory lookup when the memory chiplet requests range + /// checks. The value returned is the denominator used for including the value into the LogUp + /// lookup: (alpha - d1). The value d1 which is being range-checked is the upper 16-bits of the + /// delta value being tracked between two consecutive context IDs, addresses, or clock cycles in + /// the current row. + fn lookup_mv1(&self, alpha: E) -> E; + /// The value required for the first stack lookup when the stack requests range checks. The + /// value returned is the denominator used for including the value into the LogUp lookup: + /// (alpha - h0). The value h0 which is being range checked by the stack operation is stored in + /// the helper columns of the decoder section of the trace. + fn lookup_sv0(&self, alpha: E) -> E; + /// The value required for the second stack lookup when the stack requests range checks. The + /// value returned is the denominator used for including the value into the LogUp lookup: + /// (alpha - h1). The value h1 which is being range checked by the stack operation is stored in + /// the helper columns of the decoder section of the trace. + fn lookup_sv1(&self, alpha: E) -> E; + /// The value required for the third stack lookup when the stack requests range checks. The + /// value returned is the denominator used for including the value into the LogUp lookup: + /// (alpha - h2). The value h2 which is being range checked by the stack operation is stored in + /// the helper columns of the decoder section of the trace. + fn lookup_sv2(&self, alpha: E) -> E; + /// The value required for the fourth stack lookup when the stack requests range checks. The + /// value returned is the denominator used for including the value into the LogUp lookup: + /// (alpha - h3). The value h3 which is being range checked by the stack operation is stored in + /// the helper columns of the decoder section of the trace. + fn lookup_sv3(&self, alpha: E) -> E; +} + +impl MainFrameExt for EvaluationFrame +where + F: FieldElement, + E: FieldElement + ExtensionOf, +{ + /// Returns true when the stack operation is a u32 operation that requires range checks. + /// TODO: this is also defined in the op flags. It's redefined here to avoid computing all of + /// the op flags when this is the only one needed, but ideally this should only be defined once. + #[inline(always)] + fn u32_rc_op(&self) -> F { + let not_4 = binary_not(self.current()[DECODER_OP_BITS_OFFSET + 4]); + let not_5 = binary_not(self.current()[DECODER_OP_BITS_OFFSET + 5]); + self.current()[DECODER_OP_BITS_OFFSET + 6].mul(not_5).mul(not_4) + } + + // --- Intermediate values for LogUp lookups -------------------------------------------------- + + #[inline(always)] + fn lookup_mv0(&self, alpha: E) -> E { + alpha - self.current()[MEMORY_D0_COL_IDX].into() + } + + #[inline(always)] + fn lookup_mv1(&self, alpha: E) -> E { + alpha - self.current()[MEMORY_D1_COL_IDX].into() + } + + #[inline(always)] + fn lookup_sv0(&self, alpha: E) -> E { + alpha - self.current()[DECODER_USER_OP_HELPERS_OFFSET].into() + } + + #[inline(always)] + fn lookup_sv1(&self, alpha: E) -> E { + alpha - self.current()[DECODER_USER_OP_HELPERS_OFFSET + 1].into() + } + + #[inline(always)] + fn lookup_sv2(&self, alpha: E) -> E { + alpha - self.current()[DECODER_USER_OP_HELPERS_OFFSET + 2].into() + } + + #[inline(always)] + fn lookup_sv3(&self, alpha: E) -> E { + alpha - self.current()[DECODER_USER_OP_HELPERS_OFFSET + 3].into() + } +} diff --git a/air/src/constraints/range.rs b/air/src/constraints/range.rs index 6d28b07317..c0ba0c6bf1 100644 --- a/air/src/constraints/range.rs +++ b/air/src/constraints/range.rs @@ -1,7 +1,8 @@ use crate::{ - chiplets::{ChipletsFrameExt, MemoryFrameExt}, - trace::range::{B_RANGE_COL_IDX, Q_COL_IDX, S0_COL_IDX, S1_COL_IDX, V_COL_IDX}, - utils::{are_equal, binary_not, is_binary}, + chiplets::ChipletsFrameExt, + constraints::MainFrameExt, + trace::range::{B_RANGE_COL_IDX, M_COL_IDX, V_COL_IDX}, + utils::are_equal, Assertion, EvaluationFrame, Felt, FieldElement, TransitionConstraintDegree, }; use vm_core::{utils::collections::Vec, ExtensionOf}; @@ -15,11 +16,10 @@ use winter_air::AuxTraceRandElements; /// The number of boundary constraints required by the Range Checker pub const NUM_ASSERTIONS: usize = 2; /// The number of transition constraints required by the Range Checker. -pub const NUM_CONSTRAINTS: usize = 3; +pub const NUM_CONSTRAINTS: usize = 1; /// The degrees of the range checker's constraints, in the order they'll be added to the the result /// array when a transition is evaluated. pub const CONSTRAINT_DEGREES: [usize; NUM_CONSTRAINTS] = [ - 2, 2, // Selector flags must be binary: s0, s1. 9, // Enforce values of column v transition. ]; @@ -30,7 +30,7 @@ pub const NUM_AUX_ASSERTIONS: usize = 2; /// The number of transition constraints required by multiset checks for the Range Checker. pub const NUM_AUX_CONSTRAINTS: usize = 1; /// The degrees of the Range Checker's auxiliary column constraints, used for multiset checks. -pub const AUX_CONSTRAINT_DEGREES: [usize; NUM_AUX_CONSTRAINTS] = [7]; +pub const AUX_CONSTRAINT_DEGREES: [usize; NUM_AUX_CONSTRAINTS] = [9]; // BOUNDARY CONSTRAINTS // ================================================================================================ @@ -81,11 +81,16 @@ pub fn get_transition_constraint_count() -> usize { /// Enforces constraints for the range checker. pub fn enforce_constraints(frame: &EvaluationFrame, result: &mut [E]) { - // Constrain the selector flags. - let index = enforce_flags(frame, result); - - // Constrain the transition between rows of the range checker table. - enforce_delta(frame, &mut result[index..]); + // Constrain the transition of the value column between rows in the range checker table. + result[0] = frame.change(V_COL_IDX) + * (frame.change(V_COL_IDX) - E::ONE) + * (frame.change(V_COL_IDX) - E::from(3_u8)) + * (frame.change(V_COL_IDX) - E::from(9_u8)) + * (frame.change(V_COL_IDX) - E::from(27_u8)) + * (frame.change(V_COL_IDX) - E::from(81_u8)) + * (frame.change(V_COL_IDX) - E::from(243_u8)) + * (frame.change(V_COL_IDX) - E::from(729_u16)) + * (frame.change(V_COL_IDX) - E::from(2187_u16)); } // --- AUXILIARY COLUMNS (FOR MULTISET CHECKS) ---------------------------------------------------- @@ -113,48 +118,40 @@ pub fn enforce_aux_constraints( let alpha = aux_rand_elements.get_segment_elements(0)[0]; // Enforce b_range. - enforce_running_product_b_range(main_frame, aux_frame, alpha, &mut result[..]); + enforce_b_range(main_frame, aux_frame, alpha, result); } // TRANSITION CONSTRAINT HELPERS // ================================================================================================ -// --- MAIN TRACE --------------------------------------------------------------------------------- - -/// Constrain the selector flags to binary values. -fn enforce_flags(frame: &EvaluationFrame, result: &mut [E]) -> usize { - let constraint_count = 2; - - result[0] = is_binary(frame.s0()); - result[1] = is_binary(frame.s1()); - - constraint_count -} - -/// Constrain the transition between rows in the range checker table. -fn enforce_delta(frame: &EvaluationFrame, result: &mut [E]) -> usize { - let constraint_count = 1; - - result[0] = frame.change(V_COL_IDX) - * (frame.change(V_COL_IDX) - E::ONE) - * (frame.change(V_COL_IDX) - E::from(3_u8)) - * (frame.change(V_COL_IDX) - E::from(9_u8)) - * (frame.change(V_COL_IDX) - E::from(27_u8)) - * (frame.change(V_COL_IDX) - E::from(81_u8)) - * (frame.change(V_COL_IDX) - E::from(243_u8)) - * (frame.change(V_COL_IDX) - E::from(729_u16)) - * (frame.change(V_COL_IDX) - E::from(2187_u16)); - - constraint_count -} - // --- AUXILIARY COLUMNS (FOR MULTISET CHECKS) ---------------------------------------------------- -/// Ensures that the running product is computed correctly in the column `b_range`. It enforces -/// that the value only changes after the padded rows, where the value of `z` is included at each -/// step, ensuring that the values in the range checker table are multiplied into `b_range` 0, 1, -/// 2, or 4 times, according to the selector flags. -fn enforce_running_product_b_range( +/// Ensures that the range checker bus is computed correctly. It enforces an implementation of the +/// LogUp lookup as a running sum "bus" column. All values in the range checker trace are saved +/// with their lookup multiplicity and the logarithmic derivatives are added to b_range. Values +/// for which lookups are requested from the stack and memory are each looked up with multiplicity +/// one, and the logarithmic derivatives are subtracted from b_range. +/// +/// Define the following variables: +/// - rc_value: the range checker value +/// - rc_multiplicity: the range checker multiplicity value +/// - flag_s: boolean flag indicating a stack operation with range checks. This flag is degree 3. +/// - sv0-sv3: stack value 0-3, the 4 values range-checked from the stack +/// - flag_m: boolean flag indicating the memory chiplet is active (i.e. range checks are required). +/// This flag is degree 3. +/// - mv0-mv1: memory value 0-1, the 2 values range-checked from the memory chiplet +/// +/// The constraint expression looks as follows: +/// b' = b + rc_multiplicity / (alpha - rc_value) +/// - flag_s / (alpha - sv0) - flag_s / (alpha - sv1) +/// - flag_s / (alpha - sv2) - flag_s / (alpha - sv3) +/// - flag_m / (alpha - mv0) - flag_m / (alpha - mv1) +/// +/// However, to enforce the constraint, all denominators are multiplied so that no divisions are +/// included in the actual constraint expression. +/// +/// Constraint degree: 9 +fn enforce_b_range( main_frame: &EvaluationFrame, aux_frame: &EvaluationFrame, alpha: E, @@ -163,53 +160,43 @@ fn enforce_running_product_b_range( F: FieldElement, E: FieldElement + ExtensionOf, { - // The running product column must enforce that the next step has the values from the range - // checker multiplied in (z) and the values from the stack (q) and the memory divided out. This - // is enforced by ensuring that b_range_next multiplied by the stack and memory lookups at this step - // is equal to the combination of b_range and the range checker's values for this step. - let lookups = aux_frame.q() * get_memory_lookups(main_frame, alpha); - let range_checks = get_z(main_frame, alpha); - - result[0] = are_equal(aux_frame.b_range_next() * lookups, aux_frame.b_range() * range_checks); -} - -/// The value to be included in the running product column for memory lookups at this row. These are -/// only included for steps in the memory section of the trace (when the memory_flag is one). -fn get_memory_lookups(main_frame: &EvaluationFrame, alpha: E) -> E -where - F: FieldElement, - E: FieldElement + ExtensionOf, -{ - let memory_flag: E = main_frame.chiplets_memory_flag().into(); - let d0: E = main_frame.memory_d0().into(); - let d1: E = main_frame.memory_d1().into(); - - E::ONE + memory_flag * ((d0 + alpha) * (d1 + alpha) - E::ONE) -} - -/// Returns the value `z` which is included in the running product columns at each step. `z` causes -/// the row's value to be included 0, 1, 2, or 4 times, according to the row's selector flags row. -fn get_z(main_frame: &EvaluationFrame, alpha: E) -> E -where - F: FieldElement, - E: FieldElement + ExtensionOf, -{ - // Get the selectors and the value from the main frame. - let s0: E = main_frame.s0().into(); - let s1: E = main_frame.s1().into(); - let v: E = main_frame.v().into(); - - // Define the flags. - let f0: E = binary_not(s0) * binary_not(s1); - let f1: E = s0 * binary_not(s1); - let f2: E = binary_not(s0) * s1; - let f3: E = s0 * s1; - - // Compute z. - let v_alpha = v + alpha; - let v_alpha2 = v_alpha.square(); - let v_alpha4 = v_alpha2.square(); - f3 * v_alpha4 + f2 * v_alpha2 + f1 * v_alpha + f0 + // The denominator values for the LogUp lookup. + let mv0: E = main_frame.lookup_mv0(alpha); + let mv1: E = main_frame.lookup_mv1(alpha); + let sv0: E = main_frame.lookup_sv0(alpha); + let sv1: E = main_frame.lookup_sv1(alpha); + let sv2: E = main_frame.lookup_sv2(alpha); + let sv3: E = main_frame.lookup_sv3(alpha); + let range_check: E = alpha - main_frame.v().into(); + let memory_lookups: E = mv0.mul(mv1); // degree 2 + let stack_lookups: E = sv0.mul(sv1).mul(sv2).mul(sv3); // degree 4 + let lookups = range_check.mul(stack_lookups).mul(memory_lookups); // degree 7 + + // An intermediate value required by all stack terms that includes the flag indicating a stack + // operation with range checks. This value has degree 6. + let sflag_rc_mem: E = range_check + .mul(memory_lookups) + .mul_base( as MainFrameExt>::u32_rc_op(main_frame)); + // An intermediate value required by all memory terms that includes the flag indicating the + // memory portion of the chiplets trace. This value has degree 8. + let mflag_rc_stack: E = + range_check.mul(stack_lookups).mul_base(main_frame.chiplets_memory_flag()); + + // The terms for the LogUp check after all denominators have been multiplied in. + let b_next_term = aux_frame.b_range_next().mul(lookups); // degree 8 + let b_term = aux_frame.b_range().mul(lookups); // degree 8 + let rc_term = stack_lookups.mul(memory_lookups).mul_base(main_frame.multiplicity()); // degree 7 + let s0_term = sflag_rc_mem.mul(sv1).mul(sv2).mul(sv3); // degree 9 + let s1_term = sflag_rc_mem.mul(sv0).mul(sv2).mul(sv3); // degree 9 + let s2_term = sflag_rc_mem.mul(sv0).mul(sv1).mul(sv3); // degree 9 + let s3_term = sflag_rc_mem.mul(sv0).mul(sv1).mul(sv2); // degree 9 + let m0_term = mflag_rc_stack.mul(mv1); // degree 9 + let m1_term = mflag_rc_stack.mul(mv0); // degree 9 + + result[0] = are_equal( + b_next_term, + b_term + rc_term - s0_term - s1_term - s2_term - s3_term - m0_term - m1_term, + ); } // RANGE CHECKER FRAME EXTENSION TRAIT @@ -220,22 +207,15 @@ where trait EvaluationFrameExt { // --- Column accessors ----------------------------------------------------------------------- - fn s0(&self) -> E; - /// The current value in column s1. - fn s1(&self) -> E; + /// The current value in the lookup multiplicity column. + fn multiplicity(&self) -> E; /// The current value in column V. fn v(&self) -> E; - /// The next value in column V. - fn v_next(&self) -> E; /// The current value in auxiliary column b_range. fn b_range(&self) -> E; - /// The next value in auxiliary column b_range. fn b_range_next(&self) -> E; - /// The current value in auxiliary column q. - fn q(&self) -> E; - // --- Intermediate variables & helpers ------------------------------------------------------- /// The change between the current value in the specified column and the next value, calculated @@ -247,13 +227,8 @@ impl EvaluationFrameExt for &EvaluationFrame { // --- Column accessors ----------------------------------------------------------------------- #[inline(always)] - fn s0(&self) -> E { - self.current()[S0_COL_IDX] - } - - #[inline(always)] - fn s1(&self) -> E { - self.current()[S1_COL_IDX] + fn multiplicity(&self) -> E { + self.current()[M_COL_IDX] } #[inline(always)] @@ -261,11 +236,6 @@ impl EvaluationFrameExt for &EvaluationFrame { self.current()[V_COL_IDX] } - #[inline(always)] - fn v_next(&self) -> E { - self.next()[V_COL_IDX] - } - #[inline(always)] fn b_range(&self) -> E { self.current()[B_RANGE_COL_IDX] @@ -276,11 +246,6 @@ impl EvaluationFrameExt for &EvaluationFrame { self.next()[B_RANGE_COL_IDX] } - #[inline(always)] - fn q(&self) -> E { - self.current()[Q_COL_IDX] - } - // --- Intermediate variables & helpers ------------------------------------------------------- #[inline(always)] diff --git a/air/src/constraints/stack/op_flags/mod.rs b/air/src/constraints/stack/op_flags/mod.rs index 1dc0c0958f..9a684326a7 100644 --- a/air/src/constraints/stack/op_flags/mod.rs +++ b/air/src/constraints/stack/op_flags/mod.rs @@ -989,7 +989,7 @@ impl OpFlags { self.control_flow } - /// Returns the flag when the stack operation is a u32 operation. + /// Returns true when the stack operation is a u32 operation that requires range checks. #[inline(always)] pub fn u32_rc_op(&self) -> E { self.u32_rc_op diff --git a/air/src/trace/decoder/mod.rs b/air/src/trace/decoder/mod.rs index d0e8f54f79..2795cc9646 100644 --- a/air/src/trace/decoder/mod.rs +++ b/air/src/trace/decoder/mod.rs @@ -97,3 +97,8 @@ pub const P2_COL_IDX: usize = DECODER_AUX_TRACE_OFFSET + 1; /// Running product column representing op group table. pub const P3_COL_IDX: usize = DECODER_AUX_TRACE_OFFSET + 2; + +// --- GLOBALLY-INDEXED DECODER COLUMN ACCESSORS -------------------------------------------------- +pub const DECODER_OP_BITS_OFFSET: usize = super::DECODER_TRACE_OFFSET + OP_BITS_OFFSET; +pub const DECODER_USER_OP_HELPERS_OFFSET: usize = + super::DECODER_TRACE_OFFSET + USER_OP_HELPERS_OFFSET; diff --git a/air/src/trace/mod.rs b/air/src/trace/mod.rs index 81c45b2fc5..fa908671f4 100644 --- a/air/src/trace/mod.rs +++ b/air/src/trace/mod.rs @@ -42,7 +42,7 @@ pub const STACK_TRACE_RANGE: Range = range(STACK_TRACE_OFFSET, STACK_TRAC // Range check trace pub const RANGE_CHECK_TRACE_OFFSET: usize = STACK_TRACE_RANGE.end; -pub const RANGE_CHECK_TRACE_WIDTH: usize = 3; +pub const RANGE_CHECK_TRACE_WIDTH: usize = 2; pub const RANGE_CHECK_TRACE_RANGE: Range = range(RANGE_CHECK_TRACE_OFFSET, RANGE_CHECK_TRACE_WIDTH); @@ -57,7 +57,7 @@ pub const TRACE_WIDTH: usize = CHIPLETS_OFFSET + CHIPLETS_WIDTH; // ------------------------------------------------------------------------------------------------ // decoder stack range checks hasher chiplets -// (3 columns) (1 column) (2 columns) (1 column) (1 column) +// (3 columns) (1 column) (1 column) (1 column) (1 column) // ├───────────────┴──────────────┴──────────────┴───────────────┴───────────────┤ // Decoder auxiliary columns @@ -74,7 +74,7 @@ pub const STACK_AUX_TRACE_RANGE: Range = // Range check auxiliary columns pub const RANGE_CHECK_AUX_TRACE_OFFSET: usize = STACK_AUX_TRACE_RANGE.end; -pub const RANGE_CHECK_AUX_TRACE_WIDTH: usize = 2; +pub const RANGE_CHECK_AUX_TRACE_WIDTH: usize = 1; pub const RANGE_CHECK_AUX_TRACE_RANGE: Range = range(RANGE_CHECK_AUX_TRACE_OFFSET, RANGE_CHECK_AUX_TRACE_WIDTH); diff --git a/air/src/trace/range.rs b/air/src/trace/range.rs index c86fffde31..3081bbe3a8 100644 --- a/air/src/trace/range.rs +++ b/air/src/trace/range.rs @@ -5,21 +5,13 @@ use super::{RANGE_CHECK_AUX_TRACE_OFFSET, RANGE_CHECK_TRACE_OFFSET}; // --- Column accessors in the main trace --------------------------------------------------------- -/// A binary selector column to help specify whether or not the value should be included in the -/// running product. -pub const S0_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET; -/// A binary selector column to help specify whether or not the value should be included in the -/// running product. -pub const S1_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET + 1; +/// A column to hold the multiplicity of how many times the value is being range-checked. +pub const M_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET; /// A column to hold the values being range-checked. -pub const V_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET + 2; +pub const V_COL_IDX: usize = RANGE_CHECK_TRACE_OFFSET + 1; // --- Column accessors in the auxiliary columns -------------------------------------------------- /// The running product column used for verifying that the range check lookups performed in the /// Stack and the Memory chiplet match the values checked in the Range Checker. pub const B_RANGE_COL_IDX: usize = RANGE_CHECK_AUX_TRACE_OFFSET; - -/// An auxiliary trace column of intermediate values used to enforce AIR constraints on `b_range`. -/// It contains the product of the lookups performed by the Stack processor at each cycle. -pub const Q_COL_IDX: usize = B_RANGE_COL_IDX + 1; From 3c64447e2b9cd7de34aa9374a0c2410f6402b7c8 Mon Sep 17 00:00:00 2001 From: grjte Date: Fri, 28 Jul 2023 09:55:15 -0400 Subject: [PATCH 049/120] feat(proc): update range checker trace gen main/aux --- processor/src/chiplets/memory/mod.rs | 2 +- processor/src/operations/u32_ops.rs | 2 +- processor/src/range/aux_trace.rs | 116 ++++++--------- processor/src/range/mod.rs | 205 ++++++--------------------- processor/src/range/tests.rs | 6 +- processor/src/trace/tests/range.rs | 45 +----- 6 files changed, 93 insertions(+), 283 deletions(-) diff --git a/processor/src/chiplets/memory/mod.rs b/processor/src/chiplets/memory/mod.rs index 41c254dfe1..2b87904fda 100644 --- a/processor/src/chiplets/memory/mod.rs +++ b/processor/src/chiplets/memory/mod.rs @@ -176,7 +176,7 @@ impl Memory { }; let (delta_hi, delta_lo) = split_u32_into_u16(delta); - range.add_mem_checks(row, &[delta_lo, delta_hi]); + range.add_range_checks(row, &[delta_lo, delta_hi]); // update values for the next iteration of the loop prev_ctx = ctx; diff --git a/processor/src/operations/u32_ops.rs b/processor/src/operations/u32_ops.rs index 28d2077c50..7c14d768ec 100644 --- a/processor/src/operations/u32_ops.rs +++ b/processor/src/operations/u32_ops.rs @@ -210,7 +210,7 @@ where let (t3, t2) = split_u32_into_u16(hi.as_int()); // add lookup values to the range checker. - self.range.add_stack_checks(self.system.clk(), &[t0, t1, t2, t3]); + self.range.add_range_checks(self.system.clk(), &[t0, t1, t2, t3]); // save the range check lookups to the decoder's user operation helper columns. let mut helper_values = diff --git a/processor/src/range/aux_trace.rs b/processor/src/range/aux_trace.rs index 548b112ef4..415689e7e0 100644 --- a/processor/src/range/aux_trace.rs +++ b/processor/src/range/aux_trace.rs @@ -1,8 +1,5 @@ -use super::{ - build_lookup_table_row_values, uninit_vector, BTreeMap, ColMatrix, CycleRangeChecks, Felt, - FieldElement, RangeCheckFlag, Vec, NUM_RAND_ROWS, -}; -use miden_air::trace::range::V_COL_IDX; +use super::{uninit_vector, BTreeMap, ColMatrix, Felt, FieldElement, Vec, NUM_RAND_ROWS}; +use miden_air::trace::range::{M_COL_IDX, V_COL_IDX}; // AUXILIARY TRACE BUILDER // ================================================================================================ @@ -10,16 +7,9 @@ use miden_air::trace::range::V_COL_IDX; /// Describes how to construct the execution trace of columns related to the range checker in the /// auxiliary segment of the trace. These are used in multiset checks. pub struct AuxTraceBuilder { - // Range check lookups performed by all user operations, grouped and sorted by clock cycle. Each - // cycle is mapped to a single CycleRangeChecks instance which includes lookups from the stack, - // memory, or both. - // TODO: once we switch to backfilling memory range checks this approach can change to tracking - // vectors of hints and rows like in the Stack and Hasher AuxTraceBuilders, and the - // CycleRangeChecks struct can be removed. - cycle_range_checks: BTreeMap, - // A trace-length vector of RangeCheckFlags which indicate how many times the range check value - // at that row should be included in the trace. - row_flags: Vec, + /// Range check lookups performed by all user operations, grouped and sorted by the clock cycle + /// at which they are requested. + cycle_range_checks: BTreeMap>, // The index of the first row of Range Checker's trace when the padded rows end and values to // be range checked start. values_start: usize, @@ -28,41 +18,27 @@ pub struct AuxTraceBuilder { impl AuxTraceBuilder { // CONSTRUCTOR // -------------------------------------------------------------------------------------------- - pub fn new( - cycle_range_checks: BTreeMap, - row_flags: Vec, - values_start: usize, - ) -> Self { + pub fn new(cycle_range_checks: BTreeMap>, values_start: usize) -> Self { Self { cycle_range_checks, - row_flags, values_start, } } - // ACCESSORS - // -------------------------------------------------------------------------------------------- - pub fn cycle_range_check_values(&self) -> Vec { - self.cycle_range_checks.values().cloned().collect() - } - // AUX COLUMN BUILDERS // -------------------------------------------------------------------------------------------- /// Builds and returns range checker auxiliary trace columns. Currently this consists of two /// columns: /// - `b_range`: ensures that the range checks performed by the Range Checker match those - /// requested - /// by the Stack and Memory processors. - /// - `q`: a helper column of intermediate values to reduce the degree of the constraints for - /// `b_range`. It contains the product of the lookups performed by the Stack at each row. + /// requested by the Stack and Memory processors. pub fn build_aux_columns>( &self, main_trace: &ColMatrix, rand_elements: &[E], ) -> Vec> { - let (b_range, q) = self.build_aux_col_b_range(main_trace, rand_elements); - vec![b_range, q] + let b_range = self.build_aux_col_b_range(main_trace, rand_elements); + vec![b_range] } /// Builds the execution trace of the range check `b_range` and `q` columns which ensure that the @@ -71,46 +47,40 @@ impl AuxTraceBuilder { &self, main_trace: &ColMatrix, alphas: &[E], - ) -> (Vec, Vec) { - // compute the inverses for range checks performed by operations. - let (_, inv_row_values) = - build_lookup_table_row_values(&self.cycle_range_check_values(), main_trace, alphas); + ) -> Vec { + // TODO: replace this with an efficient solution + // // compute the inverses for range checks performed by operations. + // let (_, inv_row_values) = + // build_lookup_table_row_values(&self.cycle_range_check_values(), main_trace, alphas); - // allocate memory for the running product column and set the initial value to ONE - let mut q = unsafe { uninit_vector(main_trace.num_rows()) }; + // allocate memory for the running sum column and set the initial value to ONE let mut b_range = unsafe { uninit_vector(main_trace.num_rows()) }; - q[0] = E::ONE; b_range[0] = E::ONE; - // keep track of the last updated row in the `b_range` running product column. the `q` - // column index is always one row behind, since `q` is filled with intermediate values in - // the same row as the operation is executed, whereas `b_range` is filled with result - // values that are added to the next row after the operation's execution. + // keep track of the last updated row in the `b_range` running sum column. `b_range` is + // filled with result values that are added to the next row after the operation's execution. let mut b_range_idx = 0_usize; - // keep track of the next row to be included from the user op range check values. - let mut rc_user_op_idx = 0; // the first half of the trace only includes values from the operations. for (clk, range_checks) in self.cycle_range_checks.range(0..self.values_start as u32) { let clk = *clk as usize; // if we skipped some cycles since the last update was processed, values in the last - // updated row should by copied over until the current cycle. + // updated row should be copied over until the current cycle. if b_range_idx < clk { let last_value = b_range[b_range_idx]; b_range[(b_range_idx + 1)..=clk].fill(last_value); - q[b_range_idx..clk].fill(E::ONE); } - // move the column pointers to the next row. + // move the column pointer to the next row. b_range_idx = clk + 1; - // update the intermediate values in the q column. - q[clk] = range_checks.to_stack_value(main_trace, alphas); - - // include the operation lookups in the running product. - b_range[b_range_idx] = b_range[clk] * inv_row_values[rc_user_op_idx]; - rc_user_op_idx += 1; + b_range[b_range_idx] = b_range[clk]; + // include the operation lookups + for lookup in range_checks.iter() { + let value = (alphas[0] - (*lookup).into()).inv(); + b_range[b_range_idx] -= value; + } } // if we skipped some cycles since the last update was processed, values in the last @@ -118,13 +88,13 @@ impl AuxTraceBuilder { if b_range_idx < self.values_start { let last_value = b_range[b_range_idx]; b_range[(b_range_idx + 1)..=self.values_start].fill(last_value); - q[b_range_idx..self.values_start].fill(E::ONE); } - // after the padded section of the range checker table, include `z` in the running product - // at each step and remove lookups from user ops at any step where user ops were executed. - for (row_idx, (hint, lookup)) in self - .row_flags + // after the padded section of the range checker table, include the lookup value specified + // by the range checker into the running sum at each step, and remove lookups from user ops + // at any step where user ops were executed. + for (row_idx, (multiplicity, lookup)) in main_trace + .get_column(M_COL_IDX) .iter() .zip(main_trace.get_column(V_COL_IDX).iter()) .enumerate() @@ -133,32 +103,26 @@ impl AuxTraceBuilder { { b_range_idx = row_idx + 1; - b_range[b_range_idx] = b_range[row_idx] * hint.to_value(*lookup, alphas); - - if let Some(range_check) = self.cycle_range_checks.get(&(row_idx as u32)) { - // update the intermediate values in the q column. - q[row_idx] = range_check.to_stack_value(main_trace, alphas); - - // include the operation lookups in the running product. - b_range[b_range_idx] *= inv_row_values[rc_user_op_idx]; - rc_user_op_idx += 1; - } else { - q[row_idx] = E::ONE; + // add the value in the range checker: multiplicity / (alpha - lookup) + let lookup_val = (alphas[0] - (*lookup).into()).inv().mul_base(*multiplicity); + b_range[b_range_idx] = b_range[row_idx] + lookup_val; + // subtract the range checks requested by operations + if let Some(range_checks) = self.cycle_range_checks.get(&(row_idx as u32)) { + for lookup in range_checks.iter() { + let value = (alphas[0] - (*lookup).into()).inv(); + b_range[b_range_idx] -= value; + } } } // at this point, all range checks from user operations and the range checker should be // matched - so, the last value must be ONE; - assert_eq!(q[b_range_idx - 1], E::ONE); assert_eq!(b_range[b_range_idx], E::ONE); - if (b_range_idx - 1) < b_range.len() - 1 { - q[b_range_idx..].fill(E::ONE); - } if b_range_idx < b_range.len() - 1 { b_range[(b_range_idx + 1)..].fill(E::ONE); } - (b_range, q) + b_range } } diff --git a/processor/src/range/mod.rs b/processor/src/range/mod.rs index 14c5e58ba5..d0794180bc 100644 --- a/processor/src/range/mod.rs +++ b/processor/src/range/mod.rs @@ -1,15 +1,11 @@ use super::{ - trace::{build_lookup_table_row_values, LookupTableRow, NUM_RAND_ROWS}, - utils::uninit_vector, - BTreeMap, ColMatrix, Felt, FieldElement, RangeCheckTrace, Vec, ONE, ZERO, + trace::NUM_RAND_ROWS, utils::uninit_vector, BTreeMap, ColMatrix, Felt, FieldElement, + RangeCheckTrace, Vec, ZERO, }; mod aux_trace; pub use aux_trace::AuxTraceBuilder; -mod request; -use request::CycleRangeChecks; - #[cfg(test)] mod tests; @@ -23,35 +19,31 @@ mod tests; /// into 16-bits, but rather keeps track of all 16-bit range checks performed by the VM. /// /// ## Execution trace -/// Execution trace generated by the range checker consists of 3 columns. Conceptually, the table -/// starts with value 0 and end with value 65535. +/// The execution trace generated by the range checker consists of 2 columns. Conceptually, the +/// table starts with value 0 and ends with value 65535. /// -/// The layout illustrated below. +/// The layout is illustrated below. /// -/// s0 s1 v -/// ├─────┴──────┴─────┤ +/// m v +/// ├─────┴─────┤ /// /// In the above, the meaning of the columns is as follows: /// - Column `v` contains the value being range-checked where `v` must be a 16-bit value. The /// values must be in increasing order and the jump allowed between two values should be a power /// of 3 less than or equal to 3^7, and duplicates are allowed. -/// - Column `s0` and `s1` specify how many lookups are to be included for a given value. -/// Specifically: (0, 0) means no lookups, (1, 0) means one lookup, (0, 1), means two lookups, -/// and (1, 1) means four lookups. +/// - Column `m` specifies the lookup multiplicity, which is how many lookups are to be included for +/// a given value. /// /// Thus, for example, if a value was range-checked just once, we'll need to add a single row to -/// the table with (s0, s1, v) set to (1, 0, v), where v is the value. -/// -/// If, on the other hand, the value was range-checked 5 times, we'll need two rows in the table: -/// (1, 1, v) and (1, 0, v). The first row specifies that there were 4 lookups and the second -/// row add the fifth lookup. +/// the table with (m, v) set to (1, v), where v is the value. If the value was range-checked 5 +/// times, we'll need to specify the row (5, v). pub struct RangeChecker { /// Tracks lookup count for each checked value. lookups: BTreeMap, - // Range check lookups performed by all user operations, grouped and sorted by clock cycle. Each - // cycle is mapped to a single CycleRangeChecks instance which includes lookups from the stack, - // memory, or both. - cycle_range_checks: BTreeMap, + /// Range check lookups performed by all user operations, grouped and sorted by clock cycle. + /// Each cycle is mapped to a vector of the range checks requested at that cycle, which can come + /// from the stack, memory, or both. + cycle_range_checks: BTreeMap>, } impl RangeChecker { @@ -72,41 +64,36 @@ impl RangeChecker { // TRACE MUTATORS // -------------------------------------------------------------------------------------------- + /// Adds the specified value to the trace of this range checker's lookups. pub fn add_value(&mut self, value: u16) { self.lookups.entry(value).and_modify(|v| *v += 1).or_insert(1); } - /// Adds range check lookups from the [Stack] to this [RangeChecker] instance. Stack lookups are - /// guaranteed to be added at unique clock cycles, since operations are sequential and no range - /// check lookups are added before or during the stack operation processing. - pub fn add_stack_checks(&mut self, clk: u32, values: &[u16; 4]) { - self.add_value(values[0]); - self.add_value(values[1]); - self.add_value(values[2]); - self.add_value(values[3]); - - // Stack operations are added before memory operations at unique clock cycles. - self.cycle_range_checks.insert(clk, CycleRangeChecks::new_from_stack(values)); - } + /// Adds range check lookups from the stack or memory to this [RangeChecker] instance. + pub fn add_range_checks(&mut self, clk: u32, values: &[u16]) { + // range checks requests only come from memory or from the stack, which always request 2 or + // 4 lookups respectively. + debug_assert!(values.len() == 2 || values.len() == 4); - /// Adds range check lookups from [Memory] to this [RangeChecker] instance. Memory lookups are - /// always added after all stack lookups have completed, since they are processed during trace - /// finalization. - pub fn add_mem_checks(&mut self, clk: u32, values: &[u16; 2]) { - self.add_value(values[0]); - self.add_value(values[1]); + let mut requests = Vec::new(); + for value in values.iter() { + // add the specified value to the trace of this range checker's lookups. + self.add_value(*value); + requests.push(Felt::from(*value)); + } + // track the range check requests at each cycle self.cycle_range_checks .entry(clk) - .and_modify(|entry| entry.add_memory_checks(values)) - .or_insert_with(|| CycleRangeChecks::new_from_memory(values)); + .and_modify(|entry| entry.append(&mut requests)) + .or_insert_with(|| requests); } // EXECUTION TRACE GENERATION (INTERNAL) // -------------------------------------------------------------------------------------------- - /// Converts this [RangeChecker] into an execution trace with 3 columns and the number of rows + /// Converts this [RangeChecker] into an execution trace with 2 columns and the number of rows /// specified by the `target_len` parameter. /// /// If the number of rows need to represent execution trace of this range checker is smaller @@ -133,28 +120,19 @@ impl RangeChecker { // allocated memory for the trace; this memory is un-initialized but this is not a problem // because we'll overwrite all values in it anyway. - let mut trace = unsafe { - [uninit_vector(target_len), uninit_vector(target_len), uninit_vector(target_len)] - }; - // Allocate uninitialized memory for accumulating the precomputed auxiliary column hints. - let mut row_flags = unsafe { uninit_vector(target_len) }; + let mut trace = unsafe { [uninit_vector(target_len), uninit_vector(target_len)] }; // determine the number of padding rows needed to get to target trace length and pad the // table with the required number of rows. let num_padding_rows = target_len - trace_len - num_rand_rows; trace[0][..num_padding_rows].fill(ZERO); trace[1][..num_padding_rows].fill(ZERO); - trace[2][..num_padding_rows].fill(ZERO); - - // Initialize the padded rows of the auxiliary column hints with the default flag, F0, - // indicating s0 = s1 = ZERO. - row_flags[..num_padding_rows].fill(RangeCheckFlag::F0); // build the trace table let mut i = num_padding_rows; let mut prev_value = 0u16; for (&value, &num_lookups) in self.lookups.iter() { - write_rows(&mut trace, &mut i, num_lookups, value, prev_value, &mut row_flags); + write_rows(&mut trace, &mut i, num_lookups, value, prev_value); prev_value = value; } @@ -163,11 +141,11 @@ impl RangeChecker { // (When there is data at the end of the main trace, auxiliary bus columns always need to be // one row longer than the main trace, since values in the bus column are based on data from // the "current" row of the main trace but placed into the "next" row of the bus column.) - write_value(&mut trace, &mut i, 0, (u16::MAX).into(), &mut row_flags); + write_trace_row(&mut trace, &mut i, 0, (u16::MAX).into()); RangeCheckTrace { trace, - aux_builder: AuxTraceBuilder::new(self.cycle_range_checks, row_flags, num_padding_rows), + aux_builder: AuxTraceBuilder::new(self.cycle_range_checks, num_padding_rows), } } @@ -181,16 +159,16 @@ impl RangeChecker { let mut num_rows = 1; let mut prev_value = 0u16; - for (&value, &num_lookups) in self.lookups.iter() { - // determine how many lookup rows we need for this value - num_rows += lookups_to_rows(num_lookups); + for value in self.lookups.keys() { + // add one row for each value in the range checker table + num_rows += 1; // determine the delta between this and the previous value. we need to know this delta // to determine if we need to insert any "bridge" rows to the table, this is needed // since the gap between two values in the range checker can only be a power of 3 less // than or equal to 3^7. let delta = value - prev_value; num_rows += get_num_bridge_rows(delta); - prev_value = value; + prev_value = *value; } num_rows } @@ -222,58 +200,9 @@ impl Default for RangeChecker { } } -// RANGE CHECKER ROWS -// ================================================================================================ - -/// A precomputed hint value that can be used to help construct the execution trace for the -/// auxiliary column b_range used for multiset checks. The hint is a precomputed flag value based -/// on the selectors s0 and s1 in the trace. -#[derive(Debug, PartialEq, Eq, Clone)] -pub enum RangeCheckFlag { - F0, - F1, - F2, - F3, -} - -impl RangeCheckFlag { - /// Reduces this row to a single field element in the field specified by E. This requires - /// at least 1 alpha value. - pub fn to_value>(&self, value: Felt, alphas: &[E]) -> E { - let alpha: E = alphas[0]; - - match self { - RangeCheckFlag::F0 => E::ONE, - RangeCheckFlag::F1 => alpha + value.into(), - RangeCheckFlag::F2 => (alpha + value.into()).square(), - RangeCheckFlag::F3 => ((alpha + value.into()).square()).square(), - } - } -} - // HELPER FUNCTIONS // ================================================================================================ -/// Returns the number of rows needed to perform the specified number of lookups for an 8-bit -/// value. Note that even if the number of lookups is 0, at least one row is required. This is -/// because for an 8-bit table, rows must contain contiguous values. -/// -/// The number of rows is determined as follows: -/// - First we compute the number of rows for 4 lookups per row. -/// - Then we compute the number of rows for 2 lookups per row. -/// - Then, we compute the number of rows for a single lookup per row. -/// -/// The return value is the sum of these three values. -fn lookups_to_rows(num_lookups: usize) -> usize { - if num_lookups == 0 { - 1 - } else { - let (num_rows4, num_lookups) = div_rem(num_lookups, 4); - let (num_rows2, num_rows1) = div_rem(num_lookups, 2); - num_rows4 + num_rows2 + num_rows1 - } -} - /// Calculates the number of bridge rows that are need to be added to the trace between two values /// to be range checked. pub fn get_num_bridge_rows(delta: u16) -> usize { @@ -299,7 +228,6 @@ fn write_rows( num_lookups: usize, value: u16, prev_value: u16, - row_flags: &mut [RangeCheckFlag], ) { let mut gap = value - prev_value; let mut prev_val = prev_value; @@ -308,62 +236,17 @@ fn write_rows( if gap > stride { gap -= stride; prev_val += stride; - write_value(trace, step, 0, prev_val as u64, row_flags); + write_trace_row(trace, step, 0, prev_val as u64); } else { stride /= 3; } } - write_value(trace, step, num_lookups, value as u64, row_flags); -} - -/// Populates the trace with the rows needed to support the specified number of lookups against -/// the specified value. -fn write_value( - trace: &mut [Vec], - step: &mut usize, - num_lookups: usize, - value: u64, - row_flags: &mut [RangeCheckFlag], -) { - // if the number of lookups is 0, only one trace row is required - if num_lookups == 0 { - row_flags[*step] = RangeCheckFlag::F0; - write_trace_row(trace, step, ZERO, ZERO, value); - return; - } - - // write rows which can support 4 lookups per row - let (num_rows, num_lookups) = div_rem(num_lookups, 4); - for _ in 0..num_rows { - row_flags[*step] = RangeCheckFlag::F3; - write_trace_row(trace, step, ONE, ONE, value); - } - - // write rows which can support 2 lookups per row - let (num_rows, num_lookups) = div_rem(num_lookups, 2); - for _ in 0..num_rows { - row_flags[*step] = RangeCheckFlag::F2; - write_trace_row(trace, step, ZERO, ONE, value); - } - - // write rows which can support only one lookup per row - for _ in 0..num_lookups { - row_flags[*step] = RangeCheckFlag::F1; - write_trace_row(trace, step, ONE, ZERO, value); - } + write_trace_row(trace, step, num_lookups, value as u64); } /// Populates a single row at the specified step in the trace table. -fn write_trace_row(trace: &mut [Vec], step: &mut usize, s0: Felt, s1: Felt, value: u64) { - trace[0][*step] = s0; - trace[1][*step] = s1; - trace[2][*step] = Felt::new(value); +fn write_trace_row(trace: &mut [Vec], step: &mut usize, num_lookups: usize, value: u64) { + trace[0][*step] = Felt::new(num_lookups as u64); + trace[1][*step] = Felt::new(value); *step += 1; } - -/// Returns quotient and remainder of dividing the provided value by the divisor. -fn div_rem(value: usize, divisor: usize) -> (usize, usize) { - let q = value / divisor; - let r = value % divisor; - (q, r) -} diff --git a/processor/src/range/tests.rs b/processor/src/range/tests.rs index 7ec9b3d3ff..0ca4db8fd1 100644 --- a/processor/src/range/tests.rs +++ b/processor/src/range/tests.rs @@ -1,9 +1,10 @@ -use super::{BTreeMap, Felt, RangeChecker, Vec, ONE, ZERO}; +use super::{super::ONE, BTreeMap, Felt, RangeChecker, Vec, ZERO}; use crate::{utils::get_trace_len, RangeCheckTrace}; use rand_utils::rand_array; use vm_core::{utils::ToElements, StarkField}; #[test] +#[ignore = "update required"] fn range_checks() { let mut checker = RangeChecker::new(); @@ -21,7 +22,7 @@ fn range_checks() { // skip the padded rows let mut i = 0; - while trace[0][i] == ZERO && trace[1][i] == ZERO && trace[2][i] == ZERO { + while trace[0][i] == ZERO && trace[1][i] == ZERO { i += 1; } @@ -47,6 +48,7 @@ fn range_checks() { } #[test] +#[ignore = "update required"] fn range_checks_rand() { let mut checker = RangeChecker::new(); let values = rand_array::(); diff --git a/processor/src/trace/tests/range.rs b/processor/src/trace/tests/range.rs index 54035cbb66..96e1c44e2a 100644 --- a/processor/src/trace/tests/range.rs +++ b/processor/src/trace/tests/range.rs @@ -1,56 +1,16 @@ use super::{build_trace_from_ops, Felt, FieldElement, Trace, NUM_RAND_ROWS, ONE, ZERO}; use miden_air::trace::{ - chiplets::hasher::HASH_CYCLE_LEN, - range::{B_RANGE_COL_IDX, Q_COL_IDX}, - AUX_TRACE_RAND_ELEMENTS, + chiplets::hasher::HASH_CYCLE_LEN, range::B_RANGE_COL_IDX, AUX_TRACE_RAND_ELEMENTS, }; use rand_utils::rand_array; use vm_core::Operation; -#[test] -#[allow(clippy::needless_range_loop)] -fn q_trace() { - let stack = [1, 255]; - let operations = vec![ - Operation::U32add, - Operation::MStoreW, - Operation::Drop, - Operation::Drop, - Operation::Drop, - Operation::Drop, - ]; - let mut trace = build_trace_from_ops(operations, &stack); - - let rand_elements = rand_array::(); - let alpha = rand_elements[0]; - let aux_columns = trace.build_aux_segment(&[], &rand_elements).unwrap(); - let q = aux_columns.get_column(Q_COL_IDX); - - assert_eq!(trace.length(), q.len()); - - // --- Check the stack processor's range check lookups. --------------------------------------- - - // Before any range checks are executed, the value in b_range should be one. - assert_eq!(Felt::ONE, q[0]); - - // The first range check lookup from the stack will happen when the add operation is executed, - // at cycle 1. (The trace begins by executing `span`). It must be divided out of `b_range`. - // The range-checked values are 0, 256, 0, 0. - let expected = (alpha) * (Felt::new(256) + alpha) * alpha.square(); - assert_eq!(expected, q[1]); - - // --- Check the last value of the q column is one. ------------------------------------------ - - for row in 2..(q.len() - NUM_RAND_ROWS) { - assert_eq!(Felt::ONE, q[row]); - } -} - /// This test checks that range check lookups from stack operations are balanced by the range checks /// processed in the Range Checker. /// /// The `U32add` operation results in 4 16-bit range checks of 256, 0, 0, 0. #[test] +#[ignore = "update required"] fn b_range_trace_stack() { let stack = [1, 255]; let operations = vec![Operation::U32add]; @@ -115,6 +75,7 @@ fn b_range_trace_stack() { /// The `LoadW` memory operation results in 2 16-bit range checks of 0, 0. #[test] #[allow(clippy::needless_range_loop)] +#[ignore = "update required"] fn b_range_trace_mem() { let stack = [0, 1, 2, 3, 4, 0]; let operations = vec![ From 5a78583e21a411c3e98d42c64848a7273dd1e786 Mon Sep 17 00:00:00 2001 From: grjte Date: Fri, 28 Jul 2023 09:59:44 -0400 Subject: [PATCH 050/120] test(proc): update range checker tests --- processor/src/range/tests.rs | 54 +++++++----------------- processor/src/trace/tests/range.rs | 68 ++++++++++++++---------------- 2 files changed, 48 insertions(+), 74 deletions(-) diff --git a/processor/src/range/tests.rs b/processor/src/range/tests.rs index 0ca4db8fd1..1cdce79756 100644 --- a/processor/src/range/tests.rs +++ b/processor/src/range/tests.rs @@ -1,17 +1,17 @@ -use super::{super::ONE, BTreeMap, Felt, RangeChecker, Vec, ZERO}; +use super::{BTreeMap, Felt, RangeChecker, Vec, ZERO}; use crate::{utils::get_trace_len, RangeCheckTrace}; use rand_utils::rand_array; use vm_core::{utils::ToElements, StarkField}; #[test] -#[ignore = "update required"] fn range_checks() { let mut checker = RangeChecker::new(); let values = [0, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 100, 355, 620].to_elements(); for &value in values.iter() { - checker.add_value(value.as_int() as u16) + // add the value to the range checker's trace + checker.add_value(value.as_int() as u16); } let RangeCheckTrace { @@ -30,8 +30,7 @@ fn range_checks() { validate_row(&trace, &mut i, 0, 1); validate_row(&trace, &mut i, 1, 1); validate_row(&trace, &mut i, 2, 4); - validate_row(&trace, &mut i, 3, 2); - validate_row(&trace, &mut i, 3, 1); + validate_row(&trace, &mut i, 3, 3); validate_row(&trace, &mut i, 4, 2); validate_bridge_rows(&trace, &mut i, 4, 100); @@ -48,7 +47,6 @@ fn range_checks() { } #[test] -#[ignore = "update required"] fn range_checks_rand() { let mut checker = RangeChecker::new(); let values = rand_array::(); @@ -69,22 +67,13 @@ fn range_checks_rand() { // ================================================================================================ fn validate_row(trace: &[Vec], row_idx: &mut usize, value: u64, num_lookups: u64) { - let (s0, s1) = match num_lookups { - 0 => (ZERO, ZERO), - 1 => (ONE, ZERO), - 2 => (ZERO, ONE), - 4 => (ONE, ONE), - _ => panic!("invalid lookup value"), - }; - - assert_eq!(s0, trace[0][*row_idx]); - assert_eq!(s1, trace[1][*row_idx]); - assert_eq!(Felt::new(value), trace[2][*row_idx]); + assert_eq!(trace[0][*row_idx], Felt::from(num_lookups)); + assert_eq!(trace[1][*row_idx], Felt::from(value)); *row_idx += 1; } fn validate_trace(trace: &[Vec], lookups: &[Felt]) { - assert_eq!(3, trace.len()); + assert_eq!(2, trace.len()); // trace length must be a power of two let trace_len = get_trace_len(trace); @@ -95,8 +84,8 @@ fn validate_trace(trace: &[Vec], lookups: &[Felt]) { let mut lookups_16bit = BTreeMap::new(); // process the first row - assert_eq!(ZERO, trace[2][i]); - let count = get_lookup_count(trace, i); + assert_eq!(trace[1][i], ZERO); + let count = trace[0][i].as_int(); lookups_16bit.insert(0u16, count); i += 1; @@ -104,7 +93,7 @@ fn validate_trace(trace: &[Vec], lookups: &[Felt]) { let mut prev_value = 0u16; while i < trace_len { // make sure the value is a 16-bit value - let value = trace[2][i].as_int(); + let value = trace[1][i].as_int(); assert!(value <= 65535, "not a 16-bit value"); let value = value as u16; @@ -113,15 +102,18 @@ fn validate_trace(trace: &[Vec], lookups: &[Felt]) { assert!(valid_delta(delta)); // keep track of lookup count for each value - let count = get_lookup_count(trace, i); - lookups_16bit.entry(value).and_modify(|value| *value += count).or_insert(count); + let multiplicity = trace[0][i].as_int(); + lookups_16bit + .entry(value) + .and_modify(|count| *count += multiplicity) + .or_insert(multiplicity); i += 1; prev_value = value; } // validate the last row (must be 65535) - let last_value = trace[2][i - 1].as_int(); + let last_value = trace[1][i - 1].as_int(); assert_eq!(65535, last_value); // remove all the looked up values from the lookup table @@ -163,20 +155,6 @@ fn validate_bridge_rows( } } -fn get_lookup_count(trace: &[Vec], step: usize) -> usize { - if trace[0][step] == ZERO && trace[1][step] == ZERO { - 0 - } else if trace[0][step] == ONE && trace[1][step] == ZERO { - 1 - } else if trace[0][step] == ZERO && trace[1][step] == ONE { - 2 - } else if trace[0][step] == ONE && trace[1][step] == ONE { - 4 - } else { - panic!("not a valid count"); - } -} - /// Checks if the delta between two values is 0 or a power of 3 and at most 3^7 fn valid_delta(delta: u16) -> bool { delta == 0 || (59049 % delta == 0 && delta <= 2187) diff --git a/processor/src/trace/tests/range.rs b/processor/src/trace/tests/range.rs index 96e1c44e2a..653fdce0fc 100644 --- a/processor/src/trace/tests/range.rs +++ b/processor/src/trace/tests/range.rs @@ -3,14 +3,13 @@ use miden_air::trace::{ chiplets::hasher::HASH_CYCLE_LEN, range::B_RANGE_COL_IDX, AUX_TRACE_RAND_ELEMENTS, }; use rand_utils::rand_array; -use vm_core::Operation; +use vm_core::{ExtensionOf, Operation}; /// This test checks that range check lookups from stack operations are balanced by the range checks /// processed in the Range Checker. /// /// The `U32add` operation results in 4 16-bit range checks of 256, 0, 0, 0. #[test] -#[ignore = "update required"] fn b_range_trace_stack() { let stack = [1, 255]; let operations = vec![Operation::U32add]; @@ -30,37 +29,34 @@ fn b_range_trace_stack() { assert_eq!(Felt::ONE, b_range[1]); // The first range check lookup from the stack will happen when the add operation is executed, - // at cycle 1. (The trace begins by executing `span`). It must be divided out of `b_range`. - // The range-checked values are 0, 256, 0, 0. - let lookup_product = (alpha) * (Felt::new(256) + alpha) * alpha.square(); - let mut expected = lookup_product.inv(); + // at cycle 1. (The trace begins by executing `span`). It must be subtracted out of `b_range`. + // The range-checked values are 0, 256, 0, 0, so the values to subtract are 3/(alpha - 0) and + // 1/(alpha - 256). + let lookups = alpha.inv().mul_base(Felt::new(3)) + (alpha - Felt::new(256)).inv(); + let mut expected = b_range[1] - lookups; assert_eq!(expected, b_range[2]); // --- Check the range checker's lookups. ----------------------------------------------------- - // 45 rows are needed for 0, 0, 243, 252, 255, 256, ... 38 additional bridge rows of - // powers of 3 ..., 65535. (0 is range-checked in 2 rows for a total of 3 lookups. 256 is - // range-checked in one row. 65535 is the max, and the rest are "bridge" values.) An extra row - // is added to pad the u16::MAX value. - let len_16bit = 45 + 1; + // 44 rows are needed for 0, 243, 252, 255, 256, ... 38 additional bridge rows of powers of + // 3 ..., 65535. (0 and 256 are range-checked. 65535 is the max, and the rest are "bridge" + // values.) An extra row is added to pad the u16::MAX value. + let len_16bit = 44 + 1; // The start of the values in the range checker table. let values_start = trace.length() - len_16bit - NUM_RAND_ROWS; // After the padded rows, the first value will be unchanged. assert_eq!(expected, b_range[values_start]); - // We include 2 lookups of 0, so the next value should be multiplied by alpha squared. - expected *= alpha.square(); + // We include 3 lookups of 0. + expected += alpha.inv().mul_base(Felt::new(3)); assert_eq!(expected, b_range[values_start + 1]); - // Then we include our third lookup of 0, so the next value should be multiplied by alpha. - expected *= alpha; - assert_eq!(expected, b_range[values_start + 2]); // Then we have 3 bridge rows between 0 and 255 where the value does not change + assert_eq!(expected, b_range[values_start + 2]); assert_eq!(expected, b_range[values_start + 3]); assert_eq!(expected, b_range[values_start + 4]); - assert_eq!(expected, b_range[values_start + 5]); // Then we include 1 lookup of 256, so it should be multiplied by alpha + 256. - expected *= alpha + Felt::new(256); - assert_eq!(expected, b_range[values_start + 6]); + expected += (alpha - Felt::new(256)).inv(); + assert_eq!(expected, b_range[values_start + 5]); // --- Check the last value of the b_range column is one. ------------------------------------------ @@ -75,7 +71,6 @@ fn b_range_trace_stack() { /// The `LoadW` memory operation results in 2 16-bit range checks of 0, 0. #[test] #[allow(clippy::needless_range_loop)] -#[ignore = "update required"] fn b_range_trace_mem() { let stack = [0, 1, 2, 3, 4, 0]; let operations = vec![ @@ -98,16 +93,15 @@ fn b_range_trace_mem() { // The memory section of the chiplets trace starts after the span hash. let memory_start = HASH_CYCLE_LEN; - // 41 rows are needed for 0, 0, 3, 4, ... 36 bridge additional bridge rows of powers of - // 3 ..., 65535. (0 is range-checked in 2 rows for a total of 3 lookups. Four is range - // checked in one row for a total of one lookup. 65535 is the max, and the rest are "bridge" + // 40 rows are needed for 0, 3, 4, ... 36 bridge additional bridge rows of powers of + // 3 ..., 65535. (0 and 4 are both range-checked. 65535 is the max, and the rest are "bridge" // values.) An extra row is added to pad the u16::MAX value. - let len_16bit = 41 + 1; + let len_16bit = 40 + 1; let values_start = trace.length() - len_16bit - NUM_RAND_ROWS; // The value should start at ONE and be unchanged until the memory processor section begins. let mut expected = ONE; - for row in 0..=memory_start { + for row in 0..memory_start { assert_eq!(expected, b_range[row]); } @@ -121,31 +115,33 @@ fn b_range_trace_mem() { let (d0_load, d1_load) = (Felt::new(4), ZERO); // Include the lookups from the `MStoreW` operation at the next row. - expected *= ((d0_store + alpha) * (d1_store + alpha)).inv(); + expected -= (alpha - d0_store).inv() + (alpha - d1_store).inv(); assert_eq!(expected, b_range[memory_start + 1]); // Include the lookup from the `MLoadW` operation at the next row. - expected *= ((d0_load + alpha) * (d1_load + alpha)).inv(); + expected -= (alpha - d0_load).inv() + (alpha - d1_load).inv(); assert_eq!(expected, b_range[memory_start + 2]); + // The value should be unchanged until the range checker's lookups are included. + for row in memory_start + 2..=values_start { + assert_eq!(expected, b_range[row]); + } + // --- Check the range checker's lookups. ----------------------------------------------------- - // We include 2 lookups of ZERO in the next row. - expected *= alpha.square(); + // We include 3 lookups of ZERO in the next row. + expected += alpha.inv().mul_base(Felt::new(3)); assert_eq!(expected, b_range[values_start + 1]); - // We include 1 more lookup of ZERO in the next row. - expected *= d0_store + alpha; - assert_eq!(expected, b_range[values_start + 2]); // then we have one bridge row between 0 and 4 where the value does not change. - assert_eq!(expected, b_range[values_start + 3]); + assert_eq!(expected, b_range[values_start + 2]); // We include 1 lookup of 4 in the next row. - expected *= d0_load + alpha; - assert_eq!(expected, b_range[values_start + 4]); + expected += (alpha - d0_load).inv(); + assert_eq!(expected, b_range[values_start + 3]); // --- The value should now be ONE for the rest of the trace. --------------------------------- assert_eq!(expected, ONE); - for i in (values_start + 4)..(b_range.len() - NUM_RAND_ROWS) { + for i in (values_start + 3)..(b_range.len() - NUM_RAND_ROWS) { assert_eq!(ONE, b_range[i]); } } From 382ff12f638dd94bdeafd1adaf37601c5a3eb77d Mon Sep 17 00:00:00 2001 From: grjte Date: Fri, 28 Jul 2023 20:01:51 -0400 Subject: [PATCH 051/120] feat(proc): optimize range checker aux trace generation --- processor/src/range/aux_trace.rs | 78 +++++++++++++++++++++++++------- processor/src/range/mod.rs | 23 ++++++---- 2 files changed, 76 insertions(+), 25 deletions(-) diff --git a/processor/src/range/aux_trace.rs b/processor/src/range/aux_trace.rs index 415689e7e0..a0d9c258bd 100644 --- a/processor/src/range/aux_trace.rs +++ b/processor/src/range/aux_trace.rs @@ -1,5 +1,6 @@ use super::{uninit_vector, BTreeMap, ColMatrix, Felt, FieldElement, Vec, NUM_RAND_ROWS}; use miden_air::trace::range::{M_COL_IDX, V_COL_IDX}; +use vm_core::StarkField; // AUXILIARY TRACE BUILDER // ================================================================================================ @@ -7,9 +8,11 @@ use miden_air::trace::range::{M_COL_IDX, V_COL_IDX}; /// Describes how to construct the execution trace of columns related to the range checker in the /// auxiliary segment of the trace. These are used in multiset checks. pub struct AuxTraceBuilder { + /// A list of the unique values for which range checks are performed. + lookup_values: Vec, /// Range check lookups performed by all user operations, grouped and sorted by the clock cycle /// at which they are requested. - cycle_range_checks: BTreeMap>, + cycle_lookups: BTreeMap>, // The index of the first row of Range Checker's trace when the padded rows end and values to // be range checked start. values_start: usize, @@ -18,9 +21,14 @@ pub struct AuxTraceBuilder { impl AuxTraceBuilder { // CONSTRUCTOR // -------------------------------------------------------------------------------------------- - pub fn new(cycle_range_checks: BTreeMap>, values_start: usize) -> Self { + pub fn new( + lookup_values: Vec, + cycle_lookups: BTreeMap>, + values_start: usize, + ) -> Self { Self { - cycle_range_checks, + lookup_values, + cycle_lookups, values_start, } } @@ -46,12 +54,10 @@ impl AuxTraceBuilder { fn build_aux_col_b_range>( &self, main_trace: &ColMatrix, - alphas: &[E], + rand_elements: &[E], ) -> Vec { - // TODO: replace this with an efficient solution - // // compute the inverses for range checks performed by operations. - // let (_, inv_row_values) = - // build_lookup_table_row_values(&self.cycle_range_check_values(), main_trace, alphas); + // run batch inversion on the lookup values + let divisors = get_divisors(&self.lookup_values, rand_elements[0]); // allocate memory for the running sum column and set the initial value to ONE let mut b_range = unsafe { uninit_vector(main_trace.num_rows()) }; @@ -62,7 +68,7 @@ impl AuxTraceBuilder { let mut b_range_idx = 0_usize; // the first half of the trace only includes values from the operations. - for (clk, range_checks) in self.cycle_range_checks.range(0..self.values_start as u32) { + for (clk, range_checks) in self.cycle_lookups.range(0..self.values_start as u32) { let clk = *clk as usize; // if we skipped some cycles since the last update was processed, values in the last @@ -78,8 +84,8 @@ impl AuxTraceBuilder { b_range[b_range_idx] = b_range[clk]; // include the operation lookups for lookup in range_checks.iter() { - let value = (alphas[0] - (*lookup).into()).inv(); - b_range[b_range_idx] -= value; + let value = divisors.get(lookup).expect("invalid lookup value {}"); + b_range[b_range_idx] -= *value; } } @@ -103,14 +109,19 @@ impl AuxTraceBuilder { { b_range_idx = row_idx + 1; - // add the value in the range checker: multiplicity / (alpha - lookup) - let lookup_val = (alphas[0] - (*lookup).into()).inv().mul_base(*multiplicity); - b_range[b_range_idx] = b_range[row_idx] + lookup_val; + if multiplicity.as_int() != 0 { + // add the value in the range checker: multiplicity / (alpha - lookup) + let value = divisors.get(&(lookup.as_int() as u16)).expect("invalid lookup value"); + b_range[b_range_idx] = b_range[row_idx] + value.mul_base(*multiplicity); + } else { + b_range[b_range_idx] = b_range[row_idx]; + } + // subtract the range checks requested by operations - if let Some(range_checks) = self.cycle_range_checks.get(&(row_idx as u32)) { + if let Some(range_checks) = self.cycle_lookups.get(&(row_idx as u32)) { for lookup in range_checks.iter() { - let value = (alphas[0] - (*lookup).into()).inv(); - b_range[b_range_idx] -= value; + let value = divisors.get(lookup).expect("invalid lookup value"); + b_range[b_range_idx] -= *value; } } } @@ -126,3 +137,36 @@ impl AuxTraceBuilder { b_range } } + +/// Runs batch inversion on all range check lookup values and returns a map which maps of each value +/// to the divisor used for including it in the LogUp lookup. In other words, the map contains +/// mappings of x to 1/(alpha - x). +fn get_divisors>( + lookup_values: &[u16], + alpha: E, +) -> BTreeMap { + // run batch inversion on the lookup values + let mut values = unsafe { uninit_vector(lookup_values.len()) }; + let mut inv_values = unsafe { uninit_vector(lookup_values.len()) }; + let mut log_values = BTreeMap::new(); + + let mut acc = E::ONE; + for (i, (value, inv_value)) in values.iter_mut().zip(inv_values.iter_mut()).enumerate() { + *inv_value = acc; + *value = alpha - E::from(lookup_values[i]); + acc *= *value; + } + + // invert the accumulated product + acc = acc.inv(); + + // multiply the accumulated product by the original values to compute the inverses, then + // build a map of inverses for the lookup values + for i in (0..lookup_values.len()).rev() { + inv_values[i] *= acc; + acc *= values[i]; + log_values.insert(lookup_values[i], inv_values[i]); + } + + log_values +} diff --git a/processor/src/range/mod.rs b/processor/src/range/mod.rs index d0794180bc..b22b2169a8 100644 --- a/processor/src/range/mod.rs +++ b/processor/src/range/mod.rs @@ -43,7 +43,7 @@ pub struct RangeChecker { /// Range check lookups performed by all user operations, grouped and sorted by clock cycle. /// Each cycle is mapped to a vector of the range checks requested at that cycle, which can come /// from the stack, memory, or both. - cycle_range_checks: BTreeMap>, + cycle_lookups: BTreeMap>, } impl RangeChecker { @@ -58,7 +58,7 @@ impl RangeChecker { lookups.insert(u16::MAX, 0); Self { lookups, - cycle_range_checks: BTreeMap::new(), + cycle_lookups: BTreeMap::new(), } } @@ -76,18 +76,21 @@ impl RangeChecker { // 4 lookups respectively. debug_assert!(values.len() == 2 || values.len() == 4); - let mut requests = Vec::new(); for value in values.iter() { // add the specified value to the trace of this range checker's lookups. self.add_value(*value); - requests.push(Felt::from(*value)); } // track the range check requests at each cycle - self.cycle_range_checks + // TODO: optimize this to use a struct instead of vectors, e.g.: + // struct MemoryLookupValues { + // num_lookups: u8, + // lookup_values: [u16; 6], + // } + self.cycle_lookups .entry(clk) - .and_modify(|entry| entry.append(&mut requests)) - .or_insert_with(|| requests); + .and_modify(|entry| entry.append(&mut values.to_vec())) + .or_insert_with(|| values.to_vec()); } // EXECUTION TRACE GENERATION (INTERNAL) @@ -145,7 +148,11 @@ impl RangeChecker { RangeCheckTrace { trace, - aux_builder: AuxTraceBuilder::new(self.cycle_range_checks, num_padding_rows), + aux_builder: AuxTraceBuilder::new( + self.lookups.keys().cloned().collect(), + self.cycle_lookups, + num_padding_rows, + ), } } From 2aaeb4042b2d87151466be492f935866fbfd7c35 Mon Sep 17 00:00:00 2001 From: grjte Date: Mon, 7 Aug 2023 09:40:28 -0400 Subject: [PATCH 052/120] docs: update changelog for range checker logup migration --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index da570a2677..0311a9e05a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). +- Migrated range checker lookups to use LogUp and reduced the number of trace columns to 2 main and + 1 auxiliary (#1027). - Added `get_mapped_values()` and `get_store_subset()` methods to the `AdviceProvider` trait (#987). - [BREAKING] Added options to specify maximum number of cycles and expected number of cycles for a program (#998). - Improved handling of invalid/incomplete parameters in `StackOutputs` constructors (#1010). From a2a33284529238281e3df433aacd5ea2ac616228 Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Wed, 9 Aug 2023 01:09:02 +0200 Subject: [PATCH 053/120] feat(stdlib): Change prepare_message_schedule_and_consume from being exported to internal --- stdlib/asm/crypto/hashes/sha256.masm | 2 +- stdlib/docs/crypto/hashes/sha256.md | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/stdlib/asm/crypto/hashes/sha256.masm b/stdlib/asm/crypto/hashes/sha256.masm index 1c8fd90cab..197d966aee 100644 --- a/stdlib/asm/crypto/hashes/sha256.masm +++ b/stdlib/asm/crypto/hashes/sha256.masm @@ -233,7 +233,7 @@ end #! - msg0 through msg15 are the 64 -bytes input message (in terms of 16 SHA256 words) #! See https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2.hpp#L89-L113 #! & https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2_256.hpp#L148-L187 ( loop body execution ) -export.prepare_message_schedule_and_consume.4 +proc.prepare_message_schedule_and_consume.4 loc_storew.0 loc_storew.2 dropw diff --git a/stdlib/docs/crypto/hashes/sha256.md b/stdlib/docs/crypto/hashes/sha256.md index e45dd6359b..edea4a9727 100644 --- a/stdlib/docs/crypto/hashes/sha256.md +++ b/stdlib/docs/crypto/hashes/sha256.md @@ -2,7 +2,6 @@ ## std::crypto::hashes::sha256 | Procedure | Description | | ----------- | ------------- | -| prepare_message_schedule_and_consume | Computes whole message schedule of 64 message words and consumes them into hash state.

      Input: [state0, state1, state2, state3, state4, state5, state6, state7, msg0, msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9, msg10, msg11, msg12, msg13, msg14, msg15]

      Output: [state0', state1', state2', state3', state4', state5', state6', state7']

      Where:

      - state0 through state7 are the hash state (in terms of 8 SHA256 words)

      - msg0 through msg15 are the 64 -bytes input message (in terms of 16 SHA256 words)

      See https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2.hpp#L89-L113

      & https://github.com/itzmeanjan/merklize-sha/blob/8a2c006/include/sha2_256.hpp#L148-L187 ( loop body execution ) | | hash_2to1 | Given 64 -bytes input, this routine computes 32 -bytes SHA256 digest

      Input: [m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...]

      Where: m[0,16) = 32 -bit word

      Note, each SHA256 word is 32 -bit wide, so that's how input is expected.

      As you've 64 -bytes, consider packing 4 consecutive bytes into single word,

      maintaining big endian byte order.

      SHA256 digest is represented in terms of eight 32 -bit words ( big endian byte order ). | | hash_1to1 | Given 32 -bytes input, this routine computes 32 -bytes SHA256 digest

      Expected stack state:

      Input: [m0, m1, m2, m3, m4, m5, m6, m7, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...]

      Where: m[0,8) = 32 -bit word

      Note, each SHA256 word is 32 -bit wide, so that's how input is expected.

      As you've 32 -bytes, consider packing 4 consecutive bytes into single word,

      maintaining big endian byte order.

      SHA256 digest is represented in terms of eight 32 -bit words ( big endian byte order ). | | hash_memory | Given a memory address and a message length in bytes, compute its sha256 digest

      - There must be space for writing the padding after the message in memory

      - The padding space after the message must be all zeros before this procedure is called

      Input: [addr, len, ...]

      Output: [dig0, dig1, dig2, dig3, dig4, dig5, dig6, dig7, ...] | From 631e663f24c1ceb1e0f08ac5d358ebdadd859666 Mon Sep 17 00:00:00 2001 From: Tobias Bergkvist Date: Wed, 9 Aug 2023 01:58:41 +0200 Subject: [PATCH 054/120] feat(stdlib): Add test for sha256::hash_memory --- stdlib/tests/crypto/sha256.rs | 62 ++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/stdlib/tests/crypto/sha256.rs b/stdlib/tests/crypto/sha256.rs index 166d4ce83d..07c8028483 100644 --- a/stdlib/tests/crypto/sha256.rs +++ b/stdlib/tests/crypto/sha256.rs @@ -1,6 +1,66 @@ use crate::build_test; use sha2::{Digest, Sha256}; -use test_utils::{group_slice_elements, rand::rand_array, Felt, IntoBytes}; +use test_utils::{ + group_slice_elements, + rand::{rand_array, rand_value, rand_vector}, + Felt, IntoBytes, +}; + +#[test] +fn sha256_hash_memory() { + let source = " + use.std::crypto::hashes::sha256 + + begin + # mem.0 - input data address + push.10000 mem_store.0 + + # mem.1 - length in bytes + mem_store.1 + + # mem.2 - length in felts + mem_load.1 u32checked_add.3 u32checked_div.4 mem_store.2 + + # Load input data into memory address 10000, 10001, ... + mem_load.2 u32checked_neq.0 + while.true + mem_load.0 mem_storew dropw + mem_load.0 u32checked_add.1 mem_store.0 + mem_load.2 u32checked_sub.1 dup mem_store.2 u32checked_neq.0 + end + + # Compute hash of memory address 10000, 10001, ... + mem_load.1 + push.10000 + exec.sha256::hash_memory + end"; + + let length = rand_value::() & 1023; // length: 0-1023 + let ibytes: Vec = rand_vector(length as usize); + let ipadding: Vec = vec![0; (4 - (length as usize % 4)) % 4]; + + let ifelts = [ + group_slice_elements::(&[ibytes.clone(), ipadding].concat()) + .iter() + .map(|&bytes| u32::from_be_bytes(bytes) as u64) + .rev() + .collect::>(), + vec![length as u64; 1], + ] + .concat(); + + let mut hasher = Sha256::new(); + hasher.update(ibytes); + + let obytes = hasher.finalize(); + let ofelts = group_slice_elements::(&obytes) + .iter() + .map(|&bytes| u32::from_be_bytes(bytes) as u64) + .collect::>(); + + let test = build_test!(source, &ifelts); + test.expect_stack(&ofelts); +} #[test] fn sha256_2_to_1_hash() { From 5b3b93b65cd8a422c30217596f32ea45db629c74 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Thu, 1 Jun 2023 01:59:11 -0700 Subject: [PATCH 055/120] feat: implementing updates and simple insertions into TSMT --- assembly/src/ast/nodes/advice.rs | 22 +- assembly/src/ast/parsers/adv_ops.rs | 4 + core/src/operations/decorators/advice.rs | 2 +- .../src/decorators/adv_stack_injectors.rs | 114 +++++ processor/src/decorators/mod.rs | 2 +- processor/src/decorators/tests.rs | 80 ++-- stdlib/asm/collections/smt.masm | 419 +++++++++++++++++- stdlib/docs/collections/smt.md | 3 +- stdlib/tests/collections/smt.rs | 151 ++++++- test-utils/src/crypto.rs | 12 +- 10 files changed, 745 insertions(+), 64 deletions(-) diff --git a/assembly/src/ast/nodes/advice.rs b/assembly/src/ast/nodes/advice.rs index 413fc31bd5..00d054da9e 100644 --- a/assembly/src/ast/nodes/advice.rs +++ b/assembly/src/ast/nodes/advice.rs @@ -18,6 +18,7 @@ pub enum AdviceInjectorNode { PushU64div, PushExt2intt, PushSmtGet, + PushSmtInsert, PushMapVal, PushMapValImm { offset: u8 }, PushMapValN, @@ -35,6 +36,7 @@ impl From<&AdviceInjectorNode> for AdviceInjector { PushU64div => Self::DivU64, PushExt2intt => Self::Ext2Intt, PushSmtGet => Self::SmtGet, + PushSmtInsert => Self::SmtInsert, PushMapVal => Self::MapValueToStack { include_len: false, key_offset: 0, @@ -68,6 +70,7 @@ impl fmt::Display for AdviceInjectorNode { PushU64div => write!(f, "push_u64div"), PushExt2intt => write!(f, "push_ext2intt"), PushSmtGet => write!(f, "push_smtget"), + PushSmtInsert => write!(f, "push_smtinsert"), PushMapVal => write!(f, "push_mapval"), PushMapValImm { offset } => write!(f, "push_mapval.{offset}"), PushMapValN => write!(f, "push_mapvaln"), @@ -86,14 +89,15 @@ impl fmt::Display for AdviceInjectorNode { const PUSH_U64DIV: u8 = 0; const PUSH_EXT2INTT: u8 = 1; const PUSH_SMTGET: u8 = 2; -const PUSH_MAPVAL: u8 = 3; -const PUSH_MAPVAL_IMM: u8 = 4; -const PUSH_MAPVALN: u8 = 5; -const PUSH_MAPVALN_IMM: u8 = 6; -const PUSH_MTNODE: u8 = 7; -const INSERT_MEM: u8 = 8; -const INSERT_HDWORD: u8 = 9; -const INSERT_HDWORD_IMM: u8 = 10; +const PUSH_SMTINSERT: u8 = 3; +const PUSH_MAPVAL: u8 = 4; +const PUSH_MAPVAL_IMM: u8 = 5; +const PUSH_MAPVALN: u8 = 6; +const PUSH_MAPVALN_IMM: u8 = 7; +const PUSH_MTNODE: u8 = 8; +const INSERT_MEM: u8 = 9; +const INSERT_HDWORD: u8 = 10; +const INSERT_HDWORD_IMM: u8 = 11; impl Serializable for AdviceInjectorNode { fn write_into(&self, target: &mut W) { @@ -102,6 +106,7 @@ impl Serializable for AdviceInjectorNode { PushU64div => target.write_u8(PUSH_U64DIV), PushExt2intt => target.write_u8(PUSH_EXT2INTT), PushSmtGet => target.write_u8(PUSH_SMTGET), + PushSmtInsert => target.write_u8(PUSH_SMTINSERT), PushMapVal => target.write_u8(PUSH_MAPVAL), PushMapValImm { offset } => { target.write_u8(PUSH_MAPVAL_IMM); @@ -129,6 +134,7 @@ impl Deserializable for AdviceInjectorNode { PUSH_U64DIV => Ok(AdviceInjectorNode::PushU64div), PUSH_EXT2INTT => Ok(AdviceInjectorNode::PushExt2intt), PUSH_SMTGET => Ok(AdviceInjectorNode::PushSmtGet), + PUSH_SMTINSERT => Ok(AdviceInjectorNode::PushSmtInsert), PUSH_MAPVAL => Ok(AdviceInjectorNode::PushMapVal), PUSH_MAPVAL_IMM => { let offset = source.read_u8()?; diff --git a/assembly/src/ast/parsers/adv_ops.rs b/assembly/src/ast/parsers/adv_ops.rs index 4c7042484d..1393796a05 100644 --- a/assembly/src/ast/parsers/adv_ops.rs +++ b/assembly/src/ast/parsers/adv_ops.rs @@ -33,6 +33,10 @@ pub fn parse_adv_inject(op: &Token) -> Result { 2 => AdvInject(PushSmtGet), _ => return Err(ParsingError::extra_param(op)), }, + "push_smtinsert" => match op.num_parts() { + 2 => AdvInject(PushSmtInsert), + _ => return Err(ParsingError::extra_param(op)), + }, "push_mapval" => match op.num_parts() { 2 => AdvInject(PushMapVal), 3 => { diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index c939cdbc80..d87ec83219 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -181,7 +181,7 @@ pub enum AdviceInjector { /// Where KEY is computed as hash(A || B, domain), where domain is provided via the immediate /// value. HdwordToMap { domain: Felt }, - + /// TODO: add docs SmtInsert, } diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors.rs index 1d9a2e6f2d..ec0f0ae8ca 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors.rs @@ -338,6 +338,120 @@ where Ok(()) } + + /// Pushes values onto the advice stack which are required for successful insertion of a + /// key-value pair into a Sparse Merkle Tree data structure. + /// + /// The Sparse Merkle Tree is tiered, meaning it will have leaf depths in `{16, 32, 48, 64}`. + /// + /// Inputs: + /// Operand stack: [VALUE, KEY, ROOT, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [OLD_VALUE, NEW_ROOT, ...] + /// Advice stack, depends on the type of insert: + /// - Simple insert at depth 16: [d0, d1, ONE (is_simple_insert), ZERO (is_update)] + /// - Simple insert at depth 32 or 48: [d0, d1, ONE (is_simple_insert), ZERO (is_update), P_NODE] + /// - Update of an existing leaf: [ZERO (padding), d0, d1, ONE (is_update), OLD_VALUE] + /// + /// Where: + /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. + /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. + /// - P_NODE is an internal node located at the tier above the insert tier. + /// - VALUE is the value to be inserted. + /// - OLD_VALUE is the value previously associated with the specified KEY. + /// - ROOT and NEW_ROOT are the roots of the TSMT prior and post the insert respectively. + /// + /// # Errors + /// Will return an error if the provided Merkle root doesn't exist on the advice provider. + /// + /// # Panics + /// Will panic as unimplemented if the target depth is `64`. + pub(super) fn push_smtinsert_inputs(&mut self) -> Result<(), ExecutionError> { + // get the key and tree root from the stack + let key = [self.stack.get(7), self.stack.get(6), self.stack.get(5), self.stack.get(4)]; + let root = [self.stack.get(11), self.stack.get(10), self.stack.get(9), self.stack.get(8)]; + + // determine the depth of the first leaf or an empty tree node + let index = &key[3]; + let depth = self.advice_provider.get_leaf_depth(root, &SMT_MAX_TREE_DEPTH, index)?; + debug_assert!(depth < 65); + + // map the depth value to its tier; this rounds up depth to 16, 32, 48, or 64 + let depth = SMT_NORMALIZED_DEPTHS[depth as usize]; + if depth == 64 { + unimplemented!("handling of depth=64 tier hasn't been implemented yet"); + } + + // get the value of the node a this index/depth + let index = index.as_int() >> (64 - depth); + let index = Felt::new(index); + let node = self.advice_provider.get_tree_node(root, &Felt::new(depth as u64), &index)?; + + // figure out what kind of insert we are doing; possible options are: + // - if the node is a root of an empty subtree, this is a simple insert. + // - if the node is a leaf, this could be either an update (for the same key), or a + // complex insert (i.e., the existing leaf needs to be moved to a lower tier). + let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; + let (is_update, is_simple_insert) = if node == Word::from(empty) { + // handle simple insert case + if depth == 32 || depth == 48 { + // for depth 32 and 48, we need to provide the internal node located on the tier + // above the insert tier + let p_index = Felt::from(index.as_int() >> 16); + let p_depth = Felt::from(depth - 16); + let p_node = self.advice_provider.get_tree_node(root, &p_depth, &p_index)?; + for &element in p_node.iter().rev() { + self.advice_provider.push_stack(AdviceSource::Value(element))?; + } + } + + // return is_update = ZERO, is_simple_insert = ONE + (ZERO, ONE) + } else { + // if the node is a leaf node, push the elements mapped to this node onto the advice + // stack; the elements should be [KEY, VALUE], with key located at the top of the + // advice stack. + self.advice_provider.push_stack(AdviceSource::Map { + key: node, + include_len: false, + })?; + + // remove the KEY from the advice stack, leaving only the VALUE on the stack + let leaf_key = self.advice_provider.pop_stack_word()?; + + // if the key for the value to be inserted is the same as the leaf's key, we are + // dealing with a simple update. otherwise, we are dealing with a complex insert + // (i.e., the leaf needs to be moved to a lower tier). + if leaf_key == key { + // return is_update = ONE, is_simple_insert = ZERO + (ONE, ZERO) + } else { + // return is_update = ZERO, is_simple_insert = ZERO + (ZERO, ZERO) + } + }; + + // set the flags used to determine which tier the insert is happening at + let is_16_or_32 = if depth == 16 || depth == 32 { ONE } else { ZERO }; + let is_16_or_48 = if depth == 16 || depth == 48 { ONE } else { ZERO }; + + self.advice_provider.push_stack(AdviceSource::Value(is_update))?; + if is_update == ONE { + // for update we don't need to specify whether we are dealing with an insert; but we + // insert an extra ONE at the end so that we can read 4 values from the advice stack + // regardless of which branch is taken. + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + } else { + self.advice_provider.push_stack(AdviceSource::Value(is_simple_insert))?; + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + } + Ok(()) + } } // HELPER FUNCTIONS diff --git a/processor/src/decorators/mod.rs b/processor/src/decorators/mod.rs index 25c7a28580..811f53b712 100644 --- a/processor/src/decorators/mod.rs +++ b/processor/src/decorators/mod.rs @@ -45,7 +45,7 @@ where AdviceInjector::Ext2Inv => self.push_ext2_inv_result(), AdviceInjector::Ext2Intt => self.push_ext2_intt_result(), AdviceInjector::SmtGet => self.push_smtget_inputs(), - AdviceInjector::SmtInsert => todo!(), + AdviceInjector::SmtInsert => self.push_smtinsert_inputs(), AdviceInjector::MemToMap => self.insert_mem_values_into_adv_map(), AdviceInjector::HdwordToMap { domain } => self.insert_hdword_into_adv_map(*domain), } diff --git a/processor/src/decorators/tests.rs b/processor/src/decorators/tests.rs index 4b9848f1b1..6cccdd8eb5 100644 --- a/processor/src/decorators/tests.rs +++ b/processor/src/decorators/tests.rs @@ -3,7 +3,7 @@ use super::{ Process, }; use crate::{MemAdviceProvider, StackInputs, Word}; -use test_utils::{crypto::get_smt_remaining_key, rand::seeded_word}; +use test_utils::rand::seeded_word; use vm_core::{ crypto::{ hash::{Rpo256, RpoDigest}, @@ -74,13 +74,10 @@ fn push_smtget() { // check leaves on empty trees for depth in [16, 32, 48] { - // compute the remaining key - let remaining = get_smt_remaining_key(key, depth); - // compute node value let depth_element = Felt::from(depth); let store = MerkleStore::new(); - let node = Rpo256::merge_in_domain(&[remaining.into(), value.into()], depth_element); + let node = Rpo256::merge_in_domain(&[key.into(), value.into()], depth_element); // expect absent value with constant depth 16 let expected = [ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ONE, ONE]; @@ -89,9 +86,6 @@ fn push_smtget() { // check leaves inserted on all tiers for depth in [16, 32, 48] { - // compute the remaining key - let remaining = get_smt_remaining_key(key, depth); - // set depth flags let is_16_or_32 = (depth == 16 || depth == 32).then_some(ONE).unwrap_or(ZERO); let is_16_or_48 = (depth == 16 || depth == 48).then_some(ONE).unwrap_or(ZERO); @@ -100,7 +94,7 @@ fn push_smtget() { let index = key[3].as_int() >> 64 - depth; let index = NodeIndex::new(depth, index).unwrap(); let depth_element = Felt::from(depth); - let node = Rpo256::merge_in_domain(&[remaining.into(), value.into()], depth_element); + let node = Rpo256::merge_in_domain(&[key.into(), value.into()], depth_element); // set tier node value and expect the value from the injector let mut store = MerkleStore::new(); @@ -111,10 +105,10 @@ fn push_smtget() { value[2], value[1], value[0], - remaining[3], - remaining[2], - remaining[1], - remaining[0], + key[3], + key[2], + key[1], + key[0], is_16_or_32, is_16_or_48, ]; @@ -158,23 +152,41 @@ fn inject_smtinsert() { let raw_a = 0b_01101001_01101100_00011111_11111111_10010110_10010011_11100000_00000000_u64; let key_a = build_key(raw_a); - let val_a = [ONE, ZERO, ZERO, ZERO]; - - // insertion should happen at depth 16 and thus 16_or_32 and 16_or_48 flags should be set to ONE; - // since we are replacing a node which is an empty subtree, the is_empty flag should also be ONE - let expected_stack = [ONE, ONE, ONE]; - let process = prepare_smt_insert(key_a, val_a, &smt, expected_stack.len()); + let val_a = [Felt::new(3), Felt::new(5), Felt::new(7), Felt::new(9)]; + + // this is a simple insertion at depth 16, and thus the flags should look as follows: + let is_update = ZERO; + let is_simple_insert = ONE; + let is_16_or_32 = ONE; + let is_16_or_48 = ONE; + let expected_stack = [is_update, is_simple_insert, is_16_or_32, is_16_or_48]; + let process = prepare_smt_insert(key_a, val_a, &smt, expected_stack.len(), Vec::new()); assert_eq!(build_expected(&expected_stack), process.stack.trace_state()); // --- update same key with different value ------------------------------- + // insert val_a into the tree so that val_b overwrites it + smt.insert(key_a.into(), val_a); let val_b = [ONE, ONE, ZERO, ZERO]; - smt.insert(key_a.into(), val_b); - // we are updating a node at depth 16 and thus 16_or_32 and 16_or_48 flags should be set to ONE; - // since we are updating an existing leaf, the is_empty flag should be set to ZERO - let expected_stack = [ZERO, ONE, ONE]; - let process = prepare_smt_insert(key_a, val_b, &smt, expected_stack.len()); + // this is a simple update, and thus the flags should look as follows: + let is_update = ONE; + let is_16_or_32 = ONE; + let is_16_or_48 = ONE; + + // also, the old value should be present in the advice stack: + let expected_stack = [ + val_a[3], + val_a[2], + val_a[1], + val_a[0], + is_update, + is_16_or_32, + is_16_or_48, + ZERO, + ]; + let adv_map = vec![build_adv_map_entry(key_a, val_a, 16)]; + let process = prepare_smt_insert(key_a, val_b, &smt, expected_stack.len(), adv_map); assert_eq!(build_expected(&expected_stack), process.stack.trace_state()); } @@ -183,12 +195,13 @@ fn prepare_smt_insert( value: Word, smt: &TieredSmt, adv_stack_depth: usize, + adv_map: Vec<([u8; 32], Vec)>, ) -> Process { let root: Word = smt.root().into(); let store = MerkleStore::from(smt); let stack_inputs = build_stack_inputs(value, key, root); - let advice_inputs = AdviceInputs::default().with_merkle_store(store); + let advice_inputs = AdviceInputs::default().with_merkle_store(store).with_map(adv_map); let mut process = build_process(stack_inputs, advice_inputs); process.execute_op(Operation::Noop).unwrap(); @@ -217,7 +230,7 @@ fn build_expected(values: &[Felt]) -> [Felt; 16] { } fn assert_case_smtget( - depth: u8, + _depth: u8, key: Word, value: Word, node: RpoDigest, @@ -226,9 +239,8 @@ fn assert_case_smtget( expected_stack: &[Felt], ) { // build the process - let stack_inputs = build_stack_inputs(key, root, Word::default()); - let remaining = get_smt_remaining_key(key, depth); - let mapped = remaining.into_iter().chain(value.into_iter()).collect(); + let stack_inputs = build_stack_inputs(key, root.into(), Word::default()); + let mapped = key.into_iter().chain(value.into_iter()).collect(); let advice_inputs = AdviceInputs::default() .with_merkle_store(store) .with_map([(node.into_bytes(), mapped)]); @@ -251,7 +263,7 @@ fn build_process( adv_inputs: AdviceInputs, ) -> Process { let advice_provider = MemAdviceProvider::from(adv_inputs); - Process::new(Kernel::default(), stack_inputs, advice_provider) + Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()) } fn build_stack_inputs(w0: Word, w1: Word, w2: Word) -> StackInputs { @@ -288,3 +300,11 @@ fn move_adv_to_stack(process: &mut Process, adv_stack_depth: process.execute_op(Operation::AdvPop).unwrap(); } } + +fn build_adv_map_entry(key: Word, val: Word, depth: u8) -> ([u8; 32], Vec) { + let node = Rpo256::merge_in_domain(&[key.into(), val.into()], Felt::from(depth)); + let mut elements = Vec::new(); + elements.extend_from_slice(&key); + elements.extend_from_slice(&val); + (node.into(), elements) +} diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index b7f93a4112..96faca1fbe 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -16,6 +16,9 @@ const.EMPTY_48_1=5634734408638476525 const.EMPTY_48_2=9233115969432897632 const.EMPTY_48_3=1437907447409278328 +# HELPER METHODS +# ================================================================================================= + #! Extracts 16 most significant bits from the passed-in value. #! #! Input: [v, ...] @@ -28,6 +31,16 @@ proc.get_top_16_bits u32unchecked_shr.16 end +#! Extracts 32 most significant bits from the passed-in value. +#! +#! Input: [v, ...] +#! Output: [v >> 32, ...] +#! +#! Cycles: 3 +proc.get_top_32_bits + u32split swap drop +end + #! Extracts 48 most significant bits from the passed-in value. #! #! Input: [v, ...] @@ -43,13 +56,16 @@ proc.get_top_48_bits add end +# GET +# ================================================================================================= + #! Get the leaf value for depth 16. #! #! Input: [K, R, ...] #! Output: [V, R, ...] #! #! Cycles: 85 -proc.get16.2 +proc.get_16.2 # compute index of the node by extracting top 16 bits from the key (8 cycles) dup exec.get_top_16_bits movdn.4 # => [K, i, R, ...] @@ -123,7 +139,7 @@ end #! Output: [V, R, ...] #! #! Cycles: 81 -proc.get32.2 +proc.get_32.2 # compute index of the node by extracting top 16 bits from the key (4 cycles) dup u32split movdn.5 drop # => [K, i, R, ...] @@ -197,7 +213,7 @@ end #! Output: [V, R, ...] #! #! Cycles: 88 -proc.get48.2 +proc.get_48.2 # compute index of the node by extracting top 48 bits from the key (11 cycles) dup exec.get_top_48_bits movdn.4 # => [K, i, R, ...] @@ -275,6 +291,7 @@ end #! Depth 16: 91 cycles #! Depth 32: 87 cycles #! Depth 48: 94 cycles +#! Depth 64: unimplemented export.get # invoke adv and fetch target depth flags adv.push_smtget adv_push.2 @@ -284,15 +301,15 @@ export.get if.true if.true # depth 16 - exec.get16 + exec.get_16 else # depth 32 - exec.get32 + exec.get_32 end else if.true # depth 48 - exec.get48 + exec.get_48 else # depth 64 # currently not implemented @@ -301,3 +318,393 @@ export.get end # => [V, R, ...] end + +# INSERT +# ================================================================================================= + +#! Updates a leaf node at depths 16, 32, or 48. +#! +#! Input: [d, idx, V, K, R, ...]; +#! Output: [V_old, R_new, ...] +#! +#! Where: +#! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. +#! - d, idx are the depth and index (at that depth) of the leaf node to be updated. +#! - K, V are the key-value pair for the leaf node where V is a new value for key K. +#! - V_old is the value previously stored under key K. +#! +#! This procedure succeeds only if: +#! - Node to be replaced at (d, idx) is a leaf node for the same key K. +#! +#! Cycles: 101 +proc.update_16_32_48.2 + # save [idx, d, 0, 0] in loc[0] (5 cycles) + push.0.0 loc_storew.0 + # => [0, 0, d, idx, V, K, R, ...] + + # prepare the stack for computing N = hash([K, V], domain=d), and also save K into loc[1] + # (10 cycles) + movdn.3 movup.2 drop push.0 swapw.2 loc_storew.1 swapw + # => [V, K, 0, 0, d, 0, R, ...] + + # compute the hash of the node N = hash([K, V], domain=d) - (1 cycle) + hperm + # => [X, N, X, R, ...] + + # prepare the stack for the mtree_set operation (8 cycles) + swapw.3 swapw swapw.2 loc_loadw.0 drop drop + # => [d, idx, R, N, X, ...] + + # insert the new leaf node into the tree at the specified index/depth; this also leaves the + # previous value of the node on the stack (29 cycle) + mtree_set + # => [N_old, R_new, X, ...] + + # verify that N_old is a leaf node for the same key K + + # prepare the stack for computing E = hash([K, V_old], domain=d); value of V_old is read + # from the advice provider and is saved into loc[0] (21 cycles) + swapw.2 loc_loadw.0 movdn.3 push.0 movup.3 push.0.0.0 loc_loadw.1 adv_push.4 loc_storew.0 + # => [V_old, K, 0, 0, d, 0, R_new, N_old, ...] + + # compute E = hash([K, V_old], domain=d) + # (10 cycle) + hperm dropw swapw dropw + # => [E, R_new, N_old, ...] + + # make sure E and N_old are the same (14 cycles) + swapw swapw.2 + repeat.4 + dup.4 assert_eq + end + # => [E, R_new, ...] + + # load the old value (which we saved previously) onto the stack (3 cycles) + loc_loadw.0 + # => [V_old, R_new, ...] +end + +#! Inserts a new leaf node at depth 16. +#! +#! Input: [V, K, R, ...]; +#! Output:[0, 0, 0, 0, R_new, ...] +#! +#! Where: +#! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. +#! - K and V is the key-value pair for the leaf node to be inserted. +#! +#! This procedure succeeds only if: +#! - Node to be replaced at depth 16 is a root of an empty subtree. +#! +#! Cycles: 73 +proc.insert_16 + # extract 16-bit index from the key (8 cycles) + swapw dup exec.get_top_16_bits + # => [idx, K, V, R, ...] + + # prepare the stack for computing leaf node value (6 cycles) + movdn.8 push.0.16.0.0 swapw.2 + # => [V, K, 0, 0, 16, 0, idx, R, ...] + + # compute leaf node value as N = hash([K, V], domain=16) (10 cycles) + hperm dropw swapw dropw + # => [N, idx, R, ...] + + # prepare the stack for mtree_set operation (4 cycles) + swapw movup.8 movdn.4 push.16 + # => [16, idx, R, N, ...] + + # insert the node into the tree at depth 16; this also leaves the old value of the node on the + # stack (29 cycle) + mtree_set + # => [N_old, R_new, ...] + + # verify that the old value of the node was a root of an empty subtree for depth 16 (12 cycles) + push.EMPTY_16_3 assert_eq + push.EMPTY_16_2 assert_eq + push.EMPTY_16_1 assert_eq + push.EMPTY_16_0 assert_eq + + # put the return value onto the stack and return (4 cycles) + padw + # => [0, 0, 0, 0, R_new, ...] +end + +#! Inserts a new leaf node at depth 32. +#! +#! Input: [V, K, R, ...]; +#! Output:[0, 0, 0, 0, R_new, ...] +#! +#! Where: +#! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. +#! - K, V is the key-value pair for the leaf node to be inserted into the TSMT. +#! +#! This procedure consists of two high-level steps: +#! - First, insert N = hash([K, V], domain=32) into a subtree with root P, where P is the +#! internal node at depth 16 on the path to the new leaf node. This outputs the new root +#! of the subtree P_new. +#! - Then, insert P_new into the TSMT with root R. +#! +#! We do this to minimize the number of hashes consumed by the procedure for Merkle path +#! verification. Specifically, Merkle path verification will require exactly 64 hashes. +#! +#! This procedure succeeds only if: +#! - Node at depth 16 is an internal node. +#! - Node at depth 32 is a root of an empty subtree. +#! +#! Cycles: 154 +proc.insert_32.2 + # load the value of P from the advice provider (5 cycles) + adv_push.4 swapw.2 + # => [K, V, P, R, ...] + + # save k3 into loc[0][0] (4 cycles) + dup loc_store.0 + # => [K, V, P, R, ...] + + # prepare the stack for computing N = hash([K, V], domain=32) - (5 cycles) + push.0.32.0.0 swapw.2 + # => [V, K, 0, 0, 32, 0, P, R, ...] + + # compute N = hash([K, V], domain=32) (1 cycle) + hperm + # => [X, N, X, P, R, ...] + + # save P into loc[1] to be used later (5 cycles) + swapw.3 loc_storew.1 + # => [P, N, X, X, R, ...] + + # make sure P is not a root of an empty subtree at depth 16 (17 cycles) + dup push.EMPTY_16_3 eq + dup.2 push.EMPTY_16_2 eq + dup.4 push.EMPTY_16_1 eq + dup.6 push.EMPTY_16_0 eq + and and and assertz + # => [P, N, X, X, R, ...] + + # load k3 from memory, extract upper 32 bits from it and split them into two 16-bit values + # such that the top 16-bits are in idx_hi and the next 16 bits are in idx_lo (9 cycles) + loc_load.0 exec.get_top_32_bits u32unchecked_divmod.65536 + # => [idx_lo, idx_hi, P, N, X, X, R, ...] + + # save idx_hi into loc[0][0] to be used later (5 cycles) + swap loc_store.0 + # => [idx_lo, P, N, X, X, R, ...] + + # replace node at idx_lo in P with N, the old value of the node is left on the stack; this also + # proves that P is a leaf node because a leaf node cannot have children at depth 16 (30 cycles) + push.16 mtree_set + # => [N_old, P_new, X, X, R, ...] + + # make sure that N_old is a root of an empty subtree at depth 32 (12 cycles) + push.EMPTY_32_3 assert_eq + push.EMPTY_32_2 assert_eq + push.EMPTY_32_1 assert_eq + push.EMPTY_32_0 assert_eq + # => [P_new, X, X, R, ...] + + # prepare the stack for mtree_set operation against R; here we load idx_hi from loc[0][0] + # (11 cycles) + swapw.2 dropw swapw.2 loc_load.0 push.16 + # => [16, idx_hi, R, P_new, X, ...] + + # insert P_new into tree with root R at depth 16 and idx_hi index (29 cycles) + mtree_set + # => [P_old, R_new, X, ...] + + # load previously saved P to compare it with P_old (6 cycles) + swapw swapw.2 loc_loadw.1 + # => [P, P_old, R_new, ...] + + # make sure P and P_old are the same (11 cycles) + assert_eqw + # => [R_new, ...] + + # put the return value onto the stack and return (4 cycles) + padw + # => [0, 0, 0, 0, R_new, ...] +end + +#! Inserts a new leaf node at depth 48. +#! +#! Input: [V, K, R, ...]; +#! Output:[0, 0, 0, 0, R_new, ...] +#! +#! This procedure is nearly identical to the insert_32 procedure above, adjusted for the use of +#! constants and idx_hi/idx_lo computation. It may be possible to combine the two at the expense +#! of extra 10 - 20 cycles. +proc.insert_48.2 + # load the value of P from the advice provider (5 cycles) + adv_push.4 swapw.2 + # => [K, V, P, R, ...] + + # save k3 into loc[0][0] (4 cycles) + dup loc_store.0 + # => [K, V, P, R, ...] + + # prepare the stack for computing N = hash([K, V], domain=48) - (5 cycles) + push.0.48.0.0 swapw.2 + # => [V, K, 0, 0, 48, 0, P, R, ...] + + # compute N = hash([K, V], domain=48) (1 cycle) + hperm + # => [X, N, X, P, R, ...] + + # save P into loc[1] to be used later (5 cycles) + swapw.3 loc_storew.1 + # => [P, N, X, X, R, ...] + + # make sure P is not a root of an empty subtree at depth 32 (17 cycles) + dup push.EMPTY_32_3 eq + dup.2 push.EMPTY_32_2 eq + dup.4 push.EMPTY_32_1 eq + dup.6 push.EMPTY_32_0 eq + and and and assertz + # => [P, N, X, X, R, ...] + + # load k3 from memory, extract upper 48 bits from it and split them into two values such that + # the top 32-bits are in idx_hi and the next 16 bits are in idx_lo (9 cycles) + loc_load.0 u32split swap u32unchecked_divmod.65536 drop + # => [idx_lo, idx_hi, P, N, X, X, R, ...] + + # save idx_hi into loc[0][0] to be used later (5 cycles) + swap loc_store.0 + # => [idx_lo, P, N, X, X, R, ...] + + # replace node at idx_lo in P with N, the old value of the node is left on the stack; this also + # proves that P is a leaf node because a leaf node cannot have children at depth 16 (30 cycles) + push.16 mtree_set + # => [N_old, P_new, X, X, R, ...] + + # make sure that N_old is a root of an empty subtree at depth 48 (12 cycles) + push.EMPTY_48_3 assert_eq + push.EMPTY_48_2 assert_eq + push.EMPTY_48_1 assert_eq + push.EMPTY_48_0 assert_eq + # => [P_new, X, X, R, ...] + + # prepare the stack for mtree_set operation against R; here we load idx_hi from loc[0][0] + # (11 cycles) + swapw.2 dropw swapw.2 loc_load.0 push.32 + # => [32, idx_hi, R, P_new, X, ...] + + # insert P_new into tree with root R at depth 32 and idx_hi index (29 cycles) + mtree_set + # => [P_old, R_new, X, ...] + + # load previously saved P with P_old to make sure they are the same (6 cycles) + swapw swapw.2 loc_loadw.1 + # => [P, P_old, R_new, ...] + + # make sure P and P_old are the same (11 cycles) + assert_eqw + # => [R_new, ...] + + # put the return value onto the stack and return (4 cycles) + padw + # => [0, 0, 0, 0, R_new, ...] +end + +#! Inserts the specified value into a Sparse Merkle Tree with the specified root under the +#! specified key. +#! +#! The value previously stored in the SMT under this key is left on the stack together with +#! the updated tree root. +#! +#! This assumes that the value is not [ZERO; 4]. If it is, the procedure fails. +#! +#! Input: [V, K, R, ...]; +#! Output:[V_old, R', ...] +#! +#! Cycles: +#! - Update existing leaf: +#! - Depth 16: 129 +#! - Depth 32: 126 +#! - Depth 48: 131 +#! - Insert new leaf: +#! - Depth 16: 100 +#! - Depth 32: 181 +#! - Depth 48: 181 +#! - Replace a leaf with a subtree: +#! - Depth 32: TODO +#! - Depth 48: TODO +export.insert + # make sure the value is not [ZERO; 4] (17 cycles) + repeat.4 + dup.3 eq.0 + end + and and and assertz + # => [V, K, R, ...] + + # arrange the data needed for the insert procedure on the advice stack and move the + # first 4 flags onto the operand stack; meaning of the flags f0, f1, and f2 depends + # on what type of insert is being executed (4 cycles) + adv.push_smtinsert adv_push.4 + # => [is_update, f0, f1, f2, V, K, R, ...] + + # call the inner procedure depending on the type of insert and depth + if.true # --- update leaf ------------------------------------------------- + # => [is_16_or_32, is_16_or_48, ZERO, V, K, R, ...] + if.true + if.true # --- update a leaf node at depth 16 --- + drop + # => [V, K, R, ...] + + # (cycles 8) + dup.4 exec.get_top_16_bits + push.16 + # => [16, idx, V, K, R, ...] + + exec.update_16_32_48 + else # --- update a leaf node at depth 32 --- + drop + # => [V, K, R, ...] + + #(5 cycles) + dup.4 exec.get_top_32_bits + push.32 + # => [32, idx, V, K, R, ...] + + exec.update_16_32_48 + end + else + if.true # --- update a leaf node at depth 48 --- + drop + # => [V, K, R, ...] + + # (10 cycles) + dup.4 exec.get_top_48_bits + push.48 + # => [48, idx, V, K, R, ...] + + exec.update_16_32_48 + else + # depth 64 - currently not implemented + push.0 assert + end + end + else + # => [is_simple_insert, is_16_or_32, is_16_or_48, V, K, R, ...] + if.true # --- inset new leaf ---------------------------------------------- + if.true + if.true + exec.insert_16 + else + exec.insert_32 + end + else + if.true + exec.insert_48 + else + # depth 64 - currently not implemented + push.0 assert + end + end + else # --- replace leaf with subtree ---------------------------------- + # TODO: implement replace leaf with subtree + push.0 assert + end + end + + # => [V, R, ...] +end diff --git a/stdlib/docs/collections/smt.md b/stdlib/docs/collections/smt.md index 85ee7a889d..edb31797fe 100644 --- a/stdlib/docs/collections/smt.md +++ b/stdlib/docs/collections/smt.md @@ -2,4 +2,5 @@ ## std::collections::smt | Procedure | Description | | ----------- | ------------- | -| get | Returns the value stored under the specified key in a Sparse Merkle Tree with the specified root.

      If the value for a given key has not been set, the returned `V` will consist of all zeroes.

      Input: [K, R, ...]

      Output: [V, R, ...]

      Depth 16: 91 cycles

      Depth 32: 87 cycles

      Depth 48: 94 cycles | +| get | Returns the value stored under the specified key in a Sparse Merkle Tree with the specified root.

      If the value for a given key has not been set, the returned `V` will consist of all zeroes.

      Input: [K, R, ...]

      Output: [V, R, ...]

      Depth 16: 91 cycles

      Depth 32: 87 cycles

      Depth 48: 94 cycles

      Depth 64: unimplemented | +| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...];

      Output:[V_old, R', ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 129

      - Depth 32: 126

      - Depth 48: 131

      - Insert new leaf:

      - Depth 16: 100

      - Depth 32: 181

      - Depth 48: 181

      - Replace a leaf with a subtree:

      - Depth 32: TODO

      - Depth 48: TODO | diff --git a/stdlib/tests/collections/smt.rs b/stdlib/tests/collections/smt.rs index 9618368cd9..10f6c4ad60 100644 --- a/stdlib/tests/collections/smt.rs +++ b/stdlib/tests/collections/smt.rs @@ -13,7 +13,7 @@ const EMPTY_VALUE: Word = TieredSmt::EMPTY_VALUE; // ================================================================================================ #[test] -fn smtget_depth_16() { +fn tsmt_get_16() { let mut smt = TieredSmt::default(); // create a key @@ -40,7 +40,7 @@ fn smtget_depth_16() { } #[test] -fn smtget_depth_32() { +fn tsmt_get_32() { let mut smt = TieredSmt::default(); // populate the tree with two key-value pairs sharing the same 16-bit prefix for the keys @@ -75,7 +75,7 @@ fn smtget_depth_32() { } #[test] -fn smtget_depth_48() { +fn tsmt_get_48() { let mut smt = TieredSmt::default(); // populate the tree with two key-value pairs sharing the same 32-bit prefix for the keys @@ -109,6 +109,140 @@ fn smtget_depth_48() { assert_smt_get_opens_correctly(&smt, key_e, EMPTY_VALUE); } +// INSERTS +// ================================================================================================ + +#[test] +fn tsmt_insert_16() { + let mut smt = TieredSmt::default(); + + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a1 = [ONE, ZERO, ZERO, ZERO]; + let val_a2 = [ONE, ONE, ZERO, ZERO]; + + // insert a value under key_a into an empty tree + let init_smt = smt.clone(); + smt.insert(key_a.into(), val_a1); + assert_insert(&init_smt, key_a, EMPTY_VALUE, val_a1, smt.root().into()); + + // update a value under key_a + let init_smt = smt.clone(); + smt.insert(key_a.into(), val_a2); + assert_insert(&init_smt, key_a, val_a1, val_a2, smt.root().into()); +} + +#[test] +fn tsmt_insert_32() { + let mut smt = TieredSmt::default(); + + // insert a value under key_a into an empty tree + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ZERO, ZERO, ZERO]; + smt.insert(key_a.into(), val_a); + + // insert a value under key_b which has the same 16-bit prefix as A + let raw_b = 0b00000000_00000000_01111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ONE, ONE, ZERO, ZERO]; + + // TODO: test this insertion once complex inserts are working + smt.insert(key_b.into(), val_b); + + // update a value under key_a + let init_smt = smt.clone(); + let val_a2 = [ONE, ZERO, ZERO, ONE]; + smt.insert(key_a.into(), val_a2); + assert_insert(&init_smt, key_a, val_a, val_a2, smt.root().into()); + + // insert a value under key_c which has the same 16-bit prefix as A and B + let raw_c = 0b00000000_00000000_00111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + let val_c = [ONE, ONE, ONE, ZERO]; + + let init_smt = smt.clone(); + smt.insert(key_c.into(), val_c); + assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into()); +} + +#[test] +fn tsmt_insert_48() { + let mut smt = TieredSmt::default(); + + // insert a value under key_a into an empty tree + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ZERO, ZERO, ZERO]; + smt.insert(key_a.into(), val_a); + + // insert a value under key_b which has the same 32-bit prefix as A + let raw_b = 0b00000000_00000000_11111111_11111111_01111111_11111111_11111111_11111111_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ONE, ONE, ZERO, ZERO]; + + // TODO: test this insertion once complex inserts are working + smt.insert(key_b.into(), val_b); + + // update a value under key_a + let init_smt = smt.clone(); + let val_a2 = [ONE, ZERO, ZERO, ONE]; + smt.insert(key_a.into(), val_a2); + assert_insert(&init_smt, key_a, val_a, val_a2, smt.root().into()); + + // insert a value under key_c which has the same 32-bit prefix as A and B + let raw_c = 0b00000000_00000000_11111111_11111111_00111111_11111111_11111111_11111111_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + let val_c = [ONE, ONE, ONE, ZERO]; + + let init_smt = smt.clone(); + smt.insert(key_c.into(), val_c); + assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into()); +} + +fn assert_insert( + init_smt: &TieredSmt, + key: RpoDigest, + old_value: Word, + new_value: Word, + new_root: RpoDigest, +) { + let old_root = init_smt.root(); + let source = r#" + use.std::collections::smt + + begin + exec.smt::insert + end + "#; + let initial_stack = [ + old_root[0].as_int(), + old_root[1].as_int(), + old_root[2].as_int(), + old_root[3].as_int(), + key[0].as_int(), + key[1].as_int(), + key[2].as_int(), + key[3].as_int(), + new_value[0].as_int(), + new_value[1].as_int(), + new_value[2].as_int(), + new_value[3].as_int(), + ]; + let expected_output = [ + old_value[3].as_int(), + old_value[2].as_int(), + old_value[1].as_int(), + old_value[0].as_int(), + new_root[3].as_int(), + new_root[2].as_int(), + new_root[1].as_int(), + new_root[0].as_int(), + ]; + let (store, adv_map) = build_advice_inputs(init_smt); + build_test!(source, &initial_stack, &[], store, adv_map).expect_stack(&expected_output); +} + // TEST HELPERS // ================================================================================================ @@ -143,6 +277,13 @@ fn assert_smt_get_opens_correctly(smt: &TieredSmt, key: RpoDigest, value: Word) root[0].as_int(), ]; + let (store, advice_map) = build_advice_inputs(smt); + let advice_stack = []; + build_test!(source, &initial_stack, &advice_stack, store, advice_map.into_iter()) + .expect_stack(&expected_output); +} + +fn build_advice_inputs(smt: &TieredSmt) -> (MerkleStore, Vec<([u8; 32], Vec)>) { let store = MerkleStore::from(smt); let advice_map = smt .upper_leaves() @@ -153,7 +294,5 @@ fn assert_smt_get_opens_correctly(smt: &TieredSmt, key: RpoDigest, value: Word) }) .collect::>(); - let advice_stack = []; - build_test!(source, &initial_stack, &advice_stack, store, advice_map.into_iter()) - .expect_stack(&expected_output); + (store, advice_map) } diff --git a/test-utils/src/crypto.rs b/test-utils/src/crypto.rs index e06c516098..5a807f32b8 100644 --- a/test-utils/src/crypto.rs +++ b/test-utils/src/crypto.rs @@ -1,4 +1,4 @@ -use super::{Felt, FieldElement, StarkField, Vec, Word}; +use super::{Felt, FieldElement, Vec, Word}; // RE-EXPORTS // ================================================================================================ @@ -32,13 +32,3 @@ pub fn init_merkle_leaves(values: &[u64]) -> Vec { pub fn init_merkle_leaf(value: u64) -> Word { [Felt::new(value), Felt::ZERO, Felt::ZERO, Felt::ZERO] } - -/// Returns a remaining path key for a Sparse Merkle Tree -pub fn get_smt_remaining_key(mut key: Word, depth: u8) -> Word { - key[3] = Felt::new(match depth { - 16 | 32 | 48 => (key[3].as_int() << depth) >> depth, - 64 => 0, - _ => unreachable!(), - }); - key -} From 4f1dc0ecf5bdad8a0979685a9701ab3e82e84889 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Thu, 10 Aug 2023 01:09:18 -0700 Subject: [PATCH 056/120] feat: implement TSMT complex insertion for 15->32 case --- .../src/decorators/adv_stack_injectors.rs | 28 ++++ stdlib/asm/collections/smt.masm | 148 +++++++++++++++++- stdlib/docs/collections/smt.md | 2 +- stdlib/tests/collections/smt.rs | 3 +- 4 files changed, 174 insertions(+), 7 deletions(-) diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors.rs index ec0f0ae8ca..ee240ef740 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors.rs @@ -354,6 +354,8 @@ where /// - Simple insert at depth 16: [d0, d1, ONE (is_simple_insert), ZERO (is_update)] /// - Simple insert at depth 32 or 48: [d0, d1, ONE (is_simple_insert), ZERO (is_update), P_NODE] /// - Update of an existing leaf: [ZERO (padding), d0, d1, ONE (is_update), OLD_VALUE] + /// - Replace leaf node with subtree 16->32: [ONE, ONE, ZERO, ZERO, P_KEY, P_VALUE] + /// - Update of an existing leaf: [ONE, d0, d1, ONE, OLD_VALUE] /// /// Where: /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. @@ -361,6 +363,7 @@ where /// - P_NODE is an internal node located at the tier above the insert tier. /// - VALUE is the value to be inserted. /// - OLD_VALUE is the value previously associated with the specified KEY. + /// - P_KEY and P_VALUE are the key-value pair for a leaf which is to be replaced by a subtree. /// - ROOT and NEW_ROOT are the roots of the TSMT prior and post the insert respectively. /// /// # Errors @@ -428,6 +431,25 @@ where // return is_update = ONE, is_simple_insert = ZERO (ONE, ZERO) } else { + // TODO: improve code readability as more cases are handled + let common_prefix = get_common_prefix(&key, &leaf_key); + if depth == 16 { + if common_prefix < 32 { + // put the key back onto the advice stack + for &element in leaf_key.iter().rev() { + self.advice_provider.push_stack(AdviceSource::Value(element))?; + } + } else { + todo!("handle moving leaf from depth 16 to 48 or 64") + } + } else if depth == 32 { + todo!("handle moving leaf from depth 32 to 48 or 64") + } else if depth == 48 { + todo!("handle moving leaf from depth 48 to 64") + } else { + todo!("handle inserting key-value pair into existing leaf at depth 64") + } + // return is_update = ZERO, is_simple_insert = ZERO (ZERO, ZERO) } @@ -462,3 +484,9 @@ fn u64_to_u32_elements(value: u64) -> (Felt, Felt) { let lo = Felt::new((value as u32) as u64); (hi, lo) } + +fn get_common_prefix(key1: &Word, key2: &Word) -> u8 { + let k1 = key1[3].as_int(); + let k2 = key2[3].as_int(); + (k1 ^ k2).leading_zeros() as u8 +} diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index 96faca1fbe..6e910668b0 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -605,6 +605,133 @@ proc.insert_48.2 # => [0, 0, 0, 0, R_new, ...] end +#! Replaces a leaf node at depth 16 with a subtree containing two leaf nodes at depth 32 such that +#! one of the leaf nodes commits to a key-value pair equal to the leaf node at depth 16, and the +#! other leaf node comments to the key-value pair being inserted. +#! +#! Input: [V, K, R, ...]; +#! Output:[0, 0, 0, 0, R_new, ...] +#! +#! Where: +#! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. +#! - K, V is the key-value pair for the leaf node to be inserted into the TSMT. +#! +#! This procedure consists of three high-level steps: +#! - First, insert M = hash([K_e, V_e], domain=32) into an empty subtree at depth 16, where K_e +#! and V_e are the key-value pair for the existing leaf node. This outputs the new root +#! of the subtree T. +#! - Then, insert N = hash([K, V], domain=32) into a subtree with root T. This outputs the new +#! root of the subtree P_new. +#! - Then, insert P_new into the TSMT with root R. +#! +#! This procedure succeeds only if: +#! - Node at depth 16 is a leaf node. +#! - The key in this node has a common prefix with the key to be inserted. This common prefix +#! must be greater or equal to 16, but smaller than 32. +#! +#! Cycles: 216 +proc.replace_16.3 + # save k3 into loc[0][0] - (6 cycles) + swapw dup loc_store.0 + # => [K, V, R, ...] + + # compute N = hash([K, V], domain=32) - (6 cycles) + push.0.32.0.0 swapw.2 hperm + # => [X, N, X, R, ...] + + # load the key associated with the existing leaf P from the advice provider and save it in + # loc[1] - (5 cycles) + adv_loadw loc_storew.1 + # => [K_e, N, X, R, ...] + + # load the value associated with the existing leaf P from the advice provider and save it in + # loc[2] - (10 cycles) + push.0.16.0.0 swapw.2 swapw.3 adv_loadw loc_storew.2 + # => [V_e, K_e, 0, 0, 16, 0, N, R, ...] + + # compute P = hash([K_e, V_e], domain=16); we will use this later to prove correct execution + # of mtree_set instruction (1 cycle) + hperm + # => [X, P, X, N, R, ...] + + # load K_e from loc[1] - (9 cycles) + push.0.32.0.0 swapw loc_loadw.1 + # => [K_e, 0, 0, 32, 0, P, X, N, R, ...] + + # extract from the most significant element of K_e (i.e., ke_3) two most significant 16-bit + # limbs: idx_hi_eidx_lo_e - (6 cycles) + dup exec.get_top_32_bits u32unchecked_divmod.65536 + # => [idx_lo_e, idx_hi_e, K_e, 0, 0, 32, 0, P, X, N, R, ...] + + # load k3 from loc[0][0] and also extract the two most significant 16-bit limbs from it + # (8 cycles) + loc_load.0 exec.get_top_32_bits u32unchecked_divmod.65536 + # => [idx_lo, idx_hi, idx_lo_e, idx_hi_e, K_e, 0, 0, 32, 0, P, X, N, R, ...] + + # make sure the top 16 bits of both keys are the same (4 cycles) + movup.3 dup.2 assert_eq + # => [idx_lo, idx_hi, idx_lo_e, K_e, 0, 0, 32, 0, P, X, N, R, ...] + + # make sure that the next 16 bits of the keys are not the same; this proves that the keys + # have the same 16-bit prefix, but not the same 32-bit prefix (6 cycles) + movup.2 dup dup.2 neq assert + # => [idx_lo_e, idx_lo, idx_hi, K_e, 0, 0, 32, 0, P, X, N, R, ...] + + # save [idx_hi, idx_lo, idx_lo_e, 0] into loc[0] - (4 cycles) + push.0 loc_storew.0 + # => [0, idx_lo_e, idx_lo, idx_hi, K_e, 0, 0, 32, 0, P, X, N, R, ...] + + # load the value V_e from loc[2] and compute M = hash([K_e, K_e], domain=32) - (4 cycles) + loc_loadw.2 hperm + # => [X, M, X, P, X, N, R, ...] + + # load the indexes from loc[0] and drop all but idx_lo_e from the stack (7 cycles) + loc_loadw.0 drop movdn.2 drop drop + # => [idx_lo_e, M, X, P, X, N, R, ...] + + # push the root of an empty subtree at depth 16 onto the stack (4 cycles) + push.EMPTY_16_0.EMPTY_16_1.EMPTY_16_2.EMPTY_16_3 + # => [E16, idx_lo_e, M, X, P, X, N, R, ...] + + # insert node M into the empty subtree at depth 16; this leaves the new root of the + # subtree T together with the root of an empty subtree at depth 32 - (31 cycles) + movup.4 push.16 mtree_set + # => [E32, T, X, P, X, N, R, ...] + + # drop the E32 root as we don't need it, and arrange the stack for inserting the next + # leaf (12 cycles) + dropw swapw dropw swapw swapw.3 swapw.2 + # => [X, N, T, P, R, ...] + + # load the indexes from loc[0] and drop all but idx_lo from the stack (7 cycles) + loc_loadw.0 drop drop swap drop + # => [idx_lo, N, T, P, R, ...] + + # insert node N into the subtree with root T at depth 16; this leaves the new root of the + # subtree P_new on the stack together with the root of an empty subtree at depth 32 - (30 cycles) + push.16 mtree_set + # => [E32, P_new, P, R, ...] + + # prepare the stack for an mtree_set operation against R; we drop the E32 value as we don't + # need it; the index idx_hi is loaded from memory (10 cycles) + dropw swapw swapw.2 loc_load.0 push.16 + # => [16, idx_hi, R, P_new, P, ...] + + # insert node P_new into the TSMT at depth 16; this puts the new value of TSMT root onto the + # stack together with the old value of the node at depth 16 - (29 cycles) + mtree_set + # => [P_old, R_new, P, ...] + + # make sure P (which we computed as hash([K_e, V_e], domain=16)) and P_old are the same + # (13 cycles) + swapw swapw.2 assert_eqw + # => [R_new, ...] + + # put the return value onto the stack and return (4 cycles) + padw + # => [0, 0, 0, 0, R_new, ...] +end + #! Inserts the specified value into a Sparse Merkle Tree with the specified root under the #! specified key. #! @@ -614,7 +741,7 @@ end #! This assumes that the value is not [ZERO; 4]. If it is, the procedure fails. #! #! Input: [V, K, R, ...]; -#! Output:[V_old, R', ...] +#! Output:[V_old, R_new, ...] #! #! Cycles: #! - Update existing leaf: @@ -626,7 +753,7 @@ end #! - Depth 32: 181 #! - Depth 48: 181 #! - Replace a leaf with a subtree: -#! - Depth 32: TODO +#! - Depth 32: 243 #! - Depth 48: TODO export.insert # make sure the value is not [ZERO; 4] (17 cycles) @@ -701,10 +828,21 @@ export.insert end end else # --- replace leaf with subtree ---------------------------------- - # TODO: implement replace leaf with subtree - push.0 assert + if.true + if.true + # replace a leaf node at depth 16 with a subtree containing + # two leaf nodes at depth 32. + exec.replace_16 + else + # not implemented + push.0 assert + end + else + # not implemented + push.0 assert + end end end - # => [V, R, ...] + # => [V_old, R_new, ...] end diff --git a/stdlib/docs/collections/smt.md b/stdlib/docs/collections/smt.md index edb31797fe..3af197d770 100644 --- a/stdlib/docs/collections/smt.md +++ b/stdlib/docs/collections/smt.md @@ -3,4 +3,4 @@ | Procedure | Description | | ----------- | ------------- | | get | Returns the value stored under the specified key in a Sparse Merkle Tree with the specified root.

      If the value for a given key has not been set, the returned `V` will consist of all zeroes.

      Input: [K, R, ...]

      Output: [V, R, ...]

      Depth 16: 91 cycles

      Depth 32: 87 cycles

      Depth 48: 94 cycles

      Depth 64: unimplemented | -| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...];

      Output:[V_old, R', ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 129

      - Depth 32: 126

      - Depth 48: 131

      - Insert new leaf:

      - Depth 16: 100

      - Depth 32: 181

      - Depth 48: 181

      - Replace a leaf with a subtree:

      - Depth 32: TODO

      - Depth 48: TODO | +| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...];

      Output:[V_old, R_new, ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 129

      - Depth 32: 126

      - Depth 48: 131

      - Insert new leaf:

      - Depth 16: 100

      - Depth 32: 181

      - Depth 48: 181

      - Replace a leaf with a subtree:

      - Depth 32: 243

      - Depth 48: TODO | diff --git a/stdlib/tests/collections/smt.rs b/stdlib/tests/collections/smt.rs index 10f6c4ad60..5c5a15fe4e 100644 --- a/stdlib/tests/collections/smt.rs +++ b/stdlib/tests/collections/smt.rs @@ -147,8 +147,9 @@ fn tsmt_insert_32() { let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); let val_b = [ONE, ONE, ZERO, ZERO]; - // TODO: test this insertion once complex inserts are working + let init_smt = smt.clone(); smt.insert(key_b.into(), val_b); + assert_insert(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into()); // update a value under key_a let init_smt = smt.clone(); From 5cc332707f9abcde373d1a6a146258f2ce23882e Mon Sep 17 00:00:00 2001 From: tohrnii <100405913+tohrnii@users.noreply.github.com> Date: Thu, 10 Aug 2023 12:15:26 +0000 Subject: [PATCH 057/120] feat: add support for module aliases --- CHANGELOG.md | 1 + assembly/src/ast/imports.rs | 7 +- assembly/src/errors.rs | 8 ++ assembly/src/tests.rs | 85 +++++++++++++++++++ assembly/src/tokens/mod.rs | 35 +++++++- .../user_docs/assembly/code_organization.md | 12 +++ 6 files changed, 140 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0311a9e05a..7777072cde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Added ability to attach doc comments to re-exported procedures (#994). - Added support for nested modules (#992). - Added support for the arithmetic expressions in constant values (#1026). +- Added support for module aliases (#1037). #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). diff --git a/assembly/src/ast/imports.rs b/assembly/src/ast/imports.rs index 4895a9a759..8c767d36b6 100644 --- a/assembly/src/ast/imports.rs +++ b/assembly/src/ast/imports.rs @@ -51,13 +51,12 @@ impl ModuleImports { while let Some(token) = tokens.read() { match token.parts()[0] { Token::USE => { - let module_path = token.parse_use()?; - let module_name = module_path.last(); - if imports.contains_key(module_name) { + let (module_path, module_name) = token.parse_use()?; + if imports.values().any(|path| *path == module_path) { return Err(ParsingError::duplicate_module_import(token, &module_path)); } - imports.insert(module_name.to_string(), module_path); + imports.insert(module_name, module_path); // consume the `use` token tokens.advance(); diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 7d307667e3..d2abab12ff 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -593,6 +593,14 @@ impl ParsingError { } } + pub fn invalid_module_name(token: &Token, name: &str) -> Self { + ParsingError { + message: format!("invalid module name: {name}"), + location: *token.location(), + op: token.to_string(), + } + } + pub fn import_inside_body(token: &Token) -> Self { ParsingError { message: "import in procedure body".to_string(), diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 197db63b7b..9bbb619d0f 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -968,6 +968,91 @@ fn program_with_reexported_proc_in_another_library() { assert!(assembler.compile(source).is_err()); } +#[test] +fn module_alias() { + const NAMESPACE: &str = "dummy"; + const MODULE: &str = "math::u64"; + const PROCEDURE: &str = r#" + export.checked_add + swap + movup.3 + u32assert.2 + u32overflowing_add + movup.3 + movup.3 + u32assert.2 + u32overflowing_add3 + eq.0 + assert + end"#; + + let namespace = LibraryNamespace::try_from(NAMESPACE.to_string()).unwrap(); + let path = LibraryPath::try_from(MODULE.to_string()).unwrap().prepend(&namespace).unwrap(); + let ast = ModuleAst::parse(PROCEDURE).unwrap(); + let modules = vec![Module { path, ast }]; + let library = DummyLibrary::new(namespace, modules); + + let assembler = super::Assembler::default().with_library(&library).unwrap(); + + let source = " + use.dummy::math::u64->bigint + + begin + push.1.0 + push.2.0 + exec.bigint::checked_add + end"; + let program = assembler.compile(source).unwrap(); + let expected = "\ + begin \ + span \ + pad incr pad push(2) pad \ + swap movup3 u32assert2 \ + u32add movup3 movup3 \ + u32assert2 u32add3 eqz assert \ + end \ + end"; + assert_eq!(expected, format!("{program}")); + + // --- invalid module alias ----------------------------------------------- + let source = " + use.dummy::math::u64->bigint->invalidname + + begin + push.1.0 + push.2.0 + exec.bigint->invalidname::checked_add + end"; + assert!(assembler.compile(source).is_err()); + + // --- duplicate module import -------------------------------------------- + let source = " + use.dummy::math::u64 + use.dummy::math::u64->bigint + + begin + push.1.0 + push.2.0 + exec.bigint::checked_add + end"; + + assert!(assembler.compile(source).is_err()); + + // --- duplicate module imports with different aliases -------------------- + let source = " + use.dummy::math::u64->bigint + use.dummy::math::u64->bigint2 + + begin + push.1.0 + push.2.0 + exec.bigint::checked_add + exec.bigint2::checked_add + end"; + + assert!(assembler.compile(source).is_err()); +} + #[test] fn program_with_import_errors() { // --- non-existent import ------------------------------------------------ diff --git a/assembly/src/tokens/mod.rs b/assembly/src/tokens/mod.rs index f0a96e58e8..6256e5d8d9 100644 --- a/assembly/src/tokens/mod.rs +++ b/assembly/src/tokens/mod.rs @@ -54,7 +54,7 @@ impl<'a> Token<'a> { // -------------------------------------------------------------------------------------------- pub const DOC_COMMENT_PREFIX: &str = "#!"; pub const COMMENT_PREFIX: char = '#'; - pub const EXPORT_ALIAS_DELIM: &str = "->"; + pub const ALIAS_DELIM: &str = "->"; // CONSTRUCTOR // -------------------------------------------------------------------------------------------- @@ -112,12 +112,23 @@ impl<'a> Token<'a> { // CONTROL TOKEN PARSERS / VALIDATORS // -------------------------------------------------------------------------------------------- - pub fn parse_use(&self) -> Result { + pub fn parse_use(&self) -> Result<(LibraryPath, String), ParsingError> { assert_eq!(Self::USE, self.parts[0], "not a use"); match self.num_parts() { 0 => unreachable!(), 1 => Err(ParsingError::missing_param(self)), - 2 => validate_import_path(self.parts[1], self), + 2 => { + if let Some((module_path, module_name)) = + self.parts[1].split_once(Self::ALIAS_DELIM) + { + validate_module_name(module_name, self)?; + Ok((validate_import_path(module_path, self)?, module_name.to_string())) + } else { + let module_path = validate_import_path(self.parts[1], self)?; + let module_name = module_path.last().to_string(); + Ok((module_path, module_name)) + } + } _ => Err(ParsingError::extra_param(self)), } } @@ -171,7 +182,7 @@ impl<'a> Token<'a> { // get the alias name if it exists else export it with the original name let (ref_name, proc_name) = proc_name_with_alias - .split_once(Self::EXPORT_ALIAS_DELIM) + .split_once(Self::ALIAS_DELIM) .unwrap_or((proc_name_with_alias, proc_name_with_alias)); // validate the procedure names @@ -289,3 +300,19 @@ fn validate_proc_locals(locals: &str, token: &Token) -> Result Err(ParsingError::invalid_proc_locals(token, locals)), } } + +/// A module name must comply with the following rules: +/// - The name must be between 1 and 255 characters long. +/// - The name must start with an ASCII letter. +/// - The name can contain only ASCII letters, numbers, or underscores. +fn validate_module_name(name: &str, token: &Token) -> Result<(), ParsingError> { + if name.is_empty() + || name.len() > crate::MAX_LABEL_LEN + || !name.chars().next().unwrap().is_ascii_alphabetic() + || !name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') + { + Err(ParsingError::invalid_module_name(token, name)) + } else { + Ok(()) + } +} diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index 65ee845bc5..06bc5e72f2 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -90,6 +90,18 @@ end ``` In the above example we import `std::math::u64` module from the [standard library](../stdlib/main.md). We then execute a program which pushes two 64-bit integers onto the stack, and then invokes a 64-bit addition procedure from the imported module. +We can also define aliases for imported modules. For example: + +``` +use.std::math::u64->bigint + +begin + push.1.0 + push.2.0 + exec.bigint::checked_add +end +``` + The set of modules which can be imported by a program can be specified via a Module Provider when instantiating the [Miden Assembler](https://crates.io/crates/miden-assembly) used to compile the program. #### Re-exporting procedures From 57110fa60c27e64cfdf3c8a6fd8cb4a39a79baf2 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sat, 12 Aug 2023 08:47:16 -0700 Subject: [PATCH 058/120] fix: error message format --- assembly/src/errors.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index d2abab12ff..51f699dc84 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -143,7 +143,7 @@ impl fmt::Display for AssemblyError { LibraryError(err) | ParsingError(err) | ProcedureNameError(err) => write!(f, "{err}"), LocalProcNotFound(proc_idx, module_path) => write!(f, "procedure at index {proc_idx} not found in module {module_path}"), ParamOutOfBounds(value, min, max) => write!(f, "parameter value must be greater than or equal to {min} and less than or equal to {max}, but was {value}"), - PhantomCallsNotAllowed(mast_root) => write!(f, "cannot call phantom procedure with MAST root 0x{mast_root}: phantom calls not allowed"), + PhantomCallsNotAllowed(mast_root) => write!(f, "cannot call phantom procedure with MAST root {mast_root}: phantom calls not allowed"), SysCallInKernel(proc_name) => write!(f, "syscall instruction used in kernel procedure '{proc_name}'"), } } From 9bcbd2418ee84c3dfe59c2e7a91c82d27416e118 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Fri, 11 Aug 2023 00:11:33 -0700 Subject: [PATCH 059/120] feat: implement TSMT procedure to handle complex inserts at depth 48 --- core/src/operations/decorators/advice.rs | 36 ++- processor/src/advice/providers.rs | 10 +- processor/src/advice/source.rs | 3 + .../src/decorators/adv_stack_injectors.rs | 250 +++++++++++----- processor/src/errors.rs | 14 +- stdlib/asm/collections/smt.masm | 280 +++++++++++++++++- stdlib/docs/collections/smt.md | 2 +- stdlib/tests/collections/smt.rs | 32 +- 8 files changed, 520 insertions(+), 107 deletions(-) diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index d87ec83219..b6c7229d84 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -151,6 +151,39 @@ pub enum AdviceInjector { /// - f2 is a boolean flag set to `1` if a remaining key is not zero. SmtGet, + /// Pushes values onto the advice stack which are required for successful insertion of a + /// key-value pair into a Sparse Merkle Tree data structure. + /// + /// The Sparse Merkle Tree is tiered, meaning it will have leaf depths in `{16, 32, 48, 64}`. + /// + /// Inputs: + /// Operand stack: [VALUE, KEY, ROOT, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [OLD_VALUE, NEW_ROOT, ...] + /// Advice stack depends on the type of insert operation as follows: + /// - Update of an existing leaf: [ZERO (padding), d0, d1, ONE (is_update), OLD_VALUE] + /// - Simple insert at depth 16: [d0, d1, ONE (is_simple_insert), ZERO (is_update)] + /// - Simple insert at depth 32 or 48: [d0, d1, ONE (is_simple_insert), ZERO (is_update), P_NODE] + /// - Complex insert: [f0, f1, ZERO (is_simple_insert), ZERO (is_update), E_KEY, E_VALUE] + /// + /// Where: + /// - ROOT and NEW_ROOT are the roots of the TSMT before and after the insert respectively. + /// - VALUE is the value to be inserted. + /// - OLD_VALUE is the value previously associated with the specified KEY. + /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. + /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. + /// - P_NODE is an internal node located at the tier above the insert tier. + /// - f0 and f1 are boolean flags a combination of which determines the source and the target + /// tiers as follows: + /// - (0, 0): depth 16 -> 32 + /// - (0, 1): depth 16 -> 48 + /// - (1, 0): depth 32 -> 48 + /// - (1, 1): depth 16, 32, or 48 -> 64 + /// - E_KEY and E_VALUE are the key-value pair for a leaf which is to be replaced by a subtree. + SmtInsert, + // ADVICE MAP INJECTORS // -------------------------------------------------------------------------------------------- /// Reads words from memory at the specified range and inserts them into the advice map under @@ -181,9 +214,6 @@ pub enum AdviceInjector { /// Where KEY is computed as hash(A || B, domain), where domain is provided via the immediate /// value. HdwordToMap { domain: Felt }, - - /// TODO: add docs - SmtInsert, } impl fmt::Display for AdviceInjector { diff --git a/processor/src/advice/providers.rs b/processor/src/advice/providers.rs index 11b350b654..18c151fa18 100644 --- a/processor/src/advice/providers.rs +++ b/processor/src/advice/providers.rs @@ -83,22 +83,24 @@ where match source { AdviceSource::Value(value) => { self.stack.push(value); - Ok(()) } - + AdviceSource::Word(word) => { + self.stack.extend(word.iter().rev()); + } AdviceSource::Map { key, include_len } => { let values = self .map .get(&key.into_bytes()) - .ok_or(ExecutionError::AdviceKeyNotFound(key))?; + .ok_or(ExecutionError::AdviceMapKeyNotFound(key))?; self.stack.extend(values.iter().rev()); if include_len { self.stack.push(Felt::from(values.len() as u64)); } - Ok(()) } } + + Ok(()) } fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError> { diff --git a/processor/src/advice/source.rs b/processor/src/advice/source.rs index b2ba99e42f..d87f7ed436 100644 --- a/processor/src/advice/source.rs +++ b/processor/src/advice/source.rs @@ -9,6 +9,9 @@ pub enum AdviceSource { /// Puts a single value onto the advice stack. Value(Felt), + /// Puts a word (4 elements) ont the the stack. + Word(Word), + /// Fetches a list of elements under the specified key from the advice map and pushes them onto /// the advice stack. /// diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors.rs index ee240ef740..b22d86b1cb 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors.rs @@ -1,7 +1,8 @@ use super::{super::Ext2InttError, AdviceProvider, AdviceSource, ExecutionError, Process}; use vm_core::{ - crypto::merkle::EmptySubtreeRoots, utils::collections::Vec, Felt, FieldElement, QuadExtension, - StarkField, Word, ONE, ZERO, + crypto::{hash::RpoDigest, merkle::EmptySubtreeRoots}, + utils::collections::Vec, + Felt, FieldElement, QuadExtension, StarkField, Word, ONE, WORD_SIZE, ZERO, }; use winter_prover::math::fft; @@ -350,31 +351,26 @@ where /// /// Outputs: /// Operand stack: [OLD_VALUE, NEW_ROOT, ...] - /// Advice stack, depends on the type of insert: - /// - Simple insert at depth 16: [d0, d1, ONE (is_simple_insert), ZERO (is_update)] - /// - Simple insert at depth 32 or 48: [d0, d1, ONE (is_simple_insert), ZERO (is_update), P_NODE] - /// - Update of an existing leaf: [ZERO (padding), d0, d1, ONE (is_update), OLD_VALUE] - /// - Replace leaf node with subtree 16->32: [ONE, ONE, ZERO, ZERO, P_KEY, P_VALUE] - /// - Update of an existing leaf: [ONE, d0, d1, ONE, OLD_VALUE] + /// Advice stack: see comments for specialized handlers below. /// /// Where: - /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. - /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. - /// - P_NODE is an internal node located at the tier above the insert tier. + /// - ROOT and NEW_ROOT are the roots of the TSMT before and after the insert respectively. /// - VALUE is the value to be inserted. /// - OLD_VALUE is the value previously associated with the specified KEY. - /// - P_KEY and P_VALUE are the key-value pair for a leaf which is to be replaced by a subtree. - /// - ROOT and NEW_ROOT are the roots of the TSMT prior and post the insert respectively. /// /// # Errors - /// Will return an error if the provided Merkle root doesn't exist on the advice provider. + /// Will return an error if: + /// - The Merkle store does not contain a node with the specified root. + /// - The Merkle store does not contain all nodes needed to validate the path between the root + /// and the relevant TSMT nodes. + /// - The advice map does not contain required data about TSMT leaves to be modified. /// /// # Panics /// Will panic as unimplemented if the target depth is `64`. pub(super) fn push_smtinsert_inputs(&mut self) -> Result<(), ExecutionError> { // get the key and tree root from the stack - let key = [self.stack.get(7), self.stack.get(6), self.stack.get(5), self.stack.get(4)]; - let root = [self.stack.get(11), self.stack.get(10), self.stack.get(9), self.stack.get(8)]; + let key = self.stack.get_word(1); + let root = self.stack.get_word(2); // determine the depth of the first leaf or an empty tree node let index = &key[3]; @@ -397,81 +393,169 @@ where // - if the node is a leaf, this could be either an update (for the same key), or a // complex insert (i.e., the existing leaf needs to be moved to a lower tier). let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; - let (is_update, is_simple_insert) = if node == Word::from(empty) { - // handle simple insert case - if depth == 32 || depth == 48 { + if node == Word::from(empty) { + self.handle_smt_simple_insert(root, depth, index)?; + } else { + // get the key and value stored in the current leaf + let (leaf_key, leaf_value) = self.get_smt_upper_leaf_preimage(node)?; + + // if the key for the value to be inserted is the same as the leaf's key, we are + // dealing with a simple update; otherwise, we are dealing with a complex insert + if leaf_key == key { + self.handle_smt_update(depth, leaf_value)?; + } else { + self.handle_smt_complex_insert(depth, key, leaf_key, leaf_value)?; + } + } + + Ok(()) + } + + // TSMT INSERT HELPER METHODS + // -------------------------------------------------------------------------------------------- + + /// Retrieves a key-value pair for the specified leaf node from the advice map. + /// + /// # Errors + /// Returns an error if the value under the specified node does not exist or does not consist + /// of exactly 8 elements. + fn get_smt_upper_leaf_preimage(&self, node: Word) -> Result<(Word, Word), ExecutionError> { + let node_bytes = RpoDigest::from(node).as_bytes(); + let kv = self + .advice_provider + .get_mapped_values(&node_bytes) + .ok_or(ExecutionError::AdviceMapKeyNotFound(node))?; + + if kv.len() != WORD_SIZE * 2 { + return Err(ExecutionError::AdviceMapValueInvalidLength(node, WORD_SIZE * 2, kv.len())); + } + + let key = [kv[0], kv[1], kv[2], kv[3]]; + let val = [kv[4], kv[5], kv[6], kv[7]]; + Ok((key, val)) + } + + /// Prepares the advice stack for a TSMT update operation. Specifically, the advice stack will + /// be arranged as follows: + /// + /// - [ZERO (padding), d0, d1, ONE (is_update), OLD_VALUE] + /// + /// Where: + /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. + /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. + /// - OLD_VALUE is the current value in the leaf to be updated. + fn handle_smt_update(&mut self, depth: u8, old_value: Word) -> Result<(), ExecutionError> { + // put the old value onto the advice stack + self.advice_provider.push_stack(AdviceSource::Word(old_value))?; + + // set is_update flag to ONE + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + + // set depth flags based on leaf's depth + let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + + // pad the advice stack with an extra value to make it consistent with other cases when + // we expect 4 flag values on the top of the advice stack + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + + Ok(()) + } + + /// Prepares the advice stack for a TSMT simple insert operation (i.e., when we are replacing + /// an empty node). Specifically, the advice stack will be arranged as follows: + /// + /// - Simple insert at depth 16: [d0, d1, ONE (is_simple_insert), ZERO (is_update)] + /// - Simple insert at depth 32 or 48: [d0, d1, ONE (is_simple_insert), ZERO (is_update), P_NODE] + /// + /// Where: + /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. + /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. + /// - P_NODE is an internal node located at the tier above the insert tier. + fn handle_smt_simple_insert( + &mut self, + root: Word, + depth: u8, + index: Felt, + ) -> Result<(), ExecutionError> { + // put additional data onto the advice stack as needed + match depth { + 16 => (), // nothing to do; all the required data is already in the VM + 32 | 48 => { // for depth 32 and 48, we need to provide the internal node located on the tier // above the insert tier let p_index = Felt::from(index.as_int() >> 16); let p_depth = Felt::from(depth - 16); let p_node = self.advice_provider.get_tree_node(root, &p_depth, &p_index)?; - for &element in p_node.iter().rev() { - self.advice_provider.push_stack(AdviceSource::Value(element))?; - } + self.advice_provider.push_stack(AdviceSource::Word(p_node))?; } + 64 => unimplemented!("insertions at depth 64 are not yet implemented"), + _ => unreachable!("invalid depth {depth}"), + } - // return is_update = ZERO, is_simple_insert = ONE - (ZERO, ONE) - } else { - // if the node is a leaf node, push the elements mapped to this node onto the advice - // stack; the elements should be [KEY, VALUE], with key located at the top of the - // advice stack. - self.advice_provider.push_stack(AdviceSource::Map { - key: node, - include_len: false, - })?; - - // remove the KEY from the advice stack, leaving only the VALUE on the stack - let leaf_key = self.advice_provider.pop_stack_word()?; + // push is_update and is_simple_insert flags onto the advice stack + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - // if the key for the value to be inserted is the same as the leaf's key, we are - // dealing with a simple update. otherwise, we are dealing with a complex insert - // (i.e., the leaf needs to be moved to a lower tier). - if leaf_key == key { - // return is_update = ONE, is_simple_insert = ZERO - (ONE, ZERO) - } else { - // TODO: improve code readability as more cases are handled - let common_prefix = get_common_prefix(&key, &leaf_key); - if depth == 16 { - if common_prefix < 32 { - // put the key back onto the advice stack - for &element in leaf_key.iter().rev() { - self.advice_provider.push_stack(AdviceSource::Value(element))?; - } - } else { - todo!("handle moving leaf from depth 16 to 48 or 64") - } - } else if depth == 32 { - todo!("handle moving leaf from depth 32 to 48 or 64") - } else if depth == 48 { - todo!("handle moving leaf from depth 48 to 64") - } else { - todo!("handle inserting key-value pair into existing leaf at depth 64") - } - - // return is_update = ZERO, is_simple_insert = ZERO - (ZERO, ZERO) - } - }; + // set depth flags based on node's depth + let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; - // set the flags used to determine which tier the insert is happening at - let is_16_or_32 = if depth == 16 || depth == 32 { ONE } else { ZERO }; - let is_16_or_48 = if depth == 16 || depth == 48 { ONE } else { ZERO }; + Ok(()) + } - self.advice_provider.push_stack(AdviceSource::Value(is_update))?; - if is_update == ONE { - // for update we don't need to specify whether we are dealing with an insert; but we - // insert an extra ONE at the end so that we can read 4 values from the advice stack - // regardless of which branch is taken. - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - } else { - self.advice_provider.push_stack(AdviceSource::Value(is_simple_insert))?; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + /// Prepares the advice stack for a TSMT complex insert operation (i.e., when a leaf node needs + /// to be replaced with a subtree of nodes at a lower tier). Specifically, the advice stack + /// will be arranged as follows: + /// + /// - [d0, d1, ZERO (is_simple_insert), ZERO (is_update), E_KEY, E_VALUE] + /// + /// Where: + /// - d0 and d1 are boolean flags a combination of which determines the source and the target + /// tiers as follows: + /// - (0, 0): depth 16 -> 32 + /// - (0, 1): depth 16 -> 48 + /// - (1, 0): depth 32 -> 48 + /// - (1, 1): depth 16, 32, or 48 -> 64 + /// - E_KEY and E_VALUE are the key-value pair for a leaf which is to be replaced by a subtree. + fn handle_smt_complex_insert( + &mut self, + depth: u8, + key: Word, + leaf_key: Word, + leaf_value: Word, + ) -> Result<(), ExecutionError> { + // push the key and value onto the advice stack + self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; + self.advice_provider.push_stack(AdviceSource::Word(leaf_key))?; + + // push is_update and is_simple_insert flags onto the advice stack + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + + // determine the combination of the source and target tiers for the insert + // and populate the depth flags accordingly + let common_prefix = get_common_prefix(&key, &leaf_key); + let target_depth = SMT_NORMALIZED_DEPTHS[common_prefix as usize + 1]; + match target_depth { + 32 if depth == 16 => { + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + } + 48 if depth == 16 => { + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + } + 48 if depth == 32 => { + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + } + 64 => unimplemented!("insertions at depth 64 are not yet implemented"), + _ => unreachable!("invalid source/target tier combination: {depth} -> {target_depth}"), } + Ok(()) } } @@ -490,3 +574,9 @@ fn get_common_prefix(key1: &Word, key2: &Word) -> u8 { let k2 = key2[3].as_int(); (k1 ^ k2).leading_zeros() as u8 } + +fn get_depth_flags(depth: u8) -> (Felt, Felt) { + let is_16_or_32 = if depth == 16 || depth == 32 { ONE } else { ZERO }; + let is_16_or_48 = if depth == 16 || depth == 48 { ONE } else { ZERO }; + (is_16_or_32, is_16_or_48) +} diff --git a/processor/src/errors.rs b/processor/src/errors.rs index e95c0c5649..4c616dbf1d 100644 --- a/processor/src/errors.rs +++ b/processor/src/errors.rs @@ -15,7 +15,8 @@ use std::error::Error; #[derive(Debug)] pub enum ExecutionError { - AdviceKeyNotFound(Word), + AdviceMapKeyNotFound(Word), + AdviceMapValueInvalidLength(Word, usize, usize), AdviceStackReadFailed(u32), CallerNotInSyscall, CodeBlockNotFound(Digest), @@ -47,9 +48,16 @@ impl Display for ExecutionError { use ExecutionError::*; match self { - AdviceKeyNotFound(key) => { + AdviceMapKeyNotFound(key) => { let hex = to_hex(Felt::elements_as_bytes(key))?; - write!(f, "Can't push values onto the advice stack: value for key {hex} not present in the advice map.") + write!(f, "Value for key {hex} not present in the advice map") + } + AdviceMapValueInvalidLength(key, expected, actual) => { + let hex = to_hex(Felt::elements_as_bytes(key))?; + write!( + f, + "Expected value for key {hex} to contain {expected} elements, but was {actual}" + ) } AdviceStackReadFailed(step) => write!(f, "Advice stack read failed at step {step}"), CallerNotInSyscall => { diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index 6e910668b0..c90e904a03 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -56,6 +56,67 @@ proc.get_top_48_bits add end +#! Extracts top 16 and the next 32 bits from the most significant elements of U and V. +#! +#! Also verifies that the top 32 bits of these elements are the same, while the next 16 bits are +#! different. +#! +#! Input: [U, V, ...] +#! Output: [(u3 << 16) >> 32, (v3 << 16) >> 32, v3 >> 48, U, V, ...] +#! +#! Cycles: 30 +proc.get_common_prefix_16 + # split the most significant elements of U and V into 32-bit chunks and make sure the top + # 32 bit chunks are the same (i.e. u3_hi = v3_hi) - (8 cycles) + dup.4 u32split dup.2 u32split dup movup.3 assert_eq + # => [u3_hi, u3_lo, v3_lo, U, V, ...] + + u32unchecked_divmod.65536 mul.65536 + # => [idx_mid, idx_hi, u3_lo, v3_lo, U, V, ...] + + movup.3 u32unchecked_shr.16 + # => [v3_lo_hi, idx_mid, idx_hi, u3_lo, U, V, ...] + + dup dup.2 add + # => [idx_lo_v, v3_lo_hi, idx_mid, idx_hi, u3_lo, U, V, ...] + + movup.4 u32unchecked_shr.16 + # => [u3_lo_hi, idx_lo_v, v3_lo_hi, idx_mid, idx_hi, U, V, ...] + + dup movup.3 neq assert + # => [u3_lo_hi, idx_lo_v, idx_mid, idx_hi, U, V, ...] + + movup.2 add + # => [idx_lo_u, idx_lo_v, idx_hi, U, V, ...] +end + +#! Extracts top 32 bits and the next 16 bits from the most significant elements of U and V. +#! +#! Also verifies that the top 32 bits of these elements are the same, while the next 16 bits are +#! different. +#! +#! Input: [U, V, ...] +#! Output: [(u3 << 32) >> 48, (v3 << 32) >> 48, v3 >> 32, U, V, ...] +#! +#! Cycles: 20 +proc.get_common_prefix_32 + # slit teh most significant elements of U and V into 32-bit chunks (4 cycles) + dup.4 u32split dup.2 u32split + # => [u3_hi, u3_lo, v3_hi, v3_lo, U, V, ...] + + # make sure that the top 32 bit chunks are the same (3 cycles) + dup.2 assert_eq + # => [u3_lo, idx_hi, v3_lo, U, V, ...] + + # drop the least significant 16 bits from the lower 32-bit chunks (8 cycles) + u32unchecked_shr.16 movup.2 u32unchecked_shr.16 swap + # => [idx_lo_u, idx_lo_v, idx_hi, U, V, ...] + + # make sure the lower 16-bit chunks are different (5 cycles) + dup dup.2 neq assert + # => [idx_lo_u, idx_lo_v, idx_hi, U, V, ...] +end + # GET # ================================================================================================= @@ -630,7 +691,7 @@ end #! must be greater or equal to 16, but smaller than 32. #! #! Cycles: 216 -proc.replace_16.3 +proc.replace_32.3 # save k3 into loc[0][0] - (6 cycles) swapw dup loc_store.0 # => [K, V, R, ...] @@ -732,6 +793,157 @@ proc.replace_16.3 # => [0, 0, 0, 0, R_new, ...] end +#! Replaces a leaf node at depth 16 or 32 with a subtree containing two leaf nodes at depth 48 +#! such that one of the leaf nodes commits to a key-value pair equal to the leaf node at the +#! original depth, and the other leaf node comments to the key-value pair being inserted. +#! +#! Input: [E, idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...]; +#! Output:[0, 0, 0, 0, R_new, ...] +#! +#! Where: +#! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. +#! - K, V is the key-value pair for the leaf node to be inserted into the TSMT. +#! - d is the depth of the current leaf node (i.e., depth 16 or 32). +#! - idx_hi is the index of the last common node on the path from R to the leaves at depth 48. +#! - idx_lo_e and idx_lo_n are the indexes of the new leaf nodes in a subtree rooted in the +#! last common node. +#! - E is a root of an empty subtree at depth d. +#! +#! This procedure consists of three high-level steps: +#! - First, insert M = hash([K_e, V_e], domain=48) into an empty subtree at depth 48 - d, where +#! K_e and V_e are the key-value pair for the existing leaf node at depth d. This outputs the +#! new root of the subtree T. +#! - Then, insert N = hash([K, V], domain=48) into a subtree with root T. This outputs the new +#! root of the subtree P_new. +#! - Then, insert P_new into the TSMT with root R at depth d. +#! +#! This procedure succeeds only if: +#! - Node at depth d is a leaf node. +#! +#! The procedure assumes but does not check that: +#! - d is either 16 or 32. +#! - idx_hi is within range valid for depth d. +#! - idx_lo_e and idx_hi_e are different values. +#! - idx_lo_e and idx_hi_e are within range valid for depth 48 - d. +#! +#! Cycles: 195 +proc.replace_48.4 + # save E into loc[3] and drop it from the stack (7 cycles) + loc_storew.3 dropw + # => [idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...]; + + # save [d, idx_hi, idx_lo_n, idx_lo_e] into loc[0] (3 cycles) + loc_storew.0 + # => [idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...]; + + # prepare the stack for computing P = hash([K_e, V_e], domain=d) + + # load V_e from the advice provider and save it into loc[1] (5 cycles) + adv_loadw loc_storew.1 + # => [V_e, K_e, K, V, R, ...]; + + # (6 cycles) + push.0 loc_load.0 push.0.0 + # => [0, 0, d, 0, V_e, K_e, K, V, R, ...]; + + # save K_e into loc[2] - (5 cycles) + swapw.2 loc_storew.2 swapw + # => [V_e, K_e, 0, 0, d, 0, K, V, R, ...]; + + # compute P = hash([K_e, V_e], domain=d) (1 cycle) + hperm + # => [X, P, X, K, V, R, ...]; + + # prepare the stack for computing M = hash([K_e, V_e], domain=48) + + # load K_e and V_e from loc[2] and loc[1] respectively (13 cycles) + loc_loadw.2 push.0.48.0.0 swapw.2 swapw.3 loc_loadw.1 + # => [V_e, K_e, 0, 0, 48, 0, P, K, V, R, ...]; + + # compute M = hash([K_e, V_e], domain=48) (1 cycle) + hperm + # => [X, M, X, P, K, V, R, ...]; + + # load the root of empty subtree at depth d from loc[3] (3 cycles) + loc_loadw.3 + # => [E, M, X, P, K, V, R, ...]; + + # prepare the stack for inserting M into E + + # (5 cycles) + swapw swapw.2 loc_loadw.0 + # => [idx_lo_e, idx_lo_n, idx_hi, d, E, M, P, K, V, R, ...]; + + # (6 cycles) + movdn.3 drop drop neg add.48 + # => [48 - d, idx_lo_e, E, M, P, K, V, R, ...]; + + # insert M into an empty subtree rooted at E; this leaves a root of empty subtree at depth 48 + # on the stack - though, we don't need to verify this (29 cycles) + mtree_set + # => [E48, T, P, K, V, R, ...]; + + # prepare the stack for computing N = hash([K, V], domain=48) + + # (5 cycles) + dropw swapdw + # => [K, V, T, P, R, ...]; + + # (5 cycles) + push.0.48.0.0 swapw.2 + # => [V, K, 0, 0, 48, 0, T, P, R, ...]; + + # compute N = hash([K, V], domain=48) - (1 cycles) + hperm + # => [X, N, X, T, P, R, ...]; + + # prepare the stack for inserting N into T + + # (6 cycles) + dropw swapw.2 swapw + # => [X, T, N, P, R, ...]; + + # (3 cycles) + loc_loadw.0 + # => [idx_lo_e, idx_lo_n, idx_hi, d, T, N, P, R, ...]; + + # (6 cycles) + drop movdn.2 drop neg add.48 + # => [48 - d, idx_lo_n, T, N, P, R, ...]; + + # insert N into a subtree with root T; this leaves a root of an empty subtree at depth 48 + # on the stack - though, we don't need to verify this (29 cycles) + mtree_set + # => [E48, P_new, P, R, ...]; + + # prepare the stack for inserting P_new into R + + # (4 cycles) + swapw.3 swapw swapw.2 swapw.3 + # => [E48, R, P_new, P, ...]; + + # (3 cycles) + loc_loadw.0 + # => [idx_lo_e, idx_lo_n, idx_hi, d, R, P_new, P, ...]; + + # (3 cycles) + drop drop swap + # => [d, idx_hi, R, P_new, P, ...]; + + # insert P_new into the tree rooted at R; this also leaves P_old (the old value of the node) + # on the stack (29 cycles) + mtree_set + # => [P_old, R_new, P, ...]; + + # make sure P and P_old are the same (13 cycles) + swapw swapw.2 assert_eqw + # => [R_new, ...]; + + # put the return value onto the stack and return (4 cycles) + padw + # => [0, 0, 0, 0, R_new, ...] +end + #! Inserts the specified value into a Sparse Merkle Tree with the specified root under the #! specified key. #! @@ -753,8 +965,9 @@ end #! - Depth 32: 181 #! - Depth 48: 181 #! - Replace a leaf with a subtree: -#! - Depth 32: 243 -#! - Depth 48: TODO +#! - Depth 16 -> 32: 243 +#! - Depth 16 -> 48: 263 +#! - Depth 32 -> 48: 253 export.insert # make sure the value is not [ZERO; 4] (17 cycles) repeat.4 @@ -770,7 +983,7 @@ export.insert # => [is_update, f0, f1, f2, V, K, R, ...] # call the inner procedure depending on the type of insert and depth - if.true # --- update leaf ------------------------------------------------- + if.true # --- update leaf --------------------------------------------------------------------- # => [is_16_or_32, is_16_or_48, ZERO, V, K, R, ...] if.true if.true # --- update a leaf node at depth 16 --- @@ -812,7 +1025,7 @@ export.insert end else # => [is_simple_insert, is_16_or_32, is_16_or_48, V, K, R, ...] - if.true # --- inset new leaf ---------------------------------------------- + if.true # --- insert new leaf ------------------------------------------------------------- if.true if.true exec.insert_16 @@ -827,19 +1040,56 @@ export.insert push.0 assert end end - else # --- replace leaf with subtree ---------------------------------- + else # --- replace leaf with subtree ------------------------------------------------------ if.true - if.true - # replace a leaf node at depth 16 with a subtree containing - # two leaf nodes at depth 32. - exec.replace_16 - else - # not implemented - push.0 assert + if.true # --- replace a leaf at depth 16 with two leaves at depth 32 --- + exec.replace_32 + else # --- replace a leaf at depth 16 with two leaves at depth 48 --- + # load K_e from the advice provider (5 cycles) + swapw adv_push.4 + # => [K_e, K, V, R, ...] + + # (30 cycles) + exec.get_common_prefix_16 + # => [idx_lo_e, idx_lo, idx_hi, K_e, K, V, R, ...] + + # (2 cycles) + push.16 movdn.3 + # => [idx_lo_e, idx_lo, idx_hi, 16, K_e, K, V, R, ...] + + # (4 cycles) + push.EMPTY_16_0.EMPTY_16_1.EMPTY_16_2.EMPTY_16_3 + # => [E, idx_lo_e, idx_lo, idx_hi, 16, K_e, K, V, R, ...] + + # (195 cycles) + exec.replace_48 + # => [0, 0, 0, 0, R_new, ...] end else - # not implemented - push.0 assert + if.true # --- replace a leaf at depth 32 with two leaves at depth 48 --- + # load K_e from the advice provider (5 cycles) + swapw adv_push.4 + # => [K_e, K, V, R, ...] + + # (20 cycles) + exec.get_common_prefix_32 + # => [idx_lo_e, idx_lo, idx_hi, K_e, K, V, R, ...] + + # (2 cycles) + push.32 movdn.3 + # => [idx_lo_e, idx_lo, idx_hi, 16, K_e, K, V, R, ...] + + # (4 cycles) + push.EMPTY_32_0.EMPTY_32_1.EMPTY_32_2.EMPTY_32_3 + # => [E, idx_lo_e, idx_lo, idx_hi, 16, K_e, K, V, R, ...] + + # (195 cycles) + exec.replace_48 + # => [0, 0, 0, 0, R_new, ...] + else # --- replace a leaf at depth 16, 32, or 48 with two leaves at depth 64 --- + # depth 64 - currently not implemented + push.0 assert + end end end end diff --git a/stdlib/docs/collections/smt.md b/stdlib/docs/collections/smt.md index 3af197d770..9d31187bc6 100644 --- a/stdlib/docs/collections/smt.md +++ b/stdlib/docs/collections/smt.md @@ -3,4 +3,4 @@ | Procedure | Description | | ----------- | ------------- | | get | Returns the value stored under the specified key in a Sparse Merkle Tree with the specified root.

      If the value for a given key has not been set, the returned `V` will consist of all zeroes.

      Input: [K, R, ...]

      Output: [V, R, ...]

      Depth 16: 91 cycles

      Depth 32: 87 cycles

      Depth 48: 94 cycles

      Depth 64: unimplemented | -| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...];

      Output:[V_old, R_new, ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 129

      - Depth 32: 126

      - Depth 48: 131

      - Insert new leaf:

      - Depth 16: 100

      - Depth 32: 181

      - Depth 48: 181

      - Replace a leaf with a subtree:

      - Depth 32: 243

      - Depth 48: TODO | +| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...];

      Output:[V_old, R_new, ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 129

      - Depth 32: 126

      - Depth 48: 131

      - Insert new leaf:

      - Depth 16: 100

      - Depth 32: 181

      - Depth 48: 181

      - Replace a leaf with a subtree:

      - Depth 16 -> 32: 243

      - Depth 16 -> 48: 263

      - Depth 32 -> 48: 253 | diff --git a/stdlib/tests/collections/smt.rs b/stdlib/tests/collections/smt.rs index 5c5a15fe4e..e47ceb860c 100644 --- a/stdlib/tests/collections/smt.rs +++ b/stdlib/tests/collections/smt.rs @@ -147,6 +147,7 @@ fn tsmt_insert_32() { let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); let val_b = [ONE, ONE, ZERO, ZERO]; + // this tests a complex insertion when a leaf node moves from depth 16 to depth 32 let init_smt = smt.clone(); smt.insert(key_b.into(), val_b); assert_insert(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into()); @@ -182,8 +183,10 @@ fn tsmt_insert_48() { let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); let val_b = [ONE, ONE, ZERO, ZERO]; - // TODO: test this insertion once complex inserts are working + // this tests a complex insertion when a leaf moves from depth 16 to depth 48 + let init_smt = smt.clone(); smt.insert(key_b.into(), val_b); + assert_insert(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into()); // update a value under key_a let init_smt = smt.clone(); @@ -201,6 +204,33 @@ fn tsmt_insert_48() { assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into()); } +#[test] +fn tsmt_insert_48_from_32() { + let mut smt = TieredSmt::default(); + + // insert a value under key_a into an empty tree + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ZERO, ZERO, ZERO]; + smt.insert(key_a.into(), val_a); + + // insert a value under key_b which has the same 16-bit prefix as A + let raw_b = 0b00000000_00000000_01111111_11111111_01111111_11111111_11111111_11111111_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ONE, ONE, ZERO, ZERO]; + smt.insert(key_b.into(), val_b); + + // insert a value under key_c which has the same 32-bit prefix as A + let raw_c = 0b00000000_00000000_11111111_11111111_00111111_11111111_11111111_11111111_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + let val_c = [ONE, ONE, ONE, ZERO]; + + // this tests a complex insertion when a leaf moves from depth 32 to depth 48 + let init_smt = smt.clone(); + smt.insert(key_c.into(), val_c); + assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into()); +} + fn assert_insert( init_smt: &TieredSmt, key: RpoDigest, From c3d7b4b07c2b3c89e1773e8cacfd78225b70c265 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sat, 12 Aug 2023 21:26:49 -0700 Subject: [PATCH 060/120] refactor: make TSMT replace32 work similarly to replace48 --- stdlib/asm/collections/smt.masm | 240 ++++++++++++++++---------------- stdlib/docs/collections/smt.md | 2 +- 2 files changed, 123 insertions(+), 119 deletions(-) diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index c90e904a03..5a00de3b6f 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -56,6 +56,33 @@ proc.get_top_48_bits add end +#! Extracts top 16 and the next 16 bits from the most significant elements of U and V. +#! +#! Also verifies that the top 16 bits of these elements are the same, while the next 16 bits are +#! different. +#! +#! Input: [U, V, ...] +#! Output: [(u3 << 16) >> 48, (v3 << 16) >> 48, v3 >> 48, U, V, ...] +#! +#! Cycles: 20 +proc.extract_index_16_16 + # extract the top 16 and the next 16 bits from the most significant element of V (6 cycles) + dup.4 u32split swap drop u32unchecked_divmod.65536 + # => [v3_hi_lo, v3_hi_hi, U, V, ...] + + # extract the top 16 and the next 16 bits from the most significant element of U (4 cycles) + dup.2 u32split u32unchecked_divmod.65536 + # => [u3_hi_lo, u3_hi_hi, u3_lo, v3_hi_lo, v3_hi_hi, U, V, ...] + + # make sure the lower 16 bits are different (5 cycles) + dup dup.4 neq assert + # => [u3_hi_lo, u3_hi_hi, u3_lo, v3_hi_lo, v3_hi_hi, U, V, ...] + + # make sure the top 16 bits are the same (5 cycles) + movdn.2 dup.4 assert_eq drop + # => [u3_hi_lo, v3_hi_lo, v3_hi_hi, U, V, ...] +end + #! Extracts top 16 and the next 32 bits from the most significant elements of U and V. #! #! Also verifies that the top 32 bits of these elements are the same, while the next 16 bits are @@ -65,7 +92,7 @@ end #! Output: [(u3 << 16) >> 32, (v3 << 16) >> 32, v3 >> 48, U, V, ...] #! #! Cycles: 30 -proc.get_common_prefix_16 +proc.extract_index_16_32 # split the most significant elements of U and V into 32-bit chunks and make sure the top # 32 bit chunks are the same (i.e. u3_hi = v3_hi) - (8 cycles) dup.4 u32split dup.2 u32split dup movup.3 assert_eq @@ -99,7 +126,7 @@ end #! Output: [(u3 << 32) >> 48, (v3 << 32) >> 48, v3 >> 32, U, V, ...] #! #! Cycles: 20 -proc.get_common_prefix_32 +proc.extract_index_32_16 # slit teh most significant elements of U and V into 32-bit chunks (4 cycles) dup.4 u32split dup.2 u32split # => [u3_hi, u3_lo, v3_hi, v3_lo, U, V, ...] @@ -385,7 +412,7 @@ end #! Updates a leaf node at depths 16, 32, or 48. #! -#! Input: [d, idx, V, K, R, ...]; +#! Input: [d, idx, V, K, R, ...] #! Output: [V_old, R_new, ...] #! #! Where: @@ -447,8 +474,8 @@ end #! Inserts a new leaf node at depth 16. #! -#! Input: [V, K, R, ...]; -#! Output:[0, 0, 0, 0, R_new, ...] +#! Input: [V, K, R, ...] +#! Output: [0, 0, 0, 0, R_new, ...] #! #! Where: #! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. @@ -493,8 +520,8 @@ end #! Inserts a new leaf node at depth 32. #! -#! Input: [V, K, R, ...]; -#! Output:[0, 0, 0, 0, R_new, ...] +#! Input: [V, K, R, ...] +#! Output: [0, 0, 0, 0, R_new, ...] #! #! Where: #! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. @@ -588,8 +615,8 @@ end #! Inserts a new leaf node at depth 48. #! -#! Input: [V, K, R, ...]; -#! Output:[0, 0, 0, 0, R_new, ...] +#! Input: [V, K, R, ...] +#! Output: [0, 0, 0, 0, R_new, ...] #! #! This procedure is nearly identical to the insert_32 procedure above, adjusted for the use of #! constants and idx_hi/idx_lo computation. It may be possible to combine the two at the expense @@ -670,8 +697,8 @@ end #! one of the leaf nodes commits to a key-value pair equal to the leaf node at depth 16, and the #! other leaf node comments to the key-value pair being inserted. #! -#! Input: [V, K, R, ...]; -#! Output:[0, 0, 0, 0, R_new, ...] +#! Input: [idx_lo_e, idx_lo_n, idx_hi, K_e, K, V, R, ...] +#! Output: [0, 0, 0, 0, R_new, ...] #! #! Where: #! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. @@ -690,101 +717,71 @@ end #! - The key in this node has a common prefix with the key to be inserted. This common prefix #! must be greater or equal to 16, but smaller than 32. #! -#! Cycles: 216 +#! Cycles: 188 proc.replace_32.3 - # save k3 into loc[0][0] - (6 cycles) - swapw dup loc_store.0 - # => [K, V, R, ...] - - # compute N = hash([K, V], domain=32) - (6 cycles) - push.0.32.0.0 swapw.2 hperm - # => [X, N, X, R, ...] + # save [idx_hi, idx_lo_n, idx_lo_e, 16] into loc[0] - (4 cycles) + push.16 loc_storew.0 + # => [16, idx_lo_e, idx_lo_n, idx_hi, K_e, K, V, R, ...] - # load the key associated with the existing leaf P from the advice provider and save it in - # loc[1] - (5 cycles) - adv_loadw loc_storew.1 - # => [K_e, N, X, R, ...] + # load V_e from the advice provider (1 cycle) + adv_loadw + # => [V_e, K_e, K, V, R, ...] - # load the value associated with the existing leaf P from the advice provider and save it in - # loc[2] - (10 cycles) - push.0.16.0.0 swapw.2 swapw.3 adv_loadw loc_storew.2 - # => [V_e, K_e, 0, 0, 16, 0, N, R, ...] + # save K_e and V_e into loc[1] and loc[2] respectively (13 cycles) + push.0.16.0.0 swapw.2 loc_storew.1 swapw loc_storew.2 - # compute P = hash([K_e, V_e], domain=16); we will use this later to prove correct execution - # of mtree_set instruction (1 cycle) + # compute P = hash([K_e, V_e], domain=16) - (1 cycles) hperm - # => [X, P, X, N, R, ...] - - # load K_e from loc[1] - (9 cycles) - push.0.32.0.0 swapw loc_loadw.1 - # => [K_e, 0, 0, 32, 0, P, X, N, R, ...] - - # extract from the most significant element of K_e (i.e., ke_3) two most significant 16-bit - # limbs: idx_hi_eidx_lo_e - (6 cycles) - dup exec.get_top_32_bits u32unchecked_divmod.65536 - # => [idx_lo_e, idx_hi_e, K_e, 0, 0, 32, 0, P, X, N, R, ...] - - # load k3 from loc[0][0] and also extract the two most significant 16-bit limbs from it - # (8 cycles) - loc_load.0 exec.get_top_32_bits u32unchecked_divmod.65536 - # => [idx_lo, idx_hi, idx_lo_e, idx_hi_e, K_e, 0, 0, 32, 0, P, X, N, R, ...] + # => [X, P, X, K, V, R, ...] - # make sure the top 16 bits of both keys are the same (4 cycles) - movup.3 dup.2 assert_eq - # => [idx_lo, idx_hi, idx_lo_e, K_e, 0, 0, 32, 0, P, X, N, R, ...] + # prepare the stack for computing M = hash([K_e, V_e], domain=32) - (13 cycles) + loc_loadw.1 push.0.32.0.0 swapw.2 swapw.3 loc_loadw.2 + # => [V_e, K_e, 0, 0, 32, 0, P, K, V, R, ...] - # make sure that the next 16 bits of the keys are not the same; this proves that the keys - # have the same 16-bit prefix, but not the same 32-bit prefix (6 cycles) - movup.2 dup dup.2 neq assert - # => [idx_lo_e, idx_lo, idx_hi, K_e, 0, 0, 32, 0, P, X, N, R, ...] - - # save [idx_hi, idx_lo, idx_lo_e, 0] into loc[0] - (4 cycles) - push.0 loc_storew.0 - # => [0, idx_lo_e, idx_lo, idx_hi, K_e, 0, 0, 32, 0, P, X, N, R, ...] - - # load the value V_e from loc[2] and compute M = hash([K_e, K_e], domain=32) - (4 cycles) - loc_loadw.2 hperm - # => [X, M, X, P, X, N, R, ...] - - # load the indexes from loc[0] and drop all but idx_lo_e from the stack (7 cycles) - loc_loadw.0 drop movdn.2 drop drop - # => [idx_lo_e, M, X, P, X, N, R, ...] + # compute M = hash([K_e, V_e], domain=32) - 1 cycle + hperm + # => [X, M, X, P, K, V, R, ...] # push the root of an empty subtree at depth 16 onto the stack (4 cycles) push.EMPTY_16_0.EMPTY_16_1.EMPTY_16_2.EMPTY_16_3 - # => [E16, idx_lo_e, M, X, P, X, N, R, ...] + # => [E, X, M, X, P, K, V, R, ...] + + # prepare the stack for inserting M into E (8 cycles) + swapw loc_loadw.0 movup.2 drop movup.2 drop + # => [16, idx_lo_e, E, M, X, P, K, V, R, ...] - # insert node M into the empty subtree at depth 16; this leaves the new root of the - # subtree T together with the root of an empty subtree at depth 32 - (31 cycles) - movup.4 push.16 mtree_set - # => [E32, T, X, P, X, N, R, ...] + # insert M into an empty subtree rooted at E; this leaves a root of empty subtree at depth 32 + # on the stack - though, we don't need to verify this (29 cycles) + mtree_set + # => [E32, T, X, P, K, V, R, ...] - # drop the E32 root as we don't need it, and arrange the stack for inserting the next - # leaf (12 cycles) - dropw swapw dropw swapw swapw.3 swapw.2 - # => [X, N, T, P, R, ...] + # prepare the stack for computing N = hash([K, V], domain=32) - (15 cycles) + dropw swapw dropw swapdw push.0.32.0.0 swapw.2 + # => [V, K, 0, 0, 32, 0, T, P, R, ...] - # load the indexes from loc[0] and drop all but idx_lo from the stack (7 cycles) - loc_loadw.0 drop drop swap drop - # => [idx_lo, N, T, P, R, ...] + # compute N = hash([K, V], domain=32) - 1 cycle + hperm + # => [X, N, X, T, P, R, ...] - # insert node N into the subtree with root T at depth 16; this leaves the new root of the - # subtree P_new on the stack together with the root of an empty subtree at depth 32 - (30 cycles) - push.16 mtree_set + # prepare the stack for inserting N into T (13 cycles) + dropw swapw.2 swapw loc_loadw.0 swap drop movup.2 drop + # => [16, idx_lo_n, T, N, P, R, ...] + + # insert M into an empty subtree rooted at T; this leaves a root of empty subtree at depth 32 + # on the stack - though, we don't need to verify this (29 cycles) + mtree_set # => [E32, P_new, P, R, ...] - # prepare the stack for an mtree_set operation against R; we drop the E32 value as we don't - # need it; the index idx_hi is loaded from memory (10 cycles) - dropw swapw swapw.2 loc_load.0 push.16 + # prepare the stack for inserting P_new into R (10 cycles) + swapw.3 swapw swapw.2 swapw.3 loc_loadw.0 movdn.2 drop drop # => [16, idx_hi, R, P_new, P, ...] - # insert node P_new into the TSMT at depth 16; this puts the new value of TSMT root onto the - # stack together with the old value of the node at depth 16 - (29 cycles) + # insert P_new into the tree rooted at R; this also leaves P_old (the old value of the node) + # on the stack (29 cycles) mtree_set # => [P_old, R_new, P, ...] - # make sure P (which we computed as hash([K_e, V_e], domain=16)) and P_old are the same - # (13 cycles) + # make sure P and P_old are the same (13 cycles) swapw swapw.2 assert_eqw # => [R_new, ...] @@ -797,8 +794,8 @@ end #! such that one of the leaf nodes commits to a key-value pair equal to the leaf node at the #! original depth, and the other leaf node comments to the key-value pair being inserted. #! -#! Input: [E, idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...]; -#! Output:[0, 0, 0, 0, R_new, ...] +#! Input: [E, idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...] +#! Output: [0, 0, 0, 0, R_new, ...] #! #! Where: #! - R is the initial root of the TSMT, and R_new is the new root of the TSMT. @@ -830,114 +827,114 @@ end proc.replace_48.4 # save E into loc[3] and drop it from the stack (7 cycles) loc_storew.3 dropw - # => [idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...]; + # => [idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...] # save [d, idx_hi, idx_lo_n, idx_lo_e] into loc[0] (3 cycles) loc_storew.0 - # => [idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...]; + # => [idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...] # prepare the stack for computing P = hash([K_e, V_e], domain=d) # load V_e from the advice provider and save it into loc[1] (5 cycles) adv_loadw loc_storew.1 - # => [V_e, K_e, K, V, R, ...]; + # => [V_e, K_e, K, V, R, ...] # (6 cycles) push.0 loc_load.0 push.0.0 - # => [0, 0, d, 0, V_e, K_e, K, V, R, ...]; + # => [0, 0, d, 0, V_e, K_e, K, V, R, ...] # save K_e into loc[2] - (5 cycles) swapw.2 loc_storew.2 swapw - # => [V_e, K_e, 0, 0, d, 0, K, V, R, ...]; + # => [V_e, K_e, 0, 0, d, 0, K, V, R, ...] # compute P = hash([K_e, V_e], domain=d) (1 cycle) hperm - # => [X, P, X, K, V, R, ...]; + # => [X, P, X, K, V, R, ...] # prepare the stack for computing M = hash([K_e, V_e], domain=48) # load K_e and V_e from loc[2] and loc[1] respectively (13 cycles) loc_loadw.2 push.0.48.0.0 swapw.2 swapw.3 loc_loadw.1 - # => [V_e, K_e, 0, 0, 48, 0, P, K, V, R, ...]; + # => [V_e, K_e, 0, 0, 48, 0, P, K, V, R, ...] # compute M = hash([K_e, V_e], domain=48) (1 cycle) hperm - # => [X, M, X, P, K, V, R, ...]; + # => [X, M, X, P, K, V, R, ...] # load the root of empty subtree at depth d from loc[3] (3 cycles) loc_loadw.3 - # => [E, M, X, P, K, V, R, ...]; + # => [E, M, X, P, K, V, R, ...] # prepare the stack for inserting M into E # (5 cycles) swapw swapw.2 loc_loadw.0 - # => [idx_lo_e, idx_lo_n, idx_hi, d, E, M, P, K, V, R, ...]; + # => [idx_lo_e, idx_lo_n, idx_hi, d, E, M, P, K, V, R, ...] # (6 cycles) movdn.3 drop drop neg add.48 - # => [48 - d, idx_lo_e, E, M, P, K, V, R, ...]; + # => [48 - d, idx_lo_e, E, M, P, K, V, R, ...] # insert M into an empty subtree rooted at E; this leaves a root of empty subtree at depth 48 # on the stack - though, we don't need to verify this (29 cycles) mtree_set - # => [E48, T, P, K, V, R, ...]; + # => [E48, T, P, K, V, R, ...] # prepare the stack for computing N = hash([K, V], domain=48) # (5 cycles) dropw swapdw - # => [K, V, T, P, R, ...]; + # => [K, V, T, P, R, ...] # (5 cycles) push.0.48.0.0 swapw.2 - # => [V, K, 0, 0, 48, 0, T, P, R, ...]; + # => [V, K, 0, 0, 48, 0, T, P, R, ...] # compute N = hash([K, V], domain=48) - (1 cycles) hperm - # => [X, N, X, T, P, R, ...]; + # => [X, N, X, T, P, R, ...] # prepare the stack for inserting N into T # (6 cycles) dropw swapw.2 swapw - # => [X, T, N, P, R, ...]; + # => [X, T, N, P, R, ...] # (3 cycles) loc_loadw.0 - # => [idx_lo_e, idx_lo_n, idx_hi, d, T, N, P, R, ...]; + # => [idx_lo_e, idx_lo_n, idx_hi, d, T, N, P, R, ...] # (6 cycles) drop movdn.2 drop neg add.48 - # => [48 - d, idx_lo_n, T, N, P, R, ...]; + # => [48 - d, idx_lo_n, T, N, P, R, ...] # insert N into a subtree with root T; this leaves a root of an empty subtree at depth 48 # on the stack - though, we don't need to verify this (29 cycles) mtree_set - # => [E48, P_new, P, R, ...]; + # => [E48, P_new, P, R, ...] # prepare the stack for inserting P_new into R # (4 cycles) swapw.3 swapw swapw.2 swapw.3 - # => [E48, R, P_new, P, ...]; + # => [E48, R, P_new, P, ...] # (3 cycles) loc_loadw.0 - # => [idx_lo_e, idx_lo_n, idx_hi, d, R, P_new, P, ...]; + # => [idx_lo_e, idx_lo_n, idx_hi, d, R, P_new, P, ...] # (3 cycles) drop drop swap - # => [d, idx_hi, R, P_new, P, ...]; + # => [d, idx_hi, R, P_new, P, ...] # insert P_new into the tree rooted at R; this also leaves P_old (the old value of the node) # on the stack (29 cycles) mtree_set - # => [P_old, R_new, P, ...]; + # => [P_old, R_new, P, ...] # make sure P and P_old are the same (13 cycles) swapw swapw.2 assert_eqw - # => [R_new, ...]; + # => [R_new, ...] # put the return value onto the stack and return (4 cycles) padw @@ -952,8 +949,8 @@ end #! #! This assumes that the value is not [ZERO; 4]. If it is, the procedure fails. #! -#! Input: [V, K, R, ...]; -#! Output:[V_old, R_new, ...] +#! Input: [V, K, R, ...] +#! Output: [V_old, R_new, ...] #! #! Cycles: #! - Update existing leaf: @@ -965,7 +962,7 @@ end #! - Depth 32: 181 #! - Depth 48: 181 #! - Replace a leaf with a subtree: -#! - Depth 16 -> 32: 243 +#! - Depth 16 -> 32: 242 #! - Depth 16 -> 48: 263 #! - Depth 32 -> 48: 253 export.insert @@ -1043,6 +1040,15 @@ export.insert else # --- replace leaf with subtree ------------------------------------------------------ if.true if.true # --- replace a leaf at depth 16 with two leaves at depth 32 --- + # load K_e from the advice provider (5 cycles) + swapw adv_push.4 + # => [K_e, K, V, R, ...] + + # (20 cycles) + exec.extract_index_16_16 + # => [idx_lo_e, idx_lo, idx_hi, K_e, K, V, R, ...] + + # (188 cycles) exec.replace_32 else # --- replace a leaf at depth 16 with two leaves at depth 48 --- # load K_e from the advice provider (5 cycles) @@ -1050,7 +1056,7 @@ export.insert # => [K_e, K, V, R, ...] # (30 cycles) - exec.get_common_prefix_16 + exec.extract_index_16_32 # => [idx_lo_e, idx_lo, idx_hi, K_e, K, V, R, ...] # (2 cycles) @@ -1063,7 +1069,6 @@ export.insert # (195 cycles) exec.replace_48 - # => [0, 0, 0, 0, R_new, ...] end else if.true # --- replace a leaf at depth 32 with two leaves at depth 48 --- @@ -1072,7 +1077,7 @@ export.insert # => [K_e, K, V, R, ...] # (20 cycles) - exec.get_common_prefix_32 + exec.extract_index_32_16 # => [idx_lo_e, idx_lo, idx_hi, K_e, K, V, R, ...] # (2 cycles) @@ -1085,7 +1090,6 @@ export.insert # (195 cycles) exec.replace_48 - # => [0, 0, 0, 0, R_new, ...] else # --- replace a leaf at depth 16, 32, or 48 with two leaves at depth 64 --- # depth 64 - currently not implemented push.0 assert diff --git a/stdlib/docs/collections/smt.md b/stdlib/docs/collections/smt.md index 9d31187bc6..2ff3771647 100644 --- a/stdlib/docs/collections/smt.md +++ b/stdlib/docs/collections/smt.md @@ -3,4 +3,4 @@ | Procedure | Description | | ----------- | ------------- | | get | Returns the value stored under the specified key in a Sparse Merkle Tree with the specified root.

      If the value for a given key has not been set, the returned `V` will consist of all zeroes.

      Input: [K, R, ...]

      Output: [V, R, ...]

      Depth 16: 91 cycles

      Depth 32: 87 cycles

      Depth 48: 94 cycles

      Depth 64: unimplemented | -| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...];

      Output:[V_old, R_new, ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 129

      - Depth 32: 126

      - Depth 48: 131

      - Insert new leaf:

      - Depth 16: 100

      - Depth 32: 181

      - Depth 48: 181

      - Replace a leaf with a subtree:

      - Depth 16 -> 32: 243

      - Depth 16 -> 48: 263

      - Depth 32 -> 48: 253 | +| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...]

      Output: [V_old, R_new, ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 129

      - Depth 32: 126

      - Depth 48: 131

      - Insert new leaf:

      - Depth 16: 100

      - Depth 32: 181

      - Depth 48: 181

      - Replace a leaf with a subtree:

      - Depth 16 -> 32: 242

      - Depth 16 -> 48: 263

      - Depth 32 -> 48: 253 | From 7d707625f40f4422d05a1b491010fc5ce4c28d4e Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 14 Aug 2023 18:59:38 -0700 Subject: [PATCH 061/120] fix: implement TSMT leaf insertion into advice map --- CHANGELOG.md | 1 + assembly/src/ast/nodes/advice.rs | 6 + assembly/src/ast/parsers/adv_ops.rs | 4 + core/src/operations/decorators/advice.rs | 16 ++ docs/src/user_docs/assembly/io_operations.md | 16 +- processor/src/advice/mod.rs | 1 + processor/src/advice/source.rs | 4 +- processor/src/decorators/adv_map_injectors.rs | 50 +++- processor/src/decorators/mod.rs | 1 + stdlib/asm/collections/smt.masm | 36 ++- stdlib/tests/collections/smt.rs | 220 +++++++++++------- 11 files changed, 251 insertions(+), 104 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7777072cde..3467a431ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Added support for nested modules (#992). - Added support for the arithmetic expressions in constant values (#1026). - Added support for module aliases (#1037). +- Added `adv.insert_hperm` decorator (#1042). #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). diff --git a/assembly/src/ast/nodes/advice.rs b/assembly/src/ast/nodes/advice.rs index 00d054da9e..9ea83d4aad 100644 --- a/assembly/src/ast/nodes/advice.rs +++ b/assembly/src/ast/nodes/advice.rs @@ -27,6 +27,7 @@ pub enum AdviceInjectorNode { InsertMem, InsertHdword, InsertHdwordImm { domain: u8 }, + InsertHperm, } impl From<&AdviceInjectorNode> for AdviceInjector { @@ -59,6 +60,7 @@ impl From<&AdviceInjectorNode> for AdviceInjector { InsertHdwordImm { domain } => Self::HdwordToMap { domain: Felt::from(*domain), }, + InsertHperm => Self::HpermToMap, } } } @@ -79,6 +81,7 @@ impl fmt::Display for AdviceInjectorNode { InsertMem => write!(f, "insert_mem"), InsertHdword => write!(f, "insert_hdword"), InsertHdwordImm { domain } => write!(f, "insert_hdword.{domain}"), + InsertHperm => writeln!(f, "insert_hperm"), } } } @@ -98,6 +101,7 @@ const PUSH_MTNODE: u8 = 8; const INSERT_MEM: u8 = 9; const INSERT_HDWORD: u8 = 10; const INSERT_HDWORD_IMM: u8 = 11; +const INSERT_HPERM: u8 = 12; impl Serializable for AdviceInjectorNode { fn write_into(&self, target: &mut W) { @@ -124,6 +128,7 @@ impl Serializable for AdviceInjectorNode { target.write_u8(INSERT_HDWORD_IMM); target.write_u8(*domain); } + InsertHperm => target.write_u8(INSERT_HPERM), } } } @@ -158,6 +163,7 @@ impl Deserializable for AdviceInjectorNode { let domain = source.read_u8()?; Ok(AdviceInjectorNode::InsertHdwordImm { domain }) } + INSERT_HPERM => Ok(AdviceInjectorNode::InsertHperm), val => Err(DeserializationError::InvalidValue(val.to_string())), } } diff --git a/assembly/src/ast/parsers/adv_ops.rs b/assembly/src/ast/parsers/adv_ops.rs index 1393796a05..c4688a9ac6 100644 --- a/assembly/src/ast/parsers/adv_ops.rs +++ b/assembly/src/ast/parsers/adv_ops.rs @@ -81,6 +81,10 @@ pub fn parse_adv_inject(op: &Token) -> Result { } _ => return Err(ParsingError::extra_param(op)), }, + "insert_hperm" => match op.num_parts() { + 2 => AdvInject(InsertHperm), + _ => return Err(ParsingError::extra_param(op)), + }, _ => return Err(ParsingError::invalid_op(op)), }; diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index b6c7229d84..854a4c7469 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -214,6 +214,21 @@ pub enum AdviceInjector { /// Where KEY is computed as hash(A || B, domain), where domain is provided via the immediate /// value. HdwordToMap { domain: Felt }, + + /// Reads three words from the operand stack and inserts the top two words into the advice map + /// under the key defined by applying an RPO permutation to all three words. + /// + /// Inputs: + /// Operand stack: [B, A, C, ...] + /// Advice map: {...} + /// + /// Outputs: + /// Operand stack: [B, A, C, ...] + /// Advice map: {KEY: [a0, a1, a2, a3, b0, b1, b2, b3]} + /// + /// Where KEY is computed by extracting the digest elements from hperm([C, A, B]). For example, + /// if C is [0, d, 0, 0], KEY will be set as hash(A || B, d). + HpermToMap, } impl fmt::Display for AdviceInjector { @@ -238,6 +253,7 @@ impl fmt::Display for AdviceInjector { Self::SmtInsert => write!(f, "smt_insert"), Self::MemToMap => write!(f, "mem_to_map"), Self::HdwordToMap { domain } => write!(f, "hdword_to_map.{domain}"), + Self::HpermToMap => write!(f, "hperm_to_map"), } } } diff --git a/docs/src/user_docs/assembly/io_operations.md b/docs/src/user_docs/assembly/io_operations.md index a754fd79f0..053c34a509 100644 --- a/docs/src/user_docs/assembly/io_operations.md +++ b/docs/src/user_docs/assembly/io_operations.md @@ -47,14 +47,16 @@ Advice injectors fall into two categories: (1) injectors which push new data ont | Instruction | Stack_input | Stack_output | Notes | | -------------------------------------------- | -------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| adv.push_mapval
      adv.push_mapval.*s* | [K, ... ] | [K, ... ] | Pushes a list of field elements onto the advice stack. The list is looked up in the advice map using word $K$ as the key. If offset $s$ is provided, the key is taken starting from item $s$ on the stack. | +| adv.push_mapval
      adv.push_mapval.*s* | [K, ... ] | [K, ... ] | Pushes a list of field elements onto the advice stack. The list is looked up in the advice map using word $K$ as the key. If offset $s$ is provided, the key is taken starting from item $s$ on the stack. | | adv.push_mapvaln
      adv.push_mapvaln.*s* | [K, ... ] | [K, ... ] | Pushes a list of field elements together with the number of elements onto the advice stack. The list is looked up in the advice map using word $K$ as the key. If offset $s$ is provided, the key is taken starting from item $s$ on the stack. | -| adv.push_mtnode | [d, i, R, ... ] | [d, i, R, ... ] | Pushes a node of a Merkle tree with root $R$ at depth $d$ and index $i$ from Merkle store onto the advice stack. | -| adv.push_u64div | [b1, b0, a1, a0, ...] | [b1, b0, a1, a0, ...] | Pushes the result of `u64` division $a / b$ onto the advice stack. Both $a$ and $b$ are represented using 32-bit limbs. The result consists of both the quotient and the remainder. | -| adv.push_ext2intt | [osize, isize, iptr, ... ] | [osize, isize, iptr, ... ] | Given evaluations of a polynomial over some specified domain, interpolates the evaluations into a polynomial in coefficient form and pushes the result into the advice stack. | -| adv.smt_get | [K, R, ... ] | [K, R, ... ] | Pushes values onto the advice stack which are required for successful retrieval of a value under the key $K$ from a Sparse Merkle Tree with root $R$. | -| adv.insert_mem | [K, a, b, ... ] | [K, a, b, ... ] | Reads words $data \leftarrow mem[a] .. mem[b]$ from memory, and save the data into $advice\_map[K] \leftarrow data$. | -| adv.insert_hdword
      adv.insert_hdword.*d* | [B, A, ... ] | [B, A, ... ] | Reads top two words from the stack, computes a key as $K \leftarrow hash(A || b, d)$, and saves the data into $advice\_map[K] \leftarrow [A, B]$. $d$ is an optional domain value which can be between $0$ and $255$, default value $0$. | +| adv.push_mtnode | [d, i, R, ... ] | [d, i, R, ... ] | Pushes a node of a Merkle tree with root $R$ at depth $d$ and index $i$ from Merkle store onto the advice stack. | +| adv.push_u64div | [b1, b0, a1, a0, ...] | [b1, b0, a1, a0, ...] | Pushes the result of `u64` division $a / b$ onto the advice stack. Both $a$ and $b$ are represented using 32-bit limbs. The result consists of both the quotient and the remainder. | +| adv.push_ext2intt | [osize, isize, iptr, ... ] | [osize, isize, iptr, ... ] | Given evaluations of a polynomial over some specified domain, interpolates the evaluations into a polynomial in coefficient form and pushes the result into the advice stack. | +| adv.smt_get | [K, R, ... ] | [K, R, ... ] | Pushes values onto the advice stack which are required for successful retrieval of a value under the key $K$ from a Sparse Merkle Tree with root $R$. | +| adv.smt_insert | [V, K, R, ...] | [V, K, R, ...] | Pushes values onto the advice stack which are required for successful insertion of a key-value pair $(K, V)$ into a Sparse Merkle Tree with root $R$. | +| adv.insert_mem | [K, a, b, ... ] | [K, a, b, ... ] | Reads words $data \leftarrow mem[a] .. mem[b]$ from memory, and save the data into $advice\_map[K] \leftarrow data$. | +| adv.insert_hdword
      adv.insert_hdword.*d* | [B, A, ... ] | [B, A, ... ] | Reads top two words from the stack, computes a key as $K \leftarrow hash(A || b, d)$, and saves the data into $advice\_map[K] \leftarrow [A, B]$. $d$ is an optional domain value which can be between $0$ and $255$, default value $0$. | +| adv.insert_hperm | [B, A, C, ...] | [B, A, C, ...] | Reads top three words from the stack, computes a key as $K \leftarrow permute(C, A, B).digest$, and saves data into $advice\_mpa[K] \leftarrow [A, B]$. | ### Random access memory diff --git a/processor/src/advice/mod.rs b/processor/src/advice/mod.rs index a141d6019d..8382a2075b 100644 --- a/processor/src/advice/mod.rs +++ b/processor/src/advice/mod.rs @@ -103,6 +103,7 @@ pub trait AdviceProvider { // ADVICE MAP // -------------------------------------------------------------------------------------------- + /// Returns a reference to the value(s) associated with the specified key in the advice map. fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]>; diff --git a/processor/src/advice/source.rs b/processor/src/advice/source.rs index d87f7ed436..e52df4509b 100644 --- a/processor/src/advice/source.rs +++ b/processor/src/advice/source.rs @@ -9,13 +9,13 @@ pub enum AdviceSource { /// Puts a single value onto the advice stack. Value(Felt), - /// Puts a word (4 elements) ont the the stack. + /// Puts a word (4 elements) onto the stack. Word(Word), /// Fetches a list of elements under the specified key from the advice map and pushes them onto /// the advice stack. /// - /// If `include_len` is set to true, this also pushes the number of elements ont the advice + /// If `include_len` is set to true, this also pushes the number of elements onto the advice /// stack. /// /// Note: this operation doesn't consume the map element so it can be called multiple times diff --git a/processor/src/decorators/adv_map_injectors.rs b/processor/src/decorators/adv_map_injectors.rs index 34eb44a643..aa65bbadbc 100644 --- a/processor/src/decorators/adv_map_injectors.rs +++ b/processor/src/decorators/adv_map_injectors.rs @@ -1,5 +1,9 @@ use super::{AdviceProvider, ExecutionError, Process}; -use vm_core::{crypto::hash::Rpo256, utils::collections::Vec, Felt, StarkField, WORD_SIZE, ZERO}; +use vm_core::{ + crypto::hash::{Rpo256, RpoDigest}, + utils::collections::Vec, + Felt, StarkField, WORD_SIZE, ZERO, +}; // ADVICE INJECTORS // ================================================================================================ @@ -72,6 +76,50 @@ where self.advice_provider.insert_into_map(key.into(), values) } + /// Reads three words from the operand stack and inserts the top two words into the advice map + /// under the key defined by applying an RPO permutation to all three words. + /// + /// Inputs: + /// Operand stack: [B, A, C, ...] + /// Advice map: {...} + /// + /// Outputs: + /// Operand stack: [B, A, C, ...] + /// Advice map: {KEY: [a0, a1, a2, a3, b0, b1, b2, b3]} + /// + /// Where KEY is computed by extracting the digest elements from hperm([C, A, B]). For example, + /// if C is [0, d, 0, 0], KEY will be set as hash(A || B, d). + pub(super) fn insert_hperm_into_adv_map(&mut self) -> Result<(), ExecutionError> { + // read the state from the stack + let mut state = [ + self.stack.get(11), + self.stack.get(10), + self.stack.get(9), + self.stack.get(8), + self.stack.get(7), + self.stack.get(6), + self.stack.get(5), + self.stack.get(4), + self.stack.get(3), + self.stack.get(2), + self.stack.get(1), + self.stack.get(0), + ]; + + // get the values to be inserted into the advice map from the state + let values = state[Rpo256::RATE_RANGE].to_vec(); + + // apply the permutation to the state and extract the key from it + Rpo256::apply_permutation(&mut state); + let key = RpoDigest::new( + state[Rpo256::DIGEST_RANGE] + .try_into() + .expect("failed to extract digest from state"), + ); + + self.advice_provider.insert_into_map(key.into(), values) + } + // HELPER METHODS // -------------------------------------------------------------------------------------------- diff --git a/processor/src/decorators/mod.rs b/processor/src/decorators/mod.rs index 811f53b712..a4e601e438 100644 --- a/processor/src/decorators/mod.rs +++ b/processor/src/decorators/mod.rs @@ -48,6 +48,7 @@ where AdviceInjector::SmtInsert => self.push_smtinsert_inputs(), AdviceInjector::MemToMap => self.insert_mem_values_into_adv_map(), AdviceInjector::HdwordToMap { domain } => self.insert_hdword_into_adv_map(*domain), + AdviceInjector::HpermToMap => self.insert_hperm_into_adv_map(), } } diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index 5a00de3b6f..a831a09044 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -127,7 +127,7 @@ end #! #! Cycles: 20 proc.extract_index_32_16 - # slit teh most significant elements of U and V into 32-bit chunks (4 cycles) + # split the most significant elements of U and V into 32-bit chunks (4 cycles) dup.4 u32split dup.2 u32split # => [u3_hi, u3_lo, v3_hi, v3_lo, U, V, ...] @@ -435,6 +435,9 @@ proc.update_16_32_48.2 movdn.3 movup.2 drop push.0 swapw.2 loc_storew.1 swapw # => [V, K, 0, 0, d, 0, R, ...] + # insert N |-> [K, V] into the advice map (0 cycles) + adv.insert_hperm + # compute the hash of the node N = hash([K, V], domain=d) - (1 cycle) hperm # => [X, N, X, R, ...] @@ -490,10 +493,13 @@ proc.insert_16 swapw dup exec.get_top_16_bits # => [idx, K, V, R, ...] - # prepare the stack for computing leaf node value (6 cycles) + # prepare the stack for computing N = hash([K, V], domain=16) (6 cycles) movdn.8 push.0.16.0.0 swapw.2 # => [V, K, 0, 0, 16, 0, idx, R, ...] + # insert N |-> [K, V] into the advice map (0 cycles) + adv.insert_hperm + # compute leaf node value as N = hash([K, V], domain=16) (10 cycles) hperm dropw swapw dropw # => [N, idx, R, ...] @@ -554,6 +560,9 @@ proc.insert_32.2 push.0.32.0.0 swapw.2 # => [V, K, 0, 0, 32, 0, P, R, ...] + # insert N |-> [K, V] into the advice map (0 cycles) + adv.insert_hperm + # compute N = hash([K, V], domain=32) (1 cycle) hperm # => [X, N, X, P, R, ...] @@ -634,6 +643,9 @@ proc.insert_48.2 push.0.48.0.0 swapw.2 # => [V, K, 0, 0, 48, 0, P, R, ...] + # insert N |-> [K, V] into the advice map (0 cycles) + adv.insert_hperm + # compute N = hash([K, V], domain=48) (1 cycle) hperm # => [X, N, X, P, R, ...] @@ -695,7 +707,7 @@ end #! Replaces a leaf node at depth 16 with a subtree containing two leaf nodes at depth 32 such that #! one of the leaf nodes commits to a key-value pair equal to the leaf node at depth 16, and the -#! other leaf node comments to the key-value pair being inserted. +#! other leaf node commits to the key-value pair being inserted. #! #! Input: [idx_lo_e, idx_lo_n, idx_hi, K_e, K, V, R, ...] #! Output: [0, 0, 0, 0, R_new, ...] @@ -738,6 +750,9 @@ proc.replace_32.3 loc_loadw.1 push.0.32.0.0 swapw.2 swapw.3 loc_loadw.2 # => [V_e, K_e, 0, 0, 32, 0, P, K, V, R, ...] + # insert M |-> [K_e, V_e] into the advice map (0 cycles) + adv.insert_hperm + # compute M = hash([K_e, V_e], domain=32) - 1 cycle hperm # => [X, M, X, P, K, V, R, ...] @@ -759,6 +774,9 @@ proc.replace_32.3 dropw swapw dropw swapdw push.0.32.0.0 swapw.2 # => [V, K, 0, 0, 32, 0, T, P, R, ...] + # insert N |-> [K, V] into the advice map (0 cycles) + adv.insert_hperm + # compute N = hash([K, V], domain=32) - 1 cycle hperm # => [X, N, X, T, P, R, ...] @@ -767,7 +785,7 @@ proc.replace_32.3 dropw swapw.2 swapw loc_loadw.0 swap drop movup.2 drop # => [16, idx_lo_n, T, N, P, R, ...] - # insert M into an empty subtree rooted at T; this leaves a root of empty subtree at depth 32 + # insert N into an empty subtree rooted at T; this leaves a root of empty subtree at depth 32 # on the stack - though, we don't need to verify this (29 cycles) mtree_set # => [E32, P_new, P, R, ...] @@ -792,7 +810,7 @@ end #! Replaces a leaf node at depth 16 or 32 with a subtree containing two leaf nodes at depth 48 #! such that one of the leaf nodes commits to a key-value pair equal to the leaf node at the -#! original depth, and the other leaf node comments to the key-value pair being inserted. +#! original depth, and the other leaf node commits to the key-value pair being inserted. #! #! Input: [E, idx_lo_e, idx_lo_n, idx_hi, d, K_e, K, V, R, ...] #! Output: [0, 0, 0, 0, R_new, ...] @@ -808,7 +826,7 @@ end #! #! This procedure consists of three high-level steps: #! - First, insert M = hash([K_e, V_e], domain=48) into an empty subtree at depth 48 - d, where -#! K_e and V_e are the key-value pair for the existing leaf node at depth d. This outputs the +#! K_e and V_e is the key-value pair for the existing leaf node at depth d. This outputs the #! new root of the subtree T. #! - Then, insert N = hash([K, V], domain=48) into a subtree with root T. This outputs the new #! root of the subtree P_new. @@ -857,6 +875,9 @@ proc.replace_48.4 loc_loadw.2 push.0.48.0.0 swapw.2 swapw.3 loc_loadw.1 # => [V_e, K_e, 0, 0, 48, 0, P, K, V, R, ...] + # insert M |-> [K_e, V_e] into the advice map (0 cycles) + adv.insert_hperm + # compute M = hash([K_e, V_e], domain=48) (1 cycle) hperm # => [X, M, X, P, K, V, R, ...] @@ -890,6 +911,9 @@ proc.replace_48.4 push.0.48.0.0 swapw.2 # => [V, K, 0, 0, 48, 0, T, P, R, ...] + # insert N |-> [K, V] into the advice map (0 cycles) + adv.insert_hperm + # compute N = hash([K, V], domain=48) - (1 cycles) hperm # => [X, N, X, T, P, R, ...] diff --git a/stdlib/tests/collections/smt.rs b/stdlib/tests/collections/smt.rs index e47ceb860c..d5b10993a6 100644 --- a/stdlib/tests/collections/smt.rs +++ b/stdlib/tests/collections/smt.rs @@ -1,9 +1,11 @@ use crate::build_test; use test_utils::{ - crypto::{MerkleStore, RpoDigest, TieredSmt}, - Felt, StarkField, Word, ONE, ZERO, + crypto::{MerkleStore, Rpo256, RpoDigest, TieredSmt}, + stack_to_ints, stack_top_to_ints, Felt, StarkField, Word, ONE, ZERO, }; +type AdvMapEntry = ([u8; 32], Vec); + // CONSTANTS // ================================================================================================ @@ -21,22 +23,22 @@ fn tsmt_get_16() { let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); // make sure we get an empty value for this key - assert_smt_get_opens_correctly(&smt, key_a, EMPTY_VALUE); + assert_get(&smt, key_a, EMPTY_VALUE); // insert a value under this key and make sure we get it back when queried let val_a = [ONE, ONE, ONE, ONE]; smt.insert(key_a, val_a); - assert_smt_get_opens_correctly(&smt, key_a, val_a); + assert_get(&smt, key_a, val_a); // make sure that another key still returns empty value let raw_b = 0b_01111101_01101100_00011111_11111111_10010110_10010011_11100000_00000000_u64; let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); - assert_smt_get_opens_correctly(&smt, key_b, EMPTY_VALUE); + assert_get(&smt, key_b, EMPTY_VALUE); // make sure that another key with the same 16-bit prefix returns an empty value let raw_c = 0b_01010101_01101100_11111111_11111111_10010110_10010011_11100000_00000000_u64; let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); - assert_smt_get_opens_correctly(&smt, key_c, EMPTY_VALUE); + assert_get(&smt, key_c, EMPTY_VALUE); } #[test] @@ -55,23 +57,23 @@ fn tsmt_get_32() { smt.insert(key_b, val_b); // make sure the values for these keys are retrieved correctly - assert_smt_get_opens_correctly(&smt, key_a, val_a); - assert_smt_get_opens_correctly(&smt, key_b, val_b); + assert_get(&smt, key_a, val_a); + assert_get(&smt, key_b, val_b); // make sure another key with the same 16-bit prefix returns an empty value let raw_c = 0b_01010101_01010101_11100111_11111111_10010110_10010011_11100000_00000000_u64; let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); - assert_smt_get_opens_correctly(&smt, key_c, EMPTY_VALUE); + assert_get(&smt, key_c, EMPTY_VALUE); // make sure keys with the same 32-bit prefixes return empty value let raw_d = 0b_01010101_01010101_00011111_11111111_11111110_10010011_11100000_00000000_u64; let key_d = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_d)]); - assert_smt_get_opens_correctly(&smt, key_d, EMPTY_VALUE); + assert_get(&smt, key_d, EMPTY_VALUE); // make sure keys with the same 32-bit prefixes return empty value let raw_e = 0b_01010101_01010101_11100000_11111111_10011111_10010011_11100000_00000000_u64; let key_e = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_e)]); - assert_smt_get_opens_correctly(&smt, key_e, EMPTY_VALUE); + assert_get(&smt, key_e, EMPTY_VALUE); } #[test] @@ -90,26 +92,77 @@ fn tsmt_get_48() { smt.insert(key_b, val_b); // make sure the values for these keys are retrieved correctly - assert_smt_get_opens_correctly(&smt, key_a, val_a); - assert_smt_get_opens_correctly(&smt, key_b, val_b); + assert_get(&smt, key_a, val_a); + assert_get(&smt, key_b, val_b); // make sure another key with the same 32-bit prefix returns an empty value let raw_c = 0b_01010101_01010101_00011111_11111111_00000000_10010011_11100000_00000000_u64; let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); - assert_smt_get_opens_correctly(&smt, key_c, EMPTY_VALUE); + assert_get(&smt, key_c, EMPTY_VALUE); // make sure keys with the same 48-bit prefixes return empty value let raw_d = 0b_01010101_01010101_00011111_11111111_10010110_10010011_00000111_00000000_u64; let key_d = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_d)]); - assert_smt_get_opens_correctly(&smt, key_d, EMPTY_VALUE); + assert_get(&smt, key_d, EMPTY_VALUE); // make sure keys with the same 48-bit prefixes return empty value let raw_e = 0b_01010101_01010101_00011111_11111111_11111111_10010011_000001011_00000000_u64; let key_e = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_e)]); - assert_smt_get_opens_correctly(&smt, key_e, EMPTY_VALUE); + assert_get(&smt, key_e, EMPTY_VALUE); +} + +/// Asserts key/value opens to root for the provided Tiered Sparse Merkle tree. +fn assert_get(smt: &TieredSmt, key: RpoDigest, value: Word) { + let root = smt.root(); + let source = r#" + use.std::collections::smt + + begin + exec.smt::get + end + "#; + let initial_stack = [ + root[0].as_int(), + root[1].as_int(), + root[2].as_int(), + root[3].as_int(), + key[0].as_int(), + key[1].as_int(), + key[2].as_int(), + key[3].as_int(), + ]; + let expected_output = [ + value[3].as_int(), + value[2].as_int(), + value[1].as_int(), + value[0].as_int(), + root[3].as_int(), + root[2].as_int(), + root[1].as_int(), + root[0].as_int(), + ]; + + let (store, advice_map) = build_advice_inputs(smt); + let advice_stack = []; + build_test!(source, &initial_stack, &advice_stack, store, advice_map.into_iter()) + .expect_stack(&expected_output); +} + +fn build_advice_inputs(smt: &TieredSmt) -> (MerkleStore, Vec<([u8; 32], Vec)>) { + let store = MerkleStore::from(smt); + let advice_map = smt + .upper_leaves() + .map(|(node, key, value)| { + let mut elements = key.as_elements().to_vec(); + elements.extend(&value); + (node.as_bytes(), elements) + }) + .collect::>(); + + (store, advice_map) } -// INSERTS +// INSERTION TESTS // ================================================================================================ #[test] @@ -121,15 +174,17 @@ fn tsmt_insert_16() { let val_a1 = [ONE, ZERO, ZERO, ZERO]; let val_a2 = [ONE, ONE, ZERO, ZERO]; - // insert a value under key_a into an empty tree + // insert a value under key_a into an empty tree; this inserts one entry into the advice map let init_smt = smt.clone(); smt.insert(key_a.into(), val_a1); - assert_insert(&init_smt, key_a, EMPTY_VALUE, val_a1, smt.root().into()); + let new_map_entries = [build_node_entry(key_a, val_a1, 16)]; + assert_insert(&init_smt, key_a, EMPTY_VALUE, val_a1, smt.root().into(), &new_map_entries); - // update a value under key_a + // update a value under key_a; this inserts one entry into the advice map let init_smt = smt.clone(); smt.insert(key_a.into(), val_a2); - assert_insert(&init_smt, key_a, val_a1, val_a2, smt.root().into()); + let new_map_entries = [build_node_entry(key_a, val_a2, 16)]; + assert_insert(&init_smt, key_a, val_a1, val_a2, smt.root().into(), &new_map_entries); } #[test] @@ -147,25 +202,30 @@ fn tsmt_insert_32() { let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); let val_b = [ONE, ONE, ZERO, ZERO]; - // this tests a complex insertion when a leaf node moves from depth 16 to depth 32 + // this tests a complex insertion when a leaf node moves from depth 16 to depth 32; this + // moves the original node to depth 32, and thus two new entries are added to the advice map let init_smt = smt.clone(); smt.insert(key_b.into(), val_b); - assert_insert(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into()); + let new_map_entries = [build_node_entry(key_a, val_a, 32), build_node_entry(key_b, val_b, 32)]; + assert_insert(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into(), &new_map_entries); - // update a value under key_a + // update a value under key_a; this adds one new entry to the advice map let init_smt = smt.clone(); let val_a2 = [ONE, ZERO, ZERO, ONE]; smt.insert(key_a.into(), val_a2); - assert_insert(&init_smt, key_a, val_a, val_a2, smt.root().into()); + let new_map_entries = [build_node_entry(key_a, val_a2, 32)]; + assert_insert(&init_smt, key_a, val_a, val_a2, smt.root().into(), &new_map_entries); - // insert a value under key_c which has the same 16-bit prefix as A and B + // insert a value under key_c which has the same 16-bit prefix as A and B; this inserts a new + // node at depth 32, and thus adds one entry to the advice map let raw_c = 0b00000000_00000000_00111111_11111111_11111111_11111111_11111111_11111111_u64; let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); let val_c = [ONE, ONE, ONE, ZERO]; let init_smt = smt.clone(); smt.insert(key_c.into(), val_c); - assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into()); + let new_map_entries = [build_node_entry(key_c, val_c, 32)]; + assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into(), &new_map_entries); } #[test] @@ -183,25 +243,30 @@ fn tsmt_insert_48() { let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); let val_b = [ONE, ONE, ZERO, ZERO]; - // this tests a complex insertion when a leaf moves from depth 16 to depth 48 + // this tests a complex insertion when a leaf moves from depth 16 to depth 48; this moves + // node at depth 16 to depth 48 and inserts a new node at depth 48 let init_smt = smt.clone(); smt.insert(key_b.into(), val_b); - assert_insert(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into()); + let new_map_entries = [build_node_entry(key_a, val_a, 48), build_node_entry(key_b, val_b, 48)]; + assert_insert(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into(), &new_map_entries); - // update a value under key_a + // update a value under key_a; this inserts one entry into the advice map let init_smt = smt.clone(); let val_a2 = [ONE, ZERO, ZERO, ONE]; smt.insert(key_a.into(), val_a2); - assert_insert(&init_smt, key_a, val_a, val_a2, smt.root().into()); + let new_map_entries = [build_node_entry(key_a, val_a2, 48)]; + assert_insert(&init_smt, key_a, val_a, val_a2, smt.root().into(), &new_map_entries); - // insert a value under key_c which has the same 32-bit prefix as A and B + // insert a value under key_c which has the same 32-bit prefix as A and B; this inserts + // one entry into the advice map let raw_c = 0b00000000_00000000_11111111_11111111_00111111_11111111_11111111_11111111_u64; let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); let val_c = [ONE, ONE, ONE, ZERO]; let init_smt = smt.clone(); smt.insert(key_c.into(), val_c); - assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into()); + let new_map_entries = [build_node_entry(key_c, val_c, 48)]; + assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into(), &new_map_entries); } #[test] @@ -225,10 +290,12 @@ fn tsmt_insert_48_from_32() { let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); let val_c = [ONE, ONE, ONE, ZERO]; - // this tests a complex insertion when a leaf moves from depth 32 to depth 48 + // this tests a complex insertion when a leaf moves from depth 32 to depth 48; two new + // entries are added to the advice map let init_smt = smt.clone(); smt.insert(key_c.into(), val_c); - assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into()); + let new_map_entries = [build_node_entry(key_a, val_a, 48), build_node_entry(key_c, val_c, 48)]; + assert_insert(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into(), &new_map_entries); } fn assert_insert( @@ -237,6 +304,7 @@ fn assert_insert( old_value: Word, new_value: Word, new_root: RpoDigest, + new_map_entries: &[AdvMapEntry], ) { let old_root = init_smt.root(); let source = r#" @@ -260,7 +328,7 @@ fn assert_insert( new_value[2].as_int(), new_value[3].as_int(), ]; - let expected_output = [ + let expected_output = stack_top_to_ints(&[ old_value[3].as_int(), old_value[2].as_int(), old_value[1].as_int(), @@ -269,61 +337,37 @@ fn assert_insert( new_root[2].as_int(), new_root[1].as_int(), new_root[0].as_int(), - ]; + ]); let (store, adv_map) = build_advice_inputs(init_smt); - build_test!(source, &initial_stack, &[], store, adv_map).expect_stack(&expected_output); + let process = build_test!(source, &initial_stack, &[], store, adv_map.clone()) + .execute_process() + .unwrap(); + + // check the returned values + let stack = stack_to_ints(&process.stack.trace_state()); + assert_eq!(stack, expected_output); + + // remove the initial key-value pairs from the advice map + let mut new_adv_map = process.advice_provider.map().clone(); + for (key, value) in adv_map.iter() { + let init_value = new_adv_map.remove(key).unwrap(); + assert_eq!(value, &init_value); + } + + // make sure the remaining values in the advice map are the same as expected new entries + assert_eq!(new_adv_map.len(), new_map_entries.len()); + for (key, val) in new_map_entries { + let old_val = new_adv_map.get(key).unwrap(); + assert_eq!(old_val, val); + } } -// TEST HELPERS +// HELPER FUNCTIONS // ================================================================================================ -/// Asserts key/value opens to root for the provided Tiered Sparse Merkle tree. -fn assert_smt_get_opens_correctly(smt: &TieredSmt, key: RpoDigest, value: Word) { - let root = smt.root(); - let source = r#" - use.std::collections::smt - - begin - exec.smt::get - end - "#; - let initial_stack = [ - root[0].as_int(), - root[1].as_int(), - root[2].as_int(), - root[3].as_int(), - key[0].as_int(), - key[1].as_int(), - key[2].as_int(), - key[3].as_int(), - ]; - let expected_output = [ - value[3].as_int(), - value[2].as_int(), - value[1].as_int(), - value[0].as_int(), - root[3].as_int(), - root[2].as_int(), - root[1].as_int(), - root[0].as_int(), - ]; - - let (store, advice_map) = build_advice_inputs(smt); - let advice_stack = []; - build_test!(source, &initial_stack, &advice_stack, store, advice_map.into_iter()) - .expect_stack(&expected_output); -} - -fn build_advice_inputs(smt: &TieredSmt) -> (MerkleStore, Vec<([u8; 32], Vec)>) { - let store = MerkleStore::from(smt); - let advice_map = smt - .upper_leaves() - .map(|(node, key, value)| { - let mut elements = key.as_elements().to_vec(); - elements.extend(&value); - (node.as_bytes(), elements) - }) - .collect::>(); - - (store, advice_map) +fn build_node_entry(key: RpoDigest, value: Word, depth: u8) -> AdvMapEntry { + let digest = Rpo256::merge_in_domain(&[key.into(), value.into()], depth.into()); + let mut elements = key.to_vec(); + elements.extend_from_slice(&value); + (digest.into(), elements) } From 820cb010ceb6c8391f4c1a679bc74af5e85bec24 Mon Sep 17 00:00:00 2001 From: leviathanbeak88 Date: Wed, 16 Aug 2023 13:54:55 +0200 Subject: [PATCH 062/120] migrate to clap --- miden/Cargo.toml | 4 ++-- miden/src/cli/bundle.rs | 12 ++++++------ miden/src/cli/compile.rs | 11 ++++++----- miden/src/cli/debug/mod.rs | 14 +++++++------- miden/src/cli/prove.rs | 28 ++++++++++++++-------------- miden/src/cli/repl.rs | 7 ++++--- miden/src/cli/run.rs | 20 ++++++++++---------- miden/src/cli/verify.rs | 14 +++++++------- miden/src/examples/mod.rs | 24 ++++++++++++------------ miden/src/main.rs | 12 ++++++------ miden/src/tools/mod.rs | 10 +++++----- 11 files changed, 79 insertions(+), 77 deletions(-) diff --git a/miden/Cargo.toml b/miden/Cargo.toml index 121d02cc4e..61e678b885 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -39,11 +39,12 @@ path = "tests/integration/main.rs" [features] concurrent = ["prover/concurrent", "std"] default = ["std"] -executable = ["env_logger", "hex/std", "std", "serde/std", "serde_derive", "serde_json/std", "structopt", "rustyline"] +executable = ["env_logger", "hex/std", "std", "serde/std", "serde_derive", "serde_json/std", "clap", "rustyline"] std = ["assembly/std", "log/std", "processor/std", "prover/std", "verifier/std"] [dependencies] assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } +clap = { version = "3.0", features = ["derive"], optional = true } env_logger = { version = "0.10", default-features = false, optional = true } hex = { version = "0.4", optional = true } log = { version = "0.4", default-features = false } @@ -54,7 +55,6 @@ serde = {version = "1.0.117", optional = true } serde_derive = {version = "1.0.117", optional = true } serde_json = {version = "1.0.59", optional = true } stdlib = { package = "miden-stdlib", path = "../stdlib", version = "0.6", default-features = false } -structopt = { version = "0.3", default-features = false, optional = true } verifier = { package = "miden-verifier", path = "../verifier", version = "0.7", default-features = false } [dev-dependencies] diff --git a/miden/src/cli/bundle.rs b/miden/src/cli/bundle.rs index 89819b81e3..d66f01e52a 100644 --- a/miden/src/cli/bundle.rs +++ b/miden/src/cli/bundle.rs @@ -1,21 +1,21 @@ use assembly::{LibraryNamespace, MaslLibrary, Version}; +use clap::Parser; use std::path::PathBuf; -use structopt::StructOpt; -#[derive(StructOpt, Debug)] -#[structopt( +#[derive(Debug, Clone, Parser)] +#[clap( name = "Compile Library", about = "Bundles .masm files into a single .masl library" )] pub struct BundleCmd { /// Path to a directory containing the `.masm` files which are part of the library. - #[structopt(parse(from_os_str))] + #[clap(value_parser)] dir: PathBuf, /// Defines the top-level namespace, e.g. `mylib`, otherwise the directory name is used. - #[structopt(short, long)] + #[clap(short, long)] namespace: Option, /// Version of the library, defaults to `0.1.0`. - #[structopt(short, long, default_value = "0.1.0")] + #[clap(short, long, default_value = "0.1.0")] version: String, } diff --git a/miden/src/cli/compile.rs b/miden/src/cli/compile.rs index 8510132b87..9eb5018b18 100644 --- a/miden/src/cli/compile.rs +++ b/miden/src/cli/compile.rs @@ -1,15 +1,16 @@ +use clap::Parser; + use super::data::{Debug, Libraries, ProgramFile}; use std::path::PathBuf; -use structopt::StructOpt; -#[derive(StructOpt, Debug)] -#[structopt(name = "Compile", about = "Compile a miden program")] +#[derive(Debug, Clone, Parser)] +#[clap(about = "Compile a miden program")] pub struct CompileCmd { /// Path to .masm assembly file - #[structopt(short = "a", long = "assembly", parse(from_os_str))] + #[clap(short = 'a', long = "assembly", value_parser)] assembly_file: PathBuf, /// Paths to .masl library files - #[structopt(short = "l", long = "libraries", parse(from_os_str))] + #[clap(short = 'l', long = "libraries", value_parser)] library_paths: Vec, } diff --git a/miden/src/cli/debug/mod.rs b/miden/src/cli/debug/mod.rs index ba588643a2..96d5c0a676 100644 --- a/miden/src/cli/debug/mod.rs +++ b/miden/src/cli/debug/mod.rs @@ -1,7 +1,7 @@ use super::data::{Debug, InputFile, Libraries, ProgramFile}; +use clap::Parser; use rustyline::{error::ReadlineError, Config, DefaultEditor, EditMode}; use std::path::PathBuf; -use structopt::StructOpt; mod command; use command::DebugCommand; @@ -9,20 +9,20 @@ use command::DebugCommand; mod executor; use executor::DebugExecutor; -#[derive(StructOpt, Debug)] -#[structopt(name = "Debug", about = "Debug a miden program")] +#[derive(Debug, Clone, Parser)] +#[clap(about = "Debug a miden program")] pub struct DebugCmd { /// Path to .masm assembly file - #[structopt(short = "a", long = "assembly", parse(from_os_str))] + #[clap(short = 'a', long = "assembly", value_parser)] assembly_file: PathBuf, /// Path to input file - #[structopt(short = "i", long = "input", parse(from_os_str))] + #[clap(short = 'i', long = "input", value_parser)] input_file: Option, /// Enable vi edit mode - #[structopt(short = "vi", long = "vim_edit_mode")] + #[clap(long = "vi", long = "vim_edit_mode")] vim_edit_mode: Option, /// Paths to .masl library files - #[structopt(short = "l", long = "libraries", parse(from_os_str))] + #[clap(short = 'l', long = "libraries", value_parser)] library_paths: Vec, } diff --git a/miden/src/cli/prove.rs b/miden/src/cli/prove.rs index 11e37893a7..0318e2b48b 100644 --- a/miden/src/cli/prove.rs +++ b/miden/src/cli/prove.rs @@ -1,51 +1,51 @@ use super::data::{Debug, InputFile, Libraries, OutputFile, ProgramFile, ProofFile}; +use clap::Parser; use miden::ProvingOptions; use processor::{ExecutionOptions, ExecutionOptionsError}; use std::{io::Write, path::PathBuf, time::Instant}; -use structopt::StructOpt; -// TODO check if structopt is supporting automatic generation of list values of hash function -#[derive(StructOpt, Debug)] -#[structopt(name = "Prove", about = "Prove a miden program")] +// TODO check if clap is supporting automatic generation of list values of hash function +#[derive(Debug, Clone, Parser)] +#[clap(about = "Prove a miden program")] pub struct ProveCmd { /// Path to .masm assembly file - #[structopt(short = "a", long = "assembly", parse(from_os_str))] + #[clap(short = 'a', long = "assembly", value_parser)] assembly_file: PathBuf, /// Number of cycles the program is expected to consume - #[structopt(short = "e", long = "exp-cycles", default_value = "64")] + #[clap(short = 'e', long = "exp-cycles", default_value = "64")] expected_cycles: u32, /// Path to input file - #[structopt(short = "i", long = "input", parse(from_os_str))] + #[clap(short = 'i', long = "input", value_parser)] input_file: Option, /// Paths to .masl library files - #[structopt(short = "l", long = "libraries", parse(from_os_str))] + #[clap(short = 'l', long = "libraries", value_parser)] library_paths: Vec, /// Maximum number of cycles a program is allowed to consume - #[structopt(short = "m", long = "max-cycles", default_value = "4294967295")] + #[clap(short = 'm', long = "max-cycles", default_value = "4294967295")] max_cycles: u32, /// Number of outputs - #[structopt(short = "n", long = "num-outputs", default_value = "16")] + #[clap(short = 'n', long = "num-outputs", default_value = "16")] num_outputs: usize, /// Path to output file - #[structopt(short = "o", long = "output", parse(from_os_str))] + #[clap(short = 'o', long = "output", value_parser)] output_file: Option, /// Path to proof file - #[structopt(short = "p", long = "proof", parse(from_os_str))] + #[clap(short = 'p', long = "proof", value_parser)] proof_file: Option, /// Enable generation of proofs suitable for recursive verification - #[structopt(short = "r", long = "recursive")] + #[clap(short = 'r', long = "recursive")] recursive: bool, /// Security level for execution proofs generated by the VM - #[structopt(short = "s", long = "security", default_value = "96bits")] + #[clap(short = 's', long = "security", default_value = "96bits")] security: String, } diff --git a/miden/src/cli/repl.rs b/miden/src/cli/repl.rs index 3b5ee5b749..4ce4d3ecce 100644 --- a/miden/src/cli/repl.rs +++ b/miden/src/cli/repl.rs @@ -1,8 +1,9 @@ +use clap::Parser; + use crate::repl::start_repl; -use structopt::StructOpt; -#[derive(StructOpt, Debug)] -#[structopt(name = "Repl", about = "Initiates the Miden REPL tool")] +#[derive(Debug, Clone, Parser)] +#[clap(about = "Initiates the Miden REPL tool")] pub struct ReplCmd {} impl ReplCmd { diff --git a/miden/src/cli/run.rs b/miden/src/cli/run.rs index c7fe6aba46..6f011c28fd 100644 --- a/miden/src/cli/run.rs +++ b/miden/src/cli/run.rs @@ -1,37 +1,37 @@ use super::data::{Debug, InputFile, Libraries, OutputFile, ProgramFile}; +use clap::Parser; use processor::ExecutionOptions; use std::{path::PathBuf, time::Instant}; -use structopt::StructOpt; -#[derive(StructOpt, Debug)] -#[structopt(name = "Run", about = "Run a miden program")] +#[derive(Debug, Clone, Parser)] +#[clap(about = "Run a miden program")] pub struct RunCmd { /// Path to .masm assembly file - #[structopt(short = "a", long = "assembly", parse(from_os_str))] + #[clap(short = 'a', long = "assembly", value_parser)] assembly_file: PathBuf, /// Number of cycles the program is expected to consume - #[structopt(short = "e", long = "exp-cycles", default_value = "64")] + #[clap(short = 'e', long = "exp-cycles", default_value = "64")] expected_cycles: u32, /// Path to input file - #[structopt(short = "i", long = "input", parse(from_os_str))] + #[clap(short = 'i', long = "input", value_parser)] input_file: Option, /// Paths to .masl library files - #[structopt(short = "l", long = "libraries", parse(from_os_str))] + #[clap(short = 'l', long = "libraries", value_parser)] library_paths: Vec, /// Maximum number of cycles a program is allowed to consume - #[structopt(short = "m", long = "max-cycles", default_value = "4294967295")] + #[clap(short = 'm', long = "max-cycles", default_value = "4294967295")] max_cycles: u32, /// Number of ouptuts - #[structopt(short = "n", long = "num-outputs", default_value = "16")] + #[clap(short = 'n', long = "num-outputs", default_value = "16")] num_outputs: usize, /// Path to output file - #[structopt(short = "o", long = "output", parse(from_os_str))] + #[clap(short = 'o', long = "output", value_parser)] output_file: Option, } diff --git a/miden/src/cli/verify.rs b/miden/src/cli/verify.rs index 5f36937cc9..9e81863b26 100644 --- a/miden/src/cli/verify.rs +++ b/miden/src/cli/verify.rs @@ -1,22 +1,22 @@ use super::data::{InputFile, OutputFile, ProgramHash, ProofFile}; +use clap::Parser; use miden::{Kernel, ProgramInfo}; use std::{path::PathBuf, time::Instant}; -use structopt::StructOpt; -#[derive(StructOpt, Debug)] -#[structopt(name = "Verify", about = "Verify a miden program")] +#[derive(Debug, Clone, Parser)] +#[clap(about = "Verify a miden program")] pub struct VerifyCmd { /// Path to input file - #[structopt(short = "i", long = "input", parse(from_os_str))] + #[clap(short = 'i', long = "input", value_parser)] input_file: Option, /// Path to output file - #[structopt(short = "o", long = "output", parse(from_os_str))] + #[clap(short = 'o', long = "output", value_parser)] output_file: Option, /// Path to proof file - #[structopt(short = "p", long = "proof", parse(from_os_str))] + #[clap(short = 'p', long = "proof", value_parser)] proof_file: PathBuf, /// Program hash (hex) - #[structopt(short = "h", long = "program-hash")] + #[clap(short = 'h', long = "program-hash")] program_hash: String, } diff --git a/miden/src/examples/mod.rs b/miden/src/examples/mod.rs index f22d92ccad..b3bceb9e4d 100644 --- a/miden/src/examples/mod.rs +++ b/miden/src/examples/mod.rs @@ -1,8 +1,8 @@ +use clap::Parser; use miden::{AdviceProvider, ExecutionProof, Program, ProgramInfo, ProvingOptions, StackInputs}; use processor::{ExecutionOptions, ExecutionOptionsError}; use std::io::Write; use std::time::Instant; -use structopt::StructOpt; pub mod fibonacci; @@ -23,36 +23,36 @@ where // EXAMPLE OPTIONS // ================================================================================================ -#[derive(StructOpt, Debug)] -#[structopt(name = "Examples", about = "Run an example miden program")] +#[derive(Debug, Clone, Parser)] +#[clap(about = "Run an example miden program")] pub struct ExampleOptions { - #[structopt(subcommand)] + #[clap(subcommand)] pub example: ExampleType, /// Number of cycles the program is expected to consume - #[structopt(short = "e", long = "exp-cycles", default_value = "64")] + #[clap(short = 'r', long = "exp-cycles", default_value = "64")] expected_cycles: u32, /// Maximum number of cycles a program is allowed to consume - #[structopt(short = "m", long = "max-cycles", default_value = "4294967295")] + #[clap(short = 'm', long = "max-cycles", default_value = "4294967295")] max_cycles: u32, /// Enable generation of proofs suitable for recursive verification - #[structopt(short = "r", long = "recursive")] + #[clap(short = 'r', long = "recursive")] recursive: bool, - /// Security level for execution proofs generated by the VM - #[structopt(short = "s", long = "security", default_value = "96bits")] + /// Security level for execution proofs generated by the VM + #[clap(short = 's', long = "security", default_value = "96bits")] security: String, } -#[derive(StructOpt, Debug)] -//#[structopt(about = "available examples")] +#[derive(Debug, Clone, Parser)] +//#[clap(about = "available examples")] pub enum ExampleType { /// Compute a Fibonacci sequence of the specified length Fib { /// Length of Fibonacci sequence - #[structopt(short = "n", default_value = "1024")] + #[clap(short = 'n', default_value = "1024")] sequence_length: usize, }, } diff --git a/miden/src/main.rs b/miden/src/main.rs index bc5e370bf6..cd3e8bb64b 100644 --- a/miden/src/main.rs +++ b/miden/src/main.rs @@ -1,6 +1,6 @@ +use clap::Parser; use core::fmt; use miden::{AssemblyError, ExecutionError}; -use structopt::StructOpt; mod cli; mod examples; @@ -8,15 +8,15 @@ mod repl; mod tools; /// Root CLI struct -#[derive(StructOpt, Debug)] -#[structopt(name = "Miden", about = "Miden CLI")] +#[derive(Parser, Debug)] +#[clap(name = "Miden", about = "Miden CLI", version, rename_all = "kebab-case")] pub struct Cli { - #[structopt(subcommand)] + #[clap(subcommand)] action: Actions, } /// CLI actions -#[derive(StructOpt, Debug)] +#[derive(Debug, Parser)] pub enum Actions { Analyze(tools::Analyze), Compile(cli::CompileCmd), @@ -51,7 +51,7 @@ impl Cli { /// Executable entry point pub fn main() { // read command-line args - let cli = Cli::from_args(); + let cli = Cli::parse(); // execute cli action if let Err(error) = cli.execute() { diff --git a/miden/src/tools/mod.rs b/miden/src/tools/mod.rs index a5fe8a0886..b4ee0f87c0 100644 --- a/miden/src/tools/mod.rs +++ b/miden/src/tools/mod.rs @@ -1,23 +1,23 @@ use super::{cli::InputFile, ProgramError}; +use clap::Parser; use core::fmt; use miden::{utils::collections::Vec, AdviceProvider, Assembler, Operation, StackInputs}; use processor::AsmOpInfo; use std::{fs, path::PathBuf}; use stdlib::StdLibrary; -use structopt::StructOpt; // CLI // ================================================================================================ /// Defines cli interface -#[derive(StructOpt, Debug)] -#[structopt(about = "Analyze a miden program")] +#[derive(Debug, Clone, Parser)] +#[clap(about = "Analyze a miden program")] pub struct Analyze { /// Path to .masm assembly file - #[structopt(short = "a", long = "assembly", parse(from_os_str))] + #[clap(short = 'a', long = "assembly", value_parser)] assembly_file: PathBuf, /// Path to .inputs file - #[structopt(short = "i", long = "input", parse(from_os_str))] + #[clap(short = 'i', long = "input", value_parser)] input_file: Option, } From aa39f206509df081d0719ec27f6c9c684ec4d678 Mon Sep 17 00:00:00 2001 From: grjte Date: Mon, 7 Aug 2023 10:17:33 -0400 Subject: [PATCH 063/120] docs: update with LogUp + range checker changes --- docs/src/SUMMARY.md | 4 +- .../assets/design/lookups/logup_component.png | Bin 0 -> 125197 bytes .../src/assets/design/lookups/logup_table.png | Bin 0 -> 83256 bytes .../assets/design/range/rc_16_bit_logup.png | Bin 0 -> 14346 bytes .../assets/design/range/rc_8_bit_logup.png | Bin 0 -> 13808 bytes .../design/range/rc_with_bridge_rows.png | Bin 285757 -> 25591 bytes docs/src/design/chiplets/hasher.md | 2 +- docs/src/design/chiplets/main.md | 8 +- docs/src/design/chiplets/memory.md | 10 +- docs/src/design/lookups/logup.md | 65 ++++++++ docs/src/design/lookups/main.md | 55 +++++++ docs/src/design/{ => lookups}/multiset.md | 59 ++----- docs/src/design/main.md | 2 +- docs/src/design/range.md | 150 ++++++------------ docs/src/design/stack/main.md | 2 +- docs/src/design/stack/u32_ops.md | 8 +- 16 files changed, 204 insertions(+), 161 deletions(-) create mode 100644 docs/src/assets/design/lookups/logup_component.png create mode 100644 docs/src/assets/design/lookups/logup_table.png create mode 100644 docs/src/assets/design/range/rc_16_bit_logup.png create mode 100644 docs/src/assets/design/range/rc_8_bit_logup.png create mode 100644 docs/src/design/lookups/logup.md create mode 100644 docs/src/design/lookups/main.md rename docs/src/design/{ => lookups}/multiset.md (56%) diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 7d386e3bca..62a956d442 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -42,5 +42,7 @@ - [Bitwise Chiplet](./design/chiplets/bitwise.md) - [Memory Chiplet](./design/chiplets/memory.md) - [Kernel ROM Chiplet](./design/chiplets/kernel_rom.md) - - [Multiset checks](./design/multiset.md) + - [Lookup arguments](./design/lookups/main.md) + - [Multiset checks](./design/lookups/multiset.md) + - [LogUp](./design/lookups/logup.md) - [Background Material](./background.md) diff --git a/docs/src/assets/design/lookups/logup_component.png b/docs/src/assets/design/lookups/logup_component.png new file mode 100644 index 0000000000000000000000000000000000000000..364e7cbd6da061036727faa50ec254a6d936f285 GIT binary patch literal 125197 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

      qjG-rC16>wmfB@^xMnIBnG@l@Lx- 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 Ms|K3o8g}9T0Zp4~5C8xG literal 0 HcmV?d00001 diff --git a/docs/src/assets/design/lookups/logup_table.png b/docs/src/assets/design/lookups/logup_table.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8f1422843aef3c17c47bd8997cfc530ff928aa GIT binary patch literal 83256 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 NbzAr6w*Za6S67$jmTd3SDbO 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 hGCZ9mHpz&I_hl|xPG@)NKz18u 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 TjT5c=8Gyjk)z4*}Q$iB};I}4t literal 0 HcmV?d00001 diff --git a/docs/src/assets/design/range/rc_16_bit_logup.png b/docs/src/assets/design/range/rc_16_bit_logup.png new file mode 100644 index 0000000000000000000000000000000000000000..79dadaf658ecd2f9e1c26318a405920a4095ea59 GIT binary patch literal 14346 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 literal 0 HcmV?d00001 diff --git a/docs/src/assets/design/range/rc_8_bit_logup.png b/docs/src/assets/design/range/rc_8_bit_logup.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cc4dbc86809bee3691f74fa2b0e6bc78164abd GIT binary patch literal 13808 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�LoYtkdQa7vU4EJ)nX*B9QWOL~P~SoE~mIG@rtQZ!L25Y_p+-fueQ zZfqduF+wC`-3ukJ^? zGvXVCz&en2A6&Hm3}=DzB!4L?l?5mme}o@70x?%W3#G-P(a26K^2nZ z(%kUR4-y5s1ZLOPVt@3TwA93|V^qg}3`XQ}T1+*+lF8Gc^^?o!4dEp9LRpbi8m&L- zXeTdx$8-G7LDCYy0_0_ZY!i%;p1i2qPy0s)nUliGXItehAw4HS|m@An$T{_ zY4*q3fmQ$sgi)5v#ySBIA60MkFm2MmZ%NZ{6R4%xg}siyPrP&!2q*p1oOv4 zB)pjbH%>NMl@I$rxc5OrwXE|0pDg{12j!{lLMkFy5*sQ&Ho2k*vELCOm3-P<)&^!% zC3Bt8Og-`KeY3o>4xffVLpvtOPDeRs8oi_@^qy=>e-dk0ljG6-yo+hG(lN0$T%m4_ zj9R{2YZmDq@YdW%PaN_(I8f8UhOC;;pA|prRIhy+hNb(OANMOW8c-xOM}m;s_1?@? zrt6ptZJVBZY0aedDjyRhs1l$h#GPd)m~xjh*w9t@U->c~1EX-rw&XWRHUie4oHj9qi*HR@qtFk6mI-xn zlLJ-WmzskM$yJD(lMgke$)}1z4dR6bpC{+6Do<|KU*v2dJf~F)={gWo8newz7Q-2W zuiR)fEHP+J7jYm}@~|FnYED$cXmnKuvgwky*`EZ?gIsuQLpnrdON!UPfj6c=0V=T) zhC@VF)=xKA%N`O#ihcf_i1~)mblIn#Xeb4z?5*UF>D>>Gre9n%Gj$QAFYAKTn19wR z$Ec_P0CLvLI|8caD`7ts78-@~uf?+xU7!oMyh7 z>t>79`|^8aso4&+p&)AXI{Za(u|6|LkZy-wA6P#g!e3_yd@G=$Gim=*!H&Bd-*F4I z#K(roAU^4ACG#W;5ZwT;v93W1CX6sMS6R;*Nh_OLGdx8fApXNIThhTqv7a*S#ftPU z*Vyw8;i45vTuCyWrp4wIP9+?T{=qY+=~xZOYNZH}ZN>Lz{XUsr(?|r;fsl2pvIC@y zPa5Awll!p-;KS!#_%bQ{29n8vtX}&6iZDS+kYmT>x1~$ww&Unbrh~zx z>!L&j>q4YW<9<327tYl;aLQELfb=lr$SVDvb9EGOzkK6bHev%S#5lZ=lRo`k>&bjZ zvybSoqIUXDA)w=KY29s@ATHe`$P?&S1H*C+4PNrT2taXAyOwhf{tBq0Y&0Ue?^&{Xnf!P4h z*$j5@haChq+&5hcj2~*R?`qRE+FQ1%yizmNaJPWD2tRFFRn!5}=_5FOlLwMBUB-p3 zf0M8DpE%bHg9of(_=jJNH2p>b)I;fe=q5xJH&gp@yB}zFFD}qW^`7rp>uA|KaK8rU zbAe7HMYs;CcT`MSWEE=<4t^A1SKvfjk0?no+s6125~HxFyAf7=uL8L z(Swnv>$97S>btM)jd($Y)qer@bqH#IO#mO< zb_pLWFnea`H;*{*q-a_B2ST!!8Mv`hMFTXqr=75(`1g#|la^iBoP5oLc%cVCK}J=& IR?;;1f3AJIIsgCw literal 285757 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%0DR~=XTdgf)(1kXA5*DCfz0E7(9J)Q)f$a2G! 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 z%0D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∾6yf_|0A#Jhm?VHALO-Zr~ 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 IM6N<$f`T3d%m4rY diff --git a/docs/src/design/chiplets/hasher.md b/docs/src/design/chiplets/hasher.md index e735e0a82b..8176410ebd 100644 --- a/docs/src/design/chiplets/hasher.md +++ b/docs/src/design/chiplets/hasher.md @@ -329,7 +329,7 @@ $$ Note, that when a computation is completed (i.e., $f_{out}=1$), the next hasher state is unconstrained. ### Multiset check constraints -In this sections we describe constraints which enforce updates for [multiset check columns](../multiset.md) $b_{chip}$ and $p_1$. These columns can be updated only on rows which are multiples of $8$ or $1$ less than a multiple of $8$. On all other rows the values in the columns remain the same. +In this sections we describe constraints which enforce updates for [multiset check columns](../lookups/multiset.md) $b_{chip}$ and $p_1$. These columns can be updated only on rows which are multiples of $8$ or $1$ less than a multiple of $8$. On all other rows the values in the columns remain the same. To simplify description of the constraints, we define the following variables. Below, we denote random values sent by the verifier after the prover commits to the main execution trace as $\alpha_0$, $\alpha_1$, $\alpha_2$ etc. diff --git a/docs/src/design/chiplets/main.md b/docs/src/design/chiplets/main.md index 14707cc6e4..2695b01b0e 100644 --- a/docs/src/design/chiplets/main.md +++ b/docs/src/design/chiplets/main.md @@ -148,9 +148,9 @@ In other words, the above constraints enforce that if a selector is $0$ in the c The chiplets must be explicitly connected to the rest of the VM in order for it to use their operations. This connection must prove that all specialized operations which a given VM component claimed to offload to one of the chiplets were in fact executed by the correct chiplet with the same set of inputs and outputs as those used by the offloading component. -This is achieved via a [bus](../multiset.md#communication-buses) called $b_{chip}$ where a request can be sent to any chiplet and a corresponding response will be sent back by that chiplet. +This is achieved via a [bus](../lookups/main.md#communication-buses-in-miden-vm) called $b_{chip}$ where a request can be sent to any chiplet and a corresponding response will be sent back by that chiplet. -The bus is implemented as a single [running product column](../multiset.md) where: +The bus is implemented as a single [running product column](../lookups/multiset.md) where: - Each request is “sent” by computing an operation-specific lookup value from an [operation-specific label](#operation-labels), the operation inputs, and the operation outputs, and then dividing it out of the $b_{chip}$ running product column. - Each chiplet response is “sent” by computing the same operation-specific lookup value from the label, inputs, and outputs, and then multiplying it into the $b_{chip}$ running product column. @@ -173,13 +173,13 @@ Responses are provided by the [hash](./hasher.md#chiplets-bus-constraints), [bit ## Chiplets virtual table -Some chiplets require the use of a [virtual table](../multiset.md#virtual-tables) to maintain and enforce the correctness of their internal state. Because the length of these virtual tables does not exceed the length of the chiplets themselves, a single virtual table called $vt_{chip}$ can be shared by all chiplets. +Some chiplets require the use of a [virtual table](../lookups/multiset.md#virtual-tables) to maintain and enforce the correctness of their internal state. Because the length of these virtual tables does not exceed the length of the chiplets themselves, a single virtual table called $vt_{chip}$ can be shared by all chiplets. Currently, the chiplets virtual table combines two virtual tables: - the hash chiplet's [sibling table](./hasher.md#sibling-table-constraints) - the kernel ROM chiplet's [kernel procedure table](./kernel_rom.md#kernel-procedure-table-constraints) -To combine these correctly, the [running product column](../multiset.md) for this table must be constrained not only at the beginning and the end of the trace, but also where the hash chiplet ends and where the kernel ROM chiplet begins. These positions can be identified using the chiplet selector columns. +To combine these correctly, the [running product column](../lookups/multiset.md) for this table must be constrained not only at the beginning and the end of the trace, but also where the hash chiplet ends and where the kernel ROM chiplet begins. These positions can be identified using the chiplet selector columns. ### Chiplets virtual table constraints diff --git a/docs/src/design/chiplets/memory.md b/docs/src/design/chiplets/memory.md index 708cf7c565..c2455622f8 100644 --- a/docs/src/design/chiplets/memory.md +++ b/docs/src/design/chiplets/memory.md @@ -2,7 +2,7 @@ Miden VM supports linear read-write random access memory. This memory is word-addressable, meaning, four values are located at each address, and we can read and write values to/from memory in batches of four. Each value is a field element in a $64$-bit prime field with modulus $2^{64} - 2^{32} + 1$. Memory address can be any field element. -In this note we describe the rational for selecting the above design and describe AIR constraints needed to support it. +In this note we describe the rationale for selecting the above design and describe AIR constraints needed to support it. The design makes extensive use of $16$-bit range checks. An efficient way of implementing such range checks is described [here](../range.md). @@ -30,8 +30,6 @@ $$ where $v$ is the value in `value` column at the current row, and $v'$ is the value in this column in the next row. -In addition to the above constraints we would also need to impose constraints needed for permutation checks, but we omit these constraints here because they are needed for all designs described in this note. - As mentioned above, this approach is very efficient: each memory access requires just $2$ trace cells. ### Read-write memory @@ -112,7 +110,7 @@ The above constraint, in combination with $16$-bit range checks against columns ### Context separation -In many situations it may be desirable to assign memories to different context. For example, when making a cross-contract calls, memories of the caller and the callee should be separate. That is, caller should not be able to access the memory of the callee and vice-versa. +In many situations it may be desirable to assign memories to different contexts. For example, when making a cross-contract calls, the memories of the caller and the callee should be separate. That is, the caller should not be able to access the memory of the callee and vice-versa. To accommodate this feature, we need to add one more column as illustrated below. @@ -124,7 +122,7 @@ This new column `ctx` should behave similarly to the address column: values in i - If the context remains the same but the address changes, column `t` should be set to the inverse of $(a' - a)$. - Otherwise, column `t` should be set to $0$. -To simplify description of constraints, we'll define two variables $n_0$ and $n_1$ as follows: +To simplify the description of constraints, we'll define two variables $n_0$ and $n_1$ as follows: $$ n_0 = (c' - c) \cdot t' \\ @@ -253,7 +251,7 @@ $$ Where $\Delta i = i' - i - 1$. -In addition to this constraint, we also need to make sure that values in registers $d_0$ and $d_1$ are less than $2^{16}$, and this can be done with permutation-based range checks. +In addition to this constraint, we also need to make sure that the values in registers $d_0$ and $d_1$ are less than $2^{16}$, and this can be done with [range checks](../range.md). Next, we need to make sure that values at a given memory address are always initialized to $0$. This can be done with the following constraint: diff --git a/docs/src/design/lookups/logup.md b/docs/src/design/lookups/logup.md new file mode 100644 index 0000000000..aa207a11ce --- /dev/null +++ b/docs/src/design/lookups/logup.md @@ -0,0 +1,65 @@ +# LogUp: multivariate lookups with logarithmic derivatives + +The description of LogUp can be found [here](https://eprint.iacr.org/2022/1530.pdf). In MidenVM, LogUp is used to implement efficient [communication buses](./main.md#communication-buses-in-miden-vm). + +Using the LogUp construction instead of a simple [multiset check](./multiset.md) with running products reduces the computational effort for the prover and the verifier. Given two columns $a$ and $b$ in the main trace where $a$ contains duplicates and $b$ does not (i.e. $b$ is part of the lookup table), LogUp allows us to compute two logarithmic derivatives and check their equality. + +$$ +\sum_{i=0}^{l} \frac{1}{(\alpha - a_i)} = \sum_{i=0}^{n} \frac{m_i}{(\alpha - b_i)} +$$ + +In the above: +- $l$ is the number of values in $a$, which must be smaller than the size of the field. (The prime field used for Miden VM has modulus $p = 2^{64} - 2^{32} + 1$, so $l < p$ must be true.) +- $n$ is the number of values in $b$, which must be smaller than the size of the field. ($n < p$, for Miden VM) +- $m_i$ is the multiplicity of $b_i$, which is expected to match the number of times the value $b_i$ is duplicated in column $a$. It must be smaller than the size of the set of lookup values. ($m_i < n$) +- $\alpha$ is a random value that is sent to the prover by the verifier after the prover commits to the execution trace of the program. + +Thus, instead of needing to compute running products, we are able to assert correct lookups by computing running sums. + +## Usage in Miden VM + +The generalized trace columns and constraints for this construction are as follows, where component $X$ is some component in the trace and lookup table $T$ contains the values $v$ which need to be looked up from $X$ and how many times they are looked up (the multiplicity $m$). + +![logup_component_x](../../assets/design/lookups/logup_component.png) + +![logup_table_t](../../assets/design/lookups/logup_table.png) + +### Constraints + +The diagrams above show running sum columns for computing the logarithmic derivatives for both $X$ and $T$. As an optimization, we can combine these values into a single auxiliary column in the extension field that contains the running sum of values from both logarithmic derivatives. We'll refer to this column as a _communication bus_ $b$, since it communicates the lookup request from the component $X$ to the lookup table $T$. + +This can be expressed as follows: + +> $$ +b' = b + \frac{m}{(\alpha - v)} - \frac{1}{(\alpha - x)} +$$ + +Since constraints must be expressed without division, the actual constraint which is enforced will be the following: + +> $$ +b' \cdot (\alpha - v) \cdot (\alpha - x) = b \cdot (\alpha - v) \cdot (\alpha - v) + m \cdot (\alpha - x) - (\alpha - v) \text{ | degree} = 3 +$$ + +In general, we will write constraints within these docs using the previous form, since it's clearer and more readable. + +Additionally, boundary constraints must be enforced against $b$ to ensure that its initial and final values are $1$. This will enforce that the logarithmic derivatives for $X$ and $T$ were equal. + +### Extending the construction to multiple components + +The functionality of the bus can easily be extended to receive lookup requests from multiple components. For example, to additionally support requests from column $y$, the bus constraint would be modified to the following: + +> $$ +b' = b + \frac{m}{(\alpha - v)} - \frac{1}{(\alpha - x)} - \frac{1}{(\alpha - y)} \text{ | degree} = 4 +$$ + +Since the maximum constraint degree in Miden VM is 9, the lookup table $T$ could accommodate requests from at most 7 trace columns in the same trace row via this construction. + +### Extending the construction with flags + +Boolean flags can also be used to determine when requests from various components are sent to the bus. For example, let $f_x$ be 1 when a request should be sent from $x$ and 0 otherwise, and let $f_y$ be similarly defined for column $y$. We can use the following constraint to turn requests on or off: + +> $$ +b' = b + \frac{m}{(\alpha - v)} - \frac{f_x}{(\alpha - x)} - \frac{f_y}{(\alpha - y)} \text{ | degree} = 4 +$$ + +If any of these flags have degree greater than 2 then this will increase the overall degree of the constraint and reduce the number of lookup requests that can be accommodated by the bus per row. \ No newline at end of file diff --git a/docs/src/design/lookups/main.md b/docs/src/design/lookups/main.md new file mode 100644 index 0000000000..e37309c3e4 --- /dev/null +++ b/docs/src/design/lookups/main.md @@ -0,0 +1,55 @@ +# Lookup arguments in Miden VM + +Zero knowledge virtual machines frequently make use of lookup arguments to enable performance optimizations. Miden VM uses two types of arguments: multiset checks and a multivariate lookup based on logarithmic derivatives known as LogUp. A brief introduction to multiset checks can be found [here](https://hackmd.io/@arielg/ByFgSDA7D). The description of LogUp can be found [here](https://eprint.iacr.org/2022/1530.pdf). + +In Miden VM, lookup arguments are used for two purposes: + +1. To prove the consistency of intermediate values that must persist between different cycles of the trace without storing the full data in the execution trace (which would require adding more columns to the trace). +2. To prove correct interaction between two independent sections of the execution trace, e.g., between the main trace where the result of some operation is required, but would be expensive to compute, and a specialized component which can perform that operation cheaply. + +The first is achieved using [virtual tables](#virtual-tables-in-miden-vm) of data, where we add a row at some cycle in the trace and remove it at a later cycle when it is needed again. Instead of maintaining the entire table in the execution trace, multiset checks allow us to prove data consistency of this table using one running product column. + +The second is done by reducing each operation to a lookup value and then using a [communication bus](#communication-buses-in-miden-vm) to provably connect the two sections of the trace. These communication buses can be implemented either via [multiset checks](./multiset.md#communication-buses) or via the [LogUp argument](./logup.md). + + +## Virtual tables in Miden VM + +Miden VM makes use of 6 virtual tables across 4 components, all of which are implemented via [multiset checks](./multiset.md#virtual-tables): + +- Stack: + - [Overflow table](../stack/main.md#overflow-table) +- Decoder: + - [Block stack table](../decoder/main.md#block-stack-table) + - [Block hash table](../decoder/main.md#block-hash-table) + - [Op group table](../decoder/main.md#op-group-table) +- Chiplets: + - [Chiplets virtual table](../chiplets/main.md#chiplets-virtual-table), which combines the following two tables into one: + - [Hash chiplet sibling table](../chiplets/hasher.md#sibling-table-constraints) + - [Kernel ROM chiplet procedure table](../chiplets/kernel_rom.md#kernel-procedure-table-constraints) + +## Communication buses in Miden VM + +One strategy for improving the efficiency of a zero knowledge virtual machine is to use specialized components for complex operations and have the main circuit “offload” those operations to the corresponding components by specifying inputs and outputs and allowing the proof of execution to be done by the dedicated component instead of by the main circuit. + +These specialized components are designed to prove the internal correctness of the execution of the operations they support. However, in isolation they cannot make any guarantees about the source of the input data or the destination of the output data. + +In order to prove that the inputs and outputs specified by the main circuit match the inputs and outputs provably executed in the specialized component, some kind of provable communication bus is needed. + +This bus is typically implemented as some kind of lookup argument, and in Miden VM in particular we use multiset checks or LogUp. + +Miden VM uses 2 communication buses: + +- The chiplets bus [$b_{chip}$](../chiplets/main.md#chiplets-bus), which communicates with all of the chiplets (Hash, Bitwise, Memory, and Kernel ROM). It is implemented using multiset checks. +- The range checker bus [$b_{range}$](../range.md#communication-bus), which facilitates requests between the [stack](../stack/u32_ops.md) and [memory](../chiplets/memory.md) components and the [range checker](../range.md). It is implemented using LogUp. + + +## Length of auxiliary columns for lookup arguments + +The auxiliary columns used for buses and virtual tables are computed by including information from the *current* row of the main execution trace into the *next* row of the auxiliary trace column. Thus, in order to ensure that the trace is long enough to give the auxiliary column space for its final value, a padding row may be required at the end of the trace of the component upon which the auxiliary column depends. + +This is true when the data in the main trace could go all the way to the end of the trace, such as in the case of the range checker. + +## Cost of auxiliary columns for lookup arguments +It is important to note that depending on the field in which we operate, an auxilliary column implementing a lookup argument may actually require more than one trace column. This is specifically true for small fields. + +Since Miden uses a 64-bit field, each auxiliary column needs to be represented by $2$ columns to achieve ~100-bit security and by $3$ columns to achieve ~128-bit security. \ No newline at end of file diff --git a/docs/src/design/multiset.md b/docs/src/design/lookups/multiset.md similarity index 56% rename from docs/src/design/multiset.md rename to docs/src/design/lookups/multiset.md index efcb9db72f..7f34b57acc 100644 --- a/docs/src/design/multiset.md +++ b/docs/src/design/lookups/multiset.md @@ -1,17 +1,8 @@ # Multiset checks -Zero knowledge virtual machines frequently make use of lookup arguments to enable performance optimizations. Miden VM uses multiset checks, and a brief introduction to them can be found [here](https://hackmd.io/@arielg/ByFgSDA7D). +A brief introduction to multiset checks can be found [here](https://hackmd.io/@arielg/ByFgSDA7D). In Miden VM, multiset checks are used to implement [virtual tables](#virtual-tables) and efficient [communication buses](./main.md#communication-buses-in-miden-vm). -In Miden VM, multiset checks are used for two purposes: - -1. To prove the consistency of intermediate values that must persist between different cycles of the trace, without storing the full data in the execution trace (which would require adding more columns to the trace). -2. To prove correct interaction between two independent sections of the execution trace, e.g., between the main trace where the result of some operation is required, but would be expensive to compute, and a specialized component which can perform that operation cheaply. - -The first is achieved using [virtual tables](#virtual-tables) of data, where we add a row at some cycle in the trace and remove it at a later cycle when it is needed again. Instead of maintaining the entire table in the execution trace, multiset checks allow us to prove data consistency of this table using one running product column. - -The second is done by reducing each operation to a lookup value and then using a [communication bus](#communication-buses), implemented as a running product column, to provably connect the two sections of the trace. - -### Running product columns +## Running product columns Although the multiset equality check can be thought of as comparing multiset equality between two vectors $a$ and $b$, in Miden VM it is implemented as a single running product column in the following way: - The running product column is initialized to a value $x$ at the beginning of the trace. (We typically use $x = 1$.) @@ -21,17 +12,6 @@ Although the multiset equality check can be thought of as comparing multiset equ Running product columns are computed using a set of random values $\alpha_0$, $\alpha_1, ...$ sent to the prover by the verifier after the prover commits to the execution trace of the program. -#### Length of running product columns - -Running product columns are computed by including information from the *current* row of the main execution trace into the *next* row of the running product column. Thus, in order to ensure that the trace is long enough to give the running product column space for its final value, a padding row may be required at the end of the trace of the component upon which the running product column depends. - -This is true when the data in the main trace could go all the way to the end of the trace, such as in the case of the range checker. - -#### Cost of running product columns -It is important to note that depending on the field in which we operate, a running product column may actually require more than one trace column. This is specifically true for small fields. - -Since Miden uses a 64-bit field, each running product column needs to be represented by $2$ columns to achieve ~100-bit security and by $3$ columns to achieve ~128-bit security. - ## Virtual tables Virtual tables can be used to store intermediate data which is computed at one cycle and used at a different cycle. When the data is computed, the row is added to the table, and when it is used later, the row is deleted from the table. Thus, all that needs to be proved is the data consistency between the row that was added and the row that was deleted. @@ -66,30 +46,20 @@ $$ ### Virtual tables in Miden VM -Miden VM currently makes use of 6 virtual tables across 4 components: +Miden VM makes use of 6 virtual tables across 4 components: - Stack: - - [Overflow table](./stack/main.md#overflow-table) + - [Overflow table](../stack/main.md#overflow-table) - Decoder: - - [Block stack table](./decoder/main.md#block-stack-table) - - [Block hash table](./decoder/main.md#block-hash-table) - - [Op group table](./decoder/main.md#op-group-table) + - [Block stack table](../decoder/main.md#block-stack-table) + - [Block hash table](../decoder/main.md#block-hash-table) + - [Op group table](../decoder/main.md#op-group-table) - Chiplets: - - [Chiplets virtual table](./chiplets/main.md#chiplet-virtual-table), which combines the following two tables into one: - - [Hash chiplet sibling table](./chiplets/hasher.md#sibling-table-constraints) - - [Kernel ROM chiplet procedure table](./chiplets/kernel_rom.md#kernel-procedure-table-constraints) - -## Communication buses - -One strategy for improving the efficiency of a zero knowledge virtual machine is to use specialized components for complex operations and have the main circuit “offload” those operations to the corresponding components by specifying inputs and outputs and allowing the proof of execution to be done by the dedicated component instead of by the main circuit. - -These specialized components are designed to prove the internal correctness of the execution of the operations they support. However, in isolation they cannot make any guarantees about the source of the input data or the destination of the output data. + - [Chiplets virtual table](../chiplets/main.md#chiplets-virtual-table), which combines the following two tables into one: + - [Hash chiplet sibling table](../chiplets/hasher.md#sibling-table-constraints) + - [Kernel ROM chiplet procedure table](../chiplets/kernel_rom.md#kernel-procedure-table-constraints) -In order to prove that the inputs and outputs specified by the main circuit match the inputs and outputs provably executed in the specialized component, some kind of provable communication bus is needed. - -This bus is typically implemented as some kind of lookup argument, and in Miden VM in particular we use multiset checks. - -### Implementation +## Communication buses via multiset checks A `bus` can be implemented as a single trace column $b$ where a request can be sent to a specific component and a corresponding response will be sent back by that component. @@ -131,9 +101,6 @@ $$b' \cdot u_{lookup} = b \cdot v_{lookup}$$ ### Communication buses in Miden VM -In Miden VM, the specialized components are implemented as dedicated segments of the execution trace, which include the range checker and the 3 chiplets in the Chiplets module (the hash chiplet, bitwise chiplet, and memory chiplet). - -Miden VM currently uses 2 buses to communicate with these components: +In Miden VM, the specialized components are implemented as dedicated segments of the execution trace, which include the 3 chiplets in the Chiplets module (the hash chiplet, bitwise chiplet, and memory chiplet). -- The chiplets bus [$b_{chip}$](./chiplets/main.md#chiplet-bus), which communicates with all of the chiplets (Hash, Bitwise, and Memory). -- The range checker bus [$b_{range}$](./range.md#communication-bus). +Miden VM currently uses multiset checks to implement the chiplets bus [$b_{chip}$](../chiplets/main.md#chiplets-bus), which communicates with all of the chiplets (Hash, Bitwise, and Memory). diff --git a/docs/src/design/main.md b/docs/src/design/main.md index 01b4ef9fb9..d967da8457 100644 --- a/docs/src/design/main.md +++ b/docs/src/design/main.md @@ -31,7 +31,7 @@ Miden VM consists of several interconnected components, each providing a specifi - Memory chiplet, used to support random-access memory in the VM. - Kernel ROM chiplet, used to enable calling predefined kernel procedures which are provided before execution begins. -The above components are connected via **buses**, which are implemented using [multiset checks](./multiset.md). We also use multiset checks internally within components to describe **virtual tables**. +The above components are connected via **buses**, which are implemented using [lookup arguments](./lookups/main.md). We also use [multiset check lookups](./lookups/multiset.md) internally within components to describe **virtual tables**. ## VM execution trace The execution trace of Miden VM consists of $71$ main trace columns, $2$ buses, and $5$ virtual tables, as shown in the diagram below. diff --git a/docs/src/design/range.md b/docs/src/design/range.md index d10abb5308..aa4478267c 100644 --- a/docs/src/design/range.md +++ b/docs/src/design/range.md @@ -1,8 +1,8 @@ # Range Checker -Miden VM relies very heavily on 16-bit range-checks (checking if a value of a field element is between $0$ and $2^{16}$). For example, most of the [u32 operations](./stack/u32_ops.md), need to perform between two and four 16-bit range-checks per operation. Similarly, operations involving memory (e.g. load and store) require two 16-bit range-check per operation. +Miden VM relies very heavily on 16-bit range-checks (checking if a value of a field element is between $0$ and $2^{16}$). For example, most of the [u32 operations](./stack/u32_ops.md) need to perform between two and four 16-bit range-checks per operation. Similarly, operations involving memory (e.g. load and store) require two 16-bit range-checks per operation. -Thus, it is very important for the VM to be able to perform a large number 16-bit range checks very efficiently. In this note we describe how this can be achieved using permutation checks. +Thus, it is very important for the VM to be able to perform a large number of 16-bit range checks very efficiently. In this note we describe how this can be achieved using the [LogUp](./lookups/logup.md) lookup argument. ## 8-bit range checks @@ -12,9 +12,9 @@ First, let's define a construction for the simplest possible 8-bit range-check. For this to work as a range-check we need to enforce a few constraints on this column: -- Value in the first row must be $0$. -- Value in the last row must be $255$. -- As we move from one row to the next, we can either keep the value the same, or increment it by $1$. +- The value in the first row must be $0$. +- The value in the last row must be $255$. +- As we move from one row to the next, we can either keep the value the same or increment it by $1$. Denoting $v$ as the value of column $v$ in the current row, and $v'$ as the value of column $v$ in the next row, we can enforce the last condition as follows: @@ -24,99 +24,57 @@ $$ Together, these constraints guarantee that all values in column $v$ are between $0$ and $255$ (inclusive). -We can then add another column $p_0$, which will keep a running product of values in $v$ offset by random value $\alpha_0$ (provided by the verifier). Transition constraints for column $p_0$ would look like so: +We can then make use of the LogUp lookup argument by adding another column $b$ which will keep a running sum that is the logarithmic derivative of the product of values in the $v$ column. The transition constraint for $b$ would look as follows: $$ -p'_0 - p_0 \cdot (\alpha_0 + v) = 0 +b' = b + \frac{1}{(\alpha - v)} $$ -Using these two columns we can check if some other column in the execution trace is a permutation of values in $v$. Let's call this other column $x$. We can compute the running product of $x$ in the same way as we compute the running product for $v$. Then, we can check that the last value in $p_0$ is the same as the final value for the running product of $x$ (this is the permutation check). +Since constraints cannot include divisions, the constraint would actually be expressed as the following degree 2 constraint: -While this approach works, it has a couple of limitations: - -- First, column $v$ must contain all values between $0$ and $255$. Thus, if column $x$ does not contain one of these values, we need to artificially add this value to $x$ somehow (i.e., we need to pad $x$ with extra values). -- Second, assuming $n$ is the length of execution trace, we can range-check at most $n$ values. Thus, if we wanted to range-check more than $n$ values, we'd need to introduce another column similar to $v$. - -To get rid of the padding requirement, we can add a _selector_ column, which would contain $1$ for values we want to include in the running product, and $0$ for the ones we don't. But we can address both issues with a single solution. - -### A better construction - -Let's add two selector column to our table $s_0$ and $s_1$ as illustrated below. - -![rc_better_construction](../assets/design/range/rc_better_construction.png) - -The purpose of these columns is as follows: - -- When $s_0 = 0$ and $s_1 = 0$, we won't include the value into the running product. -- When $s_0 = 1$ and $s_1 = 0$, we will include the value into the running product. -- When $s_0 = 0$ and $s_1 = 1$, we will include two copies of the value into the running product. -- When $s_0 = 1$ and $s_1 = 1$, we will include four copies of the value into the running product. - -Thus, for the table pictured below, the running product will include: a single $0$, a single $1$, no $2$'s, and five $3$'s etc. - -To keep the description of constraints simple, we'll first define the four flag values as follows: - -$$ -f_0 = (1 - s_0) \cdot (1 - s_1) -$$ - -$$ -f_1 = s_0 \cdot (1 - s_1) $$ - -$$ -f_2 = (1 - s_0) \cdot s_1 -$$ - -$$ -f_3 = s_0 \cdot s_1 +b' \cdot (\alpha - v) = b \cdot (\alpha - v) + 1 $$ -Thus, for example, when $s_0 = 1$ and $s_1 = 1$, $f_3 = 1$ and $f_0 = f_1 = f_2 = 0$. +Using these two columns we can check if some other column in the execution trace is a permutation of values in $v$. Let's call this other column $x$. We can compute the logarithmic derivative for $x$ as a running sum in the same way as we compute it for $v$. Then, we can check that the last value in $b$ is the same as the final value for the running sum of $x$. -Then, we'll update transition constraints for $p_0$ like so: +While this approach works, it has a couple of limitations: -$$ -p'_0 - p_0 \cdot \left((\alpha_0 + v)^4 \cdot f_3 + (\alpha_0 + v)^2 \cdot f_2 + (\alpha_0 + v) \cdot f_1 + f_0\right) = 0 -$$ +- First, column $v$ must contain all values between $0$ and $255$. Thus, if column $x$ does not contain one of these values, we need to artificially add this value to $x$ somehow (i.e., we need to pad $x$ with extra values). +- Second, assuming $n$ is the length of execution trace, we can range-check at most $n$ values. Thus, if we wanted to range-check more than $n$ values, we'd need to introduce another column similar to $v$. -The above ensures that when $f_0 = 1$, $p_0$ remains the same, when $f_1 = 1$, $p_0$ is multiplied by $(\alpha_0 + v)$, when $f_2 = 1$, $p_0$ is multiplied by $(\alpha_0 + v)^2$, and when $f_3 = 1$, $p_0$ is multiplied by $(\alpha_0 + v)^4$. +We can get rid of both requirements by including the _multiplicity_ of the value $v$ into the calculation of the logarithmic derivative for LogUp, which will allow us to specify exactly how many times each value needs to be range-checked. -We also need to ensure that values in columns $s_0$ and $s_1$ are binary (either $0$ or $1$). This can be done with the following constraints: +### A better construction -$$ -s_0^2 - s_0 = 0 -$$ +Let's add one more column $m$ to our table to keep track of how many times each value should be range-checked. -$$ -s_1^2 - s_1 = 0 -$$ +![rc_8_bit_logup](../assets/design/range/rc_8_bit_logup.png) -And lastly, for completeness, we still need to impose a transition constraint that we had in the naive approach: +The transition constraint for $b$ is now as follows: $$ -(v' - v) \cdot (v' - v - 1) = 0 +b' = b + \frac{m}{(\alpha - v)} $$ -This 3-column table addresses the limitations we had as follows: - -1. We no longer need to pad the column we want to range-check with extra values because we can skip the values we don't care about. -2. We can support almost $4n$ range checks (when $n$ is relatively large). Though, for short traces (when $n < 256$), we can range-check at most $n$ unique values. +This addresses the limitations we had as follows: +1. We no longer need to pad the column we want to range-check with extra values because we can skip the values we don't care about by setting the multiplicity to $0$. +2. We can range check as many unique values as there are rows in the trace, and there is essentially no limit to how many times each of these values can be range-checked. (The only restriction on the multiplicity value is that it must be less than the size of the set of lookup values. Therefore, for long traces where $n > 2^{16}$, $m < 2^{16}$ must hold, and for short traces $m < n$ must be true.) -The one downside of this approach is that the degree of our constraints is now $6$ (vs. $2$ in the naive approach). But in the context of Miden VM this doesn't matter as maximum constraint degree for the VM is $9$ anyway. +Additionally, the constraint degree has not increased versus the naive approach, and the only additional cost is a single trace column. ## 16-bit range checks -To support 16-bit range checks, let's try to extend the idea of the 8-bit table. Our 16-bit table would look like so (the only difference is that column $u$ now has to end with value $65535$): +To support 16-bit range checks, let's try to extend the idea of the 8-bit table. Our 16-bit table would look like so (the only difference is that column $v$ now has to end with value $65535$): -![rc_16_bit_range_check](../assets/design/range/rc_16_bit_range_check.png) +![rc_16_bit_logup](../assets/design/range/rc_16_bit_logup.png) While this works, it is rather wasteful. In the worst case, we'd need to enumerate over 65K values, most of which we may not actually need. It would be nice if we could "skip over" the values that we don't want. One way to do this could be to add bridge rows between two values to be range checked and add constraints to enforce the consistency of the gap between these bridge rows. If we allow gaps between two consecutive rows to only be 0 or powers of 2, we could enforce a constraint: $$ -\Delta u \cdot (\Delta u - 1) \cdot (\Delta u - 2) \cdot (\Delta u - 4) \cdot (\Delta u - 8) \cdot (\Delta u - 16) \cdot (\Delta u - 32) \cdot (\Delta u - 64) \cdot (\Delta u - 128) = 0 +\Delta v \cdot (\Delta v - 1) \cdot (\Delta v - 2) \cdot (\Delta v - 4) \cdot (\Delta v - 8) \cdot (\Delta v - 16) \cdot (\Delta v - 32) \cdot (\Delta v - 64) \cdot (\Delta v - 128) = 0 $$ This constraint has a degree 9. This construction allows the minimum trace length to be 1024. @@ -124,7 +82,7 @@ This constraint has a degree 9. This construction allows the minimum trace lengt We could go even further and allow the gaps between two consecutive rows to only be 0 or powers of 3. In this case we would enforce the constraint: $$ -\Delta u \cdot (\Delta u - 1) \cdot (\Delta u - 3) \cdot (\Delta u - 9) \cdot (\Delta u - 27) \cdot (\Delta u - 81) \cdot (\Delta u - 243) \cdot (\Delta u - 729) \cdot (\Delta u - 2187) = 0 +\Delta v \cdot (\Delta v - 1) \cdot (\Delta v - 3) \cdot (\Delta v - 9) \cdot (\Delta v - 27) \cdot (\Delta v - 81) \cdot (\Delta v - 243) \cdot (\Delta v - 729) \cdot (\Delta v - 2187) = 0 $$ This allows us to reduce the minimum trace length to 64. @@ -143,14 +101,14 @@ This construction is implemented in Miden with the following requirements, capab ### Requirements -- 3 columns of the main trace: $s_0, s_1, v$. -- 1 [bus](./multiset.md#communication-buses) $b_{range}$ to ensure that the range checks performed in the range checker match those requested by other VM components (the [stack](./stack/u32_ops.md#range-checks) and the [memory chiplet](./chiplets/memory.md)). +- 2 columns of the main trace: $m, v$, where $v$ contains the value being range-checked and $m$ is the number of times the value is checked (its multiplicity). +- 1 [bus](./lookups/main.md#communication-buses-in-miden-vm) $b_{range}$ to ensure that the range checks performed in the range checker match those requested by other VM components (the [stack](./stack/u32_ops.md#range-checks) and the [memory chiplet](./chiplets/memory.md)). ### Capabilities The construction gives us the following capabilities: -- For long traces (when $n > 2^{16}$), we can do over $4n$ arbitrary 16-bit range-checks. -- For short traces ($2^5 < n \le 2^{16}$), we can range-check at slightly fewer than $n$ unique values, but if there are duplicates, we may be able to range-check up to $4n$ total values. +- For long traces (when $n > 2^{16}$), we can do an essentially unlimited number of arbitrary 16-bit range-checks. +- For short traces ($2^5 < n \le 2^{16}$), we can range-check slightly fewer than $n$ unique values, but there is essentially no practical limit to the total number of range checks. ### Execution trace @@ -160,24 +118,14 @@ The range checker's execution trace looks as follows: ![rc_with_bridge_rows.png](../assets/design/range/rc_with_bridge_rows.png) The columns have the following meanings: -- $s_0$ and $s_1$ are selector columns that are combined into flags to indicate the number of times the value in that row should be range checked (included into the running product). With these flags, values can be included 0, 1, 2, or 4 times per row in the execution trace. (Values can be included more times by having multiple trace rows with the same value). +- $m$ is the multiplicity column that indicates the number of times the value in that row should be range checked (included into the computation of the logarithmic derivative). - $v$ contains the values to be range checked. - These values go from $0$ to $65535$. Values must either stay the same or increase by powers of 3 less than or equal to $3^7$. - - The final 2 rows of the 16-bit section of the trace must both equal $65535$. The extra value of $65535$ is required in order to [pad the trace](./multiset.md#length-of-running-product-columns) so the [$b_{range}$](#communication-bus) running product bus column can be computed correctly. + - The final 2 rows of the 16-bit section of the trace must both equal $65535$. The extra value of $65535$ is required in order to [pad the trace](./lookups/main.md#length-of-auxiliary-columns-for-lookup-arguments) so the [$b_{range}$](#communication-bus) bus column can be computed correctly. ### Execution trace constraints -First, we'll need to make sure that all selector flags are binary. This can be done with the following constraints: - -> $$ -s_0^2 - s_0 = 0 \text{ | degree} = 2 -$$ - -> $$ -s_1^2 - s_1 = 0 \text{ | degree} = 2 -$$ - -Then, we need to constrain that the consecutive values in the range checker are either same or differ by powers of 3 less than or equal to $3^7$. +First, we need to constrain that the consecutive values in the range checker are either the same or differ by powers of 3 that are less than or equal to $3^7$. > $$ \Delta v \cdot (\Delta v - 1) \cdot (\Delta v - 3) \cdot (\Delta v - 9) \cdot (\Delta v - 27) \cdot (\Delta v - 81) \\ @@ -186,33 +134,39 @@ $$ In addition to the transition constraints described above, we also need to enforce the following boundary constraints: -- Value of $v$ in the first row is $0$. -- Value of $v$ in the last row is $65535$. +- The value of $v$ in the first row is $0$. +- The value of $v$ in the last row is $65535$. ### Communication bus -$b_{range}$ is the [bus](./multiset.md#communication-buses) that connects components which require 16-bit range checks to the range-checked values in the 16-bit section of the range checker. The bus constraints are defined by the components that use it to communicate. +$b_{range}$ is the [bus](./lookups/main.md#communication-buses-in-miden-vm) that connects components which require 16-bit range checks to the values in the range checker. The bus constraints are defined by the components that use it to communicate. Requests are sent to the range checker bus by the following components: - The Stack sends requests for 16-bit range checks during some [`u32` operations](./stack/u32_ops.md#range-checks). - The [Memory chiplet](./chiplets/memory.md) sends requests for 16-bit range checks against the values in the $d_0$ and $d_1$ trace columns to enforce internal consistency. -Responses are provided by the range checker as follows. +Responses are provided by the range checker using the transition constraint for the LogUp construction described above. -Once again, we'll make use of variable $z$, which represents how a row in the execution trace is reduced to a single value. - -$$ -z = (\alpha_0 + v)^4 \cdot f_3 + (\alpha_0 + v)^2 \cdot f_2 + (\alpha_0 + v) \cdot f_1 + f_0 +> $$ +b'_{range} = b_{range} + \frac{m}{(\alpha - v)} \text{ | degree} = 2 $$ -Transition constraints for this are fairly straightforward: +To describe the complete transition constraint for the bus, we'll define the following variables: + +- $f_{stack}$: the boolean flag that indicates whether or not a stack operation requiring range checks is occurring. This flag has degree 3. +- $f_{mem}$: the boolean flag that indicates whether or not a memory operation requiring range checks is occurring. This flag has degree 3. +- $s_0, s_1, s_2, s_3$: the values for which range checks are requested from the stack when $f_{stack}$ is set. +- $m_0, m_1$: the values for which range checks are requested from the memory chiplet when $f_{mem}$ is set. > $$ -b'_{range} = b_{range} \cdot z \text{ | degree} = 7 +b'_{range} = b_{range} + \frac{m}{(\alpha - v)} - \frac{f_{stack}}{(\alpha - s_0)} - \frac{f_{stack}}{(\alpha - s_1)} - \frac{f_{stack}}{(\alpha - s_2)} - \frac{f_{stack}}{(\alpha - s_3)} \\ - \frac{f_{mem}}{(\alpha - m_0)} - \frac{f_{mem}}{(\alpha - m_1)} \text{ | degree} = 9 $$ +As previously mentioned, constraints cannot include divisions, so the actual constraint which is applied will be the equivalent expression in which all denominators have been multiplied through, which is degree 9. + If $b_{range}$ is initialized to $1$ and the values sent to the bus by other VM components match those that are range-checked in the the trace, then at the end of the trace we should end up with $b_{range} = 1$. -In addition to the transition constraint described above, we also need to enforce the following boundary constraint: +Therefore, in addition to the transition constraint described above, we also need to enforce the following boundary constraints: -- The value of $b_{range}$ in the first and last rows is $1$. +- The value of $b_{range}$ in the first row $1$. +- The value of $b_{range}$ in the last row $1$. diff --git a/docs/src/design/stack/main.md b/docs/src/design/stack/main.md index 70ebe67976..2b71ce38b7 100644 --- a/docs/src/design/stack/main.md +++ b/docs/src/design/stack/main.md @@ -23,7 +23,7 @@ The meaning of the above columns is as follows: * Helper column $h_0$ is used to ensure that stack depth does not drop below $16$. Values in this column are set by the prover non-deterministically to $\frac{1}{b_0 - 16}$ when $b_0 \neq 16$, and to any other value otherwise. ### Overflow table -To keep track of the data which doesn't fit into the top $16$ stack slots, we'll use an overflow table. This will be a [virtual table](../multiset.md#virtual-tables). To represent this table, we'll use a single auxiliary column $p_1$. +To keep track of the data which doesn't fit into the top $16$ stack slots, we'll use an overflow table. This will be a [virtual table](../lookups/multiset.md#virtual-tables). To represent this table, we'll use a single auxiliary column $p_1$. The table itself can be thought of as having 3 columns as illustrated below. diff --git a/docs/src/design/stack/u32_ops.md b/docs/src/design/stack/u32_ops.md index c9404d1e50..5d3c3c4215 100644 --- a/docs/src/design/stack/u32_ops.md +++ b/docs/src/design/stack/u32_ops.md @@ -4,13 +4,15 @@ In this section we describe semantics and AIR constraints of operations over u32 ### Range checks Most operations described below require some number of 16-bit range checks (i.e., verifying that the value of a field element is smaller than $2^{16}$). The number of required range checks varies between $2$ and $4$, depending on the operation. However, to simplify the constraint system, we force each relevant operation to consume exactly $4$ range checks. -To perform these range checks, the prover puts the values to be range-checked into helper registers $h_0, ..., h_3$, and then divides the range checker bus column $b_{range}$ by a randomized product of these values. This operation is enforced via the following constraint: +To perform these range checks, the prover puts the values to be range-checked into helper registers $h_0, ..., h_3$, and then updates the range checker bus column $b_{range}$ according to the LogUp construction described in the [range checker](../range.md) documentation, using multiplicity $1$ for each value. + +This operation is enforced via the following constraint. Note that since constraints cannot include divisions, the actual constraint which is enforced will be expressed equivalently with all denominators multiplied through, resulting in a constraint of degree 5. >$$ -b_{range}' \cdot (\alpha_0 + h_0) \cdot (\alpha_0 + h_1) \cdot (\alpha_0 + h_2) \cdot (\alpha_0 + h_3) = b_{range} \text{ | degree} = 5 +b_{range}' = b_{range} - \frac{1}{(\alpha - h_0)} - \frac{1}{(\alpha - h_1)} - \frac{1}{(\alpha - h_2)} - \frac{1}{(\alpha - h_3)} \text{ | degree} = 5 $$ -The above is just a partial constraint as it does not show the range checker's part of the constraint, which multiplies the required values into the bus column. It also omits the [selector flag](./op_constraints.md#operation-flags) which is used to turn this constraint on only when executing relevant operations. +The above is just a partial constraint as it does not show the range checker's part of the constraint, which adds the required values into the bus column. It also omits the [selector flag](./op_constraints.md#operation-flags) which is used to turn this constraint on only when executing relevant operations. ### Checking element validity Another primitive which is required by most of the operations described below is checking whether four 16-bit values form a valid field element. Assume $t_0$, $t_1$, $t_2$, and $t_3$ are known to be 16-bit values, and we want to verify that $2^{48} \cdot t_3 + 2^{32} \cdot t_2 + 2^{16} \cdot t_1 + t_0$ is a valid field element. From e206e44a52c5127c99873fbdc2f6782cdda749d2 Mon Sep 17 00:00:00 2001 From: bing Date: Tue, 22 Aug 2023 12:10:11 +0800 Subject: [PATCH 064/120] fix(docs): constraint expression multiplies same term twice The `alpha - v` term is being multiplied twice, when it should be > $$ b \cdot (\alpha - x) \cdot (\alpha - v) $$ instead. --- docs/src/design/lookups/logup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/design/lookups/logup.md b/docs/src/design/lookups/logup.md index aa207a11ce..49fe5b45bb 100644 --- a/docs/src/design/lookups/logup.md +++ b/docs/src/design/lookups/logup.md @@ -37,7 +37,7 @@ $$ Since constraints must be expressed without division, the actual constraint which is enforced will be the following: > $$ -b' \cdot (\alpha - v) \cdot (\alpha - x) = b \cdot (\alpha - v) \cdot (\alpha - v) + m \cdot (\alpha - x) - (\alpha - v) \text{ | degree} = 3 +b' \cdot (\alpha - v) \cdot (\alpha - x) = b \cdot (\alpha - x) \cdot (\alpha - v) + m \cdot (\alpha - x) - (\alpha - v) \text{ | degree} = 3 $$ In general, we will write constraints within these docs using the previous form, since it's clearer and more readable. From d6c49ce1c24eb26c0f8e4e1e6aeb99dda245db0f Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 28 Aug 2023 00:26:55 -0700 Subject: [PATCH 065/120] fix: clippy changes --- assembly/src/library/masl.rs | 6 +++--- assembly/src/library/path.rs | 6 +++--- assembly/src/procedures/mod.rs | 2 +- assembly/src/tokens/mod.rs | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/assembly/src/library/masl.rs b/assembly/src/library/masl.rs index 19733d6197..755a78dd73 100644 --- a/assembly/src/library/masl.rs +++ b/assembly/src/library/masl.rs @@ -59,11 +59,11 @@ impl Library for MaslLibrary { impl MaslLibrary { /// File extension for the Assembly Library. - pub const LIBRARY_EXTENSION: &str = "masl"; + pub const LIBRARY_EXTENSION: &'static str = "masl"; /// File extension for the Assembly Module. - pub const MODULE_EXTENSION: &str = "masm"; + pub const MODULE_EXTENSION: &'static str = "masm"; /// Name of the root module. - pub const MOD: &str = "mod"; + pub const MOD: &'static str = "mod"; // CONSTRUCTOR // -------------------------------------------------------------------------------------------- diff --git a/assembly/src/library/path.rs b/assembly/src/library/path.rs index 6b4093756c..590d6596e8 100644 --- a/assembly/src/library/path.rs +++ b/assembly/src/library/path.rs @@ -24,13 +24,13 @@ impl LibraryPath { // -------------------------------------------------------------------------------------------- /// Path delimiter. - pub const PATH_DELIM: &str = "::"; + pub const PATH_DELIM: &'static str = "::"; /// Base kernel path. - pub const KERNEL_PATH: &str = "#sys"; + pub const KERNEL_PATH: &'static str = "#sys"; /// Path for an executable module. - pub const EXEC_PATH: &str = "#exec"; + pub const EXEC_PATH: &'static str = "#exec"; // CONSTRUCTORS // -------------------------------------------------------------------------------------------- diff --git a/assembly/src/procedures/mod.rs b/assembly/src/procedures/mod.rs index f1b896c04a..01ede682a9 100644 --- a/assembly/src/procedures/mod.rs +++ b/assembly/src/procedures/mod.rs @@ -167,7 +167,7 @@ impl ProcedureName { // -------------------------------------------------------------------------------------------- /// Reserved name for a main procedure. - pub const MAIN_PROC_NAME: &str = "#main"; + pub const MAIN_PROC_NAME: &'static str = "#main"; // CONSTRUCTORS // -------------------------------------------------------------------------------------------- diff --git a/assembly/src/tokens/mod.rs b/assembly/src/tokens/mod.rs index 6256e5d8d9..8eb9c213c9 100644 --- a/assembly/src/tokens/mod.rs +++ b/assembly/src/tokens/mod.rs @@ -52,9 +52,9 @@ impl<'a> Token<'a> { // DELIMITERS // -------------------------------------------------------------------------------------------- - pub const DOC_COMMENT_PREFIX: &str = "#!"; + pub const DOC_COMMENT_PREFIX: &'static str = "#!"; pub const COMMENT_PREFIX: char = '#'; - pub const ALIAS_DELIM: &str = "->"; + pub const ALIAS_DELIM: &'static str = "->"; // CONSTRUCTOR // -------------------------------------------------------------------------------------------- From c90513e4758e89f4c56b6a46f5e70454254a8a7a Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Thu, 17 Aug 2023 01:27:56 -0700 Subject: [PATCH 066/120] feat: implement TSMT delete procedures --- core/Cargo.toml | 2 +- processor/src/advice/mod.rs | 6 +- processor/src/advice/providers.rs | 8 +- .../src/decorators/adv_stack_injectors.rs | 71 +++- processor/src/operations/crypto_ops.rs | 3 +- stdlib/asm/collections/smt.masm | 363 ++++++++++++++++-- stdlib/docs/collections/smt.md | 3 +- stdlib/tests/collections/smt.rs | 105 +++++ 8 files changed, 519 insertions(+), 42 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 651d7e4ef2..8a06f05aac 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -21,7 +21,7 @@ std = ["math/std", "winter-utils/std"] [dependencies] math = { package = "winter-math", version = "0.6", default-features = false } -crypto = { package = "miden-crypto", git = "https://github.com/0xPolygonMiden/crypto.git", branch = "next", default-features = false } +crypto = { package = "miden-crypto", git = "https://github.com/0xPolygonMiden/crypto.git", branch = "bobbin-leaf-traversal", default-features = false } winter-crypto = { package = "winter-crypto", version = "0.6", default-features = false } winter-utils = { package = "winter-utils", version = "0.6", default-features = false } diff --git a/processor/src/advice/mod.rs b/processor/src/advice/mod.rs index 8382a2075b..250e549d7c 100644 --- a/processor/src/advice/mod.rs +++ b/processor/src/advice/mod.rs @@ -153,7 +153,7 @@ pub trait AdviceProvider { ) -> Result; /// Updates a node at the specified depth and index in a Merkle tree with the specified root; - /// returns the Merkle path from the updated node to the new root. + /// returns the Merkle path from the updated node to the new root, together with the new root. /// /// The tree is cloned prior to the update. Thus, the advice provider retains the original and /// the updated tree. @@ -171,7 +171,7 @@ pub trait AdviceProvider { depth: &Felt, index: &Felt, value: Word, - ) -> Result; + ) -> Result<(MerklePath, Word), ExecutionError>; /// Creates a new Merkle tree in the advice provider by combining Merkle trees with the /// specified roots. The root of the new tree is defined as `hash(left_root, right_root)`. @@ -267,7 +267,7 @@ where depth: &Felt, index: &Felt, value: Word, - ) -> Result { + ) -> Result<(MerklePath, Word), ExecutionError> { T::update_merkle_node(self, root, depth, index, value) } diff --git a/processor/src/advice/providers.rs b/processor/src/advice/providers.rs index 18c151fa18..b84c488b93 100644 --- a/processor/src/advice/providers.rs +++ b/processor/src/advice/providers.rs @@ -172,7 +172,7 @@ where depth: &Felt, index: &Felt, value: Word, - ) -> Result { + ) -> Result<(MerklePath, Word), ExecutionError> { let node_index = NodeIndex::from_elements(depth, index).map_err(|_| { ExecutionError::InvalidTreeNodeIndex { depth: *depth, @@ -181,7 +181,7 @@ where })?; self.store .set_node(root.into(), node_index, value.into()) - .map(|root| root.path) + .map(|root| (root.path, root.root.into())) .map_err(ExecutionError::MerkleStoreUpdateFailed) } @@ -289,7 +289,7 @@ impl AdviceProvider for MemAdviceProvider { self.provider.get_leaf_depth(root, tree_depth, index) } - fn update_merkle_node(&mut self, root: Word, depth: &Felt, index: &Felt, value: Word) -> Result { + fn update_merkle_node(&mut self, root: Word, depth: &Felt, index: &Felt, value: Word) -> Result<(MerklePath, Word), ExecutionError> { self.provider.update_merkle_node(root, depth, index, value) } @@ -414,7 +414,7 @@ impl AdviceProvider for RecAdviceProvider { self.provider.get_leaf_depth(root, tree_depth, index) } - fn update_merkle_node(&mut self, root: Word, depth: &Felt, index: &Felt, value: Word) -> Result { + fn update_merkle_node(&mut self, root: Word, depth: &Felt, index: &Felt, value: Word) -> Result<(MerklePath, Word), ExecutionError> { self.provider.update_merkle_node(root, depth, index, value) } diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors.rs index b22d86b1cb..8b44ecf188 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors.rs @@ -1,6 +1,9 @@ use super::{super::Ext2InttError, AdviceProvider, AdviceSource, ExecutionError, Process}; use vm_core::{ - crypto::{hash::RpoDigest, merkle::EmptySubtreeRoots}, + crypto::{ + hash::RpoDigest, + merkle::{EmptySubtreeRoots, TieredSmt}, + }, utils::collections::Vec, Felt, FieldElement, QuadExtension, StarkField, Word, ONE, WORD_SIZE, ZERO, }; @@ -368,7 +371,8 @@ where /// # Panics /// Will panic as unimplemented if the target depth is `64`. pub(super) fn push_smtinsert_inputs(&mut self) -> Result<(), ExecutionError> { - // get the key and tree root from the stack + // get the key, value, and tree root from the stack + let value = self.stack.get_word(0); let key = self.stack.get_word(1); let root = self.stack.get_word(2); @@ -386,7 +390,13 @@ where // get the value of the node a this index/depth let index = index.as_int() >> (64 - depth); let index = Felt::new(index); - let node = self.advice_provider.get_tree_node(root, &Felt::new(depth as u64), &index)?; + let node = self.advice_provider.get_tree_node(root, &Felt::from(depth), &index)?; + + // if the value to be inserted is an empty word, we need to process it as a delete + if value == TieredSmt::EMPTY_VALUE { + self.handle_smt_delete(root, node, depth, index, key)?; + return Ok(()); + } // figure out what kind of insert we are doing; possible options are: // - if the node is a root of an empty subtree, this is a simple insert. @@ -411,7 +421,7 @@ where Ok(()) } - // TSMT INSERT HELPER METHODS + // TSMT UPDATE HELPER METHODS // -------------------------------------------------------------------------------------------- /// Retrieves a key-value pair for the specified leaf node from the advice map. @@ -558,6 +568,59 @@ where Ok(()) } + + /// TODO: add comments + fn handle_smt_delete( + &mut self, + root: Word, + node: Word, + depth: u8, + index: Felt, + key: Word, + ) -> Result<(), ExecutionError> { + let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; + + if node == Word::from(empty) { + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + + let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + } else { + let (leaf_key, leaf_value) = self.get_smt_upper_leaf_preimage(node).unwrap(); + + if leaf_key != key { + self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; + self.advice_provider.push_stack(AdviceSource::Word(leaf_key))?; + + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + + let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + } else { + let (_, new_root) = self.advice_provider.update_merkle_node( + root, + &Felt::from(depth), + &index, + empty.into(), + )?; + + self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; + self.advice_provider.push_stack(AdviceSource::Word(new_root))?; + + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + } + } + + Ok(()) + } } // HELPER FUNCTIONS diff --git a/processor/src/operations/crypto_ops.rs b/processor/src/operations/crypto_ops.rs index 7b36720690..75cc998ceb 100644 --- a/processor/src/operations/crypto_ops.rs +++ b/processor/src/operations/crypto_ops.rs @@ -140,7 +140,8 @@ where // get a Merkle path to it. the length of the returned path is expected to match the // specified depth. if the new node is the root of a tree, this instruction will append the // whole sub-tree to this node. - let path = self.advice_provider.update_merkle_node(old_root, &depth, &index, new_node)?; + let (path, _) = + self.advice_provider.update_merkle_node(old_root, &depth, &index, new_node)?; assert_eq!(path.len(), depth.as_int() as usize); let merkle_tree_update = self.chiplets.update_merkle_root(old_node, new_node, &path, index); diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index a831a09044..ad90832213 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -968,41 +968,32 @@ end #! Inserts the specified value into a Sparse Merkle Tree with the specified root under the #! specified key. #! -#! The value previously stored in the SMT under this key is left on the stack together with -#! the updated tree root. +#! This is the actual implementation of the `insert` procedure below, except for two things: +#! - This procedure assumes that value V is not [ZERO; 4], but this is not checked. +#! - This procedure assumes that the relevant flags have already been read from the advice provider. #! -#! This assumes that the value is not [ZERO; 4]. If it is, the procedure fails. -#! -#! Input: [V, K, R, ...] +#! Input: [is_update, f0, f1, f2, V, K, R, ...] #! Output: [V_old, R_new, ...] #! +#! Where: +#! - is_update is a flag specifying whether the insert is just an update of a value under an +#! existing key. +#! - Meaning of the flags f0, f1, and f2 depends on what type of insert is being executed. +#! #! Cycles: #! - Update existing leaf: -#! - Depth 16: 129 -#! - Depth 32: 126 -#! - Depth 48: 131 +#! - Depth 16: 116 +#! - Depth 32: 113 +#! - Depth 48: 118 #! - Insert new leaf: -#! - Depth 16: 100 -#! - Depth 32: 181 -#! - Depth 48: 181 +#! - Depth 16: 81 +#! - Depth 32: 162 +#! - Depth 48: 162 #! - Replace a leaf with a subtree: -#! - Depth 16 -> 32: 242 -#! - Depth 16 -> 48: 263 -#! - Depth 32 -> 48: 253 -export.insert - # make sure the value is not [ZERO; 4] (17 cycles) - repeat.4 - dup.3 eq.0 - end - and and and assertz - # => [V, K, R, ...] - - # arrange the data needed for the insert procedure on the advice stack and move the - # first 4 flags onto the operand stack; meaning of the flags f0, f1, and f2 depends - # on what type of insert is being executed (4 cycles) - adv.push_smtinsert adv_push.4 - # => [is_update, f0, f1, f2, V, K, R, ...] - +#! - Depth 16 -> 32: 221 +#! - Depth 16 -> 48: 244 +#! - Depth 32 -> 48: 234 +proc.insert_internal # call the inner procedure depending on the type of insert and depth if.true # --- update leaf --------------------------------------------------------------------- # => [is_16_or_32, is_16_or_48, ZERO, V, K, R, ...] @@ -1124,3 +1115,319 @@ export.insert # => [V_old, R_new, ...] end + +#! Inserts the specified value into a Sparse Merkle Tree with the specified root under the +#! specified key. +#! +#! The value previously stored in the SMT under this key is left on the stack together with +#! the updated tree root. +#! +#! This assumes that the value is not [ZERO; 4]. If it is, the procedure fails. +#! +#! Input: [V, K, R, ...] +#! Output: [V_old, R_new, ...] +#! +#! Cycles: +#! - Update existing leaf: +#! - Depth 16: 137 +#! - Depth 32: 134 +#! - Depth 48: 139 +#! - Insert new leaf: +#! - Depth 16: 102 +#! - Depth 32: 183 +#! - Depth 48: 183 +#! - Replace a leaf with a subtree: +#! - Depth 16 -> 32: 242 +#! - Depth 16 -> 48: 265 +#! - Depth 32 -> 48: 255 +export.insert + # make sure the value is not [ZERO; 4] (17 cycles) + repeat.4 + dup.3 eq.0 + end + and and and assertz + # => [V, K, R, ...] + + # arrange the data needed for the insert procedure on the advice stack and move the + # first 4 flags onto the operand stack; meaning of the flags f0, f1, and f2 depends + # on what type of insert is being executed (4 cycles) + adv.push_smtinsert adv_push.4 + # => [is_update, f0, f1, f2, V, K, R, ...] + + # execute the actual insert procedure + exec.insert_internal + # => [V_old, R_new, ...] +end + +# DELETE +# ================================================================================================= + +#! Verifies that a node at depth 16 and index defined by the most significant element of K in a +#! tree with root R is a root of an empty subtree. +#! +#! Input: [Z, K, R, ...] +#! Output: [Z, R, ...] +#! +#! Where Z is [ZERO; 4]. +#! +#! Cycles: 26 +proc.verify_empty_node_16 + # (9 cycles) + swapw.2 dup.4 exec.get_top_16_bits push.16 + # => [16, idx, R, K, Z, ...] + + # (4 cycles) + push.EMPTY_16_0.EMPTY_16_1.EMPTY_16_2.EMPTY_16_3 + # => [E16, 16, idx, R, K, Z, ...] + + # (1 cycle) + mtree_verify + # => [E16, 16, idx, R, K, Z, ...] + + # (12 cycles) + dropw drop drop swapw dropw swapw + # => [Z, R, ...] +end + +#! Verifies that a node at depth 32 and index defined by the most significant element of K in a +#! tree with root R is a root of an empty subtree. +#! +#! Input: [Z, K, R, ...] +#! Output: [Z, R, ...] +#! +#! Where Z is [ZERO; 4]. +#! +#! Cycles: 23 +proc.verify_empty_node_32 + # (6 cycles) + swapw.2 dup.4 exec.get_top_32_bits push.32 + # => [32, idx, R, K, Z, ...] + + # (4 cycles) + push.EMPTY_32_0.EMPTY_32_1.EMPTY_32_2.EMPTY_32_3 + # => [E32, 32, idx, R, K, Z, ...] + + # (1 cycle) + mtree_verify + # => [E32, 32, idx, R, K, Z, ...] + + # (12 cycles) + dropw drop drop swapw dropw swapw + # => [Z, K, ...] +end + +#! Verifies that a node at depth 48 and index defined by the most significant element of K in a +#! tree with root R is a root of an empty subtree. +#! +#! Input: [Z, K, R, ...] +#! Output: [Z, R, ...] +#! +#! Where Z is [ZERO; 4]. +#! +#! Cycles: 29 +proc.verify_empty_node_48 + # (12 cycles) + swapw.2 dup.4 exec.get_top_48_bits push.48 + # => [48, idx, R, K, Z, ...] + + # (4 cycles) + push.EMPTY_48_0.EMPTY_48_1.EMPTY_48_2.EMPTY_48_3 + # => [E48, 48, idx, R, K, Z, ...] + + # (1 cycle) + mtree_verify + # => [E48, 48, idx, R, K, Z, ...] + + # (12 cycles) + dropw drop drop swapw dropw swapw + # => [Z, K, ...] +end + +#! Verifies that a leaf node located at depth d and index idx in the tree defined by root R is +#! contains key which is different from K. +#! +#! Input: [d, idx, K, R, Z, ...] +#! Output: [Z, R, ...] +#! +#! Where Z is [ZERO; 4]. +#! +#! Cycles: 50 +proc.verify_leaf_with_another_key + # load the leaf key K_e from the advice provider (11 cycles) + movdn.5 movdn.5 push.0 dup.5 push.0.0 swapw adv_push.4 + # => [K_e, K, 0, 0, d, 0, d, idx, R, Z, ...] + + # make sure K_e and K are not the same (17 cycles) + repeat.4 + dup.3 movup.8 eq + end + and and and assertz + # => [K_e, 0, 0, d, 0, d, idx, R, Z, ...] + + # load leaf value V_e from the advice provider (4 cycles) + adv_push.4 + # => [V_e, K_e, 0, 0, d, 0, d, idx, R, Z, ...] + + # compute N = hash([K_e, K_v], domain=d) - (10 cycles) + hperm dropw swapw dropw + # => [N, d, idx, R, Z, ...] + + # verify that node N exists in the tree with root R at the specified index and depth + mtree_verify + # => [N, d, idx, R, Z, ...] + + # clean up the stack and return (7 cycles) + dropw drop drop swapw + # => [Z, R, ...] +end + +#! Removes a key-value under key K from the Tiered Sparse Merkle tree defined by root R, and +#! returns the new tree root together with the value previously associated with key K. +#! +#! If the key-value pair is not in the tree, this proves that the key-value pair is not in the +#! tree but does not modify the tree itself. +#! +#! This assumes that the value Z is [ZERO; 4], but this is not checked. +#! +#! Input: [key_not_in_tree, f0, f1, f2, Z, K, R, ...] +#! Output: [V_old, R_new, ...] +#! +#! Cycles: +#! - Key not in the tree (key with common prefix in the tree): +#! - Depth 16: 68 +#! - Depth 32: 65 +#! - Depth 48: 71 +#! - Key not in the tree (no key with common prefix): +#! - Depth 16: 34 +#! - Depth 32: 31 +#! - Depth 48: 37 +#! - Remove a leaf from the tree: +#! - 121 - 284 cycles +proc.delete + if.true # --- key is not in the tree ---------------------------------------------------------- + if.true # --- key with common prefix in the tree --- + if.true + if.true + # (10 cycles) + swapw.2 swapw dup exec.get_top_16_bits push.16 + # => [16, idx, K, R, Z, ...] + + exec.verify_leaf_with_another_key + else + # (7 cycles) + swapw.2 swapw dup exec.get_top_32_bits push.32 + # => [32, idx, K, R, Z, ...] + + exec.verify_leaf_with_another_key + end + else + if.true + # (13 cycles) + swapw.2 swapw dup exec.get_top_48_bits push.48 + # => [48, idx, K, R, Z, ...] + + exec.verify_leaf_with_another_key + else + # depth 64 - currently not implemented + push.0 assert + end + end + else # --- no key with common prefix in the tree --- + if.true + if.true + exec.verify_empty_node_16 + else + exec.verify_empty_node_32 + end + else + if.true + exec.verify_empty_node_48 + else + # depth 64 - currently not implemented + push.0 assert + end + end + end + else # --- key is in the tree --------------------------------------------------------------- + # load the root of the tree with the leaf removed from the advice provider (2 cycles) + push.0 adv_loadw + # => [R_new, Z, K, R, ...] + + # load the value to be removed from the advice provider (6 cycles) + dupw swapw.2 adv_loadw + # => [V_old, R_new, R_new, K, R, ...] + + # prepare the stack for TSMT insert operation (9 cycles) + swapw.3 dupw.3 adv.push_smtinsert adv_push.4 + # => [f0, f1, f2, f3, V_old, K, R_new, R_new, V_old, R, ...] + + # insert key-pair (K, V_old) into TSMT with root R_new - i.e., insert the key-value pair + # to be removed into the TSMT with value already removed. if all values were provided + # correctly, we should get TSMT with the root prior to the key-pair's removal. + # (81 - 244 cycles) + exec.insert_internal + # => [Z, R_old, R_new, V_old, R, ...] + + # make sure the value we got back is an empty node (8 cycles) + assertz assertz assertz assertz + # => [R_old, R_new, V_old, R, ...] + + # Make sure R and R_old are the same (13 cycles) + swapw swapw.3 assert_eqw + # => [V_old, R_new, ...] + end +end + +# SET +# ================================================================================================= + +#! Sets the value associated with key K to V in a Sparse Merkle tree with root R. Returns the new +#! root of the tree together with the value previously associated with key K. +#! +#! If no value was previously associated with K, [ZERO; 4] is returned. +#! +#! Unlike the `insert` procedure defined above, this procedure allows for values to be set to +#! [ZERO; 4]. +#! +#! Input: [V, K, R, ...] +#! Output: [V_old, R_new, ...] +#! +#! Cycles: +#! - Update existing leaf: +#! - Depth 16: 137 +#! - Depth 32: 133 +#! - Depth 48: 139 +#! - Insert new leaf: +#! - Depth 16: 102 +#! - Depth 32: 183 +#! - Depth 48: 183 +#! - Replace a leaf with a subtree: +#! - Depth 16 -> 32: 242 +#! - Depth 16 -> 48: 265 +#! - Depth 32 -> 48: 255 +#! - Remove a key-value pair: +#! - Key-value pair not in tree: 52 - 93 +#! - Key-value pair is in tree: 142 - 305 +export.set + # arrange the data needed for the update procedure on the advice stack and move the first + # 4 flags onto the operand stack; meaning of the flags f0, f1, f2, and f3 depends on what + # type of update is being executed (4 cycles) + adv.push_smtinsert adv_push.4 + # => [f0, f1, f2, f3, V, K, R, ...] + + # determine if the value is an empty word (15 cycles) + repeat.4 + dup.7 push.0 eq + end + and and and + # => [is_empty_value, f0, f1, f2, f3, V, K, R, ...] + + # the value is an empty word execute the delete procedure; otherwise execute the internal + # insert procedure because we already have all required data on the advice provider and know + # that the value being inserted is not an empty word. + if.true + exec.delete + else + exec.insert_internal + end +end diff --git a/stdlib/docs/collections/smt.md b/stdlib/docs/collections/smt.md index 2ff3771647..bed60441bb 100644 --- a/stdlib/docs/collections/smt.md +++ b/stdlib/docs/collections/smt.md @@ -3,4 +3,5 @@ | Procedure | Description | | ----------- | ------------- | | get | Returns the value stored under the specified key in a Sparse Merkle Tree with the specified root.

      If the value for a given key has not been set, the returned `V` will consist of all zeroes.

      Input: [K, R, ...]

      Output: [V, R, ...]

      Depth 16: 91 cycles

      Depth 32: 87 cycles

      Depth 48: 94 cycles

      Depth 64: unimplemented | -| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...]

      Output: [V_old, R_new, ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 129

      - Depth 32: 126

      - Depth 48: 131

      - Insert new leaf:

      - Depth 16: 100

      - Depth 32: 181

      - Depth 48: 181

      - Replace a leaf with a subtree:

      - Depth 16 -> 32: 242

      - Depth 16 -> 48: 263

      - Depth 32 -> 48: 253 | +| insert | Inserts the specified value into a Sparse Merkle Tree with the specified root under the

      specified key.

      The value previously stored in the SMT under this key is left on the stack together with

      the updated tree root.

      This assumes that the value is not [ZERO; 4]. If it is, the procedure fails.

      Input: [V, K, R, ...]

      Output: [V_old, R_new, ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 137

      - Depth 32: 134

      - Depth 48: 139

      - Insert new leaf:

      - Depth 16: 102

      - Depth 32: 183

      - Depth 48: 183

      - Replace a leaf with a subtree:

      - Depth 16 -> 32: 242

      - Depth 16 -> 48: 265

      - Depth 32 -> 48: 255 | +| set | Sets the value associated with key K to V in a Sparse Merkle tree with root R. Returns the new

      root of the tree together with the value previously associated with key K.

      If no value was previously associated with K, [ZERO; 4] is returned.

      Unlike the `insert` procedure defined above, this procedure allows for values to be set to

      [ZERO; 4].

      Input: [V, K, R, ...]

      Output: [V_old, R_new, ...]

      Cycles:

      - Update existing leaf:

      - Depth 16: 137

      - Depth 32: 133

      - Depth 48: 139

      - Insert new leaf:

      - Depth 16: 102

      - Depth 32: 183

      - Depth 48: 183

      - Replace a leaf with a subtree:

      - Depth 16 -> 32: 242

      - Depth 16 -> 48: 265

      - Depth 32 -> 48: 255

      - Remove a key-value pair:

      - Key-value pair not in tree: 52 - 93

      - Key-value pair is in tree: 142 - 305 | diff --git a/stdlib/tests/collections/smt.rs b/stdlib/tests/collections/smt.rs index d5b10993a6..448de05c62 100644 --- a/stdlib/tests/collections/smt.rs +++ b/stdlib/tests/collections/smt.rs @@ -362,6 +362,111 @@ fn assert_insert( } } +// SET TESTS +// ================================================================================================ + +#[test] +fn tsmt_set_16() { + let mut smt = TieredSmt::default(); + + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a1 = [ONE, ZERO, ZERO, ZERO]; + let val_a2 = [ONE, ONE, ZERO, ZERO]; + + // set a value under key_a into an empty tree; this inserts one entry into the advice map + let init_smt = smt.clone(); + smt.insert(key_a.into(), val_a1); + let new_map_entries = [build_node_entry(key_a, val_a1, 16)]; + assert_set(&init_smt, key_a, EMPTY_VALUE, val_a1, smt.root().into(), &new_map_entries); + + // update a value under key_a; this inserts one entry into the advice map + let init_smt = smt.clone(); + smt.insert(key_a.into(), val_a2); + let new_map_entries = [build_node_entry(key_a, val_a2, 16)]; + assert_set(&init_smt, key_a, val_a1, val_a2, smt.root().into(), &new_map_entries); + + // set an empty value for a previously un-set key; this should not change the tree + let raw_b = 0b00000000_10000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + assert_set(&smt, key_b, EMPTY_VALUE, EMPTY_VALUE, smt.root().into(), &[]); + + // set an empty value for a previously un-set key which shares 16-bit prefix with A; + // this should not change the tree + let raw_c = 0b00000000_00000000_01111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + assert_set(&smt, key_c, EMPTY_VALUE, EMPTY_VALUE, smt.root().into(), &[]); + + // set the value at key A to an empty word + let init_smt = smt.clone(); + smt.insert(key_a.into(), EMPTY_VALUE); + assert_set(&init_smt, key_a, val_a2, EMPTY_VALUE, smt.root().into(), &[]); +} + +fn assert_set( + init_smt: &TieredSmt, + key: RpoDigest, + old_value: Word, + new_value: Word, + new_root: RpoDigest, + new_map_entries: &[AdvMapEntry], +) { + let old_root = init_smt.root(); + let source = r#" + use.std::collections::smt + + begin + exec.smt::set + end + "#; + let initial_stack = [ + old_root[0].as_int(), + old_root[1].as_int(), + old_root[2].as_int(), + old_root[3].as_int(), + key[0].as_int(), + key[1].as_int(), + key[2].as_int(), + key[3].as_int(), + new_value[0].as_int(), + new_value[1].as_int(), + new_value[2].as_int(), + new_value[3].as_int(), + ]; + let expected_output = stack_top_to_ints(&[ + old_value[3].as_int(), + old_value[2].as_int(), + old_value[1].as_int(), + old_value[0].as_int(), + new_root[3].as_int(), + new_root[2].as_int(), + new_root[1].as_int(), + new_root[0].as_int(), + ]); + let (store, adv_map) = build_advice_inputs(init_smt); + let process = build_test!(source, &initial_stack, &[], store, adv_map.clone()) + .execute_process() + .unwrap(); + + // check the returned values + let stack = stack_to_ints(&process.stack.trace_state()); + assert_eq!(stack, expected_output); + + // remove the initial key-value pairs from the advice map + let mut new_adv_map = process.advice_provider.map().clone(); + for (key, value) in adv_map.iter() { + let init_value = new_adv_map.remove(key).unwrap(); + assert_eq!(value, &init_value); + } + + // make sure the remaining values in the advice map are the same as expected new entries + assert_eq!(new_adv_map.len(), new_map_entries.len()); + for (key, val) in new_map_entries { + let old_val = new_adv_map.get(key).unwrap(); + assert_eq!(old_val, val); + } +} + // HELPER FUNCTIONS // ================================================================================================ From bdc7109231ba5db7324139f330fd56a8f0cbb616 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sat, 19 Aug 2023 02:52:23 -0700 Subject: [PATCH 067/120] feat: finish implemented basic TSMT functionality --- CHANGELOG.md | 3 + core/Cargo.toml | 2 +- core/src/operations/decorators/advice.rs | 3 + processor/src/advice/mod.rs | 38 +++- processor/src/advice/providers.rs | 33 ++- .../src/decorators/adv_stack_injectors.rs | 170 ++++++++++++++-- stdlib/asm/collections/smt.masm | 12 +- stdlib/tests/collections/smt.rs | 188 +++++++++++++++++- 8 files changed, 415 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3467a431ee..d6724da9a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,9 @@ - Allowed the assembler to produce programs with "phantom" calls (#1019). - Added `TraceLenSummary` struct which holds information about traces lengths to the `ExecutionTrace` (#1029). +#### Stdlib +- Completed `std::collections::smt` module by implementing `insert` and `set` procedures (#1036, #1038, #1046). + ## 0.6.1 (2023-06-29) - Fixed `no-std` compilation for `miden-core`, `miden-assembly`, and `miden-processor` crates. diff --git a/core/Cargo.toml b/core/Cargo.toml index 8a06f05aac..651d7e4ef2 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -21,7 +21,7 @@ std = ["math/std", "winter-utils/std"] [dependencies] math = { package = "winter-math", version = "0.6", default-features = false } -crypto = { package = "miden-crypto", git = "https://github.com/0xPolygonMiden/crypto.git", branch = "bobbin-leaf-traversal", default-features = false } +crypto = { package = "miden-crypto", git = "https://github.com/0xPolygonMiden/crypto.git", branch = "next", default-features = false } winter-crypto = { package = "winter-crypto", version = "0.6", default-features = false } winter-utils = { package = "winter-utils", version = "0.6", default-features = false } diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index 854a4c7469..ca2b12d6c5 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -167,6 +167,9 @@ pub enum AdviceInjector { /// - Simple insert at depth 16: [d0, d1, ONE (is_simple_insert), ZERO (is_update)] /// - Simple insert at depth 32 or 48: [d0, d1, ONE (is_simple_insert), ZERO (is_update), P_NODE] /// - Complex insert: [f0, f1, ZERO (is_simple_insert), ZERO (is_update), E_KEY, E_VALUE] + /// - Delete against an empty subtree: [d0, d1, ZERO (is_leaf), ONE (key_not_set)] + /// - Delete against another leaf: [d0, d1, ONE (is_leaf), ONE (key_not_set), KEY, VALUE] + /// - Delete against own leaf: [ZERO, ZERO, ZERO, ZERO (key_not_set), NEW_ROOT, OLD_VALUE] /// /// Where: /// - ROOT and NEW_ROOT are the roots of the TSMT before and after the insert respectively. diff --git a/processor/src/advice/mod.rs b/processor/src/advice/mod.rs index 250e549d7c..e21d0bbc57 100644 --- a/processor/src/advice/mod.rs +++ b/processor/src/advice/mod.rs @@ -92,6 +92,12 @@ pub trait AdviceProvider { /// Returns an error if the value specified by the advice source cannot be obtained. fn push_stack(&mut self, source: AdviceSource) -> Result<(), ExecutionError>; + // ADVICE MAP + // -------------------------------------------------------------------------------------------- + + /// Returns a reference to the value(s) associated with the specified key in the advice map. + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]>; + /// Inserts the provided value into the advice map under the specified key. /// /// The values in the advice map can be moved onto the advice stack by invoking @@ -101,13 +107,7 @@ pub trait AdviceProvider { /// are replaced with the specified values. fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError>; - // ADVICE MAP - // -------------------------------------------------------------------------------------------- - - /// Returns a reference to the value(s) associated with the specified key in the advice map. - fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]>; - - // ADVISE SETS + // MERKLE STORE // -------------------------------------------------------------------------------------------- /// Returns a node at the specified depth and index in a Merkle tree with the given root. @@ -152,6 +152,21 @@ pub trait AdviceProvider { index: &Felt, ) -> Result; + /// Returns node value and index of a leaf node in the subtree of the specified root, if and + /// only if this is the only leaf in the entire subtree. Otherwise, None is returned. + /// + /// The root itself is assumed to be located at the specified index in a tree with the provided + /// depth. + /// + /// # Errors + /// Returns an error if a three for the specified root does not exist in the advice provider. + fn find_lone_leaf( + &self, + root: Word, + root_index: NodeIndex, + tree_depth: u8, + ) -> Result, ExecutionError>; + /// Updates a node at the specified depth and index in a Merkle tree with the specified root; /// returns the Merkle path from the updated node to the new root, together with the new root. /// @@ -261,6 +276,15 @@ where T::get_leaf_depth(self, root, tree_depth, index) } + fn find_lone_leaf( + &self, + root: Word, + root_index: NodeIndex, + tree_depth: u8, + ) -> Result, ExecutionError> { + T::find_lone_leaf(self, root, root_index, tree_depth) + } + fn update_merkle_node( &mut self, root: Word, diff --git a/processor/src/advice/providers.rs b/processor/src/advice/providers.rs index b84c488b93..73fc05021b 100644 --- a/processor/src/advice/providers.rs +++ b/processor/src/advice/providers.rs @@ -103,18 +103,19 @@ where Ok(()) } - fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError> { - self.map.insert(key.into_bytes(), values); - Ok(()) - } - // ADVICE MAP // -------------------------------------------------------------------------------------------- + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { self.map.get(key).map(|v| v.as_slice()) } - // ADVISE SETS + fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError> { + self.map.insert(key.into_bytes(), values); + Ok(()) + } + + // MERKLE STORE // -------------------------------------------------------------------------------------------- fn get_tree_node( @@ -166,6 +167,18 @@ where .map_err(ExecutionError::MerkleStoreLookupFailed) } + fn find_lone_leaf( + &self, + root: Word, + root_index: NodeIndex, + tree_depth: u8, + ) -> Result, ExecutionError> { + self.store + .find_lone_leaf(root.into(), root_index, tree_depth) + .map(|leaf| leaf.map(|(index, leaf)| (index, leaf.into()))) + .map_err(ExecutionError::MerkleStoreLookupFailed) + } + fn update_merkle_node( &mut self, root: Word, @@ -289,6 +302,10 @@ impl AdviceProvider for MemAdviceProvider { self.provider.get_leaf_depth(root, tree_depth, index) } + fn find_lone_leaf(&self, root: Word, root_index: NodeIndex, tree_depth: u8) -> Result, ExecutionError> { + self.provider.find_lone_leaf(root, root_index, tree_depth) + } + fn update_merkle_node(&mut self, root: Word, depth: &Felt, index: &Felt, value: Word) -> Result<(MerklePath, Word), ExecutionError> { self.provider.update_merkle_node(root, depth, index, value) } @@ -414,6 +431,10 @@ impl AdviceProvider for RecAdviceProvider { self.provider.get_leaf_depth(root, tree_depth, index) } + fn find_lone_leaf(&self, root: Word, root_index: NodeIndex, tree_depth: u8) -> Result, ExecutionError> { + self.provider.find_lone_leaf(root, root_index, tree_depth) + } + fn update_merkle_node(&mut self, root: Word, depth: &Felt, index: &Felt, value: Word) -> Result<(MerklePath, Word), ExecutionError> { self.provider.update_merkle_node(root, depth, index, value) } diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors.rs index 8b44ecf188..f11195d00e 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors.rs @@ -1,10 +1,10 @@ use super::{super::Ext2InttError, AdviceProvider, AdviceSource, ExecutionError, Process}; use vm_core::{ crypto::{ - hash::RpoDigest, - merkle::{EmptySubtreeRoots, TieredSmt}, + hash::{Rpo256, RpoDigest}, + merkle::{EmptySubtreeRoots, NodeIndex, TieredSmt}, }, - utils::collections::Vec, + utils::collections::{btree_map::Entry, BTreeMap, Vec}, Felt, FieldElement, QuadExtension, StarkField, Word, ONE, WORD_SIZE, ZERO, }; use winter_prover::math::fft; @@ -387,15 +387,14 @@ where unimplemented!("handling of depth=64 tier hasn't been implemented yet"); } - // get the value of the node a this index/depth + // get the value of the node at this index/depth let index = index.as_int() >> (64 - depth); let index = Felt::new(index); let node = self.advice_provider.get_tree_node(root, &Felt::from(depth), &index)?; // if the value to be inserted is an empty word, we need to process it as a delete if value == TieredSmt::EMPTY_VALUE { - self.handle_smt_delete(root, node, depth, index, key)?; - return Ok(()); + return self.handle_smt_delete(root, node, depth, index, key); } // figure out what kind of insert we are doing; possible options are: @@ -569,7 +568,22 @@ where Ok(()) } - /// TODO: add comments + /// Prepares the advice stack for a TSMT deletion operation. Specifically, the advice stack + /// will be arranged as follows (depending on the type of the node which occupies the location + /// at which the node for the specified key should be present): + /// + /// - Root of empty subtree: [d0, d1, ZERO (is_leaf), ONE (key_not_set)] + /// - Leaf for another key: [d0, d1, ONE (is_leaf), ONE (key_not_set), KEY, VALUE] + /// - Leaf for the provided key: [ZERO, ZERO, ZERO, ZERO (key_not_set), NEW_ROOT, OLD_VALUE] + /// + /// Where: + /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. + /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. + /// - KEY and VALUE is the key-value pair of a leaf node occupying the location of the node + /// for the specified key. Note that KEY may be the same as the specified key or different + /// from the specified key if the location is occupied by a different key-value pair. + /// - NEW_ROOT is the new root of the TSMT post deletion. + /// - OLD_VALUE is the value which is to be replaced with [ZERO; 4]. fn handle_smt_delete( &mut self, root: Word, @@ -578,35 +592,80 @@ where index: Felt, key: Word, ) -> Result<(), ExecutionError> { - let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; + let empty = EmptySubtreeRoots::empty_hashes(TieredSmt::MAX_DEPTH)[depth as usize]; if node == Word::from(empty) { + // if the node to be replaced is already an empty node, we set key_not_set = ONE, + // and is_leaf = ZERO self.advice_provider.push_stack(AdviceSource::Value(ONE))?; self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; + // set depth flags based on node's depth let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; } else { - let (leaf_key, leaf_value) = self.get_smt_upper_leaf_preimage(node).unwrap(); + // if the node is not a root of an empty subtree, it must be a leaf; thus we can get + // the key and the value stored in the leaf. + let (leaf_key, leaf_value) = self.get_smt_upper_leaf_preimage(node)?; if leaf_key != key { + // if the node to be replaced is a leaf for different key, we push that key-value + // pair onto the advice stack and set key_not_set = ONE and is_leaf = ONE + self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; self.advice_provider.push_stack(AdviceSource::Word(leaf_key))?; self.advice_provider.push_stack(AdviceSource::Value(ONE))?; self.advice_provider.push_stack(AdviceSource::Value(ONE))?; + // set depth flags based on node's depth let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; } else { - let (_, new_root) = self.advice_provider.update_merkle_node( - root, - &Felt::from(depth), - &index, - empty.into(), - )?; + // if the key which we want to set to [ZERO; 4] does have an associated value, + // we update the tree in the advice provider to get the new root, then push the root + // and the old value onto the advice stack, key_not_set = ZERO, and also push 3 + // ZERO values for padding + let new_root = match self.find_lone_sibling(root, depth, &index)? { + Some((sibling, new_index)) => { + // if the node to be deleted has a lone sibling, we need to move it to a + // higher tier. + + // first, we compute the value of the new node on the higher tier + let (leaf_key, leaf_val) = self.get_smt_upper_leaf_preimage(*sibling)?; + let new_node = Rpo256::merge_in_domain( + &[leaf_key.into(), leaf_val.into()], + new_index.depth().into(), + ); + + // then we insert the node and its pre-image into the advice provider + let mut elements = leaf_key.to_vec(); + elements.extend_from_slice(&leaf_val); + self.advice_provider.insert_into_map(new_node.into(), elements)?; + + // and finally we update the tree in the advice provider + let (_, new_root) = self.advice_provider.update_merkle_node( + root, + &new_index.depth().into(), + &new_index.value().into(), + new_node.into(), + )?; + new_root + } + None => { + // if the node does not have a lone sibling, we just replace it with an + // empty node + let (_, new_root) = self.advice_provider.update_merkle_node( + root, + &Felt::from(depth), + &index, + empty.into(), + )?; + new_root + } + }; self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; self.advice_provider.push_stack(AdviceSource::Word(new_root))?; @@ -621,6 +680,87 @@ where Ok(()) } + + /// Returns info about a lone sibling of a leaf specified by depth and index parameters in the + /// Tiered Sparse Merkle tree defined by the specified root. If no lone siblings exist for the + /// specified parameters, None is returned. + /// + /// A lone sibling is defined as a leaf which has a common root with the specified leaf at a + /// higher tier such that the subtree starting at this root contains only these two leaves. + /// + /// In addition to the leaf node itself, this also returns the index of the common root at a + /// higher tier. + fn find_lone_sibling( + &self, + root: Word, + depth: u8, + index: &Felt, + ) -> Result, ExecutionError> { + debug_assert!(matches!(depth, 16 | 32 | 48)); + + // if the leaf is on the first tier (depth=16), we don't care about lone siblings as they + // cannot be moved to a higher tier. + if depth == TieredSmt::TIER_SIZE { + return Ok(None); + } + + let empty = &EmptySubtreeRoots::empty_hashes(TieredSmt::MAX_DEPTH)[..=depth as usize]; + + // get the path to the leaf node + let path: Vec<_> = self.advice_provider.get_merkle_path(root, &depth.into(), index)?.into(); + + // traverse the path from the leaf up to the root, keeping track of all non-empty nodes; + // here we ignore the top 16 depths because lone siblings cannot be moved to a higher tier + // from tier at depth 16. + let mut non_empty_nodes = BTreeMap::new(); + for (depth, sibling) in (TieredSmt::TIER_SIZE..=depth).rev().zip(path.iter()) { + // map the depth of each node to the tier it would "round up" to. For example, 17 maps + // to tier 1, 32 also maps to tier 1, but 33 maps to tier 2. + let tier = (depth - 1) / TieredSmt::TIER_SIZE; + + // if the node is non-empty, insert it into the map, but if a node for the same tier + // is already in the map, stop traversing the tree. we do this because if two nodes in + // a given tier are non-empty a lone sibling cannot exist at this tier or any higher + // tier. to indicate the the tier cannot contain a lone sibling, we set the value in + // the map to None. + if sibling != &empty[depth as usize] { + match non_empty_nodes.entry(tier) { + Entry::Vacant(entry) => { + entry.insert(Some((depth, *sibling))); + } + Entry::Occupied(mut entry) => { + entry.insert(None); + break; + } + } + } + } + + // take the deepest non-empty node and check if its subtree contains just a single leaf + if let Some((_, Some((node_depth, node)))) = non_empty_nodes.pop_last() { + let mut node_index = NodeIndex::new(depth, index.as_int()).expect("invalid node index"); + node_index.move_up_to(node_depth); + let node_index = node_index.sibling(); + + if let Some((mut leaf_index, leaf)) = self.advice_provider.find_lone_leaf( + node.into(), + node_index, + TieredSmt::MAX_DEPTH, + )? { + // if the node's subtree does contain a single leaf, figure out to which depth + // we can move it up to. we do this by taking the next tier down from the tier + // which contained at least one non-empty node on the path from the original leaf + // up to the root. if there were no non-empty nodes on this path, we default to + // the first tier (i.e., depth 16). + let target_tier = non_empty_nodes.keys().last().map(|&t| t + 1).unwrap_or(1); + leaf_index.move_up_to(target_tier * TieredSmt::TIER_SIZE); + + return Ok(Some((leaf.into(), leaf_index))); + } + } + + Ok(None) + } } // HELPER FUNCTIONS diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index ad90832213..72b95b156b 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -1244,7 +1244,7 @@ proc.verify_empty_node_48 end #! Verifies that a leaf node located at depth d and index idx in the tree defined by root R is -#! contains key which is different from K. +#! contained key which is different from K. #! #! Input: [d, idx, K, R, Z, ...] #! Output: [Z, R, ...] @@ -1287,11 +1287,15 @@ end #! If the key-value pair is not in the tree, this proves that the key-value pair is not in the #! tree but does not modify the tree itself. #! -#! This assumes that the value Z is [ZERO; 4], but this is not checked. -#! #! Input: [key_not_in_tree, f0, f1, f2, Z, K, R, ...] #! Output: [V_old, R_new, ...] #! +#! Where: +#! - key_not_in_tree is a flag specifying whether the specified key is present in the tree defined +#! by R. +#! - Meaning of the flags f0, f1, and f2 depends on what type of delete is being executed. +#! - Z is [ZERO; 4]. This is assumed but not checked. +#! #! Cycles: #! - Key not in the tree (key with common prefix in the tree): #! - Depth 16: 68 @@ -1349,7 +1353,7 @@ proc.delete end end else # --- key is in the tree --------------------------------------------------------------- - # load the root of the tree with the leaf removed from the advice provider (2 cycles) + # load from the advice provider the root of the tree with the leaf removed (2 cycles) push.0 adv_loadw # => [R_new, Z, K, R, ...] diff --git a/stdlib/tests/collections/smt.rs b/stdlib/tests/collections/smt.rs index 448de05c62..60f21f2f05 100644 --- a/stdlib/tests/collections/smt.rs +++ b/stdlib/tests/collections/smt.rs @@ -397,12 +397,198 @@ fn tsmt_set_16() { let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); assert_set(&smt, key_c, EMPTY_VALUE, EMPTY_VALUE, smt.root().into(), &[]); - // set the value at key A to an empty word + // set the value at key A to an empty word; this removes node A from the tree let init_smt = smt.clone(); smt.insert(key_a.into(), EMPTY_VALUE); assert_set(&init_smt, key_a, val_a2, EMPTY_VALUE, smt.root().into(), &[]); } +#[test] +fn tsmt_set_32() { + let mut smt = TieredSmt::default(); + + // insert a value under key_a into an empty tree + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ZERO, ZERO, ZERO]; + smt.insert(key_a.into(), val_a); + + // insert a value under key_b which has the same 16-bit prefix as A + let raw_b = 0b00000000_00000000_01111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ONE, ONE, ZERO, ZERO]; + + // this tests a complex insertion when a leaf node moves from depth 16 to depth 32; this + // moves the original node to depth 32, and thus two new entries are added to the advice map + let init_smt = smt.clone(); + smt.insert(key_b.into(), val_b); + let new_map_entries = [build_node_entry(key_a, val_a, 32), build_node_entry(key_b, val_b, 32)]; + assert_set(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into(), &new_map_entries); + + // update a value under key_a; this adds one new entry to the advice map + let init_smt = smt.clone(); + let val_a2 = [ONE, ZERO, ZERO, ONE]; + smt.insert(key_a.into(), val_a2); + let new_map_entries = [build_node_entry(key_a, val_a2, 32)]; + assert_set(&init_smt, key_a, val_a, val_a2, smt.root().into(), &new_map_entries); + + // insert a value under key_c which has the same 16-bit prefix as A and B; this inserts a new + // node at depth 32, and thus adds one entry to the advice map + let raw_c = 0b00000000_00000000_00111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + let val_c = [ONE, ONE, ONE, ZERO]; + + let init_smt = smt.clone(); + smt.insert(key_c.into(), val_c); + let new_map_entries = [build_node_entry(key_c, val_c, 32)]; + assert_set(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into(), &new_map_entries); + + // remove C from the tree + let init_smt = smt.clone(); + smt.insert(key_c.into(), EMPTY_VALUE); + assert_set(&init_smt, key_c, val_c, EMPTY_VALUE, smt.root().into(), &[]); + + // remove A from the tree; this should move B to depth 16, and thus inserts a new entry into + // the advice map for node B at depth 16 + let init_smt = smt.clone(); + smt.insert(key_a.into(), EMPTY_VALUE); + let new_map_entries = [build_node_entry(key_b, val_b, 16)]; + assert_set(&init_smt, key_a, val_a2, EMPTY_VALUE, smt.root().into(), &new_map_entries); +} + +#[test] +fn tsmt_set_48() { + let mut smt = TieredSmt::default(); + + // insert a value under key_a into an empty tree + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ZERO, ZERO, ZERO]; + smt.insert(key_a.into(), val_a); + + // insert a value under key_b which has the same 32-bit prefix as A + let raw_b = 0b00000000_00000000_11111111_11111111_00111111_11111111_11111111_11111111_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ONE, ONE, ZERO, ZERO]; + + // this tests a complex insertion when a leaf moves from depth 16 to depth 48; this moves + // node at depth 16 to depth 48 and inserts a new node at depth 48 + let init_smt = smt.clone(); + smt.insert(key_b.into(), val_b); + let new_map_entries = [build_node_entry(key_a, val_a, 48), build_node_entry(key_b, val_b, 48)]; + assert_set(&init_smt, key_b, EMPTY_VALUE, val_b, smt.root().into(), &new_map_entries); + + // update a value under key_a; this inserts one entry into the advice map + let init_smt = smt.clone(); + let val_a2 = [ONE, ZERO, ZERO, ONE]; + smt.insert(key_a.into(), val_a2); + let new_map_entries = [build_node_entry(key_a, val_a2, 48)]; + assert_set(&init_smt, key_a, val_a, val_a2, smt.root().into(), &new_map_entries); + + // insert a value under key_c which has the same 32-bit prefix as A and B; this inserts + // one entry into the advice map + let raw_c = 0b00000000_00000000_11111111_11111111_00111111_01111111_11111111_11111111_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + let val_c = [ONE, ONE, ONE, ZERO]; + + let init_smt = smt.clone(); + smt.insert(key_c.into(), val_c); + let new_map_entries = [build_node_entry(key_c, val_c, 48)]; + assert_set(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into(), &new_map_entries); + + // at this point the tree has 3 nodes A, B, C, all 3 are a depth 48 and share the same 32-bit + // prefix; also B and C share the same 34-bit prefix. + + // remove node A from the tree; since B and C share the same 34-bit prefix, they remain at + // depth 48 + let init_smt = smt.clone(); + smt.insert(key_a.into(), EMPTY_VALUE); + assert_set(&init_smt, key_a, val_a2, EMPTY_VALUE, smt.root().into(), &[]); + + // remove node B from the tree; this will move node C to depth 16, and thus inserts a new + // entry into the advice map for node C at depth 16 + let init_smt = smt.clone(); + smt.insert(key_b.into(), EMPTY_VALUE); + let new_map_entries = [build_node_entry(key_c, val_c, 16)]; + assert_set(&init_smt, key_b, val_b, EMPTY_VALUE, smt.root().into(), &new_map_entries); +} + +#[test] +fn tsmt_set_48_from_32() { + let mut smt = TieredSmt::default(); + + // insert a value under key_a into an empty tree + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ZERO, ZERO, ZERO]; + smt.insert(key_a.into(), val_a); + + // insert a value under key_b which has the same 16-bit prefix as A + let raw_b = 0b00000000_00000000_01111111_11111111_01111111_11111111_11111111_11111111_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ONE, ONE, ZERO, ZERO]; + smt.insert(key_b.into(), val_b); + + // insert a value under key_c which has the same 32-bit prefix as A + let raw_c = 0b00000000_00000000_11111111_11111111_00111111_11111111_11111111_11111111_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + let val_c = [ONE, ONE, ONE, ZERO]; + + // this tests a complex insertion when a leaf moves from depth 32 to depth 48; two new + // entries are added to the advice map + let init_smt = smt.clone(); + smt.insert(key_c.into(), val_c); + let new_map_entries = [build_node_entry(key_a, val_a, 48), build_node_entry(key_c, val_c, 48)]; + assert_set(&init_smt, key_c, EMPTY_VALUE, val_c, smt.root().into(), &new_map_entries); + + // remove C from the tree; this should cause leaf A to move to depth 32 + let init_smt = smt.clone(); + smt.insert(key_c.into(), EMPTY_VALUE); + let new_map_entries = [build_node_entry(key_a, val_a, 32)]; + assert_set(&init_smt, key_c, val_c, EMPTY_VALUE, smt.root().into(), &new_map_entries); + + // remove B from the tree; this should cause leaf A to move to depth 16 + let init_smt = smt.clone(); + smt.insert(key_b.into(), EMPTY_VALUE); + let new_map_entries = [build_node_entry(key_a, val_a, 16)]; + assert_set(&init_smt, key_b, val_b, EMPTY_VALUE, smt.root().into(), &new_map_entries); +} + +#[test] +fn tsmt_set_48_lone_sibling_move_to_32() { + let mut smt = TieredSmt::default(); + + // depth 48 leaf + let raw_a = 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64; + let key_a = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_a)]); + let val_a = [ONE, ZERO, ZERO, ZERO]; + smt.insert(key_a.into(), val_a); + + // depth 48 leaf + let raw_b = 0b00000000_00000000_11111111_11111111_11111111_00111111_11111111_11111111_u64; + let key_b = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_b)]); + let val_b = [ONE, ONE, ZERO, ZERO]; + smt.insert(key_b.into(), val_b); + + // depth 32 leaf + let raw_c = 0b00000000_00000000_11111111_11111110_11111111_11111111_11111111_11111111_u64; + let key_c = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_c)]); + let val_c = [ONE, ZERO, ZERO, ZERO]; + smt.insert(key_c.into(), val_c); + + // depth 32 leaf + let raw_d = 0b00000000_00000000_11111111_11111101_11111111_11111111_11111111_11111111_u64; + let key_d = RpoDigest::from([ONE, ONE, ONE, Felt::new(raw_d)]); + let val_d = [ONE, ONE, ZERO, ZERO]; + smt.insert(key_d, val_d); + + // remove leaf a such that it key_b, val_b should move to depth 32 + let init_smt = smt.clone(); + smt.insert(key_a.into(), EMPTY_VALUE); + let new_map_entries = [build_node_entry(key_b, val_b, 32)]; + assert_set(&init_smt, key_a, val_a, EMPTY_VALUE, smt.root().into(), &new_map_entries); +} + fn assert_set( init_smt: &TieredSmt, key: RpoDigest, From 824e2822e28b21854b35bb5f9d2049d5141a49cf Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Fri, 18 Aug 2023 21:44:05 +0200 Subject: [PATCH 068/120] refactor(processor): impose limit on the memory address --- CHANGELOG.md | 1 + processor/src/chiplets/memory/mod.rs | 35 ++++++++------- processor/src/chiplets/memory/segment.rs | 20 ++++----- processor/src/chiplets/memory/tests.rs | 57 ++++++++++++------------ processor/src/chiplets/mod.rs | 18 ++++---- processor/src/operations/io_ops.rs | 56 +++++++++++++++++------ 6 files changed, 110 insertions(+), 77 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3467a431ee..82fa6dca3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - Improved handling of invalid/incomplete parameters in `StackOutputs` constructors (#1010). - Allowed the assembler to produce programs with "phantom" calls (#1019). - Added `TraceLenSummary` struct which holds information about traces lengths to the `ExecutionTrace` (#1029). +- Imposed the 2^32 limit for the memory addresses used in the memory chiplet (#1049). ## 0.6.1 (2023-06-29) diff --git a/processor/src/chiplets/memory/mod.rs b/processor/src/chiplets/memory/mod.rs index 2b87904fda..f126425d52 100644 --- a/processor/src/chiplets/memory/mod.rs +++ b/processor/src/chiplets/memory/mod.rs @@ -96,7 +96,7 @@ impl Memory { /// /// Unlike read() which modifies the memory access trace, this method returns the value at the /// specified address (if one exists) without altering the memory access trace. - pub fn get_value(&self, ctx: u32, addr: u64) -> Option { + pub fn get_value(&self, ctx: u32, addr: u32) -> Option { match self.trace.get(&ctx) { Some(segment) => segment.get_value(addr), None => None, @@ -105,7 +105,7 @@ impl Memory { /// Returns the word at the specified context/address which should be used as the "old value" for a /// write request. It will be the previously stored value, if one exists, or initialized memory. - pub fn get_old_value(&self, ctx: u32, addr: u64) -> Word { + pub fn get_old_value(&self, ctx: u32, addr: u32) -> Word { // get the stored word or return [0, 0, 0, 0], since the memory is initialized with zeros self.get_value(ctx, addr).unwrap_or(INIT_MEM_VALUE) } @@ -131,13 +131,13 @@ impl Memory { /// /// If the specified address hasn't been previously written to, four ZERO elements are /// returned. This effectively implies that memory is initialized to ZERO. - pub fn read(&mut self, ctx: u32, addr: Felt, clk: u32) -> Word { + pub fn read(&mut self, ctx: u32, addr: u32, clk: u32) -> Word { self.num_trace_rows += 1; self.trace.entry(ctx).or_default().read(addr, Felt::from(clk)) } /// Writes the provided word at the specified context/address. - pub fn write(&mut self, ctx: u32, addr: Felt, clk: u32, value: Word) { + pub fn write(&mut self, ctx: u32, addr: u32, clk: u32, value: Word) { self.num_trace_rows += 1; self.trace.entry(ctx).or_default().write(addr, Felt::from(clk), value); } @@ -170,7 +170,7 @@ impl Memory { let delta = if prev_ctx != ctx { (ctx - prev_ctx) as u64 } else if prev_addr != addr { - addr - prev_addr + (addr - prev_addr) as u64 } else { clk - prev_clk - 1 }; @@ -214,7 +214,7 @@ impl Memory { for (addr, addr_trace) in segment.into_inner() { // when we start a new address, we set the previous value to all zeros. the effect of // this is that memory is always initialized to zero. - let addr = Felt::new(addr); + let felt_addr = Felt::from(addr); for memory_access in addr_trace { let clk = memory_access.clk(); let value = memory_access.value(); @@ -223,7 +223,7 @@ impl Memory { trace.set(row, 0, selectors[0]); trace.set(row, 1, selectors[1]); trace.set(row, CTX_COL_IDX, ctx); - trace.set(row, ADDR_COL_IDX, addr); + trace.set(row, ADDR_COL_IDX, felt_addr); trace.set(row, CLK_COL_IDX, clk); for (idx, col) in V_COL_RANGE.enumerate() { trace.set(row, col, value[idx]); @@ -232,8 +232,8 @@ impl Memory { // compute delta as difference between context IDs, addresses, or clock cycles let delta = if prev_ctx != ctx { ctx - prev_ctx - } else if prev_addr != addr { - addr - prev_addr + } else if prev_addr != felt_addr { + felt_addr - prev_addr } else { clk - prev_clk - ONE }; @@ -245,14 +245,19 @@ impl Memory { trace.set(row, D_INV_COL_IDX, delta.inv()); // provide the memory access data to the chiplets bus. - let memory_lookup = - MemoryLookup::new(memory_access.op_label(), ctx, addr, clk, value); + let memory_lookup = MemoryLookup::new( + memory_access.op_label(), + ctx, + Felt::from(addr), + clk, + value, + ); chiplets_bus .provide_memory_operation(memory_lookup, (memory_start_row + row) as u32); // update values for the next iteration of the loop prev_ctx = ctx; - prev_addr = addr; + prev_addr = felt_addr; prev_clk = clk; row += 1; } @@ -265,7 +270,7 @@ impl Memory { /// Returns the context, address, and clock cycle of the first trace row, or None if the trace /// is empty. - fn get_first_row_info(&self) -> Option<(u32, u64, Felt)> { + fn get_first_row_info(&self) -> Option<(u32, u32, Felt)> { let (ctx, segment) = match self.trace.iter().next() { Some((&ctx, segment)) => (ctx, segment), None => return None, @@ -311,11 +316,11 @@ impl MemoryLookup { } } - pub fn from_ints(label: u8, ctx: u32, addr: Felt, clk: u32, word: Word) -> Self { + pub fn from_ints(label: u8, ctx: u32, addr: u32, clk: u32, word: Word) -> Self { Self { label, ctx: Felt::from(ctx), - addr, + addr: Felt::from(addr), clk: Felt::from(clk), word, } diff --git a/processor/src/chiplets/memory/segment.rs b/processor/src/chiplets/memory/segment.rs index 651db1dd9a..15ceb760ec 100644 --- a/processor/src/chiplets/memory/segment.rs +++ b/processor/src/chiplets/memory/segment.rs @@ -14,7 +14,7 @@ use super::{BTreeMap, Felt, StarkField, Vec, Word, INIT_MEM_VALUE}; /// Within each segment, the memory is word-addressable. That is, four field elements are located /// at each memory address, and we can read and write elements to/from memory in batches of four. #[derive(Default)] -pub struct MemorySegmentTrace(BTreeMap>); +pub struct MemorySegmentTrace(BTreeMap>); impl MemorySegmentTrace { // PUBLIC ACCESSORS @@ -25,7 +25,7 @@ impl MemorySegmentTrace { /// /// Unlike read() which modifies the memory access trace, this method returns the value at the /// specified address (if one exists) without altering the memory access trace. - pub fn get_value(&self, addr: u64) -> Option { + pub fn get_value(&self, addr: u32) -> Option { match self.0.get(&addr) { Some(addr_trace) => addr_trace.last().map(|access| access.value()), None => None, @@ -47,13 +47,13 @@ impl MemorySegmentTrace { for (&addr, addr_trace) in self.0.iter() { match addr_trace.binary_search_by(|access| access.clk().as_int().cmp(&search_clk)) { - Ok(i) => result.push((addr, addr_trace[i].value())), + Ok(i) => result.push((addr.into(), addr_trace[i].value())), Err(i) => { // Binary search finds the index of the data with the specified clock cycle. // Decrement the index to get the trace from the previously accessed clock // cycle to insert into the results. if i > 0 { - result.push((addr, addr_trace[i - 1].value())); + result.push((addr.into(), addr_trace[i - 1].value())); } } } @@ -70,12 +70,12 @@ impl MemorySegmentTrace { /// /// If the specified address hasn't been previously written to, four ZERO elements are /// returned. This effectively implies that memory is initialized to ZERO. - pub fn read(&mut self, addr: Felt, clk: Felt) -> Word { + pub fn read(&mut self, addr: u32, clk: Felt) -> Word { // look up the previous value in the appropriate address trace and add (clk, prev_value) // to it; if this is the first time we access this address, create address trace for it // with entry (clk, [ZERO, 4]). in both cases, return the last value in the address trace. self.0 - .entry(addr.as_int()) + .entry(addr) .and_modify(|addr_trace| { let last_value = addr_trace.last().expect("empty address trace").value(); let access = MemorySegmentAccess::new(clk, MemoryOperation::CopyRead, last_value); @@ -93,12 +93,12 @@ impl MemorySegmentTrace { /// Writes the provided word at the specified address. The memory access is assumed to happen /// at the provided clock cycle. - pub fn write(&mut self, addr: Felt, clk: Felt, value: Word) { + pub fn write(&mut self, addr: u32, clk: Felt, value: Word) { // add a memory access to the appropriate address trace; if this is the first time // we access this address, initialize address trace. let access = MemorySegmentAccess::new(clk, MemoryOperation::Write, value); self.0 - .entry(addr.as_int()) + .entry(addr) .and_modify(|addr_trace| addr_trace.push(access)) .or_insert_with(|| vec![access]); } @@ -107,12 +107,12 @@ impl MemorySegmentTrace { // -------------------------------------------------------------------------------------------- /// Returns a reference to the map underlying this memory segment trace. - pub(super) fn inner(&self) -> &BTreeMap> { + pub(super) fn inner(&self) -> &BTreeMap> { &self.0 } /// Returns a map underlying this memory segment trace while consuming self. - pub(super) fn into_inner(self) -> BTreeMap> { + pub(super) fn into_inner(self) -> BTreeMap> { self.0 } diff --git a/processor/src/chiplets/memory/tests.rs b/processor/src/chiplets/memory/tests.rs index 808cd18019..9bf890213e 100644 --- a/processor/src/chiplets/memory/tests.rs +++ b/processor/src/chiplets/memory/tests.rs @@ -1,8 +1,7 @@ use super::{ super::aux_trace::{ChipletLookup, ChipletsBusRow}, - ChipletsBus, Felt, FieldElement, Memory, MemoryLookup, StarkField, TraceFragment, Vec, - ADDR_COL_IDX, CLK_COL_IDX, CTX_COL_IDX, D0_COL_IDX, D1_COL_IDX, D_INV_COL_IDX, ONE, - V_COL_RANGE, ZERO, + ChipletsBus, Felt, FieldElement, Memory, MemoryLookup, TraceFragment, Vec, ADDR_COL_IDX, + CLK_COL_IDX, CTX_COL_IDX, D0_COL_IDX, D1_COL_IDX, D_INV_COL_IDX, ONE, V_COL_RANGE, ZERO, }; use miden_air::trace::chiplets::memory::{ Selectors, MEMORY_COPY_READ, MEMORY_INIT_READ, MEMORY_READ_LABEL, MEMORY_WRITE, @@ -21,14 +20,14 @@ fn mem_read() { let mut mem = Memory::default(); // read a value from address 0; clk = 1 - let addr0 = Felt::new(0); + let addr0 = 0; let value = mem.read(0, addr0, 1); assert_eq!([ZERO; 4], value); assert_eq!(1, mem.size()); assert_eq!(1, mem.trace_len()); // read a value from address 3; clk = 2 - let addr3 = Felt::new(3); + let addr3 = 3; let value = mem.read(0, addr3, 2); assert_eq!([ZERO; 4], value); assert_eq!(2, mem.size()); @@ -41,7 +40,7 @@ fn mem_read() { assert_eq!(3, mem.trace_len()); // read a value from address 2; clk = 4 - let addr2 = Felt::new(2); + let addr2 = 2; let value = mem.read(0, addr2, 4); assert_eq!([ZERO; 4], value); assert_eq!(3, mem.size()); @@ -76,33 +75,33 @@ fn mem_write() { let mut mem = Memory::default(); // write a value into address 0; clk = 1 - let addr0 = Felt::new(0); + let addr0 = 0; let value1 = [ONE, ZERO, ZERO, ZERO]; mem.write(0, addr0, 1, value1); - assert_eq!(value1, mem.get_value(0, addr0.as_int()).unwrap()); + assert_eq!(value1, mem.get_value(0, addr0).unwrap()); assert_eq!(1, mem.size()); assert_eq!(1, mem.trace_len()); // write a value into address 2; clk = 2 - let addr2 = Felt::new(2); + let addr2 = 2; let value5 = [Felt::new(5), ZERO, ZERO, ZERO]; mem.write(0, addr2, 2, value5); - assert_eq!(value5, mem.get_value(0, addr2.as_int()).unwrap()); + assert_eq!(value5, mem.get_value(0, addr2).unwrap()); assert_eq!(2, mem.size()); assert_eq!(2, mem.trace_len()); // write a value into address 1; clk = 3 - let addr1 = Felt::new(1); + let addr1 = 1; let value7 = [Felt::new(7), ZERO, ZERO, ZERO]; mem.write(0, addr1, 3, value7); - assert_eq!(value7, mem.get_value(0, addr1.as_int()).unwrap()); + assert_eq!(value7, mem.get_value(0, addr1).unwrap()); assert_eq!(3, mem.size()); assert_eq!(3, mem.trace_len()); // write a value into address 0; clk = 4 let value9 = [Felt::new(9), ZERO, ZERO, ZERO]; mem.write(0, addr0, 4, value9); - assert_eq!(value7, mem.get_value(0, addr1.as_int()).unwrap()); + assert_eq!(value7, mem.get_value(0, addr1).unwrap()); assert_eq!(3, mem.size()); assert_eq!(4, mem.trace_len()); @@ -135,12 +134,12 @@ fn mem_write_read() { let mut mem = Memory::default(); // write 1 into address 5; clk = 1 - let addr5 = Felt::new(5); + let addr5 = 5; let value1 = [ONE, ZERO, ZERO, ZERO]; mem.write(0, addr5, 1, value1); // write 4 into address 2; clk = 2 - let addr2 = Felt::new(2); + let addr2 = 2; let value4 = [Felt::new(4), ZERO, ZERO, ZERO]; mem.write(0, addr2, 2, value4); @@ -216,33 +215,33 @@ fn mem_multi_context() { // write a value into ctx = 0, addr = 0; clk = 1 let value1 = [ONE, ZERO, ZERO, ZERO]; - mem.write(0, ZERO, 1, value1); + mem.write(0, 0, 1, value1); assert_eq!(value1, mem.get_value(0, 0).unwrap()); assert_eq!(1, mem.size()); assert_eq!(1, mem.trace_len()); // write a value into ctx = 3, addr = 1; clk = 4 let value2 = [ZERO, ONE, ZERO, ZERO]; - mem.write(3, ONE, 4, value2); + mem.write(3, 1, 4, value2); assert_eq!(value2, mem.get_value(3, 1).unwrap()); assert_eq!(2, mem.size()); assert_eq!(2, mem.trace_len()); // read a value from ctx = 3, addr = 1; clk = 6 - let value = mem.read(3, ONE, 6); + let value = mem.read(3, 1, 6); assert_eq!(value2, value); assert_eq!(2, mem.size()); assert_eq!(3, mem.trace_len()); // write a value into ctx = 3, addr = 0; clk = 7 let value3 = [ZERO, ZERO, ONE, ZERO]; - mem.write(3, ZERO, 7, value3); + mem.write(3, 0, 7, value3); assert_eq!(value3, mem.get_value(3, 0).unwrap()); assert_eq!(3, mem.size()); assert_eq!(4, mem.trace_len()); // read a value from ctx = 0, addr = 0; clk = 9 - let value = mem.read(0, ZERO, 9); + let value = mem.read(0, 0, 9); assert_eq!(value1, value); assert_eq!(3, mem.size()); assert_eq!(5, mem.trace_len()); @@ -253,25 +252,25 @@ fn mem_multi_context() { // ctx = 0, addr = 0 let mut prev_row = [ZERO; MEMORY_TRACE_WIDTH]; - let memory_access = MemoryLookup::from_ints(MEMORY_WRITE_LABEL, 0, ZERO, 1, value1); + let memory_access = MemoryLookup::from_ints(MEMORY_WRITE_LABEL, 0, 0, 1, value1); prev_row = verify_memory_access(&trace, &chiplets_bus, 0, MEMORY_WRITE, &memory_access, prev_row); - let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, ZERO, 9, value1); + let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, 0, 9, value1); prev_row = verify_memory_access(&trace, &chiplets_bus, 1, MEMORY_COPY_READ, &memory_access, prev_row); // ctx = 3, addr = 0 - let memory_access = MemoryLookup::from_ints(MEMORY_WRITE_LABEL, 3, ZERO, 7, value3); + let memory_access = MemoryLookup::from_ints(MEMORY_WRITE_LABEL, 3, 0, 7, value3); prev_row = verify_memory_access(&trace, &chiplets_bus, 2, MEMORY_WRITE, &memory_access, prev_row); // ctx = 3, addr = 1 - let memory_access = MemoryLookup::from_ints(MEMORY_WRITE_LABEL, 3, ONE, 4, value2); + let memory_access = MemoryLookup::from_ints(MEMORY_WRITE_LABEL, 3, 1, 4, value2); prev_row = verify_memory_access(&trace, &chiplets_bus, 3, MEMORY_WRITE, &memory_access, prev_row); - let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 3, ONE, 6, value2); + let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 3, 1, 6, value2); verify_memory_access(&trace, &chiplets_bus, 4, MEMORY_COPY_READ, &memory_access, prev_row); } @@ -282,17 +281,17 @@ fn mem_get_state_at() { // Write 1 into (ctx = 0, addr = 5) at clk = 1. // This means that mem[5] = 1 at the beginning of clk = 2 let value1 = [ONE, ZERO, ZERO, ZERO]; - mem.write(0, Felt::new(5), 1, value1); + mem.write(0, 5, 1, value1); // Write 4 into (ctx = 0, addr = 2) at clk = 2. // This means that mem[2] = 4 at the beginning of clk = 3 let value4 = [Felt::new(4), ZERO, ZERO, ZERO]; - mem.write(0, Felt::new(2), 2, value4); + mem.write(0, 2, 2, value4); // write 7 into (ctx = 3, addr = 3) at clk = 4 // This means that mem[3] = 7 at the beginning of clk = 4 let value7 = [Felt::new(7), ZERO, ZERO, ZERO]; - mem.write(3, Felt::new(3), 4, value7); + mem.write(3, 3, 4, value7); // Check memory state at clk = 2 assert_eq!(mem.get_state_at(0, 2), vec![(5, value1)]); @@ -350,7 +349,7 @@ fn build_trace_row( row[0] = op_selectors[0]; row[1] = op_selectors[1]; row[CTX_COL_IDX] = ctx; - row[ADDR_COL_IDX] = addr; + row[ADDR_COL_IDX] = Felt::from(addr); row[CLK_COL_IDX] = clk; row[V_COL_RANGE.start] = new_val[0]; row[V_COL_RANGE.start + 1] = new_val[1]; diff --git a/processor/src/chiplets/mod.rs b/processor/src/chiplets/mod.rs index e81b04c329..df6231b728 100644 --- a/processor/src/chiplets/mod.rs +++ b/processor/src/chiplets/mod.rs @@ -348,7 +348,7 @@ impl Chiplets { /// /// If the specified address hasn't been previously written to, four ZERO elements are /// returned. This effectively implies that memory is initialized to ZERO. - pub fn read_mem(&mut self, ctx: u32, addr: Felt) -> Word { + pub fn read_mem(&mut self, ctx: u32, addr: u32) -> Word { // read the word from memory let value = self.memory.read(ctx, addr, self.clk); @@ -364,9 +364,9 @@ impl Chiplets { /// /// If either of the accessed addresses hasn't been previously written to, ZERO elements are /// returned. This effectively implies that memory is initialized to ZERO. - pub fn read_mem_double(&mut self, ctx: u32, addr: Felt) -> [Word; 2] { + pub fn read_mem_double(&mut self, ctx: u32, addr: u32) -> [Word; 2] { // read two words from memory: from addr and from addr + 1 - let addr2 = addr + ONE; + let addr2 = addr + 1; let words = [self.memory.read(ctx, addr, self.clk), self.memory.read(ctx, addr2, self.clk)]; // create lookups for both memory reads @@ -383,7 +383,7 @@ impl Chiplets { /// Writes the provided word at the specified context/address. /// /// This also modifies the memory access trace and sends a memory lookup request to the bus. - pub fn write_mem(&mut self, ctx: u32, addr: Felt, word: Word) { + pub fn write_mem(&mut self, ctx: u32, addr: u32, word: Word) { self.memory.write(ctx, addr, self.clk, word); // send the memory write request to the bus @@ -395,8 +395,8 @@ impl Chiplets { /// elements of the word previously stored at that address unchanged. /// /// This also modifies the memory access trace and sends a memory lookup request to the bus. - pub fn write_mem_element(&mut self, ctx: u32, addr: Felt, value: Felt) -> Word { - let old_word = self.memory.get_old_value(ctx, addr.as_int()); + pub fn write_mem_element(&mut self, ctx: u32, addr: u32, value: Felt) -> Word { + let old_word = self.memory.get_old_value(ctx, addr); let new_word = [value, old_word[1], old_word[2], old_word[3]]; self.memory.write(ctx, addr, self.clk, new_word); @@ -412,8 +412,8 @@ impl Chiplets { /// context, starting at the specified address. /// /// This also modifies the memory access trace and sends two memory lookup requests to the bus. - pub fn write_mem_double(&mut self, ctx: u32, addr: Felt, words: [Word; 2]) { - let addr2 = addr + ONE; + pub fn write_mem_double(&mut self, ctx: u32, addr: u32, words: [Word; 2]) { + let addr2 = addr + 1; // write two words to memory at addr and addr + 1 self.memory.write(ctx, addr, self.clk, words[0]); self.memory.write(ctx, addr2, self.clk, words[1]); @@ -434,7 +434,7 @@ impl Chiplets { /// Unlike mem_read() which modifies the memory access trace, this method returns the value at /// the specified address (if one exists) without altering the memory access trace. pub fn get_mem_value(&self, ctx: u32, addr: u32) -> Option { - self.memory.get_value(ctx, addr as u64) + self.memory.get_value(ctx, addr) } /// Returns the entire memory state for the specified execution context at the specified cycle. diff --git a/processor/src/operations/io_ops.rs b/processor/src/operations/io_ops.rs index b6db128569..c56ceb95c1 100644 --- a/processor/src/operations/io_ops.rs +++ b/processor/src/operations/io_ops.rs @@ -1,9 +1,6 @@ -use super::{AdviceProvider, ExecutionError, Felt, Operation, Process}; - -// CONSTANTS -// ================================================================================================ +use vm_core::StarkField; -const TWO: Felt = Felt::new(2); +use super::{AdviceProvider, ExecutionError, Felt, Operation, Process}; // INPUT / OUTPUT OPERATIONS // ================================================================================================ @@ -40,7 +37,7 @@ where pub(super) fn op_mloadw(&mut self) -> Result<(), ExecutionError> { // get the address from the stack and read the word from current memory context let ctx = self.system.ctx(); - let addr = self.stack.get(0); + let addr = Self::get_valid_address(self.stack.get(0))?; let word = self.chiplets.read_mem(ctx, addr); // reverse the order of the memory word & update the stack state @@ -67,7 +64,7 @@ where pub(super) fn op_mload(&mut self) -> Result<(), ExecutionError> { // get the address from the stack and read the word from memory let ctx = self.system.ctx(); - let addr = self.stack.get(0); + let addr = Self::get_valid_address(self.stack.get(0))?; let mut word = self.chiplets.read_mem(ctx, addr); // put the retrieved word into stack order word.reverse(); @@ -95,7 +92,7 @@ where pub(super) fn op_mstream(&mut self) -> Result<(), ExecutionError> { // get the address from position 12 on the stack let ctx = self.system.ctx(); - let addr = self.stack.get(12); + let addr = Self::get_valid_address(self.stack.get(12))?; // load two words from memory let words = self.chiplets.read_mem_double(ctx, addr); @@ -112,7 +109,7 @@ where } // increment the address by 2 - self.stack.set(12, addr + TWO); + self.stack.set(12, Felt::from(addr + 2)); // copy over the rest of the stack self.stack.copy_state(13); @@ -131,7 +128,7 @@ where pub(super) fn op_mstorew(&mut self) -> Result<(), ExecutionError> { // get the address from the stack and build the word to be saved from the stack values let ctx = self.system.ctx(); - let addr = self.stack.get(0); + let addr = Self::get_valid_address(self.stack.get(0))?; // build the word in memory order (reverse of stack order) let word = [self.stack.get(4), self.stack.get(3), self.stack.get(2), self.stack.get(1)]; @@ -164,7 +161,7 @@ where pub(super) fn op_mstore(&mut self) -> Result<(), ExecutionError> { // get the address and the value from the stack let ctx = self.system.ctx(); - let addr = self.stack.get(0); + let addr = Self::get_valid_address(self.stack.get(0))?; let value = self.stack.get(1); // write the value to the memory and get the previous word @@ -194,7 +191,7 @@ where pub(super) fn op_pipe(&mut self) -> Result<(), ExecutionError> { // get the address from position 12 on the stack let ctx = self.system.ctx(); - let addr = self.stack.get(12); + let addr = Self::get_valid_address(self.stack.get(12))?; // pop two words from the advice stack let words = self.advice_provider.pop_stack_dword()?; @@ -214,7 +211,7 @@ where } // increment the address by 2 - self.stack.set(12, addr + TWO); + self.stack.set(12, Felt::from(addr + 2)); // copy over the rest of the stack self.stack.copy_state(13); @@ -252,6 +249,21 @@ where Ok(()) } + + // HELPER FUNCTIONS + // -------------------------------------------------------------------------------------------- + + /// Checks that provided address is less than u32::MAX and returns it cast to u32. + /// + /// # Errors + /// Returns an error if the provided address is greater than u32::MAX. + fn get_valid_address(addr: Felt) -> Result { + let addr = addr.as_int(); + if addr > u32::MAX as u64 { + return Err(ExecutionError::MemoryAddressOutOfBounds(addr)); + } + Ok(addr as u32) + } } // TESTS @@ -322,7 +334,11 @@ mod tests { assert_eq!(1, process.chiplets.get_mem_size()); assert_eq!(word, process.chiplets.get_mem_value(0, 1).unwrap()); - // --- calling LOADW with a stack of minimum depth is ok ---------------- + // --- calling MLOADW with address greater than u32::MAX leads to an error ---------------- + process.execute_op(Operation::Push(Felt::from(u64::MAX / 2))).unwrap(); + assert!(process.execute_op(Operation::MLoadW).is_err()); + + // --- calling MLOADW with a stack of minimum depth is ok ---------------- let mut process = Process::new_dummy_with_decoder_helpers_and_empty_stack(); assert!(process.execute_op(Operation::MLoadW).is_ok()); } @@ -347,6 +363,10 @@ mod tests { assert_eq!(1, process.chiplets.get_mem_size()); assert_eq!(word, process.chiplets.get_mem_value(0, 2).unwrap()); + // --- calling MLOAD with address greater than u32::MAX leads to an error ----------------- + process.execute_op(Operation::Push(Felt::from(u64::MAX / 2))).unwrap(); + assert!(process.execute_op(Operation::MLoad).is_err()); + // --- calling MLOAD with a stack of minimum depth is ok ---------------- let mut process = Process::new_dummy_with_decoder_helpers_and_empty_stack(); assert!(process.execute_op(Operation::MLoad).is_ok()); @@ -428,6 +448,10 @@ mod tests { assert_eq!(word1, process.chiplets.get_mem_value(0, 0).unwrap()); assert_eq!(word2, process.chiplets.get_mem_value(0, 3).unwrap()); + // --- calling MSTOREW with address greater than u32::MAX leads to an error ---------------- + process.execute_op(Operation::Push(Felt::from(u64::MAX / 2))).unwrap(); + assert!(process.execute_op(Operation::MStoreW).is_err()); + // --- calling STOREW with a stack of minimum depth is ok ---------------- let mut process = Process::new_dummy_with_decoder_helpers_and_empty_stack(); assert!(process.execute_op(Operation::MStoreW).is_ok()); @@ -469,6 +493,10 @@ mod tests { assert_eq!(2, process.chiplets.get_mem_size()); assert_eq!(mem_2, process.chiplets.get_mem_value(0, 2).unwrap()); + // --- calling MSTORE with address greater than u32::MAX leads to an error ---------------- + process.execute_op(Operation::Push(Felt::from(u64::MAX / 2))).unwrap(); + assert!(process.execute_op(Operation::MStore).is_err()); + // --- calling MSTORE with a stack of minimum depth is ok ---------------- let mut process = Process::new_dummy_with_decoder_helpers_and_empty_stack(); assert!(process.execute_op(Operation::MStore).is_ok()); From 1170394af88c65cd3c1902fb1cd67dd67deff8a9 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Tue, 29 Aug 2023 17:38:18 -0700 Subject: [PATCH 069/120] refactor: rename smtinsert advice injector into smtset --- assembly/src/ast/nodes/advice.rs | 12 ++++++------ assembly/src/ast/parsers/adv_ops.rs | 4 ++-- core/src/operations/decorators/advice.rs | 4 ++-- docs/src/user_docs/assembly/io_operations.md | 2 +- processor/src/decorators/adv_stack_injectors.rs | 2 +- processor/src/decorators/mod.rs | 2 +- processor/src/decorators/tests.rs | 10 ++++------ stdlib/asm/collections/smt.masm | 6 +++--- 8 files changed, 20 insertions(+), 22 deletions(-) diff --git a/assembly/src/ast/nodes/advice.rs b/assembly/src/ast/nodes/advice.rs index 9ea83d4aad..510c8eda03 100644 --- a/assembly/src/ast/nodes/advice.rs +++ b/assembly/src/ast/nodes/advice.rs @@ -18,7 +18,7 @@ pub enum AdviceInjectorNode { PushU64div, PushExt2intt, PushSmtGet, - PushSmtInsert, + PushSmtSet, PushMapVal, PushMapValImm { offset: u8 }, PushMapValN, @@ -37,7 +37,7 @@ impl From<&AdviceInjectorNode> for AdviceInjector { PushU64div => Self::DivU64, PushExt2intt => Self::Ext2Intt, PushSmtGet => Self::SmtGet, - PushSmtInsert => Self::SmtInsert, + PushSmtSet => Self::SmtSet, PushMapVal => Self::MapValueToStack { include_len: false, key_offset: 0, @@ -72,7 +72,7 @@ impl fmt::Display for AdviceInjectorNode { PushU64div => write!(f, "push_u64div"), PushExt2intt => write!(f, "push_ext2intt"), PushSmtGet => write!(f, "push_smtget"), - PushSmtInsert => write!(f, "push_smtinsert"), + PushSmtSet => write!(f, "push_smtset"), PushMapVal => write!(f, "push_mapval"), PushMapValImm { offset } => write!(f, "push_mapval.{offset}"), PushMapValN => write!(f, "push_mapvaln"), @@ -92,7 +92,7 @@ impl fmt::Display for AdviceInjectorNode { const PUSH_U64DIV: u8 = 0; const PUSH_EXT2INTT: u8 = 1; const PUSH_SMTGET: u8 = 2; -const PUSH_SMTINSERT: u8 = 3; +const PUSH_SMTSET: u8 = 3; const PUSH_MAPVAL: u8 = 4; const PUSH_MAPVAL_IMM: u8 = 5; const PUSH_MAPVALN: u8 = 6; @@ -110,7 +110,7 @@ impl Serializable for AdviceInjectorNode { PushU64div => target.write_u8(PUSH_U64DIV), PushExt2intt => target.write_u8(PUSH_EXT2INTT), PushSmtGet => target.write_u8(PUSH_SMTGET), - PushSmtInsert => target.write_u8(PUSH_SMTINSERT), + PushSmtSet => target.write_u8(PUSH_SMTSET), PushMapVal => target.write_u8(PUSH_MAPVAL), PushMapValImm { offset } => { target.write_u8(PUSH_MAPVAL_IMM); @@ -139,7 +139,7 @@ impl Deserializable for AdviceInjectorNode { PUSH_U64DIV => Ok(AdviceInjectorNode::PushU64div), PUSH_EXT2INTT => Ok(AdviceInjectorNode::PushExt2intt), PUSH_SMTGET => Ok(AdviceInjectorNode::PushSmtGet), - PUSH_SMTINSERT => Ok(AdviceInjectorNode::PushSmtInsert), + PUSH_SMTSET => Ok(AdviceInjectorNode::PushSmtSet), PUSH_MAPVAL => Ok(AdviceInjectorNode::PushMapVal), PUSH_MAPVAL_IMM => { let offset = source.read_u8()?; diff --git a/assembly/src/ast/parsers/adv_ops.rs b/assembly/src/ast/parsers/adv_ops.rs index c4688a9ac6..30d58e6e47 100644 --- a/assembly/src/ast/parsers/adv_ops.rs +++ b/assembly/src/ast/parsers/adv_ops.rs @@ -33,8 +33,8 @@ pub fn parse_adv_inject(op: &Token) -> Result { 2 => AdvInject(PushSmtGet), _ => return Err(ParsingError::extra_param(op)), }, - "push_smtinsert" => match op.num_parts() { - 2 => AdvInject(PushSmtInsert), + "push_smtset" => match op.num_parts() { + 2 => AdvInject(PushSmtSet), _ => return Err(ParsingError::extra_param(op)), }, "push_mapval" => match op.num_parts() { diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index ca2b12d6c5..3cbb429aaa 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -185,7 +185,7 @@ pub enum AdviceInjector { /// - (1, 0): depth 32 -> 48 /// - (1, 1): depth 16, 32, or 48 -> 64 /// - E_KEY and E_VALUE are the key-value pair for a leaf which is to be replaced by a subtree. - SmtInsert, + SmtSet, // ADVICE MAP INJECTORS // -------------------------------------------------------------------------------------------- @@ -253,7 +253,7 @@ impl fmt::Display for AdviceInjector { Self::Ext2Inv => write!(f, "ext2_inv"), Self::Ext2Intt => write!(f, "ext2_intt"), Self::SmtGet => write!(f, "smt_get"), - Self::SmtInsert => write!(f, "smt_insert"), + Self::SmtSet => write!(f, "smt_set"), Self::MemToMap => write!(f, "mem_to_map"), Self::HdwordToMap { domain } => write!(f, "hdword_to_map.{domain}"), Self::HpermToMap => write!(f, "hperm_to_map"), diff --git a/docs/src/user_docs/assembly/io_operations.md b/docs/src/user_docs/assembly/io_operations.md index 053c34a509..1fde53a1ff 100644 --- a/docs/src/user_docs/assembly/io_operations.md +++ b/docs/src/user_docs/assembly/io_operations.md @@ -53,7 +53,7 @@ Advice injectors fall into two categories: (1) injectors which push new data ont | adv.push_u64div | [b1, b0, a1, a0, ...] | [b1, b0, a1, a0, ...] | Pushes the result of `u64` division $a / b$ onto the advice stack. Both $a$ and $b$ are represented using 32-bit limbs. The result consists of both the quotient and the remainder. | | adv.push_ext2intt | [osize, isize, iptr, ... ] | [osize, isize, iptr, ... ] | Given evaluations of a polynomial over some specified domain, interpolates the evaluations into a polynomial in coefficient form and pushes the result into the advice stack. | | adv.smt_get | [K, R, ... ] | [K, R, ... ] | Pushes values onto the advice stack which are required for successful retrieval of a value under the key $K$ from a Sparse Merkle Tree with root $R$. | -| adv.smt_insert | [V, K, R, ...] | [V, K, R, ...] | Pushes values onto the advice stack which are required for successful insertion of a key-value pair $(K, V)$ into a Sparse Merkle Tree with root $R$. | +| adv.smt_set | [V, K, R, ...] | [V, K, R, ...] | Pushes values onto the advice stack which are required for successful insertion of a key-value pair $(K, V)$ into a Sparse Merkle Tree with root $R$. | | adv.insert_mem | [K, a, b, ... ] | [K, a, b, ... ] | Reads words $data \leftarrow mem[a] .. mem[b]$ from memory, and save the data into $advice\_map[K] \leftarrow data$. | | adv.insert_hdword
      adv.insert_hdword.*d* | [B, A, ... ] | [B, A, ... ] | Reads top two words from the stack, computes a key as $K \leftarrow hash(A || b, d)$, and saves the data into $advice\_map[K] \leftarrow [A, B]$. $d$ is an optional domain value which can be between $0$ and $255$, default value $0$. | | adv.insert_hperm | [B, A, C, ...] | [B, A, C, ...] | Reads top three words from the stack, computes a key as $K \leftarrow permute(C, A, B).digest$, and saves data into $advice\_mpa[K] \leftarrow [A, B]$. | diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors.rs index f11195d00e..b3c146cc65 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors.rs @@ -370,7 +370,7 @@ where /// /// # Panics /// Will panic as unimplemented if the target depth is `64`. - pub(super) fn push_smtinsert_inputs(&mut self) -> Result<(), ExecutionError> { + pub(super) fn push_smtset_inputs(&mut self) -> Result<(), ExecutionError> { // get the key, value, and tree root from the stack let value = self.stack.get_word(0); let key = self.stack.get_word(1); diff --git a/processor/src/decorators/mod.rs b/processor/src/decorators/mod.rs index a4e601e438..060f47173c 100644 --- a/processor/src/decorators/mod.rs +++ b/processor/src/decorators/mod.rs @@ -45,7 +45,7 @@ where AdviceInjector::Ext2Inv => self.push_ext2_inv_result(), AdviceInjector::Ext2Intt => self.push_ext2_intt_result(), AdviceInjector::SmtGet => self.push_smtget_inputs(), - AdviceInjector::SmtInsert => self.push_smtinsert_inputs(), + AdviceInjector::SmtSet => self.push_smtset_inputs(), AdviceInjector::MemToMap => self.insert_mem_values_into_adv_map(), AdviceInjector::HdwordToMap { domain } => self.insert_hdword_into_adv_map(*domain), AdviceInjector::HpermToMap => self.insert_hperm_into_adv_map(), diff --git a/processor/src/decorators/tests.rs b/processor/src/decorators/tests.rs index 6cccdd8eb5..2958e0679f 100644 --- a/processor/src/decorators/tests.rs +++ b/processor/src/decorators/tests.rs @@ -160,7 +160,7 @@ fn inject_smtinsert() { let is_16_or_32 = ONE; let is_16_or_48 = ONE; let expected_stack = [is_update, is_simple_insert, is_16_or_32, is_16_or_48]; - let process = prepare_smt_insert(key_a, val_a, &smt, expected_stack.len(), Vec::new()); + let process = prepare_smt_set(key_a, val_a, &smt, expected_stack.len(), Vec::new()); assert_eq!(build_expected(&expected_stack), process.stack.trace_state()); // --- update same key with different value ------------------------------- @@ -186,11 +186,11 @@ fn inject_smtinsert() { ZERO, ]; let adv_map = vec![build_adv_map_entry(key_a, val_a, 16)]; - let process = prepare_smt_insert(key_a, val_b, &smt, expected_stack.len(), adv_map); + let process = prepare_smt_set(key_a, val_b, &smt, expected_stack.len(), adv_map); assert_eq!(build_expected(&expected_stack), process.stack.trace_state()); } -fn prepare_smt_insert( +fn prepare_smt_set( key: Word, value: Word, smt: &TieredSmt, @@ -205,9 +205,7 @@ fn prepare_smt_insert( let mut process = build_process(stack_inputs, advice_inputs); process.execute_op(Operation::Noop).unwrap(); - process - .execute_decorator(&Decorator::Advice(AdviceInjector::SmtInsert)) - .unwrap(); + process.execute_decorator(&Decorator::Advice(AdviceInjector::SmtSet)).unwrap(); move_adv_to_stack(&mut process, adv_stack_depth); diff --git a/stdlib/asm/collections/smt.masm b/stdlib/asm/collections/smt.masm index 72b95b156b..9bb402e426 100644 --- a/stdlib/asm/collections/smt.masm +++ b/stdlib/asm/collections/smt.masm @@ -1151,7 +1151,7 @@ export.insert # arrange the data needed for the insert procedure on the advice stack and move the # first 4 flags onto the operand stack; meaning of the flags f0, f1, and f2 depends # on what type of insert is being executed (4 cycles) - adv.push_smtinsert adv_push.4 + adv.push_smtset adv_push.4 # => [is_update, f0, f1, f2, V, K, R, ...] # execute the actual insert procedure @@ -1362,7 +1362,7 @@ proc.delete # => [V_old, R_new, R_new, K, R, ...] # prepare the stack for TSMT insert operation (9 cycles) - swapw.3 dupw.3 adv.push_smtinsert adv_push.4 + swapw.3 dupw.3 adv.push_smtset adv_push.4 # => [f0, f1, f2, f3, V_old, K, R_new, R_new, V_old, R, ...] # insert key-pair (K, V_old) into TSMT with root R_new - i.e., insert the key-value pair @@ -1416,7 +1416,7 @@ export.set # arrange the data needed for the update procedure on the advice stack and move the first # 4 flags onto the operand stack; meaning of the flags f0, f1, f2, and f3 depends on what # type of update is being executed (4 cycles) - adv.push_smtinsert adv_push.4 + adv.push_smtset adv_push.4 # => [f0, f1, f2, f3, V, K, R, ...] # determine if the value is an empty word (15 cycles) From ed012cced86581a4bc7dead54176a2928e9fd7ea Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Tue, 29 Aug 2023 21:24:18 -0700 Subject: [PATCH 070/120] feat: implement adv.push_smtpeek decorator --- CHANGELOG.md | 1 + assembly/src/ast/nodes/advice.rs | 24 ++-- assembly/src/ast/parsers/adv_ops.rs | 4 + core/src/operations/decorators/advice.rs | 16 +++ docs/src/user_docs/assembly/io_operations.md | 3 +- docs/src/user_docs/stdlib/collections.md | 40 +++++-- .../src/decorators/adv_stack_injectors.rs | 113 +++++++++++++----- processor/src/decorators/mod.rs | 1 + processor/src/decorators/tests.rs | 71 +++++++++-- 9 files changed, 214 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df133e26f1..187d3f4442 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Added support for the arithmetic expressions in constant values (#1026). - Added support for module aliases (#1037). - Added `adv.insert_hperm` decorator (#1042). +- Added `adv.push_smtpeek` decorator (#1056). #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). diff --git a/assembly/src/ast/nodes/advice.rs b/assembly/src/ast/nodes/advice.rs index 510c8eda03..a95507ffb4 100644 --- a/assembly/src/ast/nodes/advice.rs +++ b/assembly/src/ast/nodes/advice.rs @@ -19,6 +19,7 @@ pub enum AdviceInjectorNode { PushExt2intt, PushSmtGet, PushSmtSet, + PushSmtPeek, PushMapVal, PushMapValImm { offset: u8 }, PushMapValN, @@ -38,6 +39,7 @@ impl From<&AdviceInjectorNode> for AdviceInjector { PushExt2intt => Self::Ext2Intt, PushSmtGet => Self::SmtGet, PushSmtSet => Self::SmtSet, + PushSmtPeek => Self::SmtPeek, PushMapVal => Self::MapValueToStack { include_len: false, key_offset: 0, @@ -73,6 +75,7 @@ impl fmt::Display for AdviceInjectorNode { PushExt2intt => write!(f, "push_ext2intt"), PushSmtGet => write!(f, "push_smtget"), PushSmtSet => write!(f, "push_smtset"), + PushSmtPeek => write!(f, "push_smtpeek"), PushMapVal => write!(f, "push_mapval"), PushMapValImm { offset } => write!(f, "push_mapval.{offset}"), PushMapValN => write!(f, "push_mapvaln"), @@ -93,15 +96,16 @@ const PUSH_U64DIV: u8 = 0; const PUSH_EXT2INTT: u8 = 1; const PUSH_SMTGET: u8 = 2; const PUSH_SMTSET: u8 = 3; -const PUSH_MAPVAL: u8 = 4; -const PUSH_MAPVAL_IMM: u8 = 5; -const PUSH_MAPVALN: u8 = 6; -const PUSH_MAPVALN_IMM: u8 = 7; -const PUSH_MTNODE: u8 = 8; -const INSERT_MEM: u8 = 9; -const INSERT_HDWORD: u8 = 10; -const INSERT_HDWORD_IMM: u8 = 11; -const INSERT_HPERM: u8 = 12; +const PUSH_SMTPEEK: u8 = 4; +const PUSH_MAPVAL: u8 = 5; +const PUSH_MAPVAL_IMM: u8 = 6; +const PUSH_MAPVALN: u8 = 7; +const PUSH_MAPVALN_IMM: u8 = 8; +const PUSH_MTNODE: u8 = 9; +const INSERT_MEM: u8 = 10; +const INSERT_HDWORD: u8 = 11; +const INSERT_HDWORD_IMM: u8 = 12; +const INSERT_HPERM: u8 = 13; impl Serializable for AdviceInjectorNode { fn write_into(&self, target: &mut W) { @@ -111,6 +115,7 @@ impl Serializable for AdviceInjectorNode { PushExt2intt => target.write_u8(PUSH_EXT2INTT), PushSmtGet => target.write_u8(PUSH_SMTGET), PushSmtSet => target.write_u8(PUSH_SMTSET), + PushSmtPeek => target.write_u8(PUSH_SMTPEEK), PushMapVal => target.write_u8(PUSH_MAPVAL), PushMapValImm { offset } => { target.write_u8(PUSH_MAPVAL_IMM); @@ -140,6 +145,7 @@ impl Deserializable for AdviceInjectorNode { PUSH_EXT2INTT => Ok(AdviceInjectorNode::PushExt2intt), PUSH_SMTGET => Ok(AdviceInjectorNode::PushSmtGet), PUSH_SMTSET => Ok(AdviceInjectorNode::PushSmtSet), + PUSH_SMTPEEK => Ok(AdviceInjectorNode::PushSmtPeek), PUSH_MAPVAL => Ok(AdviceInjectorNode::PushMapVal), PUSH_MAPVAL_IMM => { let offset = source.read_u8()?; diff --git a/assembly/src/ast/parsers/adv_ops.rs b/assembly/src/ast/parsers/adv_ops.rs index 30d58e6e47..3813d929ed 100644 --- a/assembly/src/ast/parsers/adv_ops.rs +++ b/assembly/src/ast/parsers/adv_ops.rs @@ -37,6 +37,10 @@ pub fn parse_adv_inject(op: &Token) -> Result { 2 => AdvInject(PushSmtSet), _ => return Err(ParsingError::extra_param(op)), }, + "push_smtpeek" => match op.num_parts() { + 2 => AdvInject(PushSmtPeek), + _ => return Err(ParsingError::extra_param(op)), + }, "push_mapval" => match op.num_parts() { 2 => AdvInject(PushMapVal), 3 => { diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index 3cbb429aaa..af90f1d4c1 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -187,6 +187,21 @@ pub enum AdviceInjector { /// - E_KEY and E_VALUE are the key-value pair for a leaf which is to be replaced by a subtree. SmtSet, + /// Pushes onto the advice stack the value associated with the specified key in a Sparse + /// Merkle Tree defined by the specified root. + /// + /// If no value was previously associated with the specified key, [ZERO; 4] is pushed onto + /// the advice stack. + /// + /// Inputs: + /// Operand stack: [KEY, ROOT, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [KEY, ROOT, ...] + /// Advice stack: [VALUE, ...] + SmtPeek, + // ADVICE MAP INJECTORS // -------------------------------------------------------------------------------------------- /// Reads words from memory at the specified range and inserts them into the advice map under @@ -254,6 +269,7 @@ impl fmt::Display for AdviceInjector { Self::Ext2Intt => write!(f, "ext2_intt"), Self::SmtGet => write!(f, "smt_get"), Self::SmtSet => write!(f, "smt_set"), + Self::SmtPeek => write!(f, "smt_peek"), Self::MemToMap => write!(f, "mem_to_map"), Self::HdwordToMap { domain } => write!(f, "hdword_to_map.{domain}"), Self::HpermToMap => write!(f, "hperm_to_map"), diff --git a/docs/src/user_docs/assembly/io_operations.md b/docs/src/user_docs/assembly/io_operations.md index 1fde53a1ff..e7b01c6623 100644 --- a/docs/src/user_docs/assembly/io_operations.md +++ b/docs/src/user_docs/assembly/io_operations.md @@ -52,8 +52,9 @@ Advice injectors fall into two categories: (1) injectors which push new data ont | adv.push_mtnode | [d, i, R, ... ] | [d, i, R, ... ] | Pushes a node of a Merkle tree with root $R$ at depth $d$ and index $i$ from Merkle store onto the advice stack. | | adv.push_u64div | [b1, b0, a1, a0, ...] | [b1, b0, a1, a0, ...] | Pushes the result of `u64` division $a / b$ onto the advice stack. Both $a$ and $b$ are represented using 32-bit limbs. The result consists of both the quotient and the remainder. | | adv.push_ext2intt | [osize, isize, iptr, ... ] | [osize, isize, iptr, ... ] | Given evaluations of a polynomial over some specified domain, interpolates the evaluations into a polynomial in coefficient form and pushes the result into the advice stack. | -| adv.smt_get | [K, R, ... ] | [K, R, ... ] | Pushes values onto the advice stack which are required for successful retrieval of a value under the key $K$ from a Sparse Merkle Tree with root $R$. | +| adv.smt_get | [K, R, ... ] | [K, R, ... ] | Pushes values onto the advice stack which are required for successful retrieval of a value under the key $K$ from a Sparse Merkle Tree with root $R$. | | adv.smt_set | [V, K, R, ...] | [V, K, R, ...] | Pushes values onto the advice stack which are required for successful insertion of a key-value pair $(K, V)$ into a Sparse Merkle Tree with root $R$. | +| adv.smt_peek | [K, R, ... ] | [K, R, ... ] | Pushes value onto the advice stack which is associated with key $K$ in a Sparse Merkle Tree with root $R$. | | adv.insert_mem | [K, a, b, ... ] | [K, a, b, ... ] | Reads words $data \leftarrow mem[a] .. mem[b]$ from memory, and save the data into $advice\_map[K] \leftarrow data$. | | adv.insert_hdword
      adv.insert_hdword.*d* | [B, A, ... ] | [B, A, ... ] | Reads top two words from the stack, computes a key as $K \leftarrow hash(A || b, d)$, and saves the data into $advice\_map[K] \leftarrow [A, B]$. $d$ is an optional domain value which can be between $0$ and $255$, default value $0$. | | adv.insert_hperm | [B, A, C, ...] | [B, A, C, ...] | Reads top three words from the stack, computes a key as $K \leftarrow permute(C, A, B).digest$, and saves data into $advice\_mpa[K] \leftarrow [A, B]$. | diff --git a/docs/src/user_docs/stdlib/collections.md b/docs/src/user_docs/stdlib/collections.md index fa21e90343..3dfcabc4c3 100644 --- a/docs/src/user_docs/stdlib/collections.md +++ b/docs/src/user_docs/stdlib/collections.md @@ -1,22 +1,42 @@ # Collections -Namespace `std::collections` contains modules for commonly authenticated data structures. +Namespace `std::collections` contains modules for commonly-used authenticated data structures. This includes: + +- A Merkle Mountain range. +- A Sparse Merkle Tree with 64-bit keys. +- A Sparse Merkle Tree with 256-bit keys. ## Merkle Mountain Range Module `std::collections::mmr` contains procedures for manipulating [Merkle Mountain Range](https://github.com/opentimestamps/opentimestamps-server/blob/master/doc/merkle-mountain-range.md) data structure which can be used as an append-only log. -| Procedure | Description | +The following procedures are available to read data from and make updates to a Merkle Mountain Range. + +| Procedure | Description | | ----------- | ------------- | -| get | Loads the leaf at the absolute `pos` in the MMR onto the stack.

      Valid range for `pos` is between $0$ and $2^{32} - 1$ (both inclusive).

      Inputs:
      - Operand stack: [pos, mmr_ptr, ...]

      Output:
      - Operand stack: [N, ...]

      Where `N` is the leaf loaded from the MMR whose memory location starts at `mmr_ptr`. | -| add | Adds a new leaf to the MMR.

      This will update the MMR peaks in the VM's memory and the advice provider with any merged nodes.

      Inputs:
      - Operand stack: [N, mmr_ptr, ...]

      Outputs:
      - Operand stack: [...]

      Where `N` is the leaf added to the MMR whose memory locations starts at `mmr_ptr`. | -| pack | Computes the hash of the given MMR and copies it to the Advice Map using its hash as a key.

      Inputs:
      - Operand stack: [mmr_ptr, ...]

      Outputs:
      - Operand stack: [HASH, ...]

      | -| unpack | Load the MMR peak data based on its hash.

      Inputs:
      - Operand stack: [HASH, mmr_ptr, ...]

      Outputs:
      - Operand stack: [...]

      Where:
      - `HASH`: is the MMR peak hash, the hash is expected to be padded to an even length and to have a minimum size of 16 elements.
      - The advice map must contain a key with `HASH`, and its value is `num_leaves \|\| hash_data`, and hash_data is the data used to computed `HASH`
      - `mmt_ptr`: the memory location where the MMR data will be written, starting with the MMR forest (the total count of its leaves) followed by its peaks. | +| get | Loads the leaf at the absolute position `pos` in the MMR onto the stack.

      Valid range for `pos` is between $0$ and $2^{32} - 1$ (both inclusive).

      Inputs: `[pos, mmr_ptr, ...]`
      Output: `[N, ...]`

      Where `N` is the leaf loaded from the MMR whose memory location starts at `mmr_ptr`. | +| add | Adds a new leaf to the MMR.

      This will update the MMR peaks in the VM's memory and the advice provider with any merged nodes.

      Inputs: `[N, mmr_ptr, ...]`
      Outputs: `[...]`

      Where `N` is the leaf added to the MMR whose memory locations starts at `mmr_ptr`. | +| pack | Computes a commitment to the given MMR and copies the MMR to the Advice Map using the commitment as a key.

      Inputs: `[mmr_ptr, ...]`
      Outputs: `[HASH, ...]`

      | +| unpack | Load the MMR peak data based on its hash.

      Inputs: `[HASH, mmr_ptr, ...]`
      Outputs: `[...]`

      Where:
      - `HASH`: is the MMR peak hash, the hash is expected to be padded to an even length and to have a minimum size of 16 elements.
      - The advice map must contain a key with `HASH`, and its value is `num_leaves \|\| hash_data`, and hash_data is the data used to computed `HASH`
      - `mmt_ptr`: the memory location where the MMR data will be written, starting with the MMR forest (the total count of its leaves) followed by its peaks. | ## Sparse Merkle Tree (64) Module `std::collections::smt64` contains procedures for manipulating key-value maps with single-element keys and 4-element values. The current implementation is a thin wrapper over a simple Sparse Merkle Tree of depth 64. In the future, this will be replaced with a compact Sparse Merkle Tree implementation. -| Procedure | Description | +The following procedures are available to read data from and make updates to a Sparse Merkle Tree. + +| Procedure | Description | +| ----------- | ------------- | +| get | Returns the value located under the specified key in the Sparse Merkle Tree defined by the specified root.

      If no values had been previously inserted under the specified key, an empty word is returned.

      Inputs: `[key, ROOT, ...]`
      Outputs: `[VALUE, ROOT, ...]`

      Fails if the tree with the specified root does not exist in the VM's advice provider. | +| set | Inserts the specified value under the specified key in a Sparse Merkle Tree defined by the specified root. If the insert is successful, the old value located under the specified key is returned via the stack.

      If `VALUE` is an empty word, the new state of the tree is guaranteed to be equivalent to the state as if the updated value was never inserted.

      Inputs: `[VALUE, key, ROOT, ...]`
      Outputs: `[OLD_VALUE, NEW_ROOT, ...]`

      Fails if the tree with the specified root does not exits in the VM's advice provider. | +| insert | Inserts the specified value under the specified key in a Sparse Merkle Tree defined by the specified root. If the insert is successful, the old value located under the specified key is returned via the stack.

      This procedure requires that `VALUE` be a non-empty word.

      Inputs: `[VALUE, key, ROOT, ...]`
      Outputs: `[OLD_VALUE, NEW_ROOT, ...]`

      Fails if:
      - The tree with the specified root does not exits in the VM's advice provider.
      - The provided value is an empty word. | + +## Sparse Merkle Tree (256) + +Module `std::collections::smt` contains procedures for manipulating key-value maps with 4-element keys and 4-element values. The underlying implementation is a Tiered (compacted) Sparse Merkle where leaves can exist only at specific depths called "tiers". These depths are: 16, 32, 48, and 64. Initially, when a tree is empty, it is equivalent to an empty Sparse Merkle Tree of depth 64 (i.e., leaves at depth 64 are set to [ZERO; 4]). As non-empty values are inserted into the tree, they are added to the first available tier. + +The following procedures are available to read data from and make updates to a Sparse Merkle Tree. + +| Procedure | Description | | ----------- | ------------- | -| get | Returns the value located under the specified key in the Sparse Merkle Tree defined by the specified root.

      If no values had been previously inserted under the specified key, an empty word (i.e., [ZERO; 4]) is returned.

      Inputs:
      - Operand stack: [key, ROOT, ...]

      Outputs:
      -Operand stack: [VALUE, ROOT, ...]

      Fails if the tree with the specified root does not exist in the VM's advice provider. | -| set | Inserts the specified value under the specified key in a Sparse Merkle Tree defined by the specified root. If the insert is successful, the old value located under the specified key is returned via the stack.

      If `VALUE` is an empty word (i.e., [ZERO; 4]), the new state of the tree is guaranteed to be equivalent to the state as if the updated value was never inserted.

      Inputs:
      - Operand stack: [VALUE, key, ROOT, ...]

      Outputs:
      - Operand stack: [OLD_VALUE, NEW_ROOT, ...]

      Fails if the tree with the specified root does not exits in the VM's advice provider. | -| insert | Inserts the specified value under the specified key in a Sparse Merkle Tree defined by the specified root. If the insert is successful, the old value located under the specified key is returned via the stack.

      This procedure requires that `VALUE` be a non-empty word (i.e., not [ZERO; 4]).

      Inputs:
      - Operand stack: [VALUE, key, ROOT, ...]

      Outputs:
      -Operand stack: [OLD_VALUE, NEW_ROOT, ...]

      Fails if:
      - The tree with the specified root does not exits in the VM's advice provider.
      - The provided value is an empty word. | +| get | Returns the value located under the specified key in the Sparse Merkle Tree defined by the specified root.

      If no values had been previously inserted under the specified key, an empty word is returned.

      Inputs: `[KEY, ROOT, ...]`
      Outputs: `[VALUE, ROOT, ...]`

      Fails if the tree with the specified root does not exist in the VM's advice provider. | +| set | Inserts the specified value under the specified key in a Sparse Merkle Tree defined by the specified root. If the insert is successful, the old value located under the specified key is returned via the stack.

      If `VALUE` is an empty word, the new state of the tree is guaranteed to be equivalent to the state as if the updated value was never inserted.

      Inputs: `[VALUE, KEY, ROOT, ...]`
      Outputs: `[OLD_VALUE, NEW_ROOT, ...]`

      Fails if the tree with the specified root does not exits in the VM's advice provider. | +| insert | Inserts the specified value under the specified key in a Sparse Merkle Tree defined by the specified root. If the insert is successful, the old value located under the specified key is returned via the stack.

      This procedure requires that `VALUE` be a non-empty word.

      Inputs: `[VALUE, KEY, ROOT, ...]`
      Outputs: `[OLD_VALUE, NEW_ROOT, ...]`

      Fails if:
      - The tree with the specified root does not exits in the VM's advice provider.
      - The provided value is an empty word. | diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors.rs index b3c146cc65..91254a1713 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors.rs @@ -291,7 +291,7 @@ where /// - f2 is a boolean flag set to `1` if the key is not zero. /// /// # Errors - /// Will return an error if the provided Merkle root doesn't exist on the advice provider. + /// Returns an error if the provided Merkle root doesn't exist on the advice provider. /// /// # Panics /// Will panic as unimplemented if the target depth is `64`. @@ -300,21 +300,9 @@ where let key = self.stack.get_word(0); let root = self.stack.get_word(1); - let index = &key[3]; - let depth = self.advice_provider.get_leaf_depth(root, &SMT_MAX_TREE_DEPTH, index)?; - debug_assert!(depth < 65); - - // normalize the depth into one of the tiers. this is not a simple `next_power_of_two` - // because of `48`. using a lookup table is far more efficient than if/else if/else. - let depth = SMT_NORMALIZED_DEPTHS[depth as usize]; - if depth == 64 { - unimplemented!("handling of bottom tier is not yet implemented"); - } - - // fetch the node value - let index = index.as_int() >> (64 - depth); - let index = Felt::new(index); - let node = self.advice_provider.get_tree_node(root, &Felt::new(depth as u64), &index)?; + // get the node from the SMT for the specified key; this node can be either a leaf node, + // or a root of an empty subtree at the returned depth + let (node, depth, _) = self.get_smt_node(root, key)?; // set the node value; zeroed if empty sub-tree let empty = EmptySubtreeRoots::empty_hashes(64); @@ -343,6 +331,55 @@ where Ok(()) } + /// Pushes onto the advice stack the value associated with the specified key in a Sparse + /// Merkle Tree defined by the specified root. + /// + /// If no value was previously associated with the specified key, [ZERO; 4] is pushed onto + /// the advice stack. + /// + /// Inputs: + /// Operand stack: [KEY, ROOT, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [KEY, ROOT, ...] + /// Advice stack: [VALUE, ...] + /// + /// # Errors + /// Returns an error if the provided Merkle root doesn't exist on the advice provider. + /// + /// # Panics + /// Will panic as unimplemented if the target depth is `64`. + pub(super) fn push_smtpeek_result(&mut self) -> Result<(), ExecutionError> { + // fetch the arguments from the operand stack + let key = self.stack.get_word(0); + let root = self.stack.get_word(1); + + // get the node from the SMT for the specified key; this node can be either a leaf node, + // or a root of an empty subtree at the returned depth + let (node, depth, _) = self.get_smt_node(root, key)?; + + let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; + if node == Word::from(empty) { + // if the node is a root of an empty subtree, then there is no value associated with + // the specified key + self.advice_provider.push_stack(AdviceSource::Word(TieredSmt::EMPTY_VALUE))?; + } else { + // get the key and value stored in the current leaf + let (leaf_key, leaf_value) = self.get_smt_upper_leaf_preimage(node)?; + + // if the leaf is for a different key, then there is no value associated with the + // specified key + if leaf_key == key { + self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; + } else { + self.advice_provider.push_stack(AdviceSource::Word(TieredSmt::EMPTY_VALUE))?; + } + } + + Ok(()) + } + /// Pushes values onto the advice stack which are required for successful insertion of a /// key-value pair into a Sparse Merkle Tree data structure. /// @@ -362,7 +399,7 @@ where /// - OLD_VALUE is the value previously associated with the specified KEY. /// /// # Errors - /// Will return an error if: + /// Returns an error if: /// - The Merkle store does not contain a node with the specified root. /// - The Merkle store does not contain all nodes needed to validate the path between the root /// and the relevant TSMT nodes. @@ -376,21 +413,9 @@ where let key = self.stack.get_word(1); let root = self.stack.get_word(2); - // determine the depth of the first leaf or an empty tree node - let index = &key[3]; - let depth = self.advice_provider.get_leaf_depth(root, &SMT_MAX_TREE_DEPTH, index)?; - debug_assert!(depth < 65); - - // map the depth value to its tier; this rounds up depth to 16, 32, 48, or 64 - let depth = SMT_NORMALIZED_DEPTHS[depth as usize]; - if depth == 64 { - unimplemented!("handling of depth=64 tier hasn't been implemented yet"); - } - - // get the value of the node at this index/depth - let index = index.as_int() >> (64 - depth); - let index = Felt::new(index); - let node = self.advice_provider.get_tree_node(root, &Felt::from(depth), &index)?; + // get the node from the SMT for the specified key; this node can be either a leaf node, + // or a root of an empty subtree at the returned depth + let (node, depth, index) = self.get_smt_node(root, key)?; // if the value to be inserted is an empty word, we need to process it as a delete if value == TieredSmt::EMPTY_VALUE { @@ -423,6 +448,30 @@ where // TSMT UPDATE HELPER METHODS // -------------------------------------------------------------------------------------------- + /// Returns first leaf or an empty tree node for the provided key in the Sparse Merkle tree + /// with the specified root. + /// + /// Also returns the depth and index of the returned node at this depth. + fn get_smt_node(&self, root: Word, key: Word) -> Result<(Word, u8, Felt), ExecutionError> { + // determine the depth of the first leaf or an empty tree node + let index = &key[3]; + let depth = self.advice_provider.get_leaf_depth(root, &SMT_MAX_TREE_DEPTH, index)?; + debug_assert!(depth < 65); + + // map the depth value to its tier; this rounds up depth to 16, 32, 48, or 64 + let depth = SMT_NORMALIZED_DEPTHS[depth as usize]; + if depth == 64 { + unimplemented!("handling of depth=64 tier hasn't been implemented yet"); + } + + // get the value of the node at this index/depth + let index = index.as_int() >> (64 - depth); + let index = Felt::new(index); + let node = self.advice_provider.get_tree_node(root, &Felt::from(depth), &index)?; + + Ok((node, depth, index)) + } + /// Retrieves a key-value pair for the specified leaf node from the advice map. /// /// # Errors diff --git a/processor/src/decorators/mod.rs b/processor/src/decorators/mod.rs index 060f47173c..98278864fc 100644 --- a/processor/src/decorators/mod.rs +++ b/processor/src/decorators/mod.rs @@ -46,6 +46,7 @@ where AdviceInjector::Ext2Intt => self.push_ext2_intt_result(), AdviceInjector::SmtGet => self.push_smtget_inputs(), AdviceInjector::SmtSet => self.push_smtset_inputs(), + AdviceInjector::SmtPeek => self.push_smtpeek_result(), AdviceInjector::MemToMap => self.insert_mem_values_into_adv_map(), AdviceInjector::HdwordToMap { domain } => self.insert_hdword_into_adv_map(*domain), AdviceInjector::HpermToMap => self.insert_hperm_into_adv_map(), diff --git a/processor/src/decorators/tests.rs b/processor/src/decorators/tests.rs index 2958e0679f..ff6e40e50e 100644 --- a/processor/src/decorators/tests.rs +++ b/processor/src/decorators/tests.rs @@ -9,6 +9,7 @@ use vm_core::{ hash::{Rpo256, RpoDigest}, merkle::{EmptySubtreeRoots, MerkleStore, MerkleTree, NodeIndex, TieredSmt}, }, + utils::collections::Vec, utils::IntoBytes, AdviceInjector, Decorator, ONE, ZERO, }; @@ -73,7 +74,7 @@ fn push_smtget() { let value = seeded_word(&mut seed); // check leaves on empty trees - for depth in [16, 32, 48] { + for depth in [16_u8, 32, 48] { // compute node value let depth_element = Felt::from(depth); let store = MerkleStore::new(); @@ -81,7 +82,7 @@ fn push_smtget() { // expect absent value with constant depth 16 let expected = [ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ONE, ONE]; - assert_case_smtget(depth, key, value, node, initial_root, store, &expected); + assert_case_smtget(key, value, node, initial_root, store, &expected); } // check leaves inserted on all tiers @@ -112,7 +113,7 @@ fn push_smtget() { is_16_or_32, is_16_or_48, ]; - assert_case_smtget(depth, key, value, node, root, store, &expected); + assert_case_smtget(key, value, node, root, store, &expected); } // check absent siblings of non-empty trees @@ -137,15 +138,72 @@ fn push_smtget() { let root = store.set_node(initial_root, sibling, sibling_node).unwrap().root; let expected = [ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, is_16_or_32, is_16_or_48]; - assert_case_smtget(depth, key, value, sibling_node, root, store, &expected); + assert_case_smtget(key, value, sibling_node, root, store, &expected); } } -// SMTINSERT TESTS +// SMTPEEK TESTS +// ================================================================================================ + +#[test] +fn inject_smtpeek() { + let mut smt = TieredSmt::default(); + + // insert a single value into the tree (the node will be at depth 16) + let raw_a = 0b_00000000_11111111_00011111_11111111_10010110_10010011_11100000_00000000_u64; + let key_a = build_key(raw_a); + let val_a = [Felt::new(3), Felt::new(5), Felt::new(7), Felt::new(9)]; + smt.insert(key_a.into(), val_a); + + // peeking key_a should return val_a (in stack order) + let process = prepare_smt_peek(key_a, &smt); + let mut expected = val_a; + expected.reverse(); + assert_eq!(build_expected(&expected), process.stack.trace_state()); + + // peeking another key should return empty word + let raw_b = 0b_11111111_11111111_00011111_11111111_10010110_10010011_11100000_00000000_u64; + let key_b = build_key(raw_b); + let process = prepare_smt_peek(key_b, &smt); + assert_eq!(build_expected(&[ZERO; 4]), process.stack.trace_state()); + + // peeking another key with the same 16-bit prefix as key_a should return empty word + let raw_c = 0b_00000000_11111111_10011111_11111111_10010110_10010011_11100000_00000000_u64; + let key_c = build_key(raw_c); + let process = prepare_smt_peek(key_c, &smt); + assert_eq!(build_expected(&[ZERO; 4]), process.stack.trace_state()); +} + +fn prepare_smt_peek(key: Word, smt: &TieredSmt) -> Process { + let root: Word = smt.root().into(); + let store = MerkleStore::from(smt); + + let adv_map = smt + .upper_leaves() + .map(|(node, key, value)| { + let mut elements = key.as_elements().to_vec(); + elements.extend(&value); + (node.as_bytes(), elements) + }) + .collect::>(); + let advice_inputs = AdviceInputs::default().with_merkle_store(store).with_map(adv_map); + + let stack_inputs = build_stack_inputs(key, root, [ZERO; 4]); + let mut process = build_process(stack_inputs, advice_inputs); + + process.execute_op(Operation::Noop).unwrap(); + process.execute_decorator(&Decorator::Advice(AdviceInjector::SmtPeek)).unwrap(); + + move_adv_to_stack(&mut process, 4); + + process +} + +// SMTSET TESTS // ================================================================================================ #[test] -fn inject_smtinsert() { +fn inject_smtset() { let mut smt = TieredSmt::default(); // --- insert into empty tree --------------------------------------------- @@ -228,7 +286,6 @@ fn build_expected(values: &[Felt]) -> [Felt; 16] { } fn assert_case_smtget( - _depth: u8, key: Word, value: Word, node: RpoDigest, From 0aa1ffcdd11da13172efa08069b4239962538c8c Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Tue, 29 Aug 2023 21:41:52 -0700 Subject: [PATCH 071/120] refactor: move smt decorator handlers into stand-alone module --- .../src/decorators/adv_stack_injectors/mod.rs | 265 ++++++++++++++++++ .../smt.rs} | 261 +---------------- 2 files changed, 273 insertions(+), 253 deletions(-) create mode 100644 processor/src/decorators/adv_stack_injectors/mod.rs rename processor/src/decorators/{adv_stack_injectors.rs => adv_stack_injectors/smt.rs} (71%) diff --git a/processor/src/decorators/adv_stack_injectors/mod.rs b/processor/src/decorators/adv_stack_injectors/mod.rs new file mode 100644 index 0000000000..25689a3f52 --- /dev/null +++ b/processor/src/decorators/adv_stack_injectors/mod.rs @@ -0,0 +1,265 @@ +use super::{super::Ext2InttError, AdviceProvider, AdviceSource, ExecutionError, Process}; +use vm_core::{ + utils::collections::Vec, Felt, FieldElement, QuadExtension, StarkField, Word, ONE, WORD_SIZE, + ZERO, +}; +use winter_prover::math::fft; + +mod smt; + +// TYPE ALIASES +// ================================================================================================ +type QuadFelt = QuadExtension; + +// ADVICE INJECTORS +// ================================================================================================ + +impl
      Process +where + A: AdviceProvider, +{ + /// Pushes a node of the Merkle tree specified by the values on the top of the operand stack + /// onto the advice stack. + /// + /// Inputs: + /// Operand stack: [depth, index, TREE_ROOT, ...] + /// Advice stack: [...] + /// Merkle store: {TREE_ROOT<-NODE} + /// + /// Outputs: + /// Operand stack: [depth, index, TREE_ROOT, ...] + /// Advice stack: [NODE, ...] + /// Merkle store: {TREE_ROOT<-NODE} + /// + /// # Errors + /// Returns an error if: + /// - Merkle tree for the specified root cannot be found in the advice provider. + /// - The specified depth is either zero or greater than the depth of the Merkle tree + /// identified by the specified root. + /// - Value of the node at the specified depth and index is not known to the advice provider. + pub(super) fn copy_merkle_node_to_adv_stack(&mut self) -> Result<(), ExecutionError> { + // read node depth, node index, and tree root from the stack + let depth = self.stack.get(0); + let index = self.stack.get(1); + let root = [self.stack.get(5), self.stack.get(4), self.stack.get(3), self.stack.get(2)]; + + // look up the node in the advice provider + let node = self.advice_provider.get_tree_node(root, &depth, &index)?; + + // push the node onto the advice stack with the first element pushed last so that it can + // be popped first (i.e. stack behavior for word) + self.advice_provider.push_stack(AdviceSource::Value(node[3]))?; + self.advice_provider.push_stack(AdviceSource::Value(node[2]))?; + self.advice_provider.push_stack(AdviceSource::Value(node[1]))?; + self.advice_provider.push_stack(AdviceSource::Value(node[0]))?; + + Ok(()) + } + + /// Pushes a list of field elements onto the advice stack. The list is looked up in the advice + /// map using the specified word from the operand stack as the key. If `include_len` is set to + /// true, the number of elements in the value is also pushed onto the advice stack. + /// + /// Inputs: + /// Operand stack: [..., KEY, ...] + /// Advice stack: [...] + /// Advice map: {KEY: values} + /// + /// Outputs: + /// Operand stack: [..., KEY, ...] + /// Advice stack: [values_len?, values, ...] + /// Advice map: {KEY: values} + /// + /// The `key_offset` value specifies the location of the `KEY` on the stack. For example, + /// offset value of 0 indicates that the top word on the stack should be used as the key, the + /// offset value of 4, indicates that the second word on the stack should be used as the key + /// etc. + /// + /// The valid values of `key_offset` are 0 through 12 (inclusive). + /// + /// # Errors + /// Returns an error if the required key was not found in the key-value map or if stack offset + /// is greater than 12. + pub(super) fn copy_map_value_to_adv_stack( + &mut self, + include_len: bool, + key_offset: usize, + ) -> Result<(), ExecutionError> { + if key_offset > 12 { + return Err(ExecutionError::InvalidStackWordOffset(key_offset)); + } + + let key = [ + self.stack.get(key_offset + 3), + self.stack.get(key_offset + 2), + self.stack.get(key_offset + 1), + self.stack.get(key_offset), + ]; + self.advice_provider.push_stack(AdviceSource::Map { key, include_len }) + } + + /// Pushes the result of [u64] division (both the quotient and the remainder) onto the advice + /// stack. + /// + /// Inputs: + /// Operand stack: [b1, b0, a1, a0, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [b1, b0, a1, a0, ...] + /// Advice stack: [q0, q1, r0, r1, ...] + /// + /// Where (a0, a1) and (b0, b1) are the 32-bit limbs of the dividend and the divisor + /// respectively (with a0 representing the 32 lest significant bits and a1 representing the + /// 32 most significant bits). Similarly, (q0, q1) and (r0, r1) represent the quotient and + /// the remainder respectively. + /// + /// # Errors + /// Returns an error if the divisor is ZERO. + pub(super) fn push_u64_div_result(&mut self) -> Result<(), ExecutionError> { + let divisor_hi = self.stack.get(0).as_int(); + let divisor_lo = self.stack.get(1).as_int(); + let divisor = (divisor_hi << 32) + divisor_lo; + + if divisor == 0 { + return Err(ExecutionError::DivideByZero(self.system.clk())); + } + + let dividend_hi = self.stack.get(2).as_int(); + let dividend_lo = self.stack.get(3).as_int(); + let dividend = (dividend_hi << 32) + dividend_lo; + + let quotient = dividend / divisor; + let remainder = dividend - quotient * divisor; + + let (q_hi, q_lo) = u64_to_u32_elements(quotient); + let (r_hi, r_lo) = u64_to_u32_elements(remainder); + + self.advice_provider.push_stack(AdviceSource::Value(r_hi))?; + self.advice_provider.push_stack(AdviceSource::Value(r_lo))?; + self.advice_provider.push_stack(AdviceSource::Value(q_hi))?; + self.advice_provider.push_stack(AdviceSource::Value(q_lo))?; + + Ok(()) + } + + /// Given an element in a quadratic extension field on the top of the stack (i.e., a0, b1), + /// computes its multiplicative inverse and push the result onto the advice stack. + /// + /// Inputs: + /// Operand stack: [a1, a0, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [a1, a0, ...] + /// Advice stack: [b0, b1...] + /// + /// Where (b0, b1) is the multiplicative inverse of the extension field element (a0, a1) at the + /// top of the stack. + /// + /// # Errors + /// Returns an error if the input is a zero element in the extension field. + pub(super) fn push_ext2_inv_result(&mut self) -> Result<(), ExecutionError> { + let coef0 = self.stack.get(1); + let coef1 = self.stack.get(0); + + let element = QuadFelt::new(coef0, coef1); + if element == QuadFelt::ZERO { + return Err(ExecutionError::DivideByZero(self.system.clk())); + } + let result = element.inv().to_base_elements(); + + self.advice_provider.push_stack(AdviceSource::Value(result[1]))?; + self.advice_provider.push_stack(AdviceSource::Value(result[0]))?; + + Ok(()) + } + + /// Given evaluations of a polynomial over some specified domain, interpolates the evaluations + /// into a polynomial in coefficient form and pushes the result into the advice stack. + /// + /// The interpolation is performed using the iNTT algorithm. The evaluations are expected to be + /// in the quadratic extension. + /// + /// Inputs: + /// Operand stack: [output_size, input_size, input_start_ptr, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [output_size, input_size, input_start_ptr, ...] + /// Advice stack: [coefficients...] + /// + /// - `input_size` is the number of evaluations (each evaluation is 2 base field elements). + /// Must be a power of 2 and greater 1. + /// - `output_size` is the number of coefficients in the interpolated polynomial (each + /// coefficient is 2 base field elements). Must be smaller than or equal to the number of + /// input evaluations. + /// - `input_start_ptr` is the memory address of the first evaluation. + /// - `coefficients` are the coefficients of the interpolated polynomial such that lowest + /// degree coefficients are located at the top of the advice stack. + /// + /// # Errors + /// Returns an error if: + /// - `input_size` less than or equal to 1, or is not a power of 2. + /// - `output_size` is 0 or is greater than the `input_size`. + /// - `input_ptr` is greater than 2^32. + /// - `input_ptr + input_size / 2` is greater than 2^32. + pub(super) fn push_ext2_intt_result(&mut self) -> Result<(), ExecutionError> { + let output_size = self.stack.get(0).as_int() as usize; + let input_size = self.stack.get(1).as_int() as usize; + let input_start_ptr = self.stack.get(2).as_int(); + + if input_size <= 1 { + return Err(Ext2InttError::DomainSizeTooSmall(input_size as u64).into()); + } + if !input_size.is_power_of_two() { + return Err(Ext2InttError::DomainSizeNotPowerOf2(input_size as u64).into()); + } + if input_start_ptr >= u32::MAX as u64 { + return Err(Ext2InttError::InputStartAddressTooBig(input_start_ptr).into()); + } + if input_size > u32::MAX as usize { + return Err(Ext2InttError::InputSizeTooBig(input_size as u64).into()); + } + + let input_end_ptr = input_start_ptr + (input_size / 2) as u64; + if input_end_ptr > u32::MAX as u64 { + return Err(Ext2InttError::InputEndAddressTooBig(input_end_ptr).into()); + } + + if output_size == 0 { + return Err(Ext2InttError::OutputSizeIsZero.into()); + } + if output_size > input_size { + return Err(Ext2InttError::OutputSizeTooBig(output_size, input_size).into()); + } + + let mut poly = Vec::with_capacity(input_size); + for addr in (input_start_ptr as u32)..(input_end_ptr as u32) { + let word = self + .get_memory_value(self.system.ctx(), addr) + .ok_or(Ext2InttError::UninitializedMemoryAddress(addr))?; + + poly.push(QuadFelt::new(word[0], word[1])); + poly.push(QuadFelt::new(word[2], word[3])); + } + + let twiddles = fft::get_inv_twiddles::(input_size); + fft::interpolate_poly::(&mut poly, &twiddles); + + for element in QuadFelt::slice_as_base_elements(&poly[..output_size]).iter().rev() { + self.advice_provider.push_stack(AdviceSource::Value(*element))?; + } + + Ok(()) + } +} + +// HELPER FUNCTIONS +// ================================================================================================ + +fn u64_to_u32_elements(value: u64) -> (Felt, Felt) { + let hi = Felt::new(value >> 32); + let lo = Felt::new((value as u32) as u64); + (hi, lo) +} diff --git a/processor/src/decorators/adv_stack_injectors.rs b/processor/src/decorators/adv_stack_injectors/smt.rs similarity index 71% rename from processor/src/decorators/adv_stack_injectors.rs rename to processor/src/decorators/adv_stack_injectors/smt.rs index 91254a1713..9f39d081b7 100644 --- a/processor/src/decorators/adv_stack_injectors.rs +++ b/processor/src/decorators/adv_stack_injectors/smt.rs @@ -1,17 +1,14 @@ -use super::{super::Ext2InttError, AdviceProvider, AdviceSource, ExecutionError, Process}; +use super::{ + AdviceProvider, AdviceSource, ExecutionError, Felt, Process, StarkField, Word, ONE, WORD_SIZE, + ZERO, +}; use vm_core::{ crypto::{ hash::{Rpo256, RpoDigest}, merkle::{EmptySubtreeRoots, NodeIndex, TieredSmt}, }, utils::collections::{btree_map::Entry, BTreeMap, Vec}, - Felt, FieldElement, QuadExtension, StarkField, Word, ONE, WORD_SIZE, ZERO, }; -use winter_prover::math::fft; - -// TYPE ALIASES -// ================================================================================================ -type QuadFelt = QuadExtension; // CONSTANTS // ================================================================================================ @@ -26,249 +23,13 @@ const SMT_NORMALIZED_DEPTHS: [u8; 65] = [ 48, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, ]; -// ADVICE INJECTORS +// SMT ADVICE INJECTORS // ================================================================================================ impl Process where A: AdviceProvider, { - /// Pushes a node of the Merkle tree specified by the values on the top of the operand stack - /// onto the advice stack. - /// - /// Inputs: - /// Operand stack: [depth, index, TREE_ROOT, ...] - /// Advice stack: [...] - /// Merkle store: {TREE_ROOT<-NODE} - /// - /// Outputs: - /// Operand stack: [depth, index, TREE_ROOT, ...] - /// Advice stack: [NODE, ...] - /// Merkle store: {TREE_ROOT<-NODE} - /// - /// # Errors - /// Returns an error if: - /// - Merkle tree for the specified root cannot be found in the advice provider. - /// - The specified depth is either zero or greater than the depth of the Merkle tree - /// identified by the specified root. - /// - Value of the node at the specified depth and index is not known to the advice provider. - pub(super) fn copy_merkle_node_to_adv_stack(&mut self) -> Result<(), ExecutionError> { - // read node depth, node index, and tree root from the stack - let depth = self.stack.get(0); - let index = self.stack.get(1); - let root = [self.stack.get(5), self.stack.get(4), self.stack.get(3), self.stack.get(2)]; - - // look up the node in the advice provider - let node = self.advice_provider.get_tree_node(root, &depth, &index)?; - - // push the node onto the advice stack with the first element pushed last so that it can - // be popped first (i.e. stack behavior for word) - self.advice_provider.push_stack(AdviceSource::Value(node[3]))?; - self.advice_provider.push_stack(AdviceSource::Value(node[2]))?; - self.advice_provider.push_stack(AdviceSource::Value(node[1]))?; - self.advice_provider.push_stack(AdviceSource::Value(node[0]))?; - - Ok(()) - } - - /// Pushes a list of field elements onto the advice stack. The list is looked up in the advice - /// map using the specified word from the operand stack as the key. If `include_len` is set to - /// true, the number of elements in the value is also pushed onto the advice stack. - /// - /// Inputs: - /// Operand stack: [..., KEY, ...] - /// Advice stack: [...] - /// Advice map: {KEY: values} - /// - /// Outputs: - /// Operand stack: [..., KEY, ...] - /// Advice stack: [values_len?, values, ...] - /// Advice map: {KEY: values} - /// - /// The `key_offset` value specifies the location of the `KEY` on the stack. For example, - /// offset value of 0 indicates that the top word on the stack should be used as the key, the - /// offset value of 4, indicates that the second word on the stack should be used as the key - /// etc. - /// - /// The valid values of `key_offset` are 0 through 12 (inclusive). - /// - /// # Errors - /// Returns an error if the required key was not found in the key-value map or if stack offset - /// is greater than 12. - pub(super) fn copy_map_value_to_adv_stack( - &mut self, - include_len: bool, - key_offset: usize, - ) -> Result<(), ExecutionError> { - if key_offset > 12 { - return Err(ExecutionError::InvalidStackWordOffset(key_offset)); - } - - let key = [ - self.stack.get(key_offset + 3), - self.stack.get(key_offset + 2), - self.stack.get(key_offset + 1), - self.stack.get(key_offset), - ]; - self.advice_provider.push_stack(AdviceSource::Map { key, include_len }) - } - - /// Pushes the result of [u64] division (both the quotient and the remainder) onto the advice - /// stack. - /// - /// Inputs: - /// Operand stack: [b1, b0, a1, a0, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [b1, b0, a1, a0, ...] - /// Advice stack: [q0, q1, r0, r1, ...] - /// - /// Where (a0, a1) and (b0, b1) are the 32-bit limbs of the dividend and the divisor - /// respectively (with a0 representing the 32 lest significant bits and a1 representing the - /// 32 most significant bits). Similarly, (q0, q1) and (r0, r1) represent the quotient and - /// the remainder respectively. - /// - /// # Errors - /// Returns an error if the divisor is ZERO. - pub(super) fn push_u64_div_result(&mut self) -> Result<(), ExecutionError> { - let divisor_hi = self.stack.get(0).as_int(); - let divisor_lo = self.stack.get(1).as_int(); - let divisor = (divisor_hi << 32) + divisor_lo; - - if divisor == 0 { - return Err(ExecutionError::DivideByZero(self.system.clk())); - } - - let dividend_hi = self.stack.get(2).as_int(); - let dividend_lo = self.stack.get(3).as_int(); - let dividend = (dividend_hi << 32) + dividend_lo; - - let quotient = dividend / divisor; - let remainder = dividend - quotient * divisor; - - let (q_hi, q_lo) = u64_to_u32_elements(quotient); - let (r_hi, r_lo) = u64_to_u32_elements(remainder); - - self.advice_provider.push_stack(AdviceSource::Value(r_hi))?; - self.advice_provider.push_stack(AdviceSource::Value(r_lo))?; - self.advice_provider.push_stack(AdviceSource::Value(q_hi))?; - self.advice_provider.push_stack(AdviceSource::Value(q_lo))?; - - Ok(()) - } - - /// Given an element in a quadratic extension field on the top of the stack (i.e., a0, b1), - /// computes its multiplicative inverse and push the result onto the advice stack. - /// - /// Inputs: - /// Operand stack: [a1, a0, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [a1, a0, ...] - /// Advice stack: [b0, b1...] - /// - /// Where (b0, b1) is the multiplicative inverse of the extension field element (a0, a1) at the - /// top of the stack. - /// - /// # Errors - /// Returns an error if the input is a zero element in the extension field. - pub(super) fn push_ext2_inv_result(&mut self) -> Result<(), ExecutionError> { - let coef0 = self.stack.get(1); - let coef1 = self.stack.get(0); - - let element = QuadFelt::new(coef0, coef1); - if element == QuadFelt::ZERO { - return Err(ExecutionError::DivideByZero(self.system.clk())); - } - let result = element.inv().to_base_elements(); - - self.advice_provider.push_stack(AdviceSource::Value(result[1]))?; - self.advice_provider.push_stack(AdviceSource::Value(result[0]))?; - - Ok(()) - } - - /// Given evaluations of a polynomial over some specified domain, interpolates the evaluations - /// into a polynomial in coefficient form and pushes the result into the advice stack. - /// - /// The interpolation is performed using the iNTT algorithm. The evaluations are expected to be - /// in the quadratic extension. - /// - /// Inputs: - /// Operand stack: [output_size, input_size, input_start_ptr, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [output_size, input_size, input_start_ptr, ...] - /// Advice stack: [coefficients...] - /// - /// - `input_size` is the number of evaluations (each evaluation is 2 base field elements). - /// Must be a power of 2 and greater 1. - /// - `output_size` is the number of coefficients in the interpolated polynomial (each - /// coefficient is 2 base field elements). Must be smaller than or equal to the number of - /// input evaluations. - /// - `input_start_ptr` is the memory address of the first evaluation. - /// - `coefficients` are the coefficients of the interpolated polynomial such that lowest - /// degree coefficients are located at the top of the advice stack. - /// - /// # Errors - /// Returns an error if: - /// - `input_size` less than or equal to 1, or is not a power of 2. - /// - `output_size` is 0 or is greater than the `input_size`. - /// - `input_ptr` is greater than 2^32. - /// - `input_ptr + input_size / 2` is greater than 2^32. - pub(super) fn push_ext2_intt_result(&mut self) -> Result<(), ExecutionError> { - let output_size = self.stack.get(0).as_int() as usize; - let input_size = self.stack.get(1).as_int() as usize; - let input_start_ptr = self.stack.get(2).as_int(); - - if input_size <= 1 { - return Err(Ext2InttError::DomainSizeTooSmall(input_size as u64).into()); - } - if !input_size.is_power_of_two() { - return Err(Ext2InttError::DomainSizeNotPowerOf2(input_size as u64).into()); - } - if input_start_ptr >= u32::MAX as u64 { - return Err(Ext2InttError::InputStartAddressTooBig(input_start_ptr).into()); - } - if input_size > u32::MAX as usize { - return Err(Ext2InttError::InputSizeTooBig(input_size as u64).into()); - } - - let input_end_ptr = input_start_ptr + (input_size / 2) as u64; - if input_end_ptr > u32::MAX as u64 { - return Err(Ext2InttError::InputEndAddressTooBig(input_end_ptr).into()); - } - - if output_size == 0 { - return Err(Ext2InttError::OutputSizeIsZero.into()); - } - if output_size > input_size { - return Err(Ext2InttError::OutputSizeTooBig(output_size, input_size).into()); - } - - let mut poly = Vec::with_capacity(input_size); - for addr in (input_start_ptr as u32)..(input_end_ptr as u32) { - let word = self - .get_memory_value(self.system.ctx(), addr) - .ok_or(Ext2InttError::UninitializedMemoryAddress(addr))?; - - poly.push(QuadFelt::new(word[0], word[1])); - poly.push(QuadFelt::new(word[2], word[3])); - } - - let twiddles = fft::get_inv_twiddles::(input_size); - fft::interpolate_poly::(&mut poly, &twiddles); - - for element in QuadFelt::slice_as_base_elements(&poly[..output_size]).iter().rev() { - self.advice_provider.push_stack(AdviceSource::Value(*element))?; - } - - Ok(()) - } - /// Pushes values onto the advice stack which are required for successful retrieval of a /// value from a Sparse Merkle Tree data structure. /// @@ -295,7 +56,7 @@ where /// /// # Panics /// Will panic as unimplemented if the target depth is `64`. - pub(super) fn push_smtget_inputs(&mut self) -> Result<(), ExecutionError> { + pub(in crate::decorators) fn push_smtget_inputs(&mut self) -> Result<(), ExecutionError> { // fetch the arguments from the operand stack let key = self.stack.get_word(0); let root = self.stack.get_word(1); @@ -350,7 +111,7 @@ where /// /// # Panics /// Will panic as unimplemented if the target depth is `64`. - pub(super) fn push_smtpeek_result(&mut self) -> Result<(), ExecutionError> { + pub(in crate::decorators) fn push_smtpeek_result(&mut self) -> Result<(), ExecutionError> { // fetch the arguments from the operand stack let key = self.stack.get_word(0); let root = self.stack.get_word(1); @@ -407,7 +168,7 @@ where /// /// # Panics /// Will panic as unimplemented if the target depth is `64`. - pub(super) fn push_smtset_inputs(&mut self) -> Result<(), ExecutionError> { + pub(in crate::decorators) fn push_smtset_inputs(&mut self) -> Result<(), ExecutionError> { // get the key, value, and tree root from the stack let value = self.stack.get_word(0); let key = self.stack.get_word(1); @@ -815,12 +576,6 @@ where // HELPER FUNCTIONS // ================================================================================================ -fn u64_to_u32_elements(value: u64) -> (Felt, Felt) { - let hi = Felt::new(value >> 32); - let lo = Felt::new((value as u32) as u64); - (hi, lo) -} - fn get_common_prefix(key1: &Word, key2: &Word) -> u8 { let k1 = key1[3].as_int(); let k2 = key2[3].as_int(); From 62ece8f07d0ab5618fc0aafcd1dca02066dc7cd7 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Wed, 30 Aug 2023 17:59:42 +0200 Subject: [PATCH 072/120] style: print traces lenghts during run and prove --- miden/src/cli/run.rs | 29 ++++++++++++++++++++++++- miden/tests/integration/cli/cli_test.rs | 2 +- processor/src/trace/utils.rs | 3 ++- prover/src/lib.rs | 10 +++++++-- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/miden/src/cli/run.rs b/miden/src/cli/run.rs index 6f011c28fd..ee6c4e05c6 100644 --- a/miden/src/cli/run.rs +++ b/miden/src/cli/run.rs @@ -66,7 +66,7 @@ impl RunCmd { let trace = processor::execute(&program, stack_inputs, advice_provider, execution_options) .map_err(|err| format!("Failed to generate execution trace = {:?}", err))?; - println!("done ({} steps in {} ms)", trace.get_trace_len(), now.elapsed().as_millis()); + println!("done ({} ms)", now.elapsed().as_millis()); if let Some(output_path) = &self.output_file { // write outputs to file if one was specified @@ -76,6 +76,33 @@ impl RunCmd { println!("Output: {:?}", trace.stack_outputs().stack_truncated(self.num_outputs)); } + // calculate the percentage of padded rows + let padding_percentage = (trace.trace_len_summary().padded_trace_len() + - trace.trace_len_summary().trace_len()) + * 100 + / trace.trace_len_summary().padded_trace_len(); + // print the required cycles for each component + println!( + "VM cycles: {} extended to {} steps ({}% padding). +├── Stack rows: {} +├── Range checker rows: {} +└── Chiplets rows: {} + ├── Hash chiplet rows: {} + ├── Bitwise chiplet rows: {} + ├── Memory chiplet rows: {} + └── Kernel ROM rows: {}", + trace.trace_len_summary().trace_len(), + trace.trace_len_summary().padded_trace_len(), + padding_percentage, + trace.trace_len_summary().main_trace_len(), + trace.trace_len_summary().range_trace_len(), + trace.trace_len_summary().chiplets_trace_len().trace_len(), + trace.trace_len_summary().chiplets_trace_len().hash_chiplet_len(), + trace.trace_len_summary().chiplets_trace_len().bitwise_chiplet_len(), + trace.trace_len_summary().chiplets_trace_len().memory_chiplet_len(), + trace.trace_len_summary().chiplets_trace_len().kernel_rom_len(), + ); + Ok(()) } } diff --git a/miden/tests/integration/cli/cli_test.rs b/miden/tests/integration/cli/cli_test.rs index 9a304d2cba..3743847e2c 100644 --- a/miden/tests/integration/cli/cli_test.rs +++ b/miden/tests/integration/cli/cli_test.rs @@ -31,7 +31,7 @@ fn cli_run() -> Result<(), Box> { // This tests what we want. Actually it outputs X steps in Y ms. // However we the X and the Y can change in future versions. // There is no other 'steps in' in the output - output.assert().stdout(predicate::str::contains("steps in")); + output.assert().stdout(predicate::str::contains("VM cycles")); Ok(()) } diff --git a/processor/src/trace/utils.rs b/processor/src/trace/utils.rs index 1673d95e43..db6abee587 100644 --- a/processor/src/trace/utils.rs +++ b/processor/src/trace/utils.rs @@ -247,6 +247,7 @@ impl HintCycle for u64 { /// - `range_trace_len` contains the length of the range checker trace. /// - `chiplets_trace_len` contains the trace lengths of the all chiplets (hash, bitwise, memory, /// kernel ROM) +#[derive(Debug)] pub struct TraceLenSummary { main_trace_len: usize, range_trace_len: usize, @@ -296,7 +297,7 @@ impl TraceLenSummary { /// Contains trace lengths of all chilplets: hash, bitwise, memory and kernel ROM trace /// lengths. -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Debug)] pub struct ChipletsLengths { hash_chiplet_len: usize, bitwise_chiplet_len: usize, diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 0f379e2634..125a54b4a4 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -62,10 +62,16 @@ where *options.execution_options(), )?; #[cfg(feature = "std")] + let padding_percentage = (trace.trace_len_summary().padded_trace_len() + - trace.trace_len_summary().trace_len()) + * 100 + / trace.trace_len_summary().padded_trace_len(); + #[cfg(feature = "std")] debug!( - "Generated execution trace of {} columns and {} steps in {} ms", + "Generated execution trace of {} columns and {} steps ({}% padded) in {} ms", trace.layout().main_trace_width(), - trace.length(), + trace.trace_len_summary().padded_trace_len(), + padding_percentage, now.elapsed().as_millis() ); From 3e6239e56cb0f4ccd2e1e2131c3e106229491c98 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Thu, 31 Aug 2023 17:12:55 +0200 Subject: [PATCH 073/120] refactor: use EMPTY_WORD, ZERO and ONE --- air/benches/enforce_stack_constraint.rs | 4 +- air/src/constraints/chiplets/bitwise/mod.rs | 31 ++---- air/src/constraints/chiplets/bitwise/tests.rs | 70 +++++++------- air/src/constraints/chiplets/hasher/mod.rs | 40 ++------ air/src/constraints/chiplets/hasher/tests.rs | 30 +++--- air/src/constraints/chiplets/memory/tests.rs | 20 ++-- air/src/constraints/range.rs | 4 +- air/src/constraints/stack/field_ops/tests.rs | 26 ++--- air/src/constraints/stack/io_ops/tests.rs | 6 +- air/src/constraints/stack/overflow/tests.rs | 6 +- .../stack/stack_manipulation/tests.rs | 22 ++--- air/src/constraints/stack/system_ops/tests.rs | 12 +-- air/src/constraints/stack/u32_ops/tests.rs | 16 ++-- air/src/lib.rs | 2 +- assembly/src/ast/parsers/constants.rs | 11 ++- core/src/lib.rs | 2 +- core/src/program/blocks/mod.rs | 2 +- core/src/program/blocks/span_block.rs | 77 +++++++-------- core/src/program/mod.rs | 2 +- miden/src/examples/fibonacci.rs | 6 +- miden/src/examples/mod.rs | 2 +- miden/src/lib.rs | 2 +- miden/tests/integration/exec_iters.rs | 6 +- .../tests/integration/operations/field_ops.rs | 4 +- processor/src/chiplets/bitwise/tests.rs | 2 +- processor/src/chiplets/hasher/lookups.rs | 6 +- processor/src/chiplets/hasher/tests.rs | 4 +- processor/src/chiplets/memory/mod.rs | 4 +- processor/src/chiplets/memory/tests.rs | 21 ++-- processor/src/chiplets/mod.rs | 3 +- processor/src/decoder/aux_hints.rs | 6 +- processor/src/decoder/mod.rs | 14 +-- processor/src/decoder/tests.rs | 72 +++++++------- processor/src/decorators/adv_map_injectors.rs | 4 +- processor/src/decorators/tests.rs | 16 ++-- processor/src/lib.rs | 5 +- processor/src/operations/crypto_ops.rs | 10 +- processor/src/operations/ext2_ops.rs | 6 +- processor/src/operations/field_ops.rs | 64 ++++++------- processor/src/operations/fri_ops.rs | 2 +- processor/src/operations/stack_ops.rs | 31 +++--- processor/src/operations/sys_ops.rs | 21 ++-- processor/src/operations/u32_ops.rs | 17 ++-- processor/src/operations/utils.rs | 5 +- processor/src/stack/tests.rs | 2 +- processor/src/system/mod.rs | 8 +- processor/src/trace/decoder/tests.rs | 5 +- processor/src/trace/mod.rs | 4 +- processor/src/trace/tests/chiplets/hasher.rs | 4 +- processor/src/trace/tests/range.rs | 6 +- prover/src/gpu.rs | 6 +- stdlib/tests/collections/mmr.rs | 96 +++++++++---------- stdlib/tests/collections/mod.rs | 2 +- stdlib/tests/collections/smt64.rs | 8 +- stdlib/tests/crypto/fri/remainder.rs | 4 +- stdlib/tests/crypto/fri/verifier_fri_e2f4.rs | 4 +- .../stark/verifier_recursive/channel.rs | 4 +- stdlib/tests/math/ecgfp5/base_field.rs | 42 ++++---- stdlib/tests/math/ecgfp5/group.rs | 28 +++--- test-utils/src/crypto.rs | 4 +- test-utils/src/lib.rs | 6 +- 61 files changed, 456 insertions(+), 493 deletions(-) diff --git a/air/benches/enforce_stack_constraint.rs b/air/benches/enforce_stack_constraint.rs index 7448391084..097220ab94 100644 --- a/air/benches/enforce_stack_constraint.rs +++ b/air/benches/enforce_stack_constraint.rs @@ -8,7 +8,7 @@ use miden_air::{ Felt, FieldElement, }; use std::time::Duration; -use vm_core::Operation; +use vm_core::{Operation, ZERO}; fn enforce_stack_constraint(c: &mut Criterion) { let mut group = c.benchmark_group("enforce_stack_constraint"); @@ -27,7 +27,7 @@ fn enforce_stack_constraint(c: &mut Criterion) { frame.current_mut()[STACK_TRACE_OFFSET] = Felt::new(89u64); frame.next_mut()[STACK_TRACE_OFFSET] = Felt::new(89u64).inv(); - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; let frame = generate_evaluation_frame(36); bench.iter(|| { diff --git a/air/src/constraints/chiplets/bitwise/mod.rs b/air/src/constraints/chiplets/bitwise/mod.rs index 5e7167b609..87b405f298 100644 --- a/air/src/constraints/chiplets/bitwise/mod.rs +++ b/air/src/constraints/chiplets/bitwise/mod.rs @@ -6,6 +6,7 @@ use crate::{ BITWISE_OUTPUT_COL_IDX, BITWISE_PREV_OUTPUT_COL_IDX, BITWISE_SELECTOR_COL_IDX, }, utils::{are_equal, binary_not, is_binary, is_zero, EvaluationResult}, + ONE, ZERO, }; use winter_air::TransitionConstraintDegree; @@ -413,27 +414,9 @@ pub fn agg_bits(row: &[E], start_idx: usize) -> E { // CYCLE MASKS // ================================================================================================ -pub const BITWISE_K0_MASK: [Felt; OP_CYCLE_LEN] = [ - Felt::ONE, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, -]; - -pub const BITWISE_K1_MASK: [Felt; OP_CYCLE_LEN] = [ - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ONE, - Felt::ZERO, -]; +pub const BITWISE_K0_MASK: [Felt; OP_CYCLE_LEN] = [ONE, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO]; + +pub const BITWISE_K1_MASK: [Felt; OP_CYCLE_LEN] = [ONE, ONE, ONE, ONE, ONE, ONE, ONE, ZERO]; // TEST HELPERS // ================================================================================================ @@ -442,8 +425,8 @@ pub const BITWISE_K1_MASK: [Felt; OP_CYCLE_LEN] = [ #[cfg(test)] fn get_periodic_values(cycle_row: usize) -> [Felt; 2] { match cycle_row { - 0 => [Felt::ONE, Felt::ONE], - 8 => [Felt::ZERO, Felt::ZERO], - _ => [Felt::ZERO, Felt::ONE], + 0 => [ONE, ONE], + 8 => [ZERO, ZERO], + _ => [ZERO, ONE], } } diff --git a/air/src/constraints/chiplets/bitwise/tests.rs b/air/src/constraints/chiplets/bitwise/tests.rs index e980612fb9..3609f34d08 100644 --- a/air/src/constraints/chiplets/bitwise/tests.rs +++ b/air/src/constraints/chiplets/bitwise/tests.rs @@ -1,8 +1,8 @@ use super::{ enforce_constraints, get_periodic_values, EvaluationFrame, BITWISE_A_COL_IDX, BITWISE_A_COL_RANGE, BITWISE_B_COL_IDX, BITWISE_B_COL_RANGE, BITWISE_OUTPUT_COL_IDX, - BITWISE_PREV_OUTPUT_COL_IDX, BITWISE_SELECTOR_COL_IDX, NUM_CONSTRAINTS, NUM_DECOMP_BITS, - OP_CYCLE_LEN, + BITWISE_PREV_OUTPUT_COL_IDX, BITWISE_SELECTOR_COL_IDX, NUM_CONSTRAINTS, NUM_DECOMP_BITS, ONE, + OP_CYCLE_LEN, ZERO, }; use crate::{ trace::{ @@ -12,7 +12,7 @@ use crate::{ }, TRACE_WIDTH, }, - Felt, FieldElement, + Felt, }; use rand_utils::rand_value; @@ -25,7 +25,7 @@ use proptest::prelude::*; /// specify the operation change within a cycle. #[test] fn test_bitwise_change_ops_fail() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let a = rand_value::(); let b = rand_value::(); @@ -48,28 +48,28 @@ fn output_aggregation_and() { let cycle_row = 0; // create a valid test frame manually - let mut current = vec![Felt::ZERO; TRACE_WIDTH]; - let mut next = vec![Felt::ZERO; TRACE_WIDTH]; + let mut current = vec![ZERO; TRACE_WIDTH]; + let mut next = vec![ZERO; TRACE_WIDTH]; let current_bitwise = [ // selector BITWISE_AND, // a - Felt::ONE, + ONE, // b Felt::new(9), // decomposition of a - Felt::ONE, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, + ONE, + ZERO, + ZERO, + ZERO, // decomposition of b - Felt::ONE, - Felt::ZERO, - Felt::ZERO, - Felt::ONE, + ONE, + ZERO, + ZERO, + ONE, // previous output - Felt::ZERO, + ZERO, // assert a false output Felt::new(1337), ]; @@ -82,15 +82,15 @@ fn output_aggregation_and() { // b Felt::new(157), // decomposition of a - Felt::ONE, - Felt::ONE, - Felt::ZERO, - Felt::ZERO, + ONE, + ONE, + ZERO, + ZERO, // decomposition of b - Felt::ONE, - Felt::ZERO, - Felt::ONE, - Felt::ONE, + ONE, + ZERO, + ONE, + ONE, // previous output Felt::new(1337), // output @@ -104,7 +104,7 @@ fn output_aggregation_and() { let result = get_constraint_evaluation(frame, cycle_row); // expect a failure for the output aggregation constraint (the last one) - assert_ne!(Felt::ZERO, result[NUM_CONSTRAINTS - 1]); + assert_ne!(ZERO, result[NUM_CONSTRAINTS - 1]); } // RANDOMIZED TESTS @@ -115,7 +115,7 @@ proptest! { /// compute the bitwise AND operation. #[test] fn test_bitwise_and(a in any::(), b in any::(), cycle_row in 0..(OP_CYCLE_LEN - 1)) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_test_frame(BITWISE_AND, a, b, cycle_row); let result = get_constraint_evaluation(frame, cycle_row); assert_eq!(expected, result); @@ -125,7 +125,7 @@ proptest! { /// compute the bitwise XOR operation. #[test] fn test_bitwise_xor(a in any::(), b in any::(), cycle_row in 0..(OP_CYCLE_LEN - 1)) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_test_frame(BITWISE_XOR, a, b, cycle_row); let result = get_constraint_evaluation(frame, cycle_row); assert_eq!(expected, result); @@ -139,9 +139,9 @@ proptest! { /// specified row. fn get_constraint_evaluation(frame: EvaluationFrame, row: usize) -> [Felt; NUM_CONSTRAINTS] { let periodic_values = get_periodic_values(row); - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; - enforce_constraints(&frame, &periodic_values, &mut result, Felt::ONE); + enforce_constraints(&frame, &periodic_values, &mut result, ONE); result } @@ -165,8 +165,8 @@ pub fn get_test_frame( ); // Initialize the rows. - let mut current = vec![Felt::ZERO; TRACE_WIDTH]; - let mut next = vec![Felt::ZERO; TRACE_WIDTH]; + let mut current = vec![ZERO; TRACE_WIDTH]; + let mut next = vec![ZERO; TRACE_WIDTH]; // Set the operation selectors. current[BITWISE_SELECTOR_COL_IDX] = operation; @@ -183,7 +183,7 @@ pub fn get_test_frame( // Set the previous output. let output_prev = if cycle_row_num == 0 { - Felt::ZERO + ZERO } else { Felt::new((result >> previous_shift) as u64) }; @@ -217,8 +217,8 @@ pub fn get_test_frame_with_two_ops( ); // Initialize the rows. - let mut current = vec![Felt::ZERO; TRACE_WIDTH]; - let mut next = vec![Felt::ZERO; TRACE_WIDTH]; + let mut current = vec![ZERO; TRACE_WIDTH]; + let mut next = vec![ZERO; TRACE_WIDTH]; // Set the operation selector. current[BITWISE_SELECTOR_COL_IDX] = op_current; @@ -235,7 +235,7 @@ pub fn get_test_frame_with_two_ops( // Set the previous output. let output_prev = if cycle_row_num == 0 { - Felt::ZERO + ZERO } else { Felt::new((result_op_current >> previous_shift) as u64) }; diff --git a/air/src/constraints/chiplets/hasher/mod.rs b/air/src/constraints/chiplets/hasher/mod.rs index d4a68504e9..dde05fc5c8 100644 --- a/air/src/constraints/chiplets/hasher/mod.rs +++ b/air/src/constraints/chiplets/hasher/mod.rs @@ -5,7 +5,10 @@ use crate::trace::chiplets::{ }, HASHER_NODE_INDEX_COL_IDX, HASHER_SELECTOR_COL_RANGE, HASHER_STATE_COL_RANGE, }; -use crate::utils::{are_equal, binary_not, is_binary, EvaluationResult}; +use crate::{ + utils::{are_equal, binary_not, is_binary, EvaluationResult}, + ONE, ZERO, +}; #[cfg(test)] mod tests; @@ -517,40 +520,13 @@ impl EvaluationFrameExt for &EvaluationFrame { // ================================================================================================ /// Periodic column mask used to indicate the last row of a cycle. -pub const HASH_K0_MASK: [Felt; HASH_CYCLE_LEN] = [ - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ONE, -]; +pub const HASH_K0_MASK: [Felt; HASH_CYCLE_LEN] = [ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ONE]; /// Periodic column mask used to indicate when the next row will be the last row of a cycle. -pub const HASH_K1_MASK: [Felt; HASH_CYCLE_LEN] = [ - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ONE, - Felt::ZERO, -]; +pub const HASH_K1_MASK: [Felt; HASH_CYCLE_LEN] = [ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ONE, ZERO]; /// Periodic column mask used to identify the first row of a cycle. -pub const HASH_K2_MASK: [Felt; HASH_CYCLE_LEN] = [ - Felt::ONE, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, -]; +pub const HASH_K2_MASK: [Felt; HASH_CYCLE_LEN] = [ONE, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO]; // ROUND CONSTANTS // ================================================================================================ @@ -559,7 +535,7 @@ pub const HASH_K2_MASK: [Felt; HASH_CYCLE_LEN] = [ pub fn get_round_constants() -> Vec> { let mut constants = Vec::new(); for _ in 0..(STATE_WIDTH * 2) { - constants.push(vec![Felt::ZERO; HASH_CYCLE_LEN]); + constants.push(vec![ZERO; HASH_CYCLE_LEN]); } #[allow(clippy::needless_range_loop)] diff --git a/air/src/constraints/chiplets/hasher/tests.rs b/air/src/constraints/chiplets/hasher/tests.rs index 391d55cf8e..7c183164df 100644 --- a/air/src/constraints/chiplets/hasher/tests.rs +++ b/air/src/constraints/chiplets/hasher/tests.rs @@ -1,10 +1,10 @@ use super::{ enforce_constraints, Hasher, HASHER_NODE_INDEX_COL_IDX, HASHER_SELECTOR_COL_RANGE, - HASHER_STATE_COL_RANGE, NUM_CONSTRAINTS, + HASHER_STATE_COL_RANGE, NUM_CONSTRAINTS, ONE, ZERO, }; use crate::{ trace::chiplets::hasher::{Selectors, LINEAR_HASH, STATE_WIDTH}, - Felt, FieldElement, TRACE_WIDTH, + Felt, TRACE_WIDTH, }; use rand_utils::rand_array; use vm_core::{chiplets::hasher::apply_round, utils::collections::Vec}; @@ -17,10 +17,10 @@ use winter_air::EvaluationFrame; /// eight, and applies a round of the VM's native hash function. #[test] fn hash_round() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let cycle_row_num: usize = 3; - let current_selectors = [Felt::ZERO, LINEAR_HASH[1], LINEAR_HASH[2]]; + let current_selectors = [ZERO, LINEAR_HASH[1], LINEAR_HASH[2]]; let next_selectors = current_selectors; let frame = get_test_hashing_frame(current_selectors, next_selectors, cycle_row_num); @@ -37,10 +37,10 @@ fn get_constraint_evaluation( frame: EvaluationFrame, cycle_row_num: usize, ) -> [Felt; NUM_CONSTRAINTS] { - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; let periodic_values = get_test_periodic_values(cycle_row_num); - enforce_constraints(&frame, &periodic_values, &mut result, Felt::ONE); + enforce_constraints(&frame, &periodic_values, &mut result, ONE); result } @@ -49,15 +49,15 @@ fn get_constraint_evaluation( fn get_test_periodic_values(cycle_row: usize) -> Vec { // Set the periodic column values. let mut periodic_values = match cycle_row { - 0 => vec![Felt::ZERO, Felt::ZERO, Felt::ONE], - 7 => vec![Felt::ZERO, Felt::ONE, Felt::ZERO], - 8 => vec![Felt::ONE, Felt::ZERO, Felt::ZERO], - _ => vec![Felt::ZERO, Felt::ZERO, Felt::ZERO], + 0 => vec![ZERO, ZERO, ONE], + 7 => vec![ZERO, ONE, ZERO], + 8 => vec![ONE, ZERO, ZERO], + _ => vec![ZERO, ZERO, ZERO], }; // Add the RPO round constants for the first 7 rows of the cycle, or pad with zeros. if cycle_row == 7 { - periodic_values.resize(periodic_values.len() + STATE_WIDTH * 2, Felt::ZERO); + periodic_values.resize(periodic_values.len() + STATE_WIDTH * 2, ZERO); } else { periodic_values.extend_from_slice(&Hasher::ARK1[cycle_row]); periodic_values.extend_from_slice(&Hasher::ARK2[cycle_row]); @@ -71,8 +71,8 @@ fn get_test_hashing_frame( next_selectors: Selectors, cycle_row_num: usize, ) -> EvaluationFrame { - let mut current = vec![Felt::ZERO; TRACE_WIDTH]; - let mut next = vec![Felt::ZERO; TRACE_WIDTH]; + let mut current = vec![ZERO; TRACE_WIDTH]; + let mut next = vec![ZERO; TRACE_WIDTH]; // Set the selectors for the hash operation. current[HASHER_SELECTOR_COL_RANGE].copy_from_slice(¤t_selectors); @@ -87,8 +87,8 @@ fn get_test_hashing_frame( next[HASHER_STATE_COL_RANGE].copy_from_slice(&state); // Set the node index values to zero for hash computations. - current[HASHER_NODE_INDEX_COL_IDX] = Felt::ZERO; - next[HASHER_NODE_INDEX_COL_IDX] = Felt::ZERO; + current[HASHER_NODE_INDEX_COL_IDX] = ZERO; + next[HASHER_NODE_INDEX_COL_IDX] = ZERO; EvaluationFrame::from_rows(current, next) } diff --git a/air/src/constraints/chiplets/memory/tests.rs b/air/src/constraints/chiplets/memory/tests.rs index 0572a702ab..41eef4260f 100644 --- a/air/src/constraints/chiplets/memory/tests.rs +++ b/air/src/constraints/chiplets/memory/tests.rs @@ -9,7 +9,7 @@ use crate::trace::{ }, TRACE_WIDTH, }; -use crate::{chiplets::memory, Felt, FieldElement}; +use crate::{chiplets::memory, Felt, FieldElement, ONE, ZERO}; use rand_utils::rand_value; use vm_core::utils::collections::Vec; @@ -18,7 +18,7 @@ use vm_core::utils::collections::Vec; #[test] fn test_memory_write() { - let expected = [Felt::ZERO; memory::NUM_CONSTRAINTS]; + let expected = [ZERO; memory::NUM_CONSTRAINTS]; let old_values = vec![0, 0, 0, 0]; let new_values = vec![1, 0, 0, 0]; @@ -53,7 +53,7 @@ fn test_memory_write() { #[test] fn test_memory_read() { - let expected = [Felt::ZERO; memory::NUM_CONSTRAINTS]; + let expected = [ZERO; memory::NUM_CONSTRAINTS]; let init_values = vec![0, 0, 0, 0]; let old_values = vec![1, 0, 0, 0]; @@ -116,9 +116,9 @@ fn get_constraint_evaluation( let delta_row = get_test_delta_row(&delta_type); let frame = get_test_frame(selectors, &delta_type, &delta_row, old_values, new_values); - let mut result = [Felt::ZERO; memory::NUM_CONSTRAINTS]; + let mut result = [ZERO; memory::NUM_CONSTRAINTS]; - memory::enforce_constraints(&frame, &mut result, Felt::ONE); + memory::enforce_constraints(&frame, &mut result, ONE); result } @@ -142,8 +142,8 @@ fn get_test_frame( old_values: &[u32], new_values: &[u32], ) -> EvaluationFrame { - let mut current = vec![Felt::ZERO; TRACE_WIDTH]; - let mut next = vec![Felt::ZERO; TRACE_WIDTH]; + let mut current = vec![ZERO; TRACE_WIDTH]; + let mut next = vec![ZERO; TRACE_WIDTH]; // Set the operation in the next row. next[MEMORY_TRACE_OFFSET] = selectors[0]; @@ -164,9 +164,9 @@ fn get_test_frame( } // Set the delta and delta inverse values. Treat the current row as if it's the first row. - current[MEMORY_D0_COL_IDX] = Felt::ZERO; - current[MEMORY_D1_COL_IDX] = Felt::ZERO; - current[MEMORY_D_INV_COL_IDX] = Felt::ZERO; + current[MEMORY_D0_COL_IDX] = ZERO; + current[MEMORY_D1_COL_IDX] = ZERO; + current[MEMORY_D_INV_COL_IDX] = ZERO; // Set the delta in the next row according to the specified delta type. let delta: u64 = match delta_type { diff --git a/air/src/constraints/range.rs b/air/src/constraints/range.rs index c0ba0c6bf1..1b8e95d9cd 100644 --- a/air/src/constraints/range.rs +++ b/air/src/constraints/range.rs @@ -5,7 +5,7 @@ use crate::{ utils::are_equal, Assertion, EvaluationFrame, Felt, FieldElement, TransitionConstraintDegree, }; -use vm_core::{utils::collections::Vec, ExtensionOf}; +use vm_core::{utils::collections::Vec, ExtensionOf, ZERO}; use winter_air::AuxTraceRandElements; // CONSTANTS @@ -40,7 +40,7 @@ pub const AUX_CONSTRAINT_DEGREES: [usize; NUM_AUX_CONSTRAINTS] = [9]; /// Returns the range checker's boundary assertions for the main trace at the first step. pub fn get_assertions_first_step(result: &mut Vec>) { let step = 0; - result.push(Assertion::single(V_COL_IDX, step, Felt::ZERO)); + result.push(Assertion::single(V_COL_IDX, step, ZERO)); } /// Returns the range checker's boundary assertions for the main trace at the last step. diff --git a/air/src/constraints/stack/field_ops/tests.rs b/air/src/constraints/stack/field_ops/tests.rs index 726b3a0af7..0ddde311c3 100644 --- a/air/src/constraints/stack/field_ops/tests.rs +++ b/air/src/constraints/stack/field_ops/tests.rs @@ -19,7 +19,7 @@ proptest! { #[test] fn test_eqz_stack_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; // ----------------- top element is anything except 0 ------------------------------------ if a != 0 { @@ -39,7 +39,7 @@ proptest! { #[test] fn test_incr_stack_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_incr_test_frame(a); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -49,7 +49,7 @@ proptest! { #[test] fn test_inv_stack_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_inv_test_frame(a); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -58,7 +58,7 @@ proptest! { #[test] fn test_neg_stack_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_neg_test_frame(a); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -68,7 +68,7 @@ proptest! { #[test] fn test_add_stack_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_add_test_frame(a, b); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -78,7 +78,7 @@ proptest! { #[test] fn test_mul_stack_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_mul_test_frame(a, b); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -88,7 +88,7 @@ proptest! { #[test] fn test_eq_stack_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; // ----------------- top two elements are not same ------------------------------------ if a != b { @@ -108,7 +108,7 @@ proptest! { #[test] fn test_expacc_stack_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let no_bits_stack = (b as f64).log2().ceil() as u64; for c in 0..no_bits_stack{ let frame = get_expacc_test_frame(c, a, b); @@ -121,7 +121,7 @@ proptest! { #[test] fn test_ext2mul_stack_operation(a0 in any::(), a1 in any::(), b0 in any::(), b1 in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_ext2_mul_test_frame(Felt::new(a0), Felt::new(a1), Felt::new(b0), Felt::new(b1)); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -135,7 +135,7 @@ proptest! { #[test] fn test_not_stack_operation() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; // ----------------- top element is 1 ----------------------------------------------------- let a = ONE; @@ -154,7 +154,7 @@ fn test_not_stack_operation() { #[test] fn test_and_stack_operation() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; // ----------------- top elements are 0 and 0 ----------------------------------------------------- let a = ZERO; @@ -192,7 +192,7 @@ fn test_and_stack_operation() { #[test] fn test_or_stack_operation() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; // ----------------- top elements are 0 and 0 ----------------------------------------------------- let a = ZERO; @@ -231,7 +231,7 @@ fn test_or_stack_operation() { /// Returns the result of stack operation constraint evaluations on the provided frame. fn get_constraint_evaluation(frame: EvaluationFrame) -> [Felt; NUM_CONSTRAINTS] { - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; let op_flag = OpFlags::new(&frame); diff --git a/air/src/constraints/stack/io_ops/tests.rs b/air/src/constraints/stack/io_ops/tests.rs index 6dc95a02cf..d7ab9cab9e 100644 --- a/air/src/constraints/stack/io_ops/tests.rs +++ b/air/src/constraints/stack/io_ops/tests.rs @@ -4,14 +4,14 @@ use crate::stack::{ B0_COL_IDX, STACK_TRACE_OFFSET, }; use rand_utils::rand_value; -use vm_core::{Felt, FieldElement, Operation}; +use vm_core::{Felt, Operation, ZERO}; // UNIT TESTS // ================================================================================================ #[test] fn test_sdepth_operation() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let depth = rand_value::() as u64; let frame = get_sdepth_test_frame(depth); @@ -24,7 +24,7 @@ fn test_sdepth_operation() { /// Returns the result of stack operation constraint evaluations on the provided frame. fn get_constraint_evaluation(frame: EvaluationFrame) -> [Felt; NUM_CONSTRAINTS] { - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; let op_flag = &OpFlags::new(&frame); diff --git a/air/src/constraints/stack/overflow/tests.rs b/air/src/constraints/stack/overflow/tests.rs index b7c7c1505e..f1dbde3781 100644 --- a/air/src/constraints/stack/overflow/tests.rs +++ b/air/src/constraints/stack/overflow/tests.rs @@ -12,7 +12,7 @@ use vm_core::{Felt, FieldElement, Operation, ONE, ZERO}; #[test] fn test_stack_overflow_constraints() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; // ------------------ right shift operation ---------------------------------------------------- @@ -116,7 +116,7 @@ fn test_stack_depth_air() { frame.next_mut()[B1_COL_IDX] = Felt::new(12); frame.next_mut()[H0_COL_IDX] = Felt::new(depth - 1 - 16).inv(); - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -127,7 +127,7 @@ fn test_stack_depth_air() { /// Returns the result of stack operation constraint evaluations on the provided frame. fn get_constraint_evaluation(frame: EvaluationFrame) -> [Felt; NUM_CONSTRAINTS] { - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; let op_flag = &OpFlags::new(&frame); diff --git a/air/src/constraints/stack/stack_manipulation/tests.rs b/air/src/constraints/stack/stack_manipulation/tests.rs index 602acf9ba3..262cbfa8bf 100644 --- a/air/src/constraints/stack/stack_manipulation/tests.rs +++ b/air/src/constraints/stack/stack_manipulation/tests.rs @@ -1,6 +1,6 @@ use super::{super::STACK_TRACE_OFFSET, enforce_constraints, EvaluationFrame, NUM_CONSTRAINTS}; use crate::stack::op_flags::{generate_evaluation_frame, OpFlags}; -use vm_core::{Felt, FieldElement, Operation, ONE, ZERO}; +use vm_core::{Felt, Operation, ONE, ZERO}; use proptest::prelude::*; @@ -13,7 +13,7 @@ proptest! { #[test] fn test_dupn_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let nidex = [0,1,2,3,4,5,6,7,9,11,13,15]; for n in nidex.iter() { let frame = get_dup_test_frame(a, *n); @@ -26,7 +26,7 @@ proptest! { #[test] fn test_swap_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_swap_test_frame(a, b); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -47,7 +47,7 @@ proptest! { { // ----------- swapw operation --------------------------------------- - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_swapw_test_frame(a, b, c, d, e, f, g, h); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -86,7 +86,7 @@ proptest! { o in any::(), p in any::(), ) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_swapdw_test_frame(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -96,7 +96,7 @@ proptest! { #[test] fn test_movupn_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let nidex = [2, 3, 4, 5, 6, 7, 8]; for n in nidex.iter() { let frame = get_movup_test_frame(a, *n); @@ -109,7 +109,7 @@ proptest! { #[test] fn test_movdnn_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let nidex = [2, 3, 4, 5, 6, 7, 8]; for n in nidex.iter() { let frame = get_movdn_test_frame(a, *n); @@ -122,7 +122,7 @@ proptest! { #[test] fn test_cswap_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; // -------------- when the first element is 0 --------------------- @@ -153,7 +153,7 @@ proptest! { g in any::(), h in any::() ) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; // -------------- when the first element is 0 --------------------- @@ -180,7 +180,7 @@ proptest! { #[test] fn test_pad_operation() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_pad_test_frame(); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -191,7 +191,7 @@ fn test_pad_operation() { /// Returns the result of stack operation constraint evaluations on the provided frame. fn get_constraint_evaluation(frame: EvaluationFrame) -> [Felt; NUM_CONSTRAINTS] { - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; let op_flag = &OpFlags::new(&frame); diff --git a/air/src/constraints/stack/system_ops/tests.rs b/air/src/constraints/stack/system_ops/tests.rs index f95e0d31bc..7643caf83f 100644 --- a/air/src/constraints/stack/system_ops/tests.rs +++ b/air/src/constraints/stack/system_ops/tests.rs @@ -3,7 +3,7 @@ use super::{ enforce_constraints, EvaluationFrame, NUM_CONSTRAINTS, }; use crate::stack::op_flags::{generate_evaluation_frame, OpFlags}; -use vm_core::{Felt, FieldElement, Operation, ONE}; +use vm_core::{Felt, Operation, ONE, ZERO}; use proptest::prelude::*; @@ -16,7 +16,7 @@ proptest! { #[test] fn test_fmpadd_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_fmpadd_test_frame(a); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -26,7 +26,7 @@ proptest! { #[test] fn test_fmpupdate_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_fmpupdate_test_frame(a); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -36,7 +36,7 @@ proptest! { #[test] fn test_clk_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_clk_test_frame(a); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -48,7 +48,7 @@ proptest! { #[test] fn test_assert_operation() { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_assert_test_frame(); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -59,7 +59,7 @@ fn test_assert_operation() { /// Returns the result of stack operation constraint evaluations on the provided frame. fn get_constraint_evaluation(frame: EvaluationFrame) -> [Felt; NUM_CONSTRAINTS] { - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; let op_flag = &OpFlags::new(&frame); diff --git a/air/src/constraints/stack/u32_ops/tests.rs b/air/src/constraints/stack/u32_ops/tests.rs index 884e1a0a33..cfe0161c93 100644 --- a/air/src/constraints/stack/u32_ops/tests.rs +++ b/air/src/constraints/stack/u32_ops/tests.rs @@ -17,7 +17,7 @@ proptest! { #[test] fn test_u32split_operation(a in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_u32split_test_frame(a); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -27,7 +27,7 @@ proptest! { #[test] fn test_u32add_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_u32add_test_frame(a, b); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -37,7 +37,7 @@ proptest! { #[test] fn test_u32add3_operation(a in any::(), b in any::(), c in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_u32add3_test_frame(a, b, c); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -47,7 +47,7 @@ proptest! { #[test] fn test_u32mul_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_u32mul_test_frame(a, b); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -58,7 +58,7 @@ proptest! { #[test] #[allow(arithmetic_overflow)] fn test_u32madd_operation(a in any::(), b in any::(), c in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_u32madd_test_frame(a, b, c); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -68,7 +68,7 @@ proptest! { #[test] fn test_u32sub_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; let frame = get_u32sub_test_frame(a, b); let result = get_constraint_evaluation(frame); assert_eq!(expected, result); @@ -78,7 +78,7 @@ proptest! { #[test] fn test_u32div_operation(a in any::(), b in any::()) { - let expected = [Felt::ZERO; NUM_CONSTRAINTS]; + let expected = [ZERO; NUM_CONSTRAINTS]; if a != 0 { let frame = get_u32div_test_frame(a, b); let result = get_constraint_evaluation(frame); @@ -93,7 +93,7 @@ proptest! { /// Returns the result of stack operation constraint evaluations on the provided frame. fn get_constraint_evaluation(frame: EvaluationFrame) -> [Felt; NUM_CONSTRAINTS] { - let mut result = [Felt::ZERO; NUM_CONSTRAINTS]; + let mut result = [ZERO; NUM_CONSTRAINTS]; let op_flag = &OpFlags::new(&frame); diff --git a/air/src/lib.rs b/air/src/lib.rs index 18c667e2ad..d954eef7fa 100644 --- a/air/src/lib.rs +++ b/air/src/lib.rs @@ -133,7 +133,7 @@ impl Air for ProcessorAir { // --- set assertions for the first step -------------------------------------------------- // first value of clk is 0 - result.push(Assertion::single(CLK_COL_IDX, 0, Felt::ZERO)); + result.push(Assertion::single(CLK_COL_IDX, 0, ZERO)); // first value of fmp is 2^30 result.push(Assertion::single(FMP_COL_IDX, 0, Felt::new(2u64.pow(30)))); diff --git a/assembly/src/ast/parsers/constants.rs b/assembly/src/ast/parsers/constants.rs index 16ce7ee61e..339150efae 100644 --- a/assembly/src/ast/parsers/constants.rs +++ b/assembly/src/ast/parsers/constants.rs @@ -291,8 +291,11 @@ fn compute_statement( #[cfg(test)] mod tests { use super::{Felt, LocalConstMap, Token}; - use crate::ast::parsers::constants::{ - build_postfix_expression, evaluate_postfix_expression, Operation, + use crate::{ + ast::parsers::constants::{ + build_postfix_expression, evaluate_postfix_expression, Operation, + }, + ONE, }; use Operation::*; @@ -318,7 +321,7 @@ mod tests { Value(Felt::new(3)), Value(Felt::new(3)), FeltDiv, - Value(Felt::new(1)), + Value(ONE), Add, Sub, Add, @@ -352,7 +355,7 @@ mod tests { Value(Felt::new(3)), Value(Felt::new(3)), FeltDiv, - Value(Felt::new(1)), + Value(ONE), Add, Sub, Add, diff --git a/core/src/lib.rs b/core/src/lib.rs index de450db38f..ff4e088037 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -7,7 +7,7 @@ extern crate alloc; pub mod chiplets; pub mod errors; -pub use ::crypto::{Word, ONE, WORD_SIZE, ZERO}; +pub use ::crypto::{Word, EMPTY_WORD, ONE, WORD_SIZE, ZERO}; pub mod crypto { pub mod merkle { pub use ::crypto::merkle::{ diff --git a/core/src/program/blocks/mod.rs b/core/src/program/blocks/mod.rs index 3c73ac62fa..9a1a2e043c 100644 --- a/core/src/program/blocks/mod.rs +++ b/core/src/program/blocks/mod.rs @@ -1,4 +1,4 @@ -use super::{hasher, Box, Digest, Felt, FieldElement, Operation, Vec}; +use super::{hasher, Box, Digest, Felt, Operation, Vec}; use crate::DecoratorList; use core::fmt; diff --git a/core/src/program/blocks/span_block.rs b/core/src/program/blocks/span_block.rs index 0888a5839c..570d194439 100644 --- a/core/src/program/blocks/span_block.rs +++ b/core/src/program/blocks/span_block.rs @@ -1,5 +1,5 @@ -use super::{fmt, hasher, Digest, Felt, FieldElement, Operation, Vec}; -use crate::{DecoratorIterator, DecoratorList}; +use super::{fmt, hasher, Digest, Felt, Operation, Vec}; +use crate::{DecoratorIterator, DecoratorList, ZERO}; use winter_utils::flatten_slice_elements; // CONSTANTS @@ -56,7 +56,7 @@ impl Span { // CONSTANTS // -------------------------------------------------------------------------------------------- /// The domain of the span block (used for control block hashing). - pub const DOMAIN: Felt = Felt::ZERO; + pub const DOMAIN: Felt = ZERO; // CONSTRUCTOR // -------------------------------------------------------------------------------------------- @@ -228,7 +228,7 @@ impl OpBatchAccumulator { pub fn new() -> Self { Self { ops: Vec::new(), - groups: [Felt::ZERO; BATCH_SIZE], + groups: [ZERO; BATCH_SIZE], op_counts: [0; BATCH_SIZE], group: 0, op_idx: 0, @@ -411,7 +411,8 @@ fn validate_decorators(operations: &[Operation], decorators: &DecoratorList) { #[cfg(test)] mod tests { - use super::{hasher, Felt, FieldElement, Operation, BATCH_SIZE}; + use super::{hasher, Felt, Operation, BATCH_SIZE, ZERO}; + use crate::ONE; #[test] fn batch_ops() { @@ -424,7 +425,7 @@ mod tests { assert_eq!(ops, batch.ops); assert_eq!(1, batch.num_groups()); - let mut batch_groups = [Felt::ZERO; BATCH_SIZE]; + let mut batch_groups = [ZERO; BATCH_SIZE]; batch_groups[0] = build_group(&ops); assert_eq!(batch_groups, batch.groups); @@ -440,7 +441,7 @@ mod tests { assert_eq!(ops, batch.ops); assert_eq!(1, batch.num_groups()); - let mut batch_groups = [Felt::ZERO; BATCH_SIZE]; + let mut batch_groups = [ZERO; BATCH_SIZE]; batch_groups[0] = build_group(&ops); assert_eq!(batch_groups, batch.groups); @@ -456,7 +457,7 @@ mod tests { assert_eq!(ops, batch.ops); assert_eq!(2, batch.num_groups()); - let mut batch_groups = [Felt::ZERO; BATCH_SIZE]; + let mut batch_groups = [ZERO; BATCH_SIZE]; batch_groups[0] = build_group(&ops); batch_groups[1] = Felt::new(12345678); @@ -466,7 +467,7 @@ mod tests { // --- one group with 7 immediate values -------------------------------------------------- let ops = vec![ - Operation::Push(Felt::new(1)), + Operation::Push(ONE), Operation::Push(Felt::new(2)), Operation::Push(Felt::new(3)), Operation::Push(Felt::new(4)), @@ -484,7 +485,7 @@ mod tests { let batch_groups = [ build_group(&ops), - Felt::new(1), + ONE, Felt::new(2), Felt::new(3), Felt::new(4), @@ -501,7 +502,7 @@ mod tests { let ops = vec![ Operation::Add, Operation::Mul, - Operation::Push(Felt::new(1)), + Operation::Push(ONE), Operation::Push(Felt::new(2)), Operation::Push(Felt::new(3)), Operation::Push(Felt::new(4)), @@ -519,13 +520,13 @@ mod tests { let batch0_groups = [ build_group(&ops[..9]), - Felt::new(1), + ONE, Felt::new(2), Felt::new(3), Felt::new(4), Felt::new(5), Felt::new(6), - Felt::ZERO, + ZERO, ]; assert_eq!(batch0_groups, batch0.groups); @@ -535,7 +536,7 @@ mod tests { assert_eq!(vec![ops[9]], batch1.ops); assert_eq!(2, batch1.num_groups()); - let mut batch1_groups = [Felt::ZERO; BATCH_SIZE]; + let mut batch1_groups = [ZERO; BATCH_SIZE]; batch1_groups[0] = build_group(&[ops[9]]); batch1_groups[1] = Felt::new(7); @@ -571,10 +572,10 @@ mod tests { Felt::new(7), Felt::new(11), build_group(&ops[9..]), - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, + ZERO, + ZERO, + ZERO, + ZERO, ]; assert_eq!([9_usize, 0, 0, 1, 0, 0, 0, 0], batch.op_counts); @@ -604,11 +605,11 @@ mod tests { build_group(&ops[..8]), build_group(&[ops[8]]), Felt::new(11), - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, + ZERO, + ZERO, + ZERO, + ZERO, + ZERO, ]; assert_eq!(batch_groups, batch.groups); @@ -624,7 +625,7 @@ mod tests { Operation::Add, Operation::Mul, Operation::Mul, - Operation::Push(Felt::new(1)), + Operation::Push(ONE), Operation::Push(Felt::new(2)), ]; let (batches, hash) = super::batch_ops(ops.clone()); @@ -636,13 +637,13 @@ mod tests { let batch_groups = [ build_group(&ops[..8]), - Felt::new(1), + ONE, build_group(&[ops[8]]), Felt::new(2), - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, + ZERO, + ZERO, + ZERO, + ZERO, ]; assert_eq!(batch_groups, batch.groups); @@ -653,7 +654,7 @@ mod tests { let ops = vec![ Operation::Add, Operation::Mul, - Operation::Push(Felt::new(1)), + Operation::Push(ONE), Operation::Push(Felt::new(2)), Operation::Push(Felt::new(3)), Operation::Push(Felt::new(4)), @@ -681,13 +682,13 @@ mod tests { let batch0_groups = [ build_group(&ops[..9]), - Felt::new(1), + ONE, Felt::new(2), Felt::new(3), Felt::new(4), Felt::new(5), build_group(&ops[9..17]), - Felt::ZERO, + ZERO, ]; assert_eq!(batch0_groups, batch0.groups); @@ -697,16 +698,8 @@ mod tests { assert_eq!(ops[17..], batch1.ops); assert_eq!(2, batch1.num_groups()); - let batch1_groups = [ - build_group(&ops[17..]), - Felt::new(6), - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - Felt::ZERO, - ]; + let batch1_groups = + [build_group(&ops[17..]), Felt::new(6), ZERO, ZERO, ZERO, ZERO, ZERO, ZERO]; assert_eq!(batch1_groups, batch1.groups); assert_eq!([2_usize, 0, 0, 0, 0, 0, 0, 0], batch1.op_counts); diff --git a/core/src/program/mod.rs b/core/src/program/mod.rs index b9a06dee41..972d85db99 100644 --- a/core/src/program/mod.rs +++ b/core/src/program/mod.rs @@ -4,7 +4,7 @@ use super::{ collections::{BTreeMap, Vec}, Box, }, - Felt, FieldElement, Operation, + Felt, Operation, }; use core::fmt; use winter_utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; diff --git a/miden/src/examples/fibonacci.rs b/miden/src/examples/fibonacci.rs index bf113204ee..5440ed6adc 100644 --- a/miden/src/examples/fibonacci.rs +++ b/miden/src/examples/fibonacci.rs @@ -1,4 +1,4 @@ -use super::Example; +use super::{Example, ONE, ZERO}; use miden::{ math::{Felt, FieldElement, StarkField}, Assembler, MemAdviceProvider, Program, StackInputs, @@ -47,8 +47,8 @@ fn generate_fibonacci_program(n: usize) -> Program { /// Computes the `n`-th term of Fibonacci sequence fn compute_fibonacci(n: usize) -> Felt { - let mut t0 = Felt::ZERO; - let mut t1 = Felt::ONE; + let mut t0 = ZERO; + let mut t1 = ONE; for _ in 0..n { t1 = t0 + t1; diff --git a/miden/src/examples/mod.rs b/miden/src/examples/mod.rs index b3bceb9e4d..1cc8438d32 100644 --- a/miden/src/examples/mod.rs +++ b/miden/src/examples/mod.rs @@ -1,6 +1,6 @@ use clap::Parser; use miden::{AdviceProvider, ExecutionProof, Program, ProgramInfo, ProvingOptions, StackInputs}; -use processor::{ExecutionOptions, ExecutionOptionsError}; +use processor::{ExecutionOptions, ExecutionOptionsError, ONE, ZERO}; use std::io::Write; use std::time::Instant; diff --git a/miden/src/lib.rs b/miden/src/lib.rs index 816c1ca81b..237a188c87 100644 --- a/miden/src/lib.rs +++ b/miden/src/lib.rs @@ -8,7 +8,7 @@ pub use assembly::{Assembler, AssemblyError, ParsingError}; pub use processor::{ crypto, execute, execute_iter, utils, AdviceInputs, AdviceProvider, AsmOpInfo, ExecutionError, ExecutionTrace, Kernel, MemAdviceProvider, Operation, ProgramInfo, StackInputs, VmState, - VmStateIterator, + VmStateIterator, ZERO, }; pub use prover::{ math, prove, Digest, ExecutionProof, FieldExtension, HashFunction, InputError, Program, diff --git a/miden/tests/integration/exec_iters.rs b/miden/tests/integration/exec_iters.rs index 0ff85f5c54..51839d914e 100644 --- a/miden/tests/integration/exec_iters.rs +++ b/miden/tests/integration/exec_iters.rs @@ -1,5 +1,5 @@ use processor::{AsmOpInfo, VmState}; -use test_utils::{build_debug_test, Felt, FieldElement, ToElements}; +use test_utils::{build_debug_test, Felt, ToElements, ONE}; use vm_core::{AssemblyOp, Operation}; // EXEC ITER TESTS @@ -14,7 +14,7 @@ fn test_exec_iter() { let test = build_debug_test!(source, &init_stack); let traces = test.execute_iter(); let fmp = Felt::new(2u64.pow(30)); - let next_fmp = fmp + Felt::ONE; + let next_fmp = fmp + ONE; let mem = vec![(1_u64, slice_to_word(&[13, 14, 15, 16]))]; let expected_states = vec![ VmState { @@ -143,7 +143,7 @@ fn test_exec_iter() { VmState { clk: 11, ctx: 0, - op: Some(Operation::Push(Felt::new(1))), + op: Some(Operation::Push(ONE)), asmop: None, stack: [1, 17, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0].to_elements(), fmp, diff --git a/miden/tests/integration/operations/field_ops.rs b/miden/tests/integration/operations/field_ops.rs index ca35215ece..2e1bc6488c 100644 --- a/miden/tests/integration/operations/field_ops.rs +++ b/miden/tests/integration/operations/field_ops.rs @@ -1,6 +1,6 @@ use test_utils::{ build_op_test, prop_randw, proptest::prelude::*, rand::rand_value, Felt, FieldElement, - StarkField, TestError, WORD_SIZE, + StarkField, TestError, ONE, WORD_SIZE, }; // FIELD OPS ASSERTIONS - MANUAL TESTS @@ -280,7 +280,7 @@ fn inv() { // --- simple cases --------------------------------------------------------------------------- let test = build_op_test!(asm_op, &[1]); - test.expect_stack(&[Felt::new(1).inv().as_int()]); + test.expect_stack(&[ONE.inv().as_int()]); let test = build_op_test!(asm_op, &[64]); test.expect_stack(&[Felt::new(64).inv().as_int()]); diff --git a/processor/src/chiplets/bitwise/tests.rs b/processor/src/chiplets/bitwise/tests.rs index 04540a6e96..ba78afb7dc 100644 --- a/processor/src/chiplets/bitwise/tests.rs +++ b/processor/src/chiplets/bitwise/tests.rs @@ -210,7 +210,7 @@ fn bitwise_multiple() { /// Builds a trace of the specified length and fills it with data from the provided Bitwise instance. fn build_trace(bitwise: Bitwise, num_rows: usize) -> (Vec>, ChipletsBus) { let mut chiplets_bus = ChipletsBus::default(); - let mut trace = (0..TRACE_WIDTH).map(|_| vec![Felt::new(0); num_rows]).collect::>(); + let mut trace = (0..TRACE_WIDTH).map(|_| vec![ZERO; num_rows]).collect::>(); let mut fragment = TraceFragment::trace_to_fragment(&mut trace); bitwise.fill_trace(&mut fragment, &mut chiplets_bus, 0); diff --git a/processor/src/chiplets/hasher/lookups.rs b/processor/src/chiplets/hasher/lookups.rs index 2ddb17f6aa..98db0ea177 100644 --- a/processor/src/chiplets/hasher/lookups.rs +++ b/processor/src/chiplets/hasher/lookups.rs @@ -1,4 +1,4 @@ -use super::{ColMatrix, Felt, FieldElement, LookupTableRow, StarkField, Vec}; +use super::{ColMatrix, Felt, FieldElement, LookupTableRow, StarkField, Vec, ZERO}; use core::ops::Range; use miden_air::trace::chiplets::{ hasher::{ @@ -180,8 +180,8 @@ fn get_adjacent_hasher_rates( ) -> ([Felt; RATE_LEN], [Felt; RATE_LEN]) { let row = get_row_from_addr(addr); - let mut current = [Felt::ZERO; RATE_LEN]; - let mut next = [Felt::ZERO; RATE_LEN]; + let mut current = [ZERO; RATE_LEN]; + let mut next = [ZERO; RATE_LEN]; for (idx, col_idx) in HASHER_RATE_COL_RANGE.enumerate() { let column = main_trace.get_column(col_idx); current[idx] = column[row]; diff --git a/processor/src/chiplets/hasher/tests.rs b/processor/src/chiplets/hasher/tests.rs index 44856a31f1..78368f3181 100644 --- a/processor/src/chiplets/hasher/tests.rs +++ b/processor/src/chiplets/hasher/tests.rs @@ -781,7 +781,7 @@ fn hash_memoization_span_blocks() { // --- span block with multiple batches ------------------------------------------------------- let span_block = CodeBlock::new_span(vec![ - Operation::Push(Felt::new(1)), + Operation::Push(ONE), Operation::Push(Felt::new(2)), Operation::Push(Felt::new(3)), Operation::Push(Felt::new(4)), @@ -1034,7 +1034,7 @@ fn hash_memoization_span_blocks_check(span_block: CodeBlock) { /// Builds an execution trace for the provided hasher. The trace must have the number of rows /// specified by num_rows. fn build_trace(hasher: Hasher, num_rows: usize) -> (Vec>, ChipletsVTableTraceBuilder) { - let mut trace = (0..TRACE_WIDTH).map(|_| vec![Felt::new(0); num_rows]).collect::>(); + let mut trace = (0..TRACE_WIDTH).map(|_| vec![ZERO; num_rows]).collect::>(); let mut fragment = TraceFragment::trace_to_fragment(&mut trace); let aux_trace_builder = hasher.fill_trace(&mut fragment); (trace, aux_trace_builder) diff --git a/processor/src/chiplets/memory/mod.rs b/processor/src/chiplets/memory/mod.rs index f126425d52..98a6a8676b 100644 --- a/processor/src/chiplets/memory/mod.rs +++ b/processor/src/chiplets/memory/mod.rs @@ -2,7 +2,7 @@ use super::{ trace::LookupTableRow, utils::{split_element_u32_into_u16, split_u32_into_u16}, BTreeMap, ChipletsBus, ColMatrix, Felt, FieldElement, RangeChecker, StarkField, TraceFragment, - Vec, Word, ONE, ZERO, + Vec, Word, EMPTY_WORD, ONE, }; use miden_air::trace::chiplets::memory::{ ADDR_COL_IDX, CLK_COL_IDX, CTX_COL_IDX, D0_COL_IDX, D1_COL_IDX, D_INV_COL_IDX, V_COL_RANGE, @@ -18,7 +18,7 @@ mod tests; // ================================================================================================ /// Initial value of every memory cell. -const INIT_MEM_VALUE: Word = [ZERO; 4]; +const INIT_MEM_VALUE: Word = EMPTY_WORD; // RANDOM ACCESS MEMORY // ================================================================================================ diff --git a/processor/src/chiplets/memory/tests.rs b/processor/src/chiplets/memory/tests.rs index 9bf890213e..3e33bfdf05 100644 --- a/processor/src/chiplets/memory/tests.rs +++ b/processor/src/chiplets/memory/tests.rs @@ -1,7 +1,8 @@ use super::{ super::aux_trace::{ChipletLookup, ChipletsBusRow}, + super::ZERO, ChipletsBus, Felt, FieldElement, Memory, MemoryLookup, TraceFragment, Vec, ADDR_COL_IDX, - CLK_COL_IDX, CTX_COL_IDX, D0_COL_IDX, D1_COL_IDX, D_INV_COL_IDX, ONE, V_COL_RANGE, ZERO, + CLK_COL_IDX, CTX_COL_IDX, D0_COL_IDX, D1_COL_IDX, D_INV_COL_IDX, EMPTY_WORD, ONE, V_COL_RANGE, }; use miden_air::trace::chiplets::memory::{ Selectors, MEMORY_COPY_READ, MEMORY_INIT_READ, MEMORY_READ_LABEL, MEMORY_WRITE, @@ -22,27 +23,27 @@ fn mem_read() { // read a value from address 0; clk = 1 let addr0 = 0; let value = mem.read(0, addr0, 1); - assert_eq!([ZERO; 4], value); + assert_eq!(EMPTY_WORD, value); assert_eq!(1, mem.size()); assert_eq!(1, mem.trace_len()); // read a value from address 3; clk = 2 let addr3 = 3; let value = mem.read(0, addr3, 2); - assert_eq!([ZERO; 4], value); + assert_eq!(EMPTY_WORD, value); assert_eq!(2, mem.size()); assert_eq!(2, mem.trace_len()); // read a value from address 0 again; clk = 3 let value = mem.read(0, addr0, 3); - assert_eq!([ZERO; 4], value); + assert_eq!(EMPTY_WORD, value); assert_eq!(2, mem.size()); assert_eq!(3, mem.trace_len()); // read a value from address 2; clk = 4 let addr2 = 2; let value = mem.read(0, addr2, 4); - assert_eq!([ZERO; 4], value); + assert_eq!(EMPTY_WORD, value); assert_eq!(3, mem.size()); assert_eq!(4, mem.trace_len()); @@ -52,21 +53,21 @@ fn mem_read() { // address 0 let mut prev_row = [ZERO; MEMORY_TRACE_WIDTH]; - let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, addr0, 1, [ZERO; 4]); + let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, addr0, 1, EMPTY_WORD); prev_row = verify_memory_access(&trace, &chiplets_bus, 0, MEMORY_INIT_READ, &memory_access, prev_row); - let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, addr0, 3, [ZERO; 4]); + let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, addr0, 3, EMPTY_WORD); prev_row = verify_memory_access(&trace, &chiplets_bus, 1, MEMORY_COPY_READ, &memory_access, prev_row); // address 2 - let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, addr2, 4, [ZERO; 4]); + let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, addr2, 4, EMPTY_WORD); prev_row = verify_memory_access(&trace, &chiplets_bus, 2, MEMORY_INIT_READ, &memory_access, prev_row); // address 3 - let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, addr3, 2, [ZERO; 4]); + let memory_access = MemoryLookup::from_ints(MEMORY_READ_LABEL, 0, addr3, 2, EMPTY_WORD); verify_memory_access(&trace, &chiplets_bus, 3, MEMORY_INIT_READ, &memory_access, prev_row); } @@ -316,7 +317,7 @@ fn mem_get_state_at() { /// Builds a trace of the specified length and fills it with data from the provided Memory instance. fn build_trace(mem: Memory, num_rows: usize) -> (Vec>, ChipletsBus) { let mut chiplets_bus = ChipletsBus::default(); - let mut trace = (0..MEMORY_TRACE_WIDTH).map(|_| vec![Felt::ZERO; num_rows]).collect::>(); + let mut trace = (0..MEMORY_TRACE_WIDTH).map(|_| vec![ZERO; num_rows]).collect::>(); let mut fragment = TraceFragment::trace_to_fragment(&mut trace); mem.fill_trace(&mut fragment, &mut chiplets_bus, 0); diff --git a/processor/src/chiplets/mod.rs b/processor/src/chiplets/mod.rs index df6231b728..2bd9cba103 100644 --- a/processor/src/chiplets/mod.rs +++ b/processor/src/chiplets/mod.rs @@ -1,6 +1,7 @@ use super::{ crypto::MerklePath, trace, utils, BTreeMap, ChipletsTrace, ColMatrix, ExecutionError, Felt, - FieldElement, RangeChecker, StarkField, TraceFragment, Vec, Word, CHIPLETS_WIDTH, ONE, ZERO, + FieldElement, RangeChecker, StarkField, TraceFragment, Vec, Word, CHIPLETS_WIDTH, EMPTY_WORD, + ONE, ZERO, }; use miden_air::trace::chiplets::{ bitwise::{BITWISE_AND_LABEL, BITWISE_XOR_LABEL}, diff --git a/processor/src/decoder/aux_hints.rs b/processor/src/decoder/aux_hints.rs index 773f6caeb4..72f1543bf9 100644 --- a/processor/src/decoder/aux_hints.rs +++ b/processor/src/decoder/aux_hints.rs @@ -1,6 +1,6 @@ use super::{ super::trace::LookupTableRow, get_num_groups_in_next_batch, BlockInfo, ColMatrix, Felt, - FieldElement, StarkField, Vec, Word, ONE, ZERO, + FieldElement, StarkField, Vec, Word, EMPTY_WORD, ONE, ZERO, }; // AUXILIARY TRACE HINTS @@ -33,7 +33,7 @@ impl AuxTraceHints { pub fn new() -> Self { // initialize block hash table with an blank entry, this will be replaced with an entry // containing the actual program hash at the end of trace generation - let block_hash_rows = vec![BlockHashTableRow::from_program_hash([ZERO; 4])]; + let block_hash_rows = vec![BlockHashTableRow::from_program_hash(EMPTY_WORD)]; Self { block_exec_hints: Vec::new(), @@ -308,7 +308,7 @@ impl BlockStackTableRow { parent_id, is_loop, parent_ctx: 0, - parent_fn_hash: [ZERO; 4], + parent_fn_hash: EMPTY_WORD, parent_fmp: ZERO, parent_stack_depth: 0, parent_next_overflow_addr: ZERO, diff --git a/processor/src/decoder/mod.rs b/processor/src/decoder/mod.rs index 7649b4a06b..cc1be3a737 100644 --- a/processor/src/decoder/mod.rs +++ b/processor/src/decoder/mod.rs @@ -1,7 +1,7 @@ use super::{ AdviceProvider, Call, ColMatrix, ExecutionError, Felt, FieldElement, Join, Loop, OpBatch, - Operation, Process, Span, Split, StarkField, Vec, Word, MIN_TRACE_LEN, ONE, OP_BATCH_SIZE, - ZERO, + Operation, Process, Span, Split, StarkField, Vec, Word, EMPTY_WORD, MIN_TRACE_LEN, ONE, + OP_BATCH_SIZE, ZERO, }; use miden_air::trace::{ chiplets::hasher::DIGEST_LEN, @@ -125,7 +125,7 @@ where let body_hash = block.body().hash().into(); let addr = self.chiplets - .hash_control_block(body_hash, [ZERO; 4], Loop::DOMAIN, block.hash()); + .hash_control_block(body_hash, EMPTY_WORD, Loop::DOMAIN, block.hash()); // start decoding the LOOP block; this appends a row with LOOP operation to the decoder // trace, but if the value on the top of the stack is not ONE, the block is not marked @@ -176,7 +176,7 @@ where let fn_hash = block.fn_hash().into(); let addr = self.chiplets - .hash_control_block(fn_hash, [ZERO; 4], block.domain(), block.hash()); + .hash_control_block(fn_hash, EMPTY_WORD, block.domain(), block.hash()); // start new execution context for the operand stack. this has the effect of resetting // stack depth to 16. @@ -449,7 +449,7 @@ impl Decoder { let enter_loop = stack_top == ONE; let parent_addr = self.block_stack.push(addr, BlockType::Loop(enter_loop), None); self.trace - .append_block_start(parent_addr, Operation::Loop, loop_body_hash, [ZERO; 4]); + .append_block_start(parent_addr, Operation::Loop, loop_body_hash, EMPTY_WORD); // mark this cycle as the cycle at which a new LOOP block has started (this may affect // block hash table). A loop block has a single child only if the body of the loop is @@ -490,7 +490,7 @@ impl Decoder { // push CALL block info onto the block stack and append a CALL row to the execution trace let parent_addr = self.block_stack.push(addr, BlockType::Call, Some(ctx_info)); - self.trace.append_block_start(parent_addr, Operation::Call, fn_hash, [ZERO; 4]); + self.trace.append_block_start(parent_addr, Operation::Call, fn_hash, EMPTY_WORD); // mark this cycle as the cycle at which a new CALL block began execution (this affects // block stack and block hash tables). A CALL block has only a single child. @@ -511,7 +511,7 @@ impl Decoder { // trace let parent_addr = self.block_stack.push(addr, BlockType::SysCall, Some(ctx_info)); self.trace - .append_block_start(parent_addr, Operation::SysCall, fn_hash, [ZERO; 4]); + .append_block_start(parent_addr, Operation::SysCall, fn_hash, EMPTY_WORD); // mark this cycle as the cycle at which a new SYSCALL block began execution (this affects // block stack and block hash tables). A SYSCALL block has only a single child. diff --git a/processor/src/decoder/tests.rs b/processor/src/decoder/tests.rs index b43206810e..89268ef98f 100644 --- a/processor/src/decoder/tests.rs +++ b/processor/src/decoder/tests.rs @@ -20,7 +20,7 @@ use rand_utils::rand_value; use vm_core::{ code_blocks::{CodeBlock, Span, OP_BATCH_SIZE}, utils::collections::Vec, - CodeBlockTable, StarkField, ONE, ZERO, + CodeBlockTable, StarkField, EMPTY_WORD, ONE, ZERO, }; // CONSTANTS @@ -468,16 +468,16 @@ fn join_block() { // at the end of the first SPAN, the hasher state is set to the hash of the first child assert_eq!(span1_hash, get_hasher_state1(&trace, 3)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 3)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 3)); // at the end of the second SPAN, the hasher state is set to the hash of the second child assert_eq!(span2_hash, get_hasher_state1(&trace, 6)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 6)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 6)); // at the end of the program, the hasher state is set to the hash of the entire program let program_hash: Word = program.hash().into(); assert_eq!(program_hash, get_hasher_state1(&trace, 7)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 7)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 7)); // HALT opcode and program hash gets propagated to the last row for i in 9..trace_len { @@ -550,12 +550,12 @@ fn split_block_true() { // at the end of the SPAN, the hasher state is set to the hash of the first child assert_eq!(span1_hash, get_hasher_state1(&trace, 3)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 3)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 3)); // at the end of the program, the hasher state is set to the hash of the entire program let program_hash: Word = program.hash().into(); assert_eq!(program_hash, get_hasher_state1(&trace, 4)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 4)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 4)); // HALT opcode and program hash gets propagated to the last row for i in 6..trace_len { @@ -621,12 +621,12 @@ fn split_block_false() { // at the end of the SPAN, the hasher state is set to the hash of the second child assert_eq!(span2_hash, get_hasher_state1(&trace, 3)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 3)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 3)); // at the end of the program, the hasher state is set to the hash of the entire program let program_hash: Word = program.hash().into(); assert_eq!(program_hash, get_hasher_state1(&trace, 4)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 4)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 4)); // HALT opcode and program hash gets propagated to the last row for i in 6..trace_len { @@ -690,7 +690,7 @@ fn loop_block() { // in the first row, the hasher state is set to the hash of the loop's body let loop_body_hash: Word = loop_body.hash().into(); assert_eq!(loop_body_hash, get_hasher_state1(&trace, 0)); - assert_eq!([ZERO; 4], get_hasher_state2(&trace, 0)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 0)); // at the end of the SPAN block, the hasher state is also set to the hash of the loops body, // and is_loop_body flag is also set to ONE @@ -757,13 +757,13 @@ fn loop_block_skip() { // in the first row, the hasher state is set to the hash of the loop's body let loop_body_hash: Word = loop_body.hash().into(); assert_eq!(loop_body_hash, get_hasher_state1(&trace, 0)); - assert_eq!([ZERO; 4], get_hasher_state2(&trace, 0)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 0)); // the hash of the program is located in the last END row; is_loop is not set to ONE because // we didn't enter the loop's body let program_hash: Word = program.hash().into(); assert_eq!(program_hash, get_hasher_state1(&trace, 1)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 1)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 1)); // HALT opcode and program hash gets propagated to the last row for i in 3..trace_len { @@ -822,7 +822,7 @@ fn loop_block_repeat() { // in the first row, the hasher state is set to the hash of the loop's body let loop_body_hash: Word = loop_body.hash().into(); assert_eq!(loop_body_hash, get_hasher_state1(&trace, 0)); - assert_eq!([ZERO; 4], get_hasher_state2(&trace, 0)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&trace, 0)); // at the end of the first iteration, the hasher state is also set to the hash of the loops // body, and is_loop_body flag is also set to ONE @@ -971,16 +971,16 @@ fn call_block() { // at the end of the first SPAN, the hasher state is set to the hash of the first child assert_eq!(first_span_hash, get_hasher_state1(&dec_trace, 6)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 6)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 6)); // in the 7th row, we start the CALL block which hash span2 as its only child let foo_root_hash: Word = foo_root.hash().into(); assert_eq!(foo_root_hash, get_hasher_state1(&dec_trace, 7)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 7)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 7)); // span2 ends in the 11th row assert_eq!(foo_root_hash, get_hasher_state1(&dec_trace, 11)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 11)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 11)); // CALL block ends in the 12th row; the second to last element of the hasher state // is set to ONE because we are exiting the CALL block @@ -989,16 +989,16 @@ fn call_block() { // internal JOIN block ends in the 13th row assert_eq!(join1_hash, get_hasher_state1(&dec_trace, 13)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 13)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 13)); // span3 ends in the 14th row assert_eq!(last_span_hash, get_hasher_state1(&dec_trace, 16)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 16)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 16)); // the program ends in the 17th row let program_hash: Word = program.hash().into(); assert_eq!(program_hash, get_hasher_state1(&dec_trace, 17)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 17)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 17)); // HALT opcode and program hash gets propagated to the last row for i in 18..trace_len { @@ -1065,7 +1065,7 @@ fn call_block() { // before the CALL operation is executed, we are in a root context and thus fn_hash is ZEROs. for i in 0..8 { - assert_eq!(get_fn_hash(&sys_trace, i), [ZERO; 4]); + assert_eq!(get_fn_hash(&sys_trace, i), EMPTY_WORD); } // inside the CALL block fn hash is set to the hash of the foo procedure @@ -1075,7 +1075,7 @@ fn call_block() { // after the CALL block is ended, we are back in the root context for i in 13..trace_len { - assert_eq!(get_fn_hash(&sys_trace, i), [ZERO; 4]); + assert_eq!(get_fn_hash(&sys_trace, i), EMPTY_WORD); } // --- check block execution hints ------------------------------------------------------------ @@ -1097,7 +1097,7 @@ fn call_block() { // --- check block stack table rows ----------------------------------------------------------- let call_ctx = - ExecutionContextInfo::new(0, [ZERO; 4], FMP_MIN + TWO, 17, overflow_addr_after_pad); + ExecutionContextInfo::new(0, EMPTY_WORD, FMP_MIN + TWO, 17, overflow_addr_after_pad); let expected_rows = vec![ BlockStackTableRow::new_test(INIT_ADDR, ZERO, false), BlockStackTableRow::new_test(join1_addr, INIT_ADDR, false), @@ -1242,12 +1242,12 @@ fn syscall_block() { // at the end of the first SPAN, the hasher state is set to the hash of the first child assert_eq!(first_span_hash, get_hasher_state1(&dec_trace, 6)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 6)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 6)); // in the 7th row, we start the CALL block which has bar_join as its only child let bar_root_hash: Word = bar_root.hash().into(); assert_eq!(bar_root_hash, get_hasher_state1(&dec_trace, 7)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 7)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 7)); // in the 8th row, the hasher state is set to hashes of (bar_span, foo_call) let bar_span_hash: Word = bar_span.hash().into(); @@ -1257,16 +1257,16 @@ fn syscall_block() { // at the end of the bar_span, the hasher state is set to the hash of the first child assert_eq!(bar_span_hash, get_hasher_state1(&dec_trace, 12)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 12)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 12)); // in the 13th row, we start the SYSCALL block which has foo_span as its only child let foo_root_hash: Word = foo_root.hash().into(); assert_eq!(foo_root_hash, get_hasher_state1(&dec_trace, 13)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 13)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 13)); // at the end of the foo_span_hash, the hasher state is set to the hash of the first child assert_eq!(foo_root_hash, get_hasher_state1(&dec_trace, 17)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 17)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 17)); // SYSCALL block ends in the 18th row; the last element of the hasher state // is set to ONE because we are exiting a SYSCALL block @@ -1275,7 +1275,7 @@ fn syscall_block() { // internal bar_join block ends in the 19th row assert_eq!(bar_root_hash, get_hasher_state1(&dec_trace, 19)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 19)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 19)); // CALL block ends in the 20th row; the second to last element of the hasher state // is set to ONE because we are exiting a CALL block @@ -1284,16 +1284,16 @@ fn syscall_block() { // internal JOIN block ends in the 21st row assert_eq!(inner_join_hash, get_hasher_state1(&dec_trace, 21)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 21)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 21)); // last span ends in the 24th row assert_eq!(last_span_hash, get_hasher_state1(&dec_trace, 24)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 24)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 24)); // the program ends in the 25th row let program_hash: Word = program.hash().into(); assert_eq!(program_hash, get_hasher_state1(&dec_trace, 25)); - assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&dec_trace, 25)); + assert_eq!(EMPTY_WORD, get_hasher_state2(&dec_trace, 25)); // HALT opcode and program hash gets propagated to the last row for i in 26..trace_len { @@ -1395,7 +1395,7 @@ fn syscall_block() { // before the CALL operation is executed, we are in a root context and thus fn_hash is ZEROs. for i in 0..8 { - assert_eq!(get_fn_hash(&sys_trace, i), [ZERO; 4]); + assert_eq!(get_fn_hash(&sys_trace, i), EMPTY_WORD); } // inside the CALL block (and the invoked from it SYSCALL block), fn hash is set to the hash @@ -1406,7 +1406,7 @@ fn syscall_block() { // after the CALL block is ended, we are back in the root context for i in 21..trace_len { - assert_eq!(get_fn_hash(&sys_trace, i), [ZERO; 4]); + assert_eq!(get_fn_hash(&sys_trace, i), EMPTY_WORD); } // --- check block execution hints ------------------------------------------------------------ @@ -1434,7 +1434,7 @@ fn syscall_block() { // --- check block stack table rows ----------------------------------------------------------- let call_ctx = - ExecutionContextInfo::new(0, [ZERO; 4], FMP_MIN + ONE, 17, overflow_addr_after_pad); + ExecutionContextInfo::new(0, EMPTY_WORD, FMP_MIN + ONE, 17, overflow_addr_after_pad); let syscall_ctx = ExecutionContextInfo::new(8, bar_root_hash, FMP_MIN + TWO, 16, ZERO); let expected_rows = vec![ BlockStackTableRow::new_test(INIT_ADDR, ZERO, false), @@ -1623,7 +1623,7 @@ fn build_op_batch_flags(num_groups: usize) -> [Felt; NUM_OP_BATCH_FLAGS] { // ------------------------------------------------------------------------------------------------ fn get_fn_hash(trace: &SystemTrace, row_idx: usize) -> Word { - let mut result = [ZERO; 4]; + let mut result = EMPTY_WORD; let trace = &trace[FN_HASH_RANGE]; for (element, column) in result.iter_mut().zip(trace) { *element = column[row_idx]; @@ -1650,7 +1650,7 @@ fn get_hasher_state(trace: &DecoderTrace, row_idx: usize) -> [Felt; NUM_HASHER_C } fn get_hasher_state1(trace: &DecoderTrace, row_idx: usize) -> Word { - let mut result = [ZERO; 4]; + let mut result = EMPTY_WORD; for (result, column) in result.iter_mut().zip(trace[HASHER_STATE_RANGE].iter()) { *result = column[row_idx]; } @@ -1658,7 +1658,7 @@ fn get_hasher_state1(trace: &DecoderTrace, row_idx: usize) -> Word { } fn get_hasher_state2(trace: &DecoderTrace, row_idx: usize) -> Word { - let mut result = [ZERO; 4]; + let mut result = EMPTY_WORD; for (result, column) in result.iter_mut().zip(trace[HASHER_STATE_RANGE].iter().skip(4)) { *result = column[row_idx]; } diff --git a/processor/src/decorators/adv_map_injectors.rs b/processor/src/decorators/adv_map_injectors.rs index aa65bbadbc..e7c8ddf698 100644 --- a/processor/src/decorators/adv_map_injectors.rs +++ b/processor/src/decorators/adv_map_injectors.rs @@ -2,7 +2,7 @@ use super::{AdviceProvider, ExecutionError, Process}; use vm_core::{ crypto::hash::{Rpo256, RpoDigest}, utils::collections::Vec, - Felt, StarkField, WORD_SIZE, ZERO, + Felt, StarkField, EMPTY_WORD, WORD_SIZE, }; // ADVICE INJECTORS @@ -36,7 +36,7 @@ where let mut values = Vec::with_capacity(((end_addr - start_addr) as usize) * WORD_SIZE); for addr in start_addr..end_addr { - let mem_value = self.chiplets.get_mem_value(ctx, addr).unwrap_or([ZERO; WORD_SIZE]); + let mem_value = self.chiplets.get_mem_value(ctx, addr).unwrap_or(EMPTY_WORD); values.extend_from_slice(&mem_value); } diff --git a/processor/src/decorators/tests.rs b/processor/src/decorators/tests.rs index ff6e40e50e..ad5098c1cf 100644 --- a/processor/src/decorators/tests.rs +++ b/processor/src/decorators/tests.rs @@ -1,5 +1,5 @@ use super::{ - super::{AdviceInputs, ExecutionOptions, Felt, FieldElement, Kernel, Operation, StarkField}, + super::{AdviceInputs, ExecutionOptions, Felt, Kernel, Operation, StarkField}, Process, }; use crate::{MemAdviceProvider, StackInputs, Word}; @@ -11,7 +11,7 @@ use vm_core::{ }, utils::collections::Vec, utils::IntoBytes, - AdviceInjector, Decorator, ONE, ZERO, + AdviceInjector, Decorator, EMPTY_WORD, ONE, ZERO, }; #[test] @@ -52,7 +52,7 @@ fn push_merkle_node() { leaves[1][1], leaves[1][0], Felt::new(2), - Felt::new(1), + ONE, tree.root()[3], tree.root()[2], tree.root()[1], @@ -165,13 +165,13 @@ fn inject_smtpeek() { let raw_b = 0b_11111111_11111111_00011111_11111111_10010110_10010011_11100000_00000000_u64; let key_b = build_key(raw_b); let process = prepare_smt_peek(key_b, &smt); - assert_eq!(build_expected(&[ZERO; 4]), process.stack.trace_state()); + assert_eq!(build_expected(&EMPTY_WORD), process.stack.trace_state()); // peeking another key with the same 16-bit prefix as key_a should return empty word let raw_c = 0b_00000000_11111111_10011111_11111111_10010110_10010011_11100000_00000000_u64; let key_c = build_key(raw_c); let process = prepare_smt_peek(key_c, &smt); - assert_eq!(build_expected(&[ZERO; 4]), process.stack.trace_state()); + assert_eq!(build_expected(&EMPTY_WORD), process.stack.trace_state()); } fn prepare_smt_peek(key: Word, smt: &TieredSmt) -> Process { @@ -188,7 +188,7 @@ fn prepare_smt_peek(key: Word, smt: &TieredSmt) -> Process { .collect::>(); let advice_inputs = AdviceInputs::default().with_merkle_store(store).with_map(adv_map); - let stack_inputs = build_stack_inputs(key, root, [ZERO; 4]); + let stack_inputs = build_stack_inputs(key, root, EMPTY_WORD); let mut process = build_process(stack_inputs, advice_inputs); process.execute_op(Operation::Noop).unwrap(); @@ -274,11 +274,11 @@ fn prepare_smt_set( // ================================================================================================ fn init_leaf(value: u64) -> Word { - [Felt::new(value), Felt::ZERO, Felt::ZERO, Felt::ZERO] + [Felt::new(value), ZERO, ZERO, ZERO] } fn build_expected(values: &[Felt]) -> [Felt; 16] { - let mut expected = [Felt::ZERO; 16]; + let mut expected = [ZERO; 16]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = value } diff --git a/processor/src/lib.rs b/processor/src/lib.rs index ecedcddea1..d82d4bbf6a 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -11,7 +11,8 @@ use miden_air::trace::{ pub use miden_air::{ExecutionOptions, ExecutionOptionsError}; pub use vm_core::{ chiplets::hasher::Digest, errors::InputError, utils::DeserializationError, AssemblyOp, Kernel, - Operation, Program, ProgramInfo, QuadExtension, StackInputs, StackOutputs, Word, + Operation, Program, ProgramInfo, QuadExtension, StackInputs, StackOutputs, Word, EMPTY_WORD, + ONE, ZERO, }; use vm_core::{ code_blocks::{ @@ -19,7 +20,7 @@ use vm_core::{ }, utils::collections::{BTreeMap, Vec}, AdviceInjector, CodeBlockTable, Decorator, DecoratorIterator, Felt, FieldElement, - StackTopState, StarkField, ONE, ZERO, + StackTopState, StarkField, }; use winter_prover::ColMatrix; diff --git a/processor/src/operations/crypto_ops.rs b/processor/src/operations/crypto_ops.rs index 75cc998ceb..5e312c821c 100644 --- a/processor/src/operations/crypto_ops.rs +++ b/processor/src/operations/crypto_ops.rs @@ -172,10 +172,10 @@ where #[cfg(test)] mod tests { use super::{ - super::{Felt, FieldElement, Operation, StarkField}, + super::{Felt, Operation, StarkField}, Process, }; - use crate::{AdviceInputs, StackInputs, Word}; + use crate::{AdviceInputs, StackInputs, Word, ZERO}; use rand_utils::rand_vector; use vm_core::{ chiplets::hasher::{apply_permutation, STATE_WIDTH}, @@ -409,11 +409,11 @@ mod tests { } fn init_node(value: u64) -> Word { - [Felt::new(value), Felt::ZERO, Felt::ZERO, Felt::ZERO] + [Felt::new(value), ZERO, ZERO, ZERO] } fn build_expected(values: &[Felt]) -> [Felt; 16] { - let mut expected = [Felt::ZERO; 16]; + let mut expected = [ZERO; 16]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = value; } @@ -421,7 +421,7 @@ mod tests { } fn build_expected_perm(values: &[u64]) -> [Felt; STATE_WIDTH] { - let mut expected = [Felt::ZERO; STATE_WIDTH]; + let mut expected = [ZERO; STATE_WIDTH]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = Felt::new(value); } diff --git a/processor/src/operations/ext2_ops.rs b/processor/src/operations/ext2_ops.rs index f8686ccd8e..44cbc6be72 100644 --- a/processor/src/operations/ext2_ops.rs +++ b/processor/src/operations/ext2_ops.rs @@ -34,10 +34,10 @@ where mod tests { type QuadFelt = QuadExtension; use super::{ - super::{Felt, FieldElement, Operation, STACK_TOP_SIZE}, + super::{Felt, Operation, STACK_TOP_SIZE}, Process, }; - use crate::StackInputs; + use crate::{StackInputs, ZERO}; use rand_utils::rand_value; use vm_core::QuadExtension; @@ -73,7 +73,7 @@ mod tests { // -------------------------------------------------------------------------------------------- fn build_expected(values: &[Felt]) -> [Felt; 16] { - let mut expected = [Felt::ZERO; 16]; + let mut expected = [ZERO; 16]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = value; } diff --git a/processor/src/operations/field_ops.rs b/processor/src/operations/field_ops.rs index 22eb9e9140..806abd2068 100644 --- a/processor/src/operations/field_ops.rs +++ b/processor/src/operations/field_ops.rs @@ -1,5 +1,5 @@ use super::{utils::assert_binary, AdviceProvider, ExecutionError, Felt, FieldElement, Process}; -use vm_core::{Operation, StarkField, ZERO}; +use vm_core::{Operation, StarkField, ONE, ZERO}; // FIELD OPERATIONS // ================================================================================================ @@ -46,7 +46,7 @@ where /// Returns an error if the value on the top of the stack is ZERO. pub(super) fn op_inv(&mut self) -> Result<(), ExecutionError> { let a = self.stack.get(0); - if a == Felt::ZERO { + if a == ZERO { return Err(ExecutionError::DivideByZero(self.system.clk())); } @@ -58,7 +58,7 @@ where /// Pops an element off the stack, adds ONE to it, and pushes the result back onto the stack. pub(super) fn op_incr(&mut self) -> Result<(), ExecutionError> { let a = self.stack.get(0); - self.stack.set(0, a + Felt::ONE); + self.stack.set(0, a + ONE); self.stack.copy_state(1); Ok(()) } @@ -75,10 +75,10 @@ where pub(super) fn op_and(&mut self) -> Result<(), ExecutionError> { let b = assert_binary(self.stack.get(0))?; let a = assert_binary(self.stack.get(1))?; - if a == Felt::ONE && b == Felt::ONE { - self.stack.set(0, Felt::ONE); + if a == ONE && b == ONE { + self.stack.set(0, ONE); } else { - self.stack.set(0, Felt::ZERO); + self.stack.set(0, ZERO); } self.stack.shift_left(2); Ok(()) @@ -93,10 +93,10 @@ where pub(super) fn op_or(&mut self) -> Result<(), ExecutionError> { let b = assert_binary(self.stack.get(0))?; let a = assert_binary(self.stack.get(1))?; - if a == Felt::ONE || b == Felt::ONE { - self.stack.set(0, Felt::ONE); + if a == ONE || b == ONE { + self.stack.set(0, ONE); } else { - self.stack.set(0, Felt::ZERO); + self.stack.set(0, ZERO); } self.stack.shift_left(2); Ok(()) @@ -109,7 +109,7 @@ where /// Returns an error if the value on the top of the stack is not a binary value. pub(super) fn op_not(&mut self) -> Result<(), ExecutionError> { let a = assert_binary(self.stack.get(0))?; - self.stack.set(0, Felt::ONE - a); + self.stack.set(0, ONE - a); self.stack.copy_state(1); Ok(()) } @@ -128,9 +128,9 @@ where let mut h0 = ZERO; if a == b { - self.stack.set(0, Felt::ONE); + self.stack.set(0, ONE); } else { - self.stack.set(0, Felt::ZERO); + self.stack.set(0, ZERO); // setting h0 to the inverse of the difference between the top two elements of the stack. h0 = (b - a).inv(); } @@ -151,12 +151,12 @@ where // otherwise set it to the inverse of the top element in the stack. let mut h0 = ZERO; - if a == Felt::ZERO { - self.stack.set(0, Felt::ONE); + if a == ZERO { + self.stack.set(0, ONE); } else { // setting h0 to the inverse of the top element of the stack. h0 = a.inv(); - self.stack.set(0, Felt::ZERO); + self.stack.set(0, ZERO); } // save h0 in the decoder helper register. @@ -295,7 +295,7 @@ mod tests { let mut process = Process::new_dummy(stack); // invert the top value - if b != Felt::ZERO { + if b != ZERO { process.execute_op(Operation::Inv).unwrap(); let expected = build_expected(&[a.inv(), b, c]); @@ -318,7 +318,7 @@ mod tests { // negate the top value process.execute_op(Operation::Incr).unwrap(); - let expected = build_expected(&[a + Felt::ONE, b, c]); + let expected = build_expected(&[a + ONE, b, c]); assert_eq!(STACK_TOP_SIZE, process.stack.depth()); assert_eq!(2, process.stack.current_clk()); @@ -335,7 +335,7 @@ mod tests { let mut process = Process::new_dummy(stack); process.execute_op(Operation::And).unwrap(); - let expected = build_expected(&[Felt::ZERO, Felt::new(2)]); + let expected = build_expected(&[ZERO, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- test 1 AND 0 --------------------------------------------------- @@ -343,7 +343,7 @@ mod tests { let mut process = Process::new_dummy(stack); process.execute_op(Operation::And).unwrap(); - let expected = build_expected(&[Felt::ZERO, Felt::new(2)]); + let expected = build_expected(&[ZERO, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- test 0 AND 1 --------------------------------------------------- @@ -351,7 +351,7 @@ mod tests { let mut process = Process::new_dummy(stack); process.execute_op(Operation::And).unwrap(); - let expected = build_expected(&[Felt::ZERO, Felt::new(2)]); + let expected = build_expected(&[ZERO, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- test 1 AND 1 --------------------------------------------------- @@ -359,7 +359,7 @@ mod tests { let mut process = Process::new_dummy(stack); process.execute_op(Operation::And).unwrap(); - let expected = build_expected(&[Felt::ONE, Felt::new(2)]); + let expected = build_expected(&[ONE, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- first operand is not binary ------------------------------------ @@ -384,7 +384,7 @@ mod tests { let mut process = Process::new_dummy(stack); process.execute_op(Operation::Or).unwrap(); - let expected = build_expected(&[Felt::ZERO, Felt::new(2)]); + let expected = build_expected(&[ZERO, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- test 1 OR 0 --------------------------------------------------- @@ -392,7 +392,7 @@ mod tests { let mut process = Process::new_dummy(stack); process.execute_op(Operation::Or).unwrap(); - let expected = build_expected(&[Felt::ONE, Felt::new(2)]); + let expected = build_expected(&[ONE, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- test 0 OR 1 --------------------------------------------------- @@ -400,7 +400,7 @@ mod tests { let mut process = Process::new_dummy(stack); process.execute_op(Operation::Or).unwrap(); - let expected = build_expected(&[Felt::ONE, Felt::new(2)]); + let expected = build_expected(&[ONE, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- test 1 OR 0 --------------------------------------------------- @@ -408,7 +408,7 @@ mod tests { let mut process = Process::new_dummy(stack); process.execute_op(Operation::Or).unwrap(); - let expected = build_expected(&[Felt::ONE, Felt::new(2)]); + let expected = build_expected(&[ONE, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- first operand is not binary ------------------------------------ @@ -432,14 +432,14 @@ mod tests { let stack = StackInputs::try_from_values([2, 0]).unwrap(); let mut process = Process::new_dummy(stack); process.execute_op(Operation::Not).unwrap(); - let expected = build_expected(&[Felt::ONE, Felt::new(2)]); + let expected = build_expected(&[ONE, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- test NOT 1 ---------------------------------------------------- let stack = StackInputs::try_from_values([2, 1]).unwrap(); let mut process = Process::new_dummy(stack); process.execute_op(Operation::Not).unwrap(); - let expected = build_expected(&[Felt::ZERO, Felt::new(2)]); + let expected = build_expected(&[ZERO, Felt::new(2)]); assert_eq!(expected, process.stack.trace_state()); // --- operand is not binary ------------------------------------------ @@ -460,7 +460,7 @@ mod tests { Process::new_dummy_with_inputs_and_decoder_helpers(stack_inputs, advice_inputs); process.execute_op(Operation::Eq).unwrap(); - let expected = build_expected(&[Felt::ONE, Felt::new(3)]); + let expected = build_expected(&[ONE, Felt::new(3)]); assert_eq!(expected, process.stack.trace_state()); // --- test when top two values are not equal ------------------------- @@ -470,7 +470,7 @@ mod tests { Process::new_dummy_with_inputs_and_decoder_helpers(stack_inputs, advice_inputs); process.execute_op(Operation::Eq).unwrap(); - let expected = build_expected(&[Felt::ZERO, Felt::new(3)]); + let expected = build_expected(&[ZERO, Felt::new(3)]); assert_eq!(expected, process.stack.trace_state()); // --- calling EQ with a stack of minimum depth is a ok --------------- @@ -490,7 +490,7 @@ mod tests { Process::new_dummy_with_inputs_and_decoder_helpers(stack_inputs, advice_inputs); process.execute_op(Operation::Eqz).unwrap(); - let expected = build_expected(&[Felt::ONE, Felt::new(3)]); + let expected = build_expected(&[ONE, Felt::new(3)]); assert_eq!(expected, process.stack.trace_state()); // --- test when top is not zero -------------------------------------- @@ -500,7 +500,7 @@ mod tests { Process::new_dummy_with_inputs_and_decoder_helpers(stack_inputs, advice_inputs); process.execute_op(Operation::Eqz).unwrap(); - let expected = build_expected(&[Felt::ZERO, Felt::new(3)]); + let expected = build_expected(&[ZERO, Felt::new(3)]); assert_eq!(expected, process.stack.trace_state()); } @@ -567,7 +567,7 @@ mod tests { } fn build_expected(values: &[Felt]) -> [Felt; 16] { - let mut expected = [Felt::ZERO; 16]; + let mut expected = [ZERO; 16]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = value; } diff --git a/processor/src/operations/fri_ops.rs b/processor/src/operations/fri_ops.rs index a5e824e3de..4b99b28915 100644 --- a/processor/src/operations/fri_ops.rs +++ b/processor/src/operations/fri_ops.rs @@ -192,7 +192,7 @@ where /// Determines tau factor (needed to compute x value) for the specified domain segment. fn get_tau_factor(domain_segment: usize) -> Felt { match domain_segment { - 0 => Felt::ONE, + 0 => ONE, 1 => TAU_INV, 2 => TAU2_INV, 3 => TAU3_INV, diff --git a/processor/src/operations/stack_ops.rs b/processor/src/operations/stack_ops.rs index 20a3629ee8..c341551ae5 100644 --- a/processor/src/operations/stack_ops.rs +++ b/processor/src/operations/stack_ops.rs @@ -1,6 +1,5 @@ -use super::{ - AdviceProvider, ExecutionError, Felt, FieldElement, Process, StarkField, STACK_TOP_SIZE, -}; +use super::{AdviceProvider, ExecutionError, Process, StarkField, STACK_TOP_SIZE}; +use crate::ZERO; impl Process where @@ -10,7 +9,7 @@ where // -------------------------------------------------------------------------------------------- /// Pushes a ZERO onto the stack. pub(super) fn op_pad(&mut self) -> Result<(), ExecutionError> { - self.stack.set(0, Felt::ZERO); + self.stack.set(0, ZERO); self.stack.shift_right(0); Ok(()) } @@ -304,10 +303,10 @@ where #[cfg(test)] mod tests { use super::{ - super::{FieldElement, Operation, Process}, - Felt, STACK_TOP_SIZE, + super::{Operation, Process}, + STACK_TOP_SIZE, }; - use crate::StackInputs; + use crate::{Felt, StackInputs, ONE, ZERO}; #[test] fn op_pad() { @@ -315,7 +314,7 @@ mod tests { let mut process = Process::new_dummy(stack); // push one item onto the stack - process.execute_op(Operation::Push(Felt::ONE)).unwrap(); + process.execute_op(Operation::Push(ONE)).unwrap(); let expected = build_expected(&[1]); assert_eq!(expected, process.stack.trace_state()); @@ -341,7 +340,7 @@ mod tests { // push a few items onto the stack let stack = StackInputs::default(); let mut process = Process::new_dummy(stack); - process.execute_op(Operation::Push(Felt::ONE)).unwrap(); + process.execute_op(Operation::Push(ONE)).unwrap(); process.execute_op(Operation::Push(Felt::new(2))).unwrap(); // drop the first value @@ -366,7 +365,7 @@ mod tests { let mut process = Process::new_dummy(stack); // push one item onto the stack - process.execute_op(Operation::Push(Felt::ONE)).unwrap(); + process.execute_op(Operation::Push(ONE)).unwrap(); let expected = build_expected(&[1]); assert_eq!(expected, process.stack.trace_state()); @@ -381,7 +380,7 @@ mod tests { process.execute_op(Operation::Drop).unwrap(); // put 15 more items onto the stack - let mut expected = [Felt::ONE; 16]; + let mut expected = [ONE; 16]; for i in 2..17 { process.execute_op(Operation::Push(Felt::new(i))).unwrap(); expected[16 - i as usize] = Felt::new(i); @@ -390,13 +389,13 @@ mod tests { // duplicate last stack item process.execute_op(Operation::Dup15).unwrap(); - assert_eq!(Felt::ONE, process.stack.trace_state()[0]); + assert_eq!(ONE, process.stack.trace_state()[0]); assert_eq!(&expected[..15], &process.stack.trace_state()[1..]); // duplicate 8th stack item process.execute_op(Operation::Dup7).unwrap(); assert_eq!(Felt::new(10), process.stack.trace_state()[0]); - assert_eq!(Felt::new(1), process.stack.trace_state()[1]); + assert_eq!(ONE, process.stack.trace_state()[1]); assert_eq!(&expected[..14], &process.stack.trace_state()[2..]); // remove 4 items off the stack @@ -408,8 +407,8 @@ mod tests { assert_eq!(STACK_TOP_SIZE + 15, process.stack.depth()); assert_eq!(&expected[2..], &process.stack.trace_state()[..14]); - assert_eq!(Felt::ONE, process.stack.trace_state()[14]); - assert_eq!(Felt::ZERO, process.stack.trace_state()[15]); + assert_eq!(ONE, process.stack.trace_state()[14]); + assert_eq!(ZERO, process.stack.trace_state()[15]); } #[test] @@ -602,7 +601,7 @@ mod tests { // -------------------------------------------------------------------------------------------- fn build_expected(values: &[u64]) -> [Felt; 16] { - let mut expected = [Felt::ZERO; 16]; + let mut expected = [ZERO; 16]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = Felt::new(value); } diff --git a/processor/src/operations/sys_ops.rs b/processor/src/operations/sys_ops.rs index b380fd512f..a2c3528806 100644 --- a/processor/src/operations/sys_ops.rs +++ b/processor/src/operations/sys_ops.rs @@ -1,6 +1,9 @@ use super::{ - super::system::{FMP_MAX, FMP_MIN}, - AdviceProvider, ExecutionError, Felt, FieldElement, Process, StarkField, + super::{ + system::{FMP_MAX, FMP_MIN}, + ONE, + }, + AdviceProvider, ExecutionError, Felt, Process, StarkField, }; // SYSTEM OPERATIONS @@ -15,7 +18,7 @@ where /// # Errors /// Returns an error if the popped value is not ONE. pub(super) fn op_assert(&mut self) -> Result<(), ExecutionError> { - if self.stack.get(0) != Felt::ONE { + if self.stack.get(0) != ONE { return Err(ExecutionError::FailedAssertion(self.system.clk())); } self.stack.shift_left(1); @@ -112,10 +115,8 @@ where #[cfg(test)] mod tests { - use super::{ - super::Operation, super::STACK_TOP_SIZE, Felt, FieldElement, Process, FMP_MAX, FMP_MIN, - }; - use crate::StackInputs; + use super::{super::Operation, super::STACK_TOP_SIZE, Felt, Process, FMP_MAX, FMP_MIN}; + use crate::{StackInputs, ONE, ZERO}; const MAX_PROC_LOCALS: u64 = 2_u64.pow(31) - 1; @@ -123,7 +124,7 @@ mod tests { fn op_assert() { // calling assert with a minimum stack should be an ok, as long as the top value is ONE let mut process = Process::new_dummy_with_empty_stack(); - process.execute_op(Operation::Push(Felt::ONE)).unwrap(); + process.execute_op(Operation::Push(ONE)).unwrap(); process.execute_op(Operation::Swap).unwrap(); process.execute_op(Operation::Drop).unwrap(); @@ -189,7 +190,7 @@ mod tests { process.execute_op(Operation::FmpUpdate).unwrap(); // compute address of the first local - process.execute_op(Operation::Push(-Felt::new(1))).unwrap(); + process.execute_op(Operation::Push(-ONE)).unwrap(); process.execute_op(Operation::FmpAdd).unwrap(); let expected = build_expected_stack(&[FMP_MIN + 1]); @@ -257,7 +258,7 @@ mod tests { // -------------------------------------------------------------------------------------------- fn build_expected_stack(values: &[u64]) -> [Felt; 16] { - let mut expected = [Felt::ZERO; 16]; + let mut expected = [ZERO; 16]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = Felt::new(value); } diff --git a/processor/src/operations/u32_ops.rs b/processor/src/operations/u32_ops.rs index 7c14d768ec..97e4e5e9b9 100644 --- a/processor/src/operations/u32_ops.rs +++ b/processor/src/operations/u32_ops.rs @@ -2,6 +2,7 @@ use super::{ super::utils::{split_element, split_u32_into_u16}, AdviceProvider, ExecutionError, Felt, FieldElement, Operation, Process, StarkField, }; +use crate::ZERO; impl Process where @@ -92,7 +93,7 @@ where // Force this operation to consume 4 range checks, even though only `lo` is needed. // This is required for making the constraints more uniform and grouping the opcodes of // operations requiring range checks under a common degree-4 prefix. - self.add_range_checks(Operation::U32sub, c, Felt::ZERO, false); + self.add_range_checks(Operation::U32sub, c, ZERO, false); self.stack.set(0, d); self.stack.set(1, c); @@ -214,7 +215,7 @@ where // save the range check lookups to the decoder's user operation helper columns. let mut helper_values = - [Felt::from(t0), Felt::from(t1), Felt::from(t2), Felt::from(t3), Felt::ZERO]; + [Felt::from(t0), Felt::from(t1), Felt::from(t2), Felt::from(t3), ZERO]; if check_element_validity { let m = (Felt::from(u32::MAX) - hi).inv(); @@ -231,10 +232,10 @@ where #[cfg(test)] mod tests { use super::{ - super::{Felt, FieldElement, Operation}, + super::{Felt, Operation}, split_u32_into_u16, Process, }; - use crate::StackInputs; + use crate::{StackInputs, ZERO}; use miden_air::trace::{decoder::NUM_USER_OP_HELPERS, stack::STACK_TOP_SIZE}; use rand_utils::rand_value; @@ -251,7 +252,7 @@ mod tests { let lo = (a as u32) as u64; process.execute_op(Operation::U32split).unwrap(); - let mut expected = [Felt::ZERO; 16]; + let mut expected = [ZERO; 16]; expected[0] = Felt::new(hi); expected[1] = Felt::new(lo); assert_eq!(expected, process.stack.trace_state()); @@ -264,7 +265,7 @@ mod tests { let lo = (b as u32) as u64; process.execute_op(Operation::U32split).unwrap(); - let mut expected = [Felt::ZERO; 16]; + let mut expected = [ZERO; 16]; expected[0] = Felt::new(hi); expected[1] = Felt::new(lo); expected[2] = Felt::new(a); @@ -455,7 +456,7 @@ mod tests { } fn build_expected(values: &[u32]) -> [Felt; STACK_TOP_SIZE] { - let mut expected = [Felt::ZERO; STACK_TOP_SIZE]; + let mut expected = [ZERO; STACK_TOP_SIZE]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = Felt::new(value as u64); } @@ -463,7 +464,7 @@ mod tests { } fn build_expected_helper_registers(values: &[u32]) -> [Felt; NUM_USER_OP_HELPERS] { - let mut expected = [Felt::ZERO; NUM_USER_OP_HELPERS]; + let mut expected = [ZERO; NUM_USER_OP_HELPERS]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = Felt::new(value as u64); } diff --git a/processor/src/operations/utils.rs b/processor/src/operations/utils.rs index 10b37d9af0..b48530d1da 100644 --- a/processor/src/operations/utils.rs +++ b/processor/src/operations/utils.rs @@ -1,9 +1,10 @@ -use super::{ExecutionError, Felt, FieldElement}; +use super::{ExecutionError, Felt}; +use crate::{ONE, ZERO}; /// TODO: add docs #[inline(always)] pub fn assert_binary(value: Felt) -> Result { - if value != Felt::ZERO && value != Felt::ONE { + if value != ZERO && value != ONE { Err(ExecutionError::NotBinaryValue(value)) } else { Ok(value) diff --git a/processor/src/stack/tests.rs b/processor/src/stack/tests.rs index 8b9a080fd6..4319ca4326 100644 --- a/processor/src/stack/tests.rs +++ b/processor/src/stack/tests.rs @@ -53,7 +53,7 @@ fn initialize_overflow() { ]; let init_addr = Felt::MODULUS - 3; let expected_overflow_rows = vec![ - OverflowTableRow::new(init_addr, Felt::new(1), ZERO), + OverflowTableRow::new(init_addr, ONE, ZERO), OverflowTableRow::new(init_addr + 1, Felt::new(2), Felt::new(init_addr)), OverflowTableRow::new(init_addr + 2, Felt::new(3), Felt::new(init_addr + 1)), ]; diff --git a/processor/src/system/mod.rs b/processor/src/system/mod.rs index 93836af078..b6a568f09c 100644 --- a/processor/src/system/mod.rs +++ b/processor/src/system/mod.rs @@ -1,4 +1,6 @@ -use super::{ExecutionError, Felt, FieldElement, StarkField, SysTrace, Vec, Word, ONE, ZERO}; +use super::{ + ExecutionError, Felt, FieldElement, StarkField, SysTrace, Vec, Word, EMPTY_WORD, ONE, ZERO, +}; #[cfg(test)] mod tests; @@ -65,7 +67,7 @@ impl System { ctx: 0, fmp, in_syscall: false, - fn_hash: [ZERO; 4], + fn_hash: EMPTY_WORD, clk_trace: Felt::zeroed_vector(init_trace_capacity), ctx_trace: Felt::zeroed_vector(init_trace_capacity), fmp_trace, @@ -265,7 +267,7 @@ impl System { // complete the fn hash columns by filling them with ZEROs as program execution must always // end in the root context. - debug_assert_eq!(self.fn_hash, [ZERO; 4]); + debug_assert_eq!(self.fn_hash, EMPTY_WORD); for mut column in self.fn_hash_trace.into_iter() { column.resize(trace_len, ZERO); trace.push(column); diff --git a/processor/src/trace/decoder/tests.rs b/processor/src/trace/decoder/tests.rs index 98b4f9cb71..44ec59dd6e 100644 --- a/processor/src/trace/decoder/tests.rs +++ b/processor/src/trace/decoder/tests.rs @@ -620,7 +620,7 @@ fn decoder_p3_trace_one_batch() { OpGroupTableRow::new(ONE, Felt::new(3), ONE).to_value(&trace.main_trace, &alphas); let g2_value = OpGroupTableRow::new(ONE, Felt::new(2), Felt::new(2)).to_value(&trace.main_trace, &alphas); - let g3_value = OpGroupTableRow::new(ONE, Felt::new(1), build_op_group(&ops[9..])) + let g3_value = OpGroupTableRow::new(ONE, ONE, build_op_group(&ops[9..])) .to_value(&trace.main_trace, &alphas); let expected_value = g1_value * g2_value * g3_value; assert_eq!(expected_value, p3[1]); @@ -703,8 +703,7 @@ fn decoder_p3_trace_two_batches() { let b1_values = [ OpGroupTableRow::new(batch1_addr, Felt::new(3), iv[7]).to_value(&trace.main_trace, &alphas), OpGroupTableRow::new(batch1_addr, Felt::new(2), iv[8]).to_value(&trace.main_trace, &alphas), - OpGroupTableRow::new(batch1_addr, Felt::new(1), op_group3) - .to_value(&trace.main_trace, &alphas), + OpGroupTableRow::new(batch1_addr, ONE, op_group3).to_value(&trace.main_trace, &alphas), ]; let mut expected_value: Felt = b1_values.iter().fold(ONE, |acc, &val| acc * val); assert_eq!(expected_value, p3[10]); diff --git a/processor/src/trace/mod.rs b/processor/src/trace/mod.rs index 73abf11ea4..466deddd91 100644 --- a/processor/src/trace/mod.rs +++ b/processor/src/trace/mod.rs @@ -26,6 +26,8 @@ mod decoder; #[cfg(test)] mod tests; +#[cfg(test)] +use super::EMPTY_WORD; // CONSTANTS // ================================================================================================ @@ -180,7 +182,7 @@ impl ExecutionTrace { where A: AdviceProvider, { - let rng = RpoRandomCoin::new(&[ZERO; 4]); + let rng = RpoRandomCoin::new(&EMPTY_WORD); finalize_trace(process, rng) } } diff --git a/processor/src/trace/tests/chiplets/hasher.rs b/processor/src/trace/tests/chiplets/hasher.rs index c95f2a3b47..2cbc15d0d4 100644 --- a/processor/src/trace/tests/chiplets/hasher.rs +++ b/processor/src/trace/tests/chiplets/hasher.rs @@ -682,7 +682,7 @@ fn extract_control_block_domain_from_trace(trace: &ExecutionTrace, row: usize) - if control_block_initializers.contains(&opcode_value) { Felt::from(opcode_value) } else { - Felt::ZERO + ZERO } } @@ -705,5 +705,5 @@ fn init_leaves(values: &[u64]) -> Vec { /// Initializes a Merkle tree leaf with the specified value. fn init_leaf(value: u64) -> Word { - [Felt::new(value), Felt::ZERO, Felt::ZERO, Felt::ZERO] + [Felt::new(value), ZERO, ZERO, ZERO] } diff --git a/processor/src/trace/tests/range.rs b/processor/src/trace/tests/range.rs index 653fdce0fc..c86855b772 100644 --- a/processor/src/trace/tests/range.rs +++ b/processor/src/trace/tests/range.rs @@ -25,8 +25,8 @@ fn b_range_trace_stack() { // --- Check the stack processor's range check lookups. --------------------------------------- // Before any range checks are executed, the value in b_range should be one. - assert_eq!(Felt::ONE, b_range[0]); - assert_eq!(Felt::ONE, b_range[1]); + assert_eq!(ONE, b_range[0]); + assert_eq!(ONE, b_range[1]); // The first range check lookup from the stack will happen when the add operation is executed, // at cycle 1. (The trace begins by executing `span`). It must be subtracted out of `b_range`. @@ -61,7 +61,7 @@ fn b_range_trace_stack() { // --- Check the last value of the b_range column is one. ------------------------------------------ let last_row = b_range.len() - NUM_RAND_ROWS - 1; - assert_eq!(Felt::ONE, b_range[last_row]); + assert_eq!(ONE, b_range[last_row]); } /// This test checks that range check lookups from memory operations are balanced by the diff --git a/prover/src/gpu.rs b/prover/src/gpu.rs index 6c15c40402..3f61c71475 100644 --- a/prover/src/gpu.rs +++ b/prover/src/gpu.rs @@ -12,7 +12,7 @@ use pollster::block_on; use processor::{ crypto::{RandomCoin, Rpo256, RpoDigest}, math::{fft, Felt}, - ExecutionTrace, + ExecutionTrace, ONE, }; use std::time::Instant; use winter_prover::{ @@ -108,7 +108,7 @@ where let rpo_pad_column = num_base_columns % RPO_RATE; rpo_padded_segment = unsafe { page_aligned_uninit_vector(lde_domain_size) }; rpo_padded_segment.copy_from_slice(segment); - rpo_padded_segment.iter_mut().for_each(|row| row[rpo_pad_column] = Felt::ONE); + rpo_padded_segment.iter_mut().for_each(|row| row[rpo_pad_column] = ONE); row_hasher.update(&rpo_padded_segment); assert!(lde_segment_iter.next().is_none(), "padded segment should be the last"); break; @@ -200,7 +200,7 @@ where let rpo_pad_column = num_base_columns % RPO_RATE; rpo_padded_segment = unsafe { page_aligned_uninit_vector(lde_domain_size) }; rpo_padded_segment.copy_from_slice(segment); - rpo_padded_segment.iter_mut().for_each(|row| row[rpo_pad_column] = Felt::ONE); + rpo_padded_segment.iter_mut().for_each(|row| row[rpo_pad_column] = ONE); row_hasher.update(&rpo_padded_segment); assert_eq!(segments.len() - 1, segment_idx, "padded segment should be the last"); break; diff --git a/stdlib/tests/collections/mmr.rs b/stdlib/tests/collections/mmr.rs index a0d8694c19..a3a1be6925 100644 --- a/stdlib/tests/collections/mmr.rs +++ b/stdlib/tests/collections/mmr.rs @@ -3,7 +3,7 @@ use test_utils::{ init_merkle_leaf, init_merkle_leaves, MerkleError, MerkleStore, MerkleTree, Mmr, NodeIndex, RpoDigest, }, - hash_elements, stack_to_ints, Felt, StarkField, Word, ZERO, + hash_elements, stack_to_ints, Felt, StarkField, Word, EMPTY_WORD, ONE, ZERO, }; // TESTS @@ -345,23 +345,23 @@ fn test_mmr_unpack() { let hash_data: [[Felt; 4]; 16] = [ // 3 peaks. These hashes are invalid, we can't produce data for any of these peaks (only // for testing) - [ZERO, ZERO, ZERO, Felt::new(1)], + [ZERO, ZERO, ZERO, ONE], [ZERO, ZERO, ZERO, Felt::new(2)], [ZERO, ZERO, ZERO, Felt::new(3)], // Padding, the MMR is padded to a minimum length o 16 - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, ]; let hash = hash_elements(&hash_data.concat()); @@ -407,23 +407,23 @@ fn test_mmr_unpack_invalid_hash() { let mut hash_data: [[Felt; 4]; 16] = [ // 3 peaks. These hashes are invalid, we can't produce data for any of these peaks (only // for testing) - [ZERO, ZERO, ZERO, Felt::new(1)], + [ZERO, ZERO, ZERO, ONE], [ZERO, ZERO, ZERO, Felt::new(2)], [ZERO, ZERO, ZERO, Felt::new(3)], // Padding, the MMR is padded to a minimum length o 16 - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], - [ZERO, ZERO, ZERO, ZERO], + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, + EMPTY_WORD, ]; let hash = hash_elements(&hash_data.concat()); @@ -438,7 +438,7 @@ fn test_mmr_unpack_invalid_hash() { let store = MerkleStore::new(); // corrupt the data, this changes the hash and the commitment check must fail - hash_data[0][0] = hash_data[0][0] + Felt::new(1); + hash_data[0][0] = hash_data[0][0] + ONE; let mut map_data: Vec = Vec::with_capacity(hash_data.len() + 1); map_data.extend_from_slice(&[Felt::new(0b10101), ZERO, ZERO, ZERO]); // 3 peaks, 21 leaves @@ -467,7 +467,7 @@ fn test_mmr_unpack_large_mmr() { let hash_data: [[Felt; 4]; 18] = [ // These hashes are invalid, we can't produce data for any of these peaks (only for // testing) - [ZERO, ZERO, ZERO, Felt::new(1)], + [ZERO, ZERO, ZERO, ONE], [ZERO, ZERO, ZERO, Felt::new(2)], [ZERO, ZERO, ZERO, Felt::new(3)], [ZERO, ZERO, ZERO, Felt::new(4)], @@ -485,7 +485,7 @@ fn test_mmr_unpack_large_mmr() { [ZERO, ZERO, ZERO, Felt::new(16)], // Padding, peaks greater than 16 are padded to an even number [ZERO, ZERO, ZERO, Felt::new(17)], - [ZERO, ZERO, ZERO, ZERO], + EMPTY_WORD, ]; let hash = hash_elements(&hash_data.concat()); @@ -617,7 +617,7 @@ fn test_mmr_pack() { #[rustfmt::skip] hash_data.extend_from_slice( &[ - Felt::new(1), ZERO, ZERO, ZERO, // peak1 + ONE, ZERO, ZERO, ZERO, // peak1 Felt::new(2), ZERO, ZERO, ZERO, // peak2 ]); hash_data.resize(16 * 4, ZERO); // padding data @@ -680,7 +680,7 @@ fn test_mmr_two() { ); let mut mmr = Mmr::new(); - mmr.add([Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)].into()); + mmr.add([ONE, Felt::new(2), Felt::new(3), Felt::new(4)].into()); mmr.add([Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)].into()); let accumulator = mmr.accumulator(); @@ -715,13 +715,13 @@ fn test_mmr_large() { ); let mut mmr = Mmr::new(); - mmr.add([Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(1)].into()); - mmr.add([Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(2)].into()); - mmr.add([Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(3)].into()); - mmr.add([Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(4)].into()); - mmr.add([Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(5)].into()); - mmr.add([Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(6)].into()); - mmr.add([Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(7)].into()); + mmr.add([ZERO, ZERO, ZERO, ONE].into()); + mmr.add([ZERO, ZERO, ZERO, Felt::new(2)].into()); + mmr.add([ZERO, ZERO, ZERO, Felt::new(3)].into()); + mmr.add([ZERO, ZERO, ZERO, Felt::new(4)].into()); + mmr.add([ZERO, ZERO, ZERO, Felt::new(5)].into()); + mmr.add([ZERO, ZERO, ZERO, Felt::new(6)].into()); + mmr.add([ZERO, ZERO, ZERO, Felt::new(7)].into()); let accumulator = mmr.accumulator(); @@ -739,13 +739,13 @@ fn test_mmr_large_add_roundtrip() { let mmr_ptr = 1000_u32; let mut mmr: Mmr = Mmr::from([ - [Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(1)].into(), - [Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(2)].into(), - [Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(3)].into(), - [Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(4)].into(), - [Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(5)].into(), - [Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(6)].into(), - [Felt::new(0), Felt::new(0), Felt::new(0), Felt::new(7)].into(), + [ZERO, ZERO, ZERO, ONE].into(), + [ZERO, ZERO, ZERO, Felt::new(2)].into(), + [ZERO, ZERO, ZERO, Felt::new(3)].into(), + [ZERO, ZERO, ZERO, Felt::new(4)].into(), + [ZERO, ZERO, ZERO, Felt::new(5)].into(), + [ZERO, ZERO, ZERO, Felt::new(6)].into(), + [ZERO, ZERO, ZERO, Felt::new(7)].into(), ]); let old_accumulator = mmr.accumulator(); diff --git a/stdlib/tests/collections/mod.rs b/stdlib/tests/collections/mod.rs index ee5a75e220..33bc04890c 100644 --- a/stdlib/tests/collections/mod.rs +++ b/stdlib/tests/collections/mod.rs @@ -1,6 +1,6 @@ use test_utils::{ crypto::{MerkleStore, SimpleSmt}, - Felt, StarkField, TestError, Word, ONE, ZERO, + Felt, StarkField, TestError, Word, EMPTY_WORD, ONE, ZERO, }; mod mmr; diff --git a/stdlib/tests/collections/smt64.rs b/stdlib/tests/collections/smt64.rs index ec5fb25a62..3aa2aade6f 100644 --- a/stdlib/tests/collections/smt64.rs +++ b/stdlib/tests/collections/smt64.rs @@ -1,4 +1,4 @@ -use super::{Felt, MerkleStore, SimpleSmt, StarkField, TestError, Word, ONE, ZERO}; +use super::{Felt, MerkleStore, SimpleSmt, StarkField, TestError, Word, EMPTY_WORD, ONE, ZERO}; use crate::build_test; // TEST DATA @@ -7,7 +7,7 @@ use crate::build_test; const LEAVES: [(u64, Word); 5] = [ ( 0b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111_u64, - [Felt::new(1), ZERO, ZERO, ZERO], + [ONE, ZERO, ZERO, ZERO], ), ( // different from the first key starting from the first bit @@ -80,7 +80,7 @@ fn insert() { build_test!(source, &init_stack, &[], store, vec![]).expect_stack(&final_stack); // try to insert an invalid value - let value = [ZERO; 4]; + let value = EMPTY_WORD; let (init_stack, _, store) = prepare_insert_or_set(index, value, &mut smt); build_test!(source, &init_stack, &[], store, vec![]) .expect_error(TestError::ExecutionError("FailedAssertion")); @@ -115,7 +115,7 @@ fn set() { // setting to [ZERO; 4] should return the tree to the prior state for (index, old_value) in LEAVES.iter().rev() { - let value = [ZERO; 4]; + let value = EMPTY_WORD; let (init_stack, final_stack, store) = prepare_insert_or_set(*index, value, &mut smt); let expected_final_stack = diff --git a/stdlib/tests/crypto/fri/remainder.rs b/stdlib/tests/crypto/fri/remainder.rs index 116cd5ea87..cb6429a9fb 100644 --- a/stdlib/tests/crypto/fri/remainder.rs +++ b/stdlib/tests/crypto/fri/remainder.rs @@ -1,6 +1,6 @@ use crate::build_test; use test_utils::{ - math::fft, rand::rand_vector, test_case, Felt, FieldElement, QuadFelt, StarkField, + math::fft, rand::rand_vector, test_case, Felt, FieldElement, QuadFelt, StarkField, ONE, }; #[test_case(8, 1; "poly_8 |> evaluated_8 |> interpolated_8")] @@ -62,7 +62,7 @@ fn test_decorator_ext2intt(in_poly_len: usize, blowup: usize) { let poly = rand_vector::(in_poly_len); let twiddles = fft::get_twiddles(poly.len()); - let evals = fft::evaluate_poly_with_offset(&poly, &twiddles, Felt::ONE, blowup); + let evals = fft::evaluate_poly_with_offset(&poly, &twiddles, ONE, blowup); let ifelts = QuadFelt::slice_as_base_elements(&evals); let iu64s = ifelts.iter().map(|v| v.as_int()).collect::>(); diff --git a/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs b/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs index 44637e4448..d5e35fbdd0 100644 --- a/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs +++ b/stdlib/tests/crypto/fri/verifier_fri_e2f4.rs @@ -8,7 +8,7 @@ use test_utils::{ crypto::{MerklePath, NodeIndex, PartialMerkleTree, Rpo256 as MidenHasher}, group_vector_elements, math::fft, - Felt, FieldElement, IntoBytes, QuadFelt as QuadExt, StarkField, ZERO, + Felt, FieldElement, IntoBytes, QuadFelt as QuadExt, StarkField, EMPTY_WORD, }; use winter_fri::{ folding::fold_positions, DefaultProverChannel, FriOptions, FriProof, FriProver, VerifierError, @@ -446,7 +446,7 @@ impl UnBatch for MidenFriVerifierChannel Felt { } fn is_zero(a: Felt) -> Felt { - Felt::new((a == Felt::ZERO) as u64) + Felt::new((a == ZERO) as u64) } fn is_one(a: Felt) -> Felt { - Felt::new((a == Felt::ONE) as u64) + Felt::new((a == ONE) as u64) } pub fn bv_or(a: Felt, b: Felt) -> Felt { - let flg_a = (a == Felt::ZERO) | (a == Felt::ONE); - let flg_b = (b == Felt::ZERO) | (b == Felt::ONE); + let flg_a = (a == ZERO) | (a == ONE); + let flg_b = (b == ZERO) | (b == ONE); assert_eq!(flg_a & flg_b, true); @@ -122,21 +122,21 @@ impl Ext5 { pub fn zero() -> Self { Self { - a0: Felt::new(0), - a1: Felt::new(0), - a2: Felt::new(0), - a3: Felt::new(0), - a4: Felt::new(0), + a0: ZERO, + a1: ZERO, + a2: ZERO, + a3: ZERO, + a4: ZERO, } } pub fn from_int(a: u64) -> Self { Self { a0: Felt::new(a), - a1: Felt::new(0), - a2: Felt::new(0), - a3: Felt::new(0), - a4: Felt::new(0), + a1: ZERO, + a2: ZERO, + a3: ZERO, + a4: ZERO, } } @@ -203,9 +203,9 @@ impl Ext5 { + Felt::new(3) * (self.a1 * t2.a4 + self.a2 * t2.a3 + self.a3 * t2.a2 + self.a4 * t2.a1); - let flg = t3 == Felt::new(0); + let flg = t3 == ZERO; let t3 = t3 + Felt::new(flg as u64); - let t4 = Felt::new(1) / t3; + let t4 = ONE / t3; Self { a0: t4 * t2.a0, @@ -259,11 +259,11 @@ impl Ext5 { } pub fn is_zero(self) -> Felt { - let flg0 = self.a0 == Felt::ZERO; - let flg1 = self.a1 == Felt::ZERO; - let flg2 = self.a2 == Felt::ZERO; - let flg3 = self.a3 == Felt::ZERO; - let flg4 = self.a4 == Felt::ZERO; + let flg0 = self.a0 == ZERO; + let flg1 = self.a1 == ZERO; + let flg2 = self.a2 == ZERO; + let flg3 = self.a3 == ZERO; + let flg4 = self.a4 == ZERO; let flg = flg0 & flg1 & flg2 & flg3 & flg4; Felt::new(flg as u64) diff --git a/stdlib/tests/math/ecgfp5/group.rs b/stdlib/tests/math/ecgfp5/group.rs index adb7896dd5..3ecc398e31 100644 --- a/stdlib/tests/math/ecgfp5/group.rs +++ b/stdlib/tests/math/ecgfp5/group.rs @@ -1,7 +1,7 @@ use super::base_field::{bv_or, Ext5}; use crate::build_test; use std::ops::Add; -use test_utils::{test_case, Felt, FieldElement, StarkField}; +use test_utils::{test_case, Felt, StarkField, ONE, ZERO}; #[derive(Copy, Clone, Debug)] struct ECExt5 { @@ -55,7 +55,7 @@ impl ECExt5 { Self { x: Ext5::zero(), y: Ext5::zero(), - point_at_infinity: Felt::ONE, + point_at_infinity: ONE, } } @@ -65,7 +65,7 @@ impl ECExt5 { pub fn validate(w: Ext5) -> Felt { let e = w.square() - Self::a(); let delta = e.square().subk1(Self::bmul4_1()); - bv_or(Felt::new((delta.legendre() == Felt::ONE) as u64), w.is_zero()) + bv_or(Felt::new((delta.legendre() == ONE) as u64), w.is_zero()) } // Given an encoded elliptic curve point, this routine attempts to decode it using @@ -79,10 +79,10 @@ impl ECExt5 { let x1 = (e + r) / Ext5::from_int(2); let x2 = (e - r) / Ext5::from_int(2); - let flg = x1.legendre() == Felt::ONE; + let flg = x1.legendre() == ONE; let x = if flg { x1 } else { x2 }; let y = -w * x; - let inf = Felt::ONE - c; + let inf = ONE - c; let c = bv_or(c, w.is_zero()); ( @@ -101,7 +101,7 @@ impl ECExt5 { // See https://github.com/pornin/ecgfp5/blob/ce059c6/python/ecGFp5.py#L1214-L1216 for reference implementation pub fn encode(self) -> Ext5 { let w = self.y / (Self::adiv3() - self.x); - let flg = self.point_at_infinity == Felt::ONE; + let flg = self.point_at_infinity == ONE; if flg { Ext5::zero() @@ -173,23 +173,23 @@ impl Add for ECExt5 { let inf3 = Felt::new((samex & diffy) as u64); Self { - x: if rhs.point_at_infinity == Felt::ONE { + x: if rhs.point_at_infinity == ONE { self.x - } else if self.point_at_infinity == Felt::ONE { + } else if self.point_at_infinity == ONE { rhs.x } else { x3 }, - y: if rhs.point_at_infinity == Felt::ONE { + y: if rhs.point_at_infinity == ONE { self.y - } else if self.point_at_infinity == Felt::ONE { + } else if self.point_at_infinity == ONE { rhs.y } else { y3 }, - point_at_infinity: if rhs.point_at_infinity == Felt::ONE { + point_at_infinity: if rhs.point_at_infinity == ONE { self.point_at_infinity - } else if self.point_at_infinity == Felt::ONE { + } else if self.point_at_infinity == ONE { rhs.point_at_infinity } else { inf3 @@ -301,7 +301,7 @@ fn test_ec_ext5_point_encode(a0: u64, a1: u64, a2: u64, a3: u64, a4: u64) { let w = Ext5::new(a0, a1, a2, a3, a4); let (point, flg) = ECExt5::decode(w); - assert_eq!(flg, Felt::ONE); + assert_eq!(flg, ONE); let w_prime = point.encode(); @@ -592,7 +592,7 @@ fn test_ec_ext5_gen_multiplication() { 0x1e0f15c7fd44c28e, 0x21fa7ffcc8252211, ) * Ext5::from_int(4), - point_at_infinity: Felt::ZERO, + point_at_infinity: ZERO, }; // = 1067993516717146951041484916571792702745057740581727230159139685185762082554198619328292418486241 // = N ( See https://github.com/pornin/ecgfp5/blob/ce059c6/python/ecGFp5.py#L922 ) diff --git a/test-utils/src/crypto.rs b/test-utils/src/crypto.rs index 5a807f32b8..faba323c56 100644 --- a/test-utils/src/crypto.rs +++ b/test-utils/src/crypto.rs @@ -1,4 +1,4 @@ -use super::{Felt, FieldElement, Vec, Word}; +use super::{Felt, Vec, Word, ZERO}; // RE-EXPORTS // ================================================================================================ @@ -30,5 +30,5 @@ pub fn init_merkle_leaves(values: &[u64]) -> Vec { } pub fn init_merkle_leaf(value: u64) -> Word { - [Felt::new(value), Felt::ZERO, Felt::ZERO, Felt::ZERO] + [Felt::new(value), ZERO, ZERO, ZERO] } diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 1c3249f8a7..625786900f 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -28,7 +28,7 @@ pub use verifier::{ProgramInfo, VerifierError}; pub use vm_core::{ stack::STACK_TOP_SIZE, utils::{collections, group_slice_elements, group_vector_elements, IntoBytes, ToElements}, - Felt, FieldElement, Program, StarkField, Word, ONE, WORD_SIZE, ZERO, + Felt, FieldElement, Program, StarkField, Word, EMPTY_WORD, ONE, WORD_SIZE, ZERO, }; pub mod math { @@ -175,7 +175,7 @@ impl Test { // validate the memory state for data in expected_mem.chunks(WORD_SIZE) { // Main memory is zeroed by default, use zeros as a fallback when unwrap to make testing easier - let mem_state = process.get_memory_value(0, mem_start_addr).unwrap_or([ZERO; 4]); + let mem_state = process.get_memory_value(0, mem_start_addr).unwrap_or(EMPTY_WORD); let mem_state = stack_to_ints(&mem_state); assert_eq!( @@ -321,7 +321,7 @@ pub fn prop_randw() -> impl Strategy> { /// /// Return the result of the permutation in stack order. pub fn build_expected_perm(values: &[u64]) -> [Felt; STATE_WIDTH] { - let mut expected = [Felt::ZERO; STATE_WIDTH]; + let mut expected = [ZERO; STATE_WIDTH]; for (&value, result) in values.iter().zip(expected.iter_mut()) { *result = Felt::new(value); } From 034630d5b4650bbbc3e858d3dc8af5d4af623b65 Mon Sep 17 00:00:00 2001 From: "Augusto F. Hack" Date: Fri, 1 Sep 2023 20:21:26 +0200 Subject: [PATCH 074/120] assembly: add details about re-export failure --- assembly/src/assembler/mod.rs | 4 +++- assembly/src/errors.rs | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index 40b0f39bc7..23b0881353 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -198,7 +198,9 @@ impl Assembler { for reexporteed_proc in module.ast.reexported_procs().iter() { // make sure the re-exported procedure is loaded into the procedure cache let ref_proc_id = reexporteed_proc.proc_id(); - self.ensure_procedure_is_in_cache(&ref_proc_id, context)?; + self.ensure_procedure_is_in_cache(&ref_proc_id, context).map_err(|_| { + AssemblyError::ReExportedProcModuleNotFound(reexporteed_proc.clone()) + })?; // build procedure ID for the alias, and add it to the procedure cache let proc_name = reexporteed_proc.name(); diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 51f699dc84..163f233a64 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -1,6 +1,6 @@ use super::{ - crypto::hash::RpoDigest, tokens::SourceLocation, LibraryNamespace, ProcedureId, String, - ToString, Token, Vec, + ast::ProcReExport, crypto::hash::RpoDigest, tokens::SourceLocation, LibraryNamespace, + ProcedureId, String, ToString, Token, Vec, }; use core::fmt; @@ -20,6 +20,7 @@ pub enum AssemblyError { DuplicateProcId(ProcedureId), ExportedProcInProgram(String), ImportedProcModuleNotFound(ProcedureId), + ReExportedProcModuleNotFound(ProcReExport), ImportedProcNotFoundInModule(ProcedureId, String), InvalidProgramAssemblyContext, InvalidCacheLock, @@ -135,6 +136,7 @@ impl fmt::Display for AssemblyError { DuplicateProcId(proc_id) => write!(f, "duplicate proc id {proc_id}"), ExportedProcInProgram(proc_name) => write!(f, "exported procedure '{proc_name}' in executable program"), ImportedProcModuleNotFound(proc_id) => write!(f, "module for imported procedure {proc_id} not found"), + ReExportedProcModuleNotFound(reexport) => write!(f, "re-exported proc {} with id {} not found", reexport.name(), reexport.proc_id()), ImportedProcNotFoundInModule(proc_id, module_path) => write!(f, "imported procedure {proc_id} not found in module {module_path}"), InvalidProgramAssemblyContext => write!(f, "assembly context improperly initialized for program compilation"), InvalidCacheLock => write!(f, "an attempt was made to lock a borrowed procedures cache"), From 84c7fbacb0521edd09eeb585d8474690b12a619b Mon Sep 17 00:00:00 2001 From: Goblin Oats Date: Tue, 25 Apr 2023 16:23:13 +0100 Subject: [PATCH 075/120] feat: add elgamal encryption to stdlib with tests --- stdlib/asm/crypto/elgamal_ecgfp5.masm | 130 ++++++++++ stdlib/docs/elgamal_ecgfp5_crypto.md | 8 + stdlib/tests/crypto/elgamal.rs | 337 +++++++++++++++++++++++++ stdlib/tests/crypto/mod.rs | 1 + stdlib/tests/math/ecgfp5/base_field.rs | 2 +- stdlib/tests/math/ecgfp5/group.rs | 4 +- stdlib/tests/math/ecgfp5/mod.rs | 6 +- stdlib/tests/math/mod.rs | 2 +- 8 files changed, 483 insertions(+), 7 deletions(-) create mode 100644 stdlib/asm/crypto/elgamal_ecgfp5.masm create mode 100644 stdlib/docs/elgamal_ecgfp5_crypto.md create mode 100644 stdlib/tests/crypto/elgamal.rs diff --git a/stdlib/asm/crypto/elgamal_ecgfp5.masm b/stdlib/asm/crypto/elgamal_ecgfp5.masm new file mode 100644 index 0000000000..55b22a3a32 --- /dev/null +++ b/stdlib/asm/crypto/elgamal_ecgfp5.masm @@ -0,0 +1,130 @@ +use.std::math::ecgfp5::group + +export.gen_privatekey.8 + exec.group::gen_mul +end + +#! Given public key, point H generated in gen_privatekey as coordinates (X,Y) on stack +#! and message M, elliptic curve points (a,b) also as coordinates (X,Y) on stack +#! and random scalar r on stack +#! this routine computes the first elliptic curve point C_a +#! C_a = r*G, G is the generator of elliptic curve +#! Expected stack state +#! [r0, r1, ..., r9] +#! Final stack state +#! [Ca_x0, ..., C_x4, Ca_y0, ..., Ca_y4, Ca_inf] +export.encrypt_ca.0 + exec.group::gen_mul +end + + +#! Given public key, point H generated in gen_privatekey as coordinates (X,Y) on stack +#! and message M, elliptic curve points (a,b) also as coordinates (X,Y) on stack +#! and random scalar r on stack +#! this routine computes the second elliptic curve point C_b +#! C_b = M + r*H +#! Expected stack state +#! [H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, M_x0, ..., M_x4, M_y0, ..., M_y4, M_inf, r0, r1, ...] +#! Final stack state +#! [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf] +export.encrypt_cb.20 + + loc_storew.0 + dropw + loc_store.1 # Cache H_x + loc_storew.2 + dropw + loc_store.3 # Cache H_y + loc_store.4 # Cache H_inf + + loc_storew.5 + dropw + loc_store.6 # Cache M_x + loc_storew.7 + dropw + loc_store.8 # Cache M_y + loc_store.9 # Cache M_inf + + loc_load.4 # reload H_inf + loc_load.3 # reload H_y + push.0.0.0.0 + loc_loadw.2 + loc_load.1 + push.0.0.0.0 + loc_loadw.0 #reload H_x + + exec.group::mul + + loc_load.9 #load M_inf + loc_load.8 + push.0.0.0.0 + loc_loadw.7 #load M_y + loc_load.6 + push.0.0.0.0 + loc_loadw.5 #load M_x + + exec.group::add + +end + +#! Rerandomises the first half of an Elgamal ciphertext Ca +#! and random scalar r to produce a rerandomised ciphertext C'a +#! Expected stack state +#! [Ca_x0, ..., Ca_x4, Ca_y0, ..., Ca_y4, Ca_inf, ..., r0, r1, ...] +#! +#! Final stack state +#! [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] +export.remask_ca.5 + loc_storew.0 + dropw + loc_store.1 # Cache Ca_x + loc_storew.2 + dropw + loc_store.3 # Cache Ca_y + loc_store.4 # Cache Ca_inf + + # Calculate g ^ r + exec.group::gen_mul + + loc_load.4 #reload Ca_inf + loc_load.3 + push.0.0.0.0 + loc_loadw.2 #reload Ca_y + loc_load.1 + push.0.0.0.0 + loc_loadw.0 #reload Ca_x + + # Calculate g ^ r + C_a + exec.group::add +end + +#! Rerandomises the second half of an Elgamal ciphertext Cb given a public key H +#! and random scalar r to produce a rerandomised ciphertext C'b +#! Expected stack state +#! [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf, H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, ..., r0, r1, ...] +#! +#! Final stack state +#! [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] +export.remask_cb.14 + loc_storew.0 + dropw + loc_store.1 # Cache Cb_x + loc_storew.2 + dropw + loc_store.3 # Cache Cb_y + loc_store.4 # Cache Cb_inf + + # Calculate H^r + exec.group::mul + + loc_load.4 #reload Cb_inf + loc_load.3 + push.0.0.0.0 + loc_loadw.2 #reload Cb_y + loc_load.1 + push.0.0.0.0 + loc_loadw.0 #reload Cb_x + + # Calculate H^r + Cb + exec.group::add +end diff --git a/stdlib/docs/elgamal_ecgfp5_crypto.md b/stdlib/docs/elgamal_ecgfp5_crypto.md new file mode 100644 index 0000000000..6b9721319c --- /dev/null +++ b/stdlib/docs/elgamal_ecgfp5_crypto.md @@ -0,0 +1,8 @@ + +## std::crypto::elgamal_ecgfp5 +| Procedure | Description | +| ----------- | ------------- | +| encrypt_ca | Given public key, point H generated in gen_privatekey as coordinates (X,Y) on stack

      and message M, elliptic curve points (a,b) also as coordinates (X,Y) on stack

      and random scalar r on stack

      this routine computes the first elliptic curve point C_a

      C_a = r*G, G is the generator of elliptic curve

      Expected stack state

      [r0, r1, ..., r9]

      Final stack state

      [Ca_x0, ..., C_x4, Ca_y0, ..., Ca_y4, Ca_inf] | +| encrypt_cb | Given public key, point H generated in gen_privatekey as coordinates (X,Y) on stack

      and message M, elliptic curve points (a,b) also as coordinates (X,Y) on stack

      and random scalar r on stack

      this routine computes the second elliptic curve point C_b

      C_b = M + r*H

      Expected stack state

      [H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, M_x0, ..., M_x4, M_y0, ..., M_y4, M_inf, r0, r1, ...]

      Final stack state

      [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf] | +| remask_ca | Rerandomises the first half of an Elgamal ciphertext Ca

      and random scalar r to produce a rerandomised ciphertext C'a

      Expected stack state

      [Ca_x0, ..., Ca_x4, Ca_y0, ..., Ca_y4, Ca_inf, ..., r0, r1, ...]

      Final stack state

      [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] | +| remask_cb | Rerandomises the second half of an Elgamal ciphertext Cb given a public key H

      and random scalar r to produce a rerandomised ciphertext C'b

      Expected stack state

      [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf, H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, ..., r0, r1, ...]

      Final stack state

      [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] | diff --git a/stdlib/tests/crypto/elgamal.rs b/stdlib/tests/crypto/elgamal.rs new file mode 100644 index 0000000000..9e022b73d4 --- /dev/null +++ b/stdlib/tests/crypto/elgamal.rs @@ -0,0 +1,337 @@ +use crate::build_test; +use crate::math::ecgfp5::base_field::Ext5; +use crate::math::ecgfp5::group::ECExt5; +use std::ops::Add; +use test_utils::{rand::rand_array, FieldElement, Felt, StarkField}; + +fn gen_random_private_key() -> [u32; 10] { + rand_array::() +} + +fn get_generator() -> ECExt5 { + ECExt5 { + x: Ext5::new( + 0xb2ca178ecf4453a1, + 0x3c757788836d3ea4, + 0x48d7f28a26dafd0b, + 0x1e0f15c7fd44c28e, + 0x21fa7ffcc8252211, + ), + y: Ext5::new( + 0xb2ca178ecf4453a1, + 0x3c757788836d3ea4, + 0x48d7f28a26dafd0b, + 0x1e0f15c7fd44c28e, + 0x21fa7ffcc8252211, + ) * Ext5::from_int(4), + point_at_infinity: Felt::ZERO, + } +} + +#[test] +fn test_elgamal_keygen() { + let gen = get_generator(); + let private_key = gen_random_private_key(); + let q1 = gen.scalar_mul(&private_key); + + let mut stack: [u64; 10] = private_key.iter().map(|x| *x as u64).collect::>().try_into().unwrap(); + + let source = " + use.std::crypto::elgamal_ecgfp5 + + begin + exec.elgamal_ecgfp5::gen_privatekey + end + "; + + stack.reverse(); + + let test = build_test!(source, &stack); + let strace = test.get_last_stack_state(); + assert_eq!(strace[0], q1.x.a0); + assert_eq!(strace[1], q1.x.a1); + assert_eq!(strace[2], q1.x.a2); + assert_eq!(strace[3], q1.x.a3); + assert_eq!(strace[4], q1.x.a4); + assert_eq!(strace[5], q1.y.a0); + assert_eq!(strace[6], q1.y.a1); + assert_eq!(strace[7], q1.y.a2); + assert_eq!(strace[8], q1.y.a3); + assert_eq!(strace[9], q1.y.a4); + assert_eq!(strace[10], q1.point_at_infinity); +} + +#[test] +fn test_elgamal_encrypt() { + //inputs r, M, H + //r is 10 limbs + //H and M are both x and y at point inf + //11*2 inputs + let private_key = gen_random_private_key(); + let r = gen_random_private_key(); + + let gen = get_generator(); + let plaintext_scalar = [ + 666904740u32, + 257318652u32, + 4031728122u32, + 3689598853u32, + 703808805u32, + 386793741u32, + 2898811333u32, + 4092670716u32, + 1596344924u32, + 1692681010u32, + ]; + + let pm = gen.scalar_mul(&plaintext_scalar); + + + let ca = gen.scalar_mul(&r); + let h = gen.scalar_mul(&private_key); + let rh = h.scalar_mul(&r); + let cb = pm.add(rh); + + let source = " + use.std::crypto::elgamal_ecgfp5 + + begin + exec.elgamal_ecgfp5::encrypt_ca + end + "; + + let mut stack = [ + r[0] as u64, + r[1] as u64, + r[2] as u64, + r[3] as u64, + r[4] as u64, + r[5] as u64, + r[6] as u64, + r[7] as u64, + r[8] as u64, + r[9] as u64, + ]; + + stack.reverse(); + + let test = build_test!(source, &stack); + let strace = test.get_last_stack_state(); + + assert_eq!(strace[0], ca.x.a0); + assert_eq!(strace[1], ca.x.a1); + assert_eq!(strace[2], ca.x.a2); + assert_eq!(strace[3], ca.x.a3); + assert_eq!(strace[4], ca.x.a4); + assert_eq!(strace[5], ca.y.a0); + assert_eq!(strace[6], ca.y.a1); + assert_eq!(strace[7], ca.y.a2); + assert_eq!(strace[8], ca.y.a3); + assert_eq!(strace[9], ca.y.a4); + assert_eq!(strace[10], ca.point_at_infinity); + + let mut stack = [ + h.x.a0.as_int(), + h.x.a1.as_int(), + h.x.a2.as_int(), + h.x.a3.as_int(), + h.x.a4.as_int(), + h.y.a0.as_int(), + h.y.a1.as_int(), + h.y.a2.as_int(), + h.y.a3.as_int(), + h.y.a4.as_int(), + h.point_at_infinity.as_int(), + pm.x.a0.as_int(), + pm.x.a1.as_int(), + pm.x.a2.as_int(), + pm.x.a3.as_int(), + pm.x.a4.as_int(), + pm.y.a0.as_int(), + pm.y.a1.as_int(), + pm.y.a2.as_int(), + pm.y.a3.as_int(), + pm.y.a4.as_int(), + pm.point_at_infinity.as_int(), + r[0] as u64, + r[1] as u64, + r[2] as u64, + r[3] as u64, + r[4] as u64, + r[5] as u64, + r[6] as u64, + r[7] as u64, + r[8] as u64, + r[9] as u64, + ]; + + let source = " + use.std::crypto::elgamal_ecgfp5 + + begin + exec.elgamal_ecgfp5::encrypt_cb + end + "; + + stack.reverse(); + + let test = build_test!(source, &stack); + let strace = test.get_last_stack_state(); + + assert_eq!(strace[0], cb.x.a0); + assert_eq!(strace[1], cb.x.a1); + assert_eq!(strace[2], cb.x.a2); + assert_eq!(strace[3], cb.x.a3); + assert_eq!(strace[4], cb.x.a4); + assert_eq!(strace[5], cb.y.a0); + assert_eq!(strace[6], cb.y.a1); + assert_eq!(strace[7], cb.y.a2); + assert_eq!(strace[8], cb.y.a3); + assert_eq!(strace[9], cb.y.a4); + assert_eq!(strace[10], cb.point_at_infinity); +} + +#[test] +fn test_elgamal_remask() { + // Also known as rerandomisation + // inputs r, H, Cb, Ca + // The private key + let private_key = gen_random_private_key(); + let r = gen_random_private_key(); + let r_prime = gen_random_private_key(); + + let gen = get_generator(); + let plaintext_scalar = [ + 666904740u32, + 257318652u32, + 4031728122u32, + 3689598853u32, + 703808805u32, + 386793741u32, + 2898811333u32, + 4092670716u32, + 1596344924u32, + 1692681010u32, + ]; + + let pm = gen.scalar_mul(&plaintext_scalar); + + let ca = gen.scalar_mul(&r); + let h = gen.scalar_mul(&private_key); + let rh = h.scalar_mul(&r); + let cb = pm.add(rh); + + // ca and cb are the original plaintext + let r_prime_g = gen.scalar_mul(&r_prime); + let r_prime_h = h.scalar_mul(&r_prime); + let c_prime_a = ca.add(r_prime_g); + let c_prime_b = cb.add(r_prime_h); + + let source = " + use.std::crypto::elgamal_ecgfp5 + + begin + exec.elgamal_ecgfp5::remask_ca + end + "; + + let mut stack = [ + ca.x.a0.as_int(), + ca.x.a1.as_int(), + ca.x.a2.as_int(), + ca.x.a3.as_int(), + ca.x.a4.as_int(), + ca.y.a0.as_int(), + ca.y.a1.as_int(), + ca.y.a2.as_int(), + ca.y.a3.as_int(), + ca.y.a4.as_int(), + ca.point_at_infinity.as_int(), + r_prime[0] as u64, + r_prime[1] as u64, + r_prime[2] as u64, + r_prime[3] as u64, + r_prime[4] as u64, + r_prime[5] as u64, + r_prime[6] as u64, + r_prime[7] as u64, + r_prime[8] as u64, + r_prime[9] as u64, + ]; + stack.reverse(); + + let test = build_test!(source, &stack); + let strace = test.get_last_stack_state(); + + assert_eq!(strace[0], c_prime_a.x.a0); + assert_eq!(strace[1], c_prime_a.x.a1); + assert_eq!(strace[2], c_prime_a.x.a2); + assert_eq!(strace[3], c_prime_a.x.a3); + assert_eq!(strace[4], c_prime_a.x.a4); + assert_eq!(strace[5], c_prime_a.y.a0); + assert_eq!(strace[6], c_prime_a.y.a1); + assert_eq!(strace[7], c_prime_a.y.a2); + assert_eq!(strace[8], c_prime_a.y.a3); + assert_eq!(strace[9], c_prime_a.y.a4); + assert_eq!(strace[10], c_prime_a.point_at_infinity); + + let source = " + use.std::crypto::elgamal_ecgfp5 + + begin + exec.elgamal_ecgfp5::remask_cb + end + "; + + let mut stack = [ + cb.x.a0.as_int(), + cb.x.a1.as_int(), + cb.x.a2.as_int(), + cb.x.a3.as_int(), + cb.x.a4.as_int(), + cb.y.a0.as_int(), + cb.y.a1.as_int(), + cb.y.a2.as_int(), + cb.y.a3.as_int(), + cb.y.a4.as_int(), + cb.point_at_infinity.as_int(), + h.x.a0.as_int(), + h.x.a1.as_int(), + h.x.a2.as_int(), + h.x.a3.as_int(), + h.x.a4.as_int(), + h.y.a0.as_int(), + h.y.a1.as_int(), + h.y.a2.as_int(), + h.y.a3.as_int(), + h.y.a4.as_int(), + h.point_at_infinity.as_int(), + r_prime[0] as u64, + r_prime[1] as u64, + r_prime[2] as u64, + r_prime[3] as u64, + r_prime[4] as u64, + r_prime[5] as u64, + r_prime[6] as u64, + r_prime[7] as u64, + r_prime[8] as u64, + r_prime[9] as u64, + ]; + stack.reverse(); + + let test = build_test!(source, &stack); + let strace = test.get_last_stack_state(); + + assert_eq!(strace[0], c_prime_b.x.a0); + assert_eq!(strace[1], c_prime_b.x.a1); + assert_eq!(strace[2], c_prime_b.x.a2); + assert_eq!(strace[3], c_prime_b.x.a3); + assert_eq!(strace[4], c_prime_b.x.a4); + assert_eq!(strace[5], c_prime_b.y.a0); + assert_eq!(strace[6], c_prime_b.y.a1); + assert_eq!(strace[7], c_prime_b.y.a2); + assert_eq!(strace[8], c_prime_b.y.a3); + assert_eq!(strace[9], c_prime_b.y.a4); + assert_eq!(strace[10], c_prime_b.point_at_infinity); + +} diff --git a/stdlib/tests/crypto/mod.rs b/stdlib/tests/crypto/mod.rs index 80fc00548f..cd8017ae20 100644 --- a/stdlib/tests/crypto/mod.rs +++ b/stdlib/tests/crypto/mod.rs @@ -6,3 +6,4 @@ mod keccak256; mod native; mod sha256; mod stark; +mod elgamal; diff --git a/stdlib/tests/math/ecgfp5/base_field.rs b/stdlib/tests/math/ecgfp5/base_field.rs index ecea4b99b6..649124d420 100644 --- a/stdlib/tests/math/ecgfp5/base_field.rs +++ b/stdlib/tests/math/ecgfp5/base_field.rs @@ -99,7 +99,7 @@ fn sqrt(x: Felt) -> (Felt, Felt) { (u * cc, cc) } -#[derive(Copy, Clone, Debug)] +#[derive(Eq, Copy, Clone, Debug)] pub struct Ext5 { pub a0: Felt, pub a1: Felt, diff --git a/stdlib/tests/math/ecgfp5/group.rs b/stdlib/tests/math/ecgfp5/group.rs index 3ecc398e31..b1c649923f 100644 --- a/stdlib/tests/math/ecgfp5/group.rs +++ b/stdlib/tests/math/ecgfp5/group.rs @@ -3,8 +3,8 @@ use crate::build_test; use std::ops::Add; use test_utils::{test_case, Felt, StarkField, ONE, ZERO}; -#[derive(Copy, Clone, Debug)] -struct ECExt5 { +#[derive(PartialEq, Eq, Copy, Clone, Debug)] +pub struct ECExt5 { pub x: Ext5, pub y: Ext5, pub point_at_infinity: Felt, diff --git a/stdlib/tests/math/ecgfp5/mod.rs b/stdlib/tests/math/ecgfp5/mod.rs index e054be20be..f7f2913a0d 100644 --- a/stdlib/tests/math/ecgfp5/mod.rs +++ b/stdlib/tests/math/ecgfp5/mod.rs @@ -1,3 +1,3 @@ -mod base_field; -mod group; -mod scalar_field; +pub mod base_field; +pub mod group; +pub mod scalar_field; diff --git a/stdlib/tests/math/mod.rs b/stdlib/tests/math/mod.rs index 29524b23ef..fbba1f1641 100644 --- a/stdlib/tests/math/mod.rs +++ b/stdlib/tests/math/mod.rs @@ -1,4 +1,4 @@ -mod ecgfp5; +pub mod ecgfp5; mod ntt512; mod poly512; mod secp256k1; From b766dc7ac7e1dc3bdca0235e474ed5887af5a050 Mon Sep 17 00:00:00 2001 From: Goblin Oats Date: Tue, 5 Sep 2023 13:46:20 +0100 Subject: [PATCH 076/120] refactor: simplify methods and improve documentation --- miden/src/examples/fibonacci.rs | 2 +- stdlib/asm/crypto/elgamal_ecgfp5.masm | 94 ++++----------------------- stdlib/docs/crypto/elgamal_ecgfp5.md | 9 +++ stdlib/docs/elgamal_ecgfp5_crypto.md | 8 --- stdlib/tests/crypto/elgamal.rs | 71 ++++++++++---------- stdlib/tests/crypto/mod.rs | 2 +- 6 files changed, 57 insertions(+), 129 deletions(-) create mode 100644 stdlib/docs/crypto/elgamal_ecgfp5.md delete mode 100644 stdlib/docs/elgamal_ecgfp5_crypto.md diff --git a/miden/src/examples/fibonacci.rs b/miden/src/examples/fibonacci.rs index 5440ed6adc..a8ca87aa9a 100644 --- a/miden/src/examples/fibonacci.rs +++ b/miden/src/examples/fibonacci.rs @@ -1,6 +1,6 @@ use super::{Example, ONE, ZERO}; use miden::{ - math::{Felt, FieldElement, StarkField}, + math::{Felt, StarkField}, Assembler, MemAdviceProvider, Program, StackInputs, }; diff --git a/stdlib/asm/crypto/elgamal_ecgfp5.masm b/stdlib/asm/crypto/elgamal_ecgfp5.masm index 55b22a3a32..e3f5fff24c 100644 --- a/stdlib/asm/crypto/elgamal_ecgfp5.masm +++ b/stdlib/asm/crypto/elgamal_ecgfp5.masm @@ -1,19 +1,20 @@ use.std::math::ecgfp5::group +#! Generates the public key, point H +#! the private key is expected as input and is a 319-bit random +#! number of 10 32-bit limbs. export.gen_privatekey.8 exec.group::gen_mul end -#! Given public key, point H generated in gen_privatekey as coordinates (X,Y) on stack -#! and message M, elliptic curve points (a,b) also as coordinates (X,Y) on stack -#! and random scalar r on stack +#! Given a random scalar r on stack #! this routine computes the first elliptic curve point C_a #! C_a = r*G, G is the generator of elliptic curve #! Expected stack state #! [r0, r1, ..., r9] #! Final stack state #! [Ca_x0, ..., C_x4, Ca_y0, ..., Ca_y4, Ca_inf] -export.encrypt_ca.0 +export.encrypt_ca.8 exec.group::gen_mul end @@ -24,107 +25,34 @@ end #! this routine computes the second elliptic curve point C_b #! C_b = M + r*H #! Expected stack state -#! [H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, M_x0, ..., M_x4, M_y0, ..., M_y4, M_inf, r0, r1, ...] +#! [H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, r0, r1, ..., M_x0, ..., M_x4, M_y0, ..., M_y4, M_inf,] #! Final stack state #! [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf] export.encrypt_cb.20 - - loc_storew.0 - dropw - loc_store.1 # Cache H_x - loc_storew.2 - dropw - loc_store.3 # Cache H_y - loc_store.4 # Cache H_inf - - loc_storew.5 - dropw - loc_store.6 # Cache M_x - loc_storew.7 - dropw - loc_store.8 # Cache M_y - loc_store.9 # Cache M_inf - - loc_load.4 # reload H_inf - loc_load.3 # reload H_y - push.0.0.0.0 - loc_loadw.2 - loc_load.1 - push.0.0.0.0 - loc_loadw.0 #reload H_x - exec.group::mul - - loc_load.9 #load M_inf - loc_load.8 - push.0.0.0.0 - loc_loadw.7 #load M_y - loc_load.6 - push.0.0.0.0 - loc_loadw.5 #load M_x - exec.group::add - end -#! Rerandomises the first half of an Elgamal ciphertext Ca +#! Rerandomises the first half of an ElGamal ciphertext Ca #! and random scalar r to produce a rerandomised ciphertext C'a #! Expected stack state -#! [Ca_x0, ..., Ca_x4, Ca_y0, ..., Ca_y4, Ca_inf, ..., r0, r1, ...] +#! [r0, r1, ..., Ca_x0, ..., Ca_x4, Ca_y0, ..., Ca_y4, Ca_inf, ...] #! #! Final stack state #! [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] export.remask_ca.5 - loc_storew.0 - dropw - loc_store.1 # Cache Ca_x - loc_storew.2 - dropw - loc_store.3 # Cache Ca_y - loc_store.4 # Cache Ca_inf - - # Calculate g ^ r exec.group::gen_mul - - loc_load.4 #reload Ca_inf - loc_load.3 - push.0.0.0.0 - loc_loadw.2 #reload Ca_y - loc_load.1 - push.0.0.0.0 - loc_loadw.0 #reload Ca_x - - # Calculate g ^ r + C_a exec.group::add end -#! Rerandomises the second half of an Elgamal ciphertext Cb given a public key H +#! Rerandomises the second half of an ElGamal ciphertext Cb given a public key H #! and random scalar r to produce a rerandomised ciphertext C'b #! Expected stack state -#! [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf, H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, ..., r0, r1, ...] +#! [H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, ..., r0, r1, ..., Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf] #! #! Final stack state -#! [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] +#! [C'b_x0, ..., C'b_x4, C'b_y0, ..., C'b_y4, C'b_inf] export.remask_cb.14 - loc_storew.0 - dropw - loc_store.1 # Cache Cb_x - loc_storew.2 - dropw - loc_store.3 # Cache Cb_y - loc_store.4 # Cache Cb_inf - - # Calculate H^r exec.group::mul - - loc_load.4 #reload Cb_inf - loc_load.3 - push.0.0.0.0 - loc_loadw.2 #reload Cb_y - loc_load.1 - push.0.0.0.0 - loc_loadw.0 #reload Cb_x - - # Calculate H^r + Cb exec.group::add end diff --git a/stdlib/docs/crypto/elgamal_ecgfp5.md b/stdlib/docs/crypto/elgamal_ecgfp5.md new file mode 100644 index 0000000000..1aae29bc48 --- /dev/null +++ b/stdlib/docs/crypto/elgamal_ecgfp5.md @@ -0,0 +1,9 @@ + +## std::crypto::elgamal_ecgfp5 +| Procedure | Description | +| ----------- | ------------- | +| gen_privatekey | Generates the public key, point H

      the private key is expected as input and is a 319-bit random

      number of 10 32-bit limbs. | +| encrypt_ca | Given a random scalar r on stack

      this routine computes the first elliptic curve point C_a

      C_a = r*G, G is the generator of elliptic curve

      Expected stack state

      [r0, r1, ..., r9]

      Final stack state

      [Ca_x0, ..., C_x4, Ca_y0, ..., Ca_y4, Ca_inf] | +| encrypt_cb | Given public key, point H generated in gen_privatekey as coordinates (X,Y) on stack

      and message M, elliptic curve points (a,b) also as coordinates (X,Y) on stack

      and random scalar r on stack

      this routine computes the second elliptic curve point C_b

      C_b = M + r*H

      Expected stack state

      [H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, r0, r1, ..., M_x0, ..., M_x4, M_y0, ..., M_y4, M_inf,]

      Final stack state

      [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf] | +| remask_ca | Rerandomises the first half of an ElGamal ciphertext Ca

      and random scalar r to produce a rerandomised ciphertext C'a

      Expected stack state

      [r0, r1, ..., Ca_x0, ..., Ca_x4, Ca_y0, ..., Ca_y4, Ca_inf, ...]

      Final stack state

      [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] | +| remask_cb | Rerandomises the second half of an ElGamal ciphertext Cb given a public key H

      and random scalar r to produce a rerandomised ciphertext C'b

      Expected stack state

      [H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, ..., r0, r1, ..., Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf]

      Final stack state

      [C'b_x0, ..., C'b_x4, C'b_y0, ..., C'b_y4, C'b_inf] | diff --git a/stdlib/docs/elgamal_ecgfp5_crypto.md b/stdlib/docs/elgamal_ecgfp5_crypto.md deleted file mode 100644 index 6b9721319c..0000000000 --- a/stdlib/docs/elgamal_ecgfp5_crypto.md +++ /dev/null @@ -1,8 +0,0 @@ - -## std::crypto::elgamal_ecgfp5 -| Procedure | Description | -| ----------- | ------------- | -| encrypt_ca | Given public key, point H generated in gen_privatekey as coordinates (X,Y) on stack

      and message M, elliptic curve points (a,b) also as coordinates (X,Y) on stack

      and random scalar r on stack

      this routine computes the first elliptic curve point C_a

      C_a = r*G, G is the generator of elliptic curve

      Expected stack state

      [r0, r1, ..., r9]

      Final stack state

      [Ca_x0, ..., C_x4, Ca_y0, ..., Ca_y4, Ca_inf] | -| encrypt_cb | Given public key, point H generated in gen_privatekey as coordinates (X,Y) on stack

      and message M, elliptic curve points (a,b) also as coordinates (X,Y) on stack

      and random scalar r on stack

      this routine computes the second elliptic curve point C_b

      C_b = M + r*H

      Expected stack state

      [H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, M_x0, ..., M_x4, M_y0, ..., M_y4, M_inf, r0, r1, ...]

      Final stack state

      [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf] | -| remask_ca | Rerandomises the first half of an Elgamal ciphertext Ca

      and random scalar r to produce a rerandomised ciphertext C'a

      Expected stack state

      [Ca_x0, ..., Ca_x4, Ca_y0, ..., Ca_y4, Ca_inf, ..., r0, r1, ...]

      Final stack state

      [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] | -| remask_cb | Rerandomises the second half of an Elgamal ciphertext Cb given a public key H

      and random scalar r to produce a rerandomised ciphertext C'b

      Expected stack state

      [Cb_x0, ..., Cb_x4, Cb_y0, ..., Cb_y4, Cb_inf, H_x0, ..., H_x4, H_y0, ..., H_y4, H_inf, ..., r0, r1, ...]

      Final stack state

      [C'a_x0, ..., C'a_x4, C'a_y0, ..., C'a_y4, C'a_inf] | diff --git a/stdlib/tests/crypto/elgamal.rs b/stdlib/tests/crypto/elgamal.rs index 9e022b73d4..0e598be50f 100644 --- a/stdlib/tests/crypto/elgamal.rs +++ b/stdlib/tests/crypto/elgamal.rs @@ -2,7 +2,7 @@ use crate::build_test; use crate::math::ecgfp5::base_field::Ext5; use crate::math::ecgfp5::group::ECExt5; use std::ops::Add; -use test_utils::{rand::rand_array, FieldElement, Felt, StarkField}; +use test_utils::{rand::rand_array, Felt, FieldElement, StarkField}; fn gen_random_private_key() -> [u32; 10] { rand_array::() @@ -34,7 +34,8 @@ fn test_elgamal_keygen() { let private_key = gen_random_private_key(); let q1 = gen.scalar_mul(&private_key); - let mut stack: [u64; 10] = private_key.iter().map(|x| *x as u64).collect::>().try_into().unwrap(); + let mut stack: [u64; 10] = + private_key.iter().map(|x| *x as u64).collect::>().try_into().unwrap(); let source = " use.std::crypto::elgamal_ecgfp5 @@ -86,7 +87,6 @@ fn test_elgamal_encrypt() { let pm = gen.scalar_mul(&plaintext_scalar); - let ca = gen.scalar_mul(&r); let h = gen.scalar_mul(&private_key); let rh = h.scalar_mul(&r); @@ -142,6 +142,16 @@ fn test_elgamal_encrypt() { h.y.a3.as_int(), h.y.a4.as_int(), h.point_at_infinity.as_int(), + r[0] as u64, + r[1] as u64, + r[2] as u64, + r[3] as u64, + r[4] as u64, + r[5] as u64, + r[6] as u64, + r[7] as u64, + r[8] as u64, + r[9] as u64, pm.x.a0.as_int(), pm.x.a1.as_int(), pm.x.a2.as_int(), @@ -153,16 +163,6 @@ fn test_elgamal_encrypt() { pm.y.a3.as_int(), pm.y.a4.as_int(), pm.point_at_infinity.as_int(), - r[0] as u64, - r[1] as u64, - r[2] as u64, - r[3] as u64, - r[4] as u64, - r[5] as u64, - r[6] as u64, - r[7] as u64, - r[8] as u64, - r[9] as u64, ]; let source = " @@ -236,6 +236,16 @@ fn test_elgamal_remask() { "; let mut stack = [ + r_prime[0] as u64, + r_prime[1] as u64, + r_prime[2] as u64, + r_prime[3] as u64, + r_prime[4] as u64, + r_prime[5] as u64, + r_prime[6] as u64, + r_prime[7] as u64, + r_prime[8] as u64, + r_prime[9] as u64, ca.x.a0.as_int(), ca.x.a1.as_int(), ca.x.a2.as_int(), @@ -247,16 +257,6 @@ fn test_elgamal_remask() { ca.y.a3.as_int(), ca.y.a4.as_int(), ca.point_at_infinity.as_int(), - r_prime[0] as u64, - r_prime[1] as u64, - r_prime[2] as u64, - r_prime[3] as u64, - r_prime[4] as u64, - r_prime[5] as u64, - r_prime[6] as u64, - r_prime[7] as u64, - r_prime[8] as u64, - r_prime[9] as u64, ]; stack.reverse(); @@ -274,7 +274,7 @@ fn test_elgamal_remask() { assert_eq!(strace[8], c_prime_a.y.a3); assert_eq!(strace[9], c_prime_a.y.a4); assert_eq!(strace[10], c_prime_a.point_at_infinity); - + let source = " use.std::crypto::elgamal_ecgfp5 @@ -284,17 +284,6 @@ fn test_elgamal_remask() { "; let mut stack = [ - cb.x.a0.as_int(), - cb.x.a1.as_int(), - cb.x.a2.as_int(), - cb.x.a3.as_int(), - cb.x.a4.as_int(), - cb.y.a0.as_int(), - cb.y.a1.as_int(), - cb.y.a2.as_int(), - cb.y.a3.as_int(), - cb.y.a4.as_int(), - cb.point_at_infinity.as_int(), h.x.a0.as_int(), h.x.a1.as_int(), h.x.a2.as_int(), @@ -316,6 +305,17 @@ fn test_elgamal_remask() { r_prime[7] as u64, r_prime[8] as u64, r_prime[9] as u64, + cb.x.a0.as_int(), + cb.x.a1.as_int(), + cb.x.a2.as_int(), + cb.x.a3.as_int(), + cb.x.a4.as_int(), + cb.y.a0.as_int(), + cb.y.a1.as_int(), + cb.y.a2.as_int(), + cb.y.a3.as_int(), + cb.y.a4.as_int(), + cb.point_at_infinity.as_int(), ]; stack.reverse(); @@ -333,5 +333,4 @@ fn test_elgamal_remask() { assert_eq!(strace[8], c_prime_b.y.a3); assert_eq!(strace[9], c_prime_b.y.a4); assert_eq!(strace[10], c_prime_b.point_at_infinity); - } diff --git a/stdlib/tests/crypto/mod.rs b/stdlib/tests/crypto/mod.rs index cd8017ae20..dfcd14bf91 100644 --- a/stdlib/tests/crypto/mod.rs +++ b/stdlib/tests/crypto/mod.rs @@ -1,9 +1,9 @@ mod blake3; mod ecdsa_secp256k1; +mod elgamal; mod falcon; mod fri; mod keccak256; mod native; mod sha256; mod stark; -mod elgamal; From eea2573a79974309ae6995d794fd12125fe155ce Mon Sep 17 00:00:00 2001 From: grjte Date: Wed, 23 Aug 2023 17:06:19 +0100 Subject: [PATCH 077/120] docs: add dyn program block --- docs/src/assets/design/programs/dyn_block.png | Bin 0 -> 7814 bytes docs/src/design/programs.md | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 docs/src/assets/design/programs/dyn_block.png diff --git a/docs/src/assets/design/programs/dyn_block.png b/docs/src/assets/design/programs/dyn_block.png new file mode 100644 index 0000000000000000000000000000000000000000..ff20581613acb0fc223575bd425a80ba80aeab33 GIT binary patch literal 7814 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 BC5Zq4 literal 0 HcmV?d00001 diff --git a/docs/src/design/programs.md b/docs/src/design/programs.md index 2c54e0e769..3cb32bc830 100644 --- a/docs/src/design/programs.md +++ b/docs/src/design/programs.md @@ -53,6 +53,14 @@ When executing a *syscall* block, the VM does the following: A *syscall* block does not have any children. Thus, it must be leaf node in the tree. + +### Dyn block +A **dyn** block is used to describe a node whose target is specified dynamically via the stack. When the VM encounters a *dyn* block, it executes a program which hashes to the target specified by the top of the stack. Thus, it has a dynamic target rather than a hardcoded target. In order to execute a *dyn* block, the VM must be aware of a program with the hash value that is specified by the top of the stack. Otherwise, the execution fails. + +![dyn_block](../assets/design/programs/dyn_block.png) + +A *dyn* block must always have one (dynamically-specified) child. Thus, it cannot be a leaf node in the tree. + ### Span block A **span** block is used to describe a linear sequence of operations. When the VM encounters a *span* block, it breaks the sequence of operations into batches and groups according to the following rules: * A group is represented by a single field element. Thus, assuming a single operation can be encoded using 7 bits, and assuming we are using a 64-bit field, a single group may encode up to 9 operations or a single immediate value. @@ -118,5 +126,6 @@ Below we denote $hash$ to be an arithmetization-friendly hash function with $4$- * The hash of a **loop** block is computed as $hash_{loop}(a, 0)$, where $a$ is a hash of a code block corresponding to the loop body. * The hash of a **call** block is computed as $hash_{call}(a, 0)$, where $a$ is a hash of a program of which the VM is aware. * The hash of a **syscall** block is computed as $hash_{syscall}(a, 0)$, where $a$ is a hash of a program belonging to the kernel against which the code was compiled. +* The hash of a **dyn** block is set to a constant, so it is the same for all *dyn* blocks. It does not depend on the hash of the dynamic child. This constant is computed as the RPO hash of two empty words (`[ZERO, ZERO, ZERO, ZERO]`) using a domain value of `DYN_DOMAIN`, where `DYN_DOMAIN` is the op code of the `Dyn` operation. * The hash of a **span** block is computed as $hash(a_1, ..., a_k)$, where $a_i$ is the $i$th batch of operations in the *span* block. Each batch of operations is defined as containing $8$ field elements, and thus, hashing a $k$-batch *span* block requires $k$ absorption steps. * In cases when the number of operations is insufficient to fill the last batch entirely, `NOOPs` are appended to the end of the last batch to ensure that the number of operations in the batch is always equal to $8$. From c2a8e809bd2494ebd86cb7d198103473f4f21321 Mon Sep 17 00:00:00 2001 From: grjte Date: Wed, 23 Aug 2023 17:05:19 +0100 Subject: [PATCH 078/120] feat: add dyn block --- core/src/operations/mod.rs | 7 ++- core/src/program/blocks/dyn_block.rs | 64 ++++++++++++++++++++++++++++ core/src/program/blocks/mod.rs | 11 +++++ processor/src/decoder/block_stack.rs | 2 + processor/src/decoder/mod.rs | 51 +++++++++++++++++++++- processor/src/errors.rs | 8 ++++ processor/src/lib.rs | 24 ++++++++++- processor/src/operations/mod.rs | 1 + 8 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 core/src/program/blocks/dyn_block.rs diff --git a/core/src/operations/mod.rs b/core/src/operations/mod.rs index c3ba529a26..28eb25c9fa 100644 --- a/core/src/operations/mod.rs +++ b/core/src/operations/mod.rs @@ -49,6 +49,9 @@ pub enum Operation { /// Marks the beginning of a function call. Call, + /// Marks the beginning of a dynamic code block, where the target is specified by the stack. + Dyn, + /// Marks the beginning of a kernel call. SysCall, @@ -515,7 +518,7 @@ impl Operation { Self::Loop => 0b0101_0101, Self::Span => 0b0101_0110, Self::Join => 0b0101_0111, - // => 0b0101_1000, + Self::Dyn => 0b0101_1000, // => 0b0101_1001, // => 0b0101_1010, // => 0b0101_1011, @@ -557,6 +560,7 @@ impl Operation { | Self::Halt | Self::Call | Self::SysCall + | Self::Dyn ) } } @@ -582,6 +586,7 @@ impl fmt::Display for Operation { Self::Loop => write!(f, "loop"), Self::Call => writeln!(f, "call"), Self::SysCall => writeln!(f, "syscall"), + Self::Dyn => writeln!(f, "dyn"), Self::Span => write!(f, "span"), Self::End => write!(f, "end"), Self::Repeat => write!(f, "repeat"), diff --git a/core/src/program/blocks/dyn_block.rs b/core/src/program/blocks/dyn_block.rs new file mode 100644 index 0000000000..2e35f1fe86 --- /dev/null +++ b/core/src/program/blocks/dyn_block.rs @@ -0,0 +1,64 @@ +use super::{fmt, Digest, Felt, Operation}; + +// CONSTANTS +// ================================================================================================ + +/// The Dyn block is represented by a constant, which is set to be the hash of two empty words +/// ([ZERO, ZERO, ZERO, ZERO]) with a domain value of `DYN_DOMAIN`, i.e. +/// hasher::merge_in_domain(&[Digest::default(), Digest::default()], Dyn::DOMAIN) +const DYN_CONSTANT: Digest = Digest::new([ + Felt::new(8115106948140260551), + Felt::new(13491227816952616836), + Felt::new(15015806788322198710), + Felt::new(16575543461540527115), +]); + +// Dyn BLOCK +// ================================================================================================ +/// Block for dynamic code where the target is specified by the stack. +/// +/// Executes the code block referenced by the hash on top of the stack. Fails if the body is +/// unavailable to the VM, or if the execution of the dynamically-specified code block fails. +/// +/// The child of a Dyn block (the target specified by the stack) is always dynamic and does not +/// affect the representation of the Dyn block. Therefore all Dyn blocks are represented by the same +/// constant (rather than by unique hashes), which is computed as an RPO hash of two empty words +/// ([ZERO, ZERO, ZERO, ZERO]) with a domain value of `DYN_DOMAIN`. +#[derive(Clone, Debug)] +pub struct Dyn {} + +impl Dyn { + // CONSTANTS + // -------------------------------------------------------------------------------------------- + /// The domain of the Dyn block (used for control block hashing). + pub const DOMAIN: Felt = Felt::new(Operation::Dyn.op_code() as u64); + + // CONSTRUCTOR + // -------------------------------------------------------------------------------------------- + /// Returns a new [Dyn] block instantiated with the specified function body hash. + pub fn new() -> Self { + Self {} + } + + // PUBLIC ACCESSORS + // -------------------------------------------------------------------------------------------- + + /// Returns a hash of this code block. + pub fn hash(&self) -> Digest { + DYN_CONSTANT + } +} + +impl Default for Dyn { + fn default() -> Self { + Self::new() + } +} + +impl fmt::Display for Dyn { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Dyn")?; + + Ok(()) + } +} diff --git a/core/src/program/blocks/mod.rs b/core/src/program/blocks/mod.rs index 9a1a2e043c..604daac9a4 100644 --- a/core/src/program/blocks/mod.rs +++ b/core/src/program/blocks/mod.rs @@ -3,6 +3,7 @@ use crate::DecoratorList; use core::fmt; mod call_block; +mod dyn_block; mod join_block; mod loop_block; mod proxy_block; @@ -10,6 +11,7 @@ mod span_block; mod split_block; pub use call_block::Call; +pub use dyn_block::Dyn; pub use join_block::Join; pub use loop_block::Loop; pub use proxy_block::Proxy; @@ -29,6 +31,7 @@ pub enum CodeBlock { Split(Split), Loop(Loop), Call(Call), + Dyn(Dyn), Proxy(Proxy), } @@ -71,6 +74,11 @@ impl CodeBlock { Self::Call(Call::new_syscall(fn_hash)) } + /// TODO: add comments + pub fn new_dyn() -> Self { + Self::Dyn(Dyn::new()) + } + /// TODO: add comments pub fn new_proxy(code_hash: Digest) -> Self { Self::Proxy(Proxy::new(code_hash)) @@ -92,6 +100,7 @@ impl CodeBlock { CodeBlock::Split(block) => block.hash(), CodeBlock::Loop(block) => block.hash(), CodeBlock::Call(block) => block.hash(), + CodeBlock::Dyn(block) => block.hash(), CodeBlock::Proxy(block) => block.hash(), } } @@ -100,6 +109,7 @@ impl CodeBlock { pub fn domain(&self) -> Felt { match self { CodeBlock::Call(block) => block.domain(), + CodeBlock::Dyn(_) => Dyn::DOMAIN, CodeBlock::Join(_) => Join::DOMAIN, CodeBlock::Loop(_) => Loop::DOMAIN, CodeBlock::Span(_) => Span::DOMAIN, @@ -117,6 +127,7 @@ impl fmt::Display for CodeBlock { CodeBlock::Split(block) => write!(f, "{block}"), CodeBlock::Loop(block) => write!(f, "{block}"), CodeBlock::Call(block) => write!(f, "{block}"), + CodeBlock::Dyn(block) => write!(f, "{block}",), CodeBlock::Proxy(block) => write!(f, "{block}"), } } diff --git a/processor/src/decoder/block_stack.rs b/processor/src/decoder/block_stack.rs index b7b548a8c9..cef32a8bd7 100644 --- a/processor/src/decoder/block_stack.rs +++ b/processor/src/decoder/block_stack.rs @@ -147,6 +147,7 @@ impl BlockInfo { BlockType::Split => 1, BlockType::Loop(is_entered) => u32::from(is_entered), BlockType::Call => 1, + BlockType::Dyn => 1, BlockType::SysCall => 1, BlockType::Span => 0, } @@ -202,6 +203,7 @@ pub enum BlockType { Split, Loop(bool), // internal value set to false if the loop is never entered Call, + Dyn, SysCall, Span, } diff --git a/processor/src/decoder/mod.rs b/processor/src/decoder/mod.rs index cc1be3a737..c060ba3256 100644 --- a/processor/src/decoder/mod.rs +++ b/processor/src/decoder/mod.rs @@ -1,5 +1,5 @@ use super::{ - AdviceProvider, Call, ColMatrix, ExecutionError, Felt, FieldElement, Join, Loop, OpBatch, + AdviceProvider, Call, ColMatrix, Dyn, ExecutionError, Felt, FieldElement, Join, Loop, OpBatch, Operation, Process, Span, Split, StarkField, Vec, Word, EMPTY_WORD, MIN_TRACE_LEN, ONE, OP_BATCH_SIZE, ZERO, }; @@ -241,6 +241,35 @@ where self.execute_op(Operation::Noop) } + // DYN BLOCK + // -------------------------------------------------------------------------------------------- + + /// Starts decoding of a DYN block. + pub(super) fn start_dyn_block( + &mut self, + block: &Dyn, + dyn_hash: Word, + ) -> Result<(), ExecutionError> { + let addr = + self.chiplets + .hash_control_block(EMPTY_WORD, EMPTY_WORD, Dyn::DOMAIN, block.hash()); + + self.decoder.start_dyn(dyn_hash, addr); + self.execute_op(Operation::Noop) + } + + /// Ends decoding of a DYN block. + pub(super) fn end_dyn_block(&mut self, block: &Dyn) -> Result<(), ExecutionError> { + // this appends a row with END operation to the decoder trace. when the END operation is + // executed the rest of the VM state does not change + self.decoder.end_control_block(block.hash().into()); + + // send the end of control block to the chiplets bus to handle the final hash request. + self.chiplets.read_hash_result(); + + self.execute_op(Operation::Noop) + } + // SPAN BLOCK // -------------------------------------------------------------------------------------------- @@ -520,6 +549,26 @@ impl Decoder { self.debug_info.append_operation(Operation::SysCall); } + /// Starts decoding of a DYN block. + /// + /// This pushes a block with ID=addr onto the block stack and appends execution of a DYN + /// operation to the trace. + pub fn start_dyn(&mut self, dyn_hash: Word, addr: Felt) { + // get the current clock cycle here (before the trace table is updated) + let clk = self.trace_len() as u32; + + // push DYN block info onto the block stack and append a DYN row to the execution trace + let parent_addr = self.block_stack.push(addr, BlockType::Dyn, None); + self.trace.append_block_start(parent_addr, Operation::Dyn, dyn_hash, [ZERO; 4]); + + // mark this cycle as the cycle at which a new DYN block began execution (this affects + // block stack and block hash tables). A DYN block has no children but points to the hash + // provided on the stack. + self.aux_hints.block_started(clk, self.block_stack.peek(), Some(dyn_hash), None); + + self.debug_info.append_operation(Operation::Dyn); + } + /// Ends decoding of a control block (i.e., a non-SPAN block). /// /// This appends an execution of an END operation to the trace. The top block on the block diff --git a/processor/src/errors.rs b/processor/src/errors.rs index 4c616dbf1d..fcdd335306 100644 --- a/processor/src/errors.rs +++ b/processor/src/errors.rs @@ -20,6 +20,7 @@ pub enum ExecutionError { AdviceStackReadFailed(u32), CallerNotInSyscall, CodeBlockNotFound(Digest), + DynamicCodeBlockNotFound(Digest), CycleLimitExceeded(u32), DivideByZero(u32), Ext2InttError(Ext2InttError), @@ -70,6 +71,13 @@ impl Display for ExecutionError { "Failed to execute code block with root {hex}; the block could not be found" ) } + DynamicCodeBlockNotFound(digest) => { + let hex = to_hex(&digest.as_bytes())?; + write!( + f, + "Failed to execute the dynamic code block provided by the stack with root {hex}; the block could not be found" + ) + } CycleLimitExceeded(max_cycles) => { write!(f, "Exceeded the allowed number of cycles (max cycles = {max_cycles})") } diff --git a/processor/src/lib.rs b/processor/src/lib.rs index d82d4bbf6a..dbee423758 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -16,7 +16,7 @@ pub use vm_core::{ }; use vm_core::{ code_blocks::{ - Call, CodeBlock, Join, Loop, OpBatch, Span, Split, OP_BATCH_SIZE, OP_GROUP_SIZE, + Call, CodeBlock, Dyn, Join, Loop, OpBatch, Span, Split, OP_BATCH_SIZE, OP_GROUP_SIZE, }, utils::collections::{BTreeMap, Vec}, AdviceInjector, CodeBlockTable, Decorator, DecoratorIterator, Felt, FieldElement, @@ -232,6 +232,7 @@ where CodeBlock::Split(block) => self.execute_split_block(block, cb_table), CodeBlock::Loop(block) => self.execute_loop_block(block, cb_table), CodeBlock::Call(block) => self.execute_call_block(block, cb_table), + CodeBlock::Dyn(block) => self.execute_dyn_block(block, cb_table), CodeBlock::Span(block) => self.execute_span_block(block), CodeBlock::Proxy(_) => Err(ExecutionError::UnexecutableCodeBlock(block.clone())), } @@ -333,6 +334,27 @@ where self.end_call_block(block) } + /// Executes the specified [Dyn] block. + #[inline(always)] + fn execute_dyn_block( + &mut self, + block: &Dyn, + cb_table: &CodeBlockTable, + ) -> Result<(), ExecutionError> { + // get target hash from the stack + let dyn_hash = self.stack.get_word(0); + self.start_dyn_block(block, dyn_hash)?; + + // get dynamic code from the code block table and execute it + let dyn_digest = dyn_hash.into(); + let dyn_code = cb_table + .get(dyn_digest) + .ok_or_else(|| ExecutionError::DynamicCodeBlockNotFound(dyn_digest))?; + self.execute_code_block(dyn_code, cb_table)?; + + self.end_dyn_block(block) + } + /// Executes the specified [Span] block. #[inline(always)] fn execute_span_block(&mut self, block: &Span) -> Result<(), ExecutionError> { diff --git a/processor/src/operations/mod.rs b/processor/src/operations/mod.rs index 75bd3dfe71..f1ea69a935 100644 --- a/processor/src/operations/mod.rs +++ b/processor/src/operations/mod.rs @@ -47,6 +47,7 @@ where Operation::Loop => unreachable!("control flow operation"), Operation::Call => unreachable!("control flow operation"), Operation::SysCall => unreachable!("control flow operation"), + Operation::Dyn => unreachable!("control flow operation"), Operation::Span => unreachable!("control flow operation"), Operation::Repeat => unreachable!("control flow operation"), Operation::Respan => unreachable!("control flow operation"), From 776873e1869f968ba8a0cd926a96d9f8dbfee361 Mon Sep 17 00:00:00 2001 From: grjte Date: Fri, 25 Aug 2023 15:46:14 +0100 Subject: [PATCH 079/120] test(proc): add dyn node test --- processor/src/decoder/tests.rs | 189 +++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) diff --git a/processor/src/decoder/tests.rs b/processor/src/decoder/tests.rs index 89268ef98f..d574eb9cbf 100644 --- a/processor/src/decoder/tests.rs +++ b/processor/src/decoder/tests.rs @@ -1464,6 +1464,166 @@ fn syscall_block() { assert_eq!(expected_rows, aux_hints.block_hash_table_rows()); } +// DYN BLOCK TESTS +// ================================================================================================ +#[test] +fn dyn_block() { + // build a dynamic block which looks like this: + // push.1 add + + let foo_root = CodeBlock::new_span(vec![Operation::Push(ONE), Operation::Add]); + let mul_span = CodeBlock::new_span(vec![Operation::Mul]); + let save_span = CodeBlock::new_span(vec![Operation::MovDn4]); + let join = CodeBlock::new_join([mul_span.clone(), save_span.clone()]); + // This dyn will point to foo. + let dyn_block = CodeBlock::new_dyn(); + let program = CodeBlock::new_join([join.clone(), dyn_block.clone()]); + + let (trace, aux_hints, trace_len) = build_dyn_trace( + &[ + foo_root.hash()[0].as_int(), + foo_root.hash()[1].as_int(), + foo_root.hash()[2].as_int(), + foo_root.hash()[3].as_int(), + 2, + 4, + ], + &program, + foo_root.clone(), + ); + + // --- check block address, op_bits, group count, op_index, and in_span columns --------------- + check_op_decoding(&trace, 0, ZERO, Operation::Join, 0, 0, 0); + // starting inner join + let join_addr = INIT_ADDR + EIGHT; + check_op_decoding(&trace, 1, INIT_ADDR, Operation::Join, 0, 0, 0); + // starting first span + let mul_span_addr = join_addr + EIGHT; + check_op_decoding(&trace, 2, join_addr, Operation::Span, 1, 0, 0); + check_op_decoding(&trace, 3, mul_span_addr, Operation::Mul, 0, 0, 1); + check_op_decoding(&trace, 4, mul_span_addr, Operation::End, 0, 0, 0); + // starting second span + let save_span_addr = mul_span_addr + EIGHT; + check_op_decoding(&trace, 5, join_addr, Operation::Span, 1, 0, 0); + check_op_decoding(&trace, 6, save_span_addr, Operation::MovDn4, 0, 0, 1); + check_op_decoding(&trace, 7, save_span_addr, Operation::End, 0, 0, 0); + // end inner join + check_op_decoding(&trace, 8, join_addr, Operation::End, 0, 0, 0); + // dyn + check_op_decoding(&trace, 9, INIT_ADDR, Operation::Dyn, 0, 0, 0); + // starting foo span + let dyn_addr = save_span_addr + EIGHT; + let add_span_addr = dyn_addr + EIGHT; + check_op_decoding(&trace, 10, dyn_addr, Operation::Span, 2, 0, 0); + check_op_decoding(&trace, 11, add_span_addr, Operation::Push(ONE), 1, 0, 1); + check_op_decoding(&trace, 12, add_span_addr, Operation::Add, 0, 1, 1); + check_op_decoding(&trace, 13, add_span_addr, Operation::End, 0, 0, 0); + // end dyn + check_op_decoding(&trace, 14, dyn_addr, Operation::End, 0, 0, 0); + // end outer join + check_op_decoding(&trace, 15, INIT_ADDR, Operation::End, 0, 0, 0); + + // --- check hasher state columns ------------------------------------------------------------- + + // in the first row, the hasher state is set to hashes of both child nodes + let join_hash: Word = join.hash().into(); + let dyn_hash: Word = dyn_block.hash().into(); + assert_eq!(join_hash, get_hasher_state1(&trace, 0)); + assert_eq!(dyn_hash, get_hasher_state2(&trace, 0)); + + // in the second row, the hasher set is set to hashes of both child nodes of the inner JOIN + let mul_span_hash: Word = mul_span.hash().into(); + let save_span_hash: Word = save_span.hash().into(); + assert_eq!(mul_span_hash, get_hasher_state1(&trace, 1)); + assert_eq!(save_span_hash, get_hasher_state2(&trace, 1)); + + // at the end of the first SPAN, the hasher state is set to the hash of the first child + assert_eq!(mul_span_hash, get_hasher_state1(&trace, 4)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 4)); + + // at the end of the second SPAN, the hasher state is set to the hash of the second child + assert_eq!(save_span_hash, get_hasher_state1(&trace, 7)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 7)); + + // at the end of the inner JOIN, the hasher set is set to the hash of the JOIN + assert_eq!(join_hash, get_hasher_state1(&trace, 8)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 8)); + + // at the start of the DYN block, the hasher state is set to the hash of its child (foo span) + let foo_hash: Word = foo_root.hash().into(); + assert_eq!(foo_hash, get_hasher_state1(&trace, 9)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 9)); + + // at the end of the DYN SPAN, the hasher state is set to the hash of the foo span + assert_eq!(foo_hash, get_hasher_state1(&trace, 13)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 13)); + + // at the end of the DYN block, the hasher state is set to the hash of the DYN node + assert_eq!(dyn_hash, get_hasher_state1(&trace, 14)); + + // at the end of the program, the hasher state is set to the hash of the entire program + let program_hash: Word = program.hash().into(); + assert_eq!(program_hash, get_hasher_state1(&trace, 15)); + assert_eq!([ZERO, ZERO, ZERO, ZERO], get_hasher_state2(&trace, 15)); + + // the HALT opcode and program hash get propagated to the last row + for i in 16..trace_len { + assert!(contains_op(&trace, i, Operation::Halt)); + assert_eq!(ZERO, trace[OP_BITS_EXTRA_COLS_RANGE.start][i]); + assert_eq!(ONE, trace[OP_BITS_EXTRA_COLS_RANGE.start + 1][i]); + assert_eq!(program_hash, get_hasher_state1(&trace, i)); + } + + // --- check op_group table hints ------------------------------------------------------------- + // 1 op group should be inserted at cycle 10, and removed in the subsequent cycle + let expected_ogt_hints = + vec![(10, OpGroupTableUpdate::InsertRows(1)), (11, OpGroupTableUpdate::RemoveRow)]; + assert_eq!(&expected_ogt_hints, aux_hints.op_group_table_hints()); + + // the group is an op group with a single ADD + let expected_ogt_rows = vec![OpGroupTableRow::new(add_span_addr, ONE, ONE)]; + assert_eq!(expected_ogt_rows, aux_hints.op_group_table_rows()); + + // --- check block execution hints ------------------------------------------------------------ + let expected_hints = vec![ + (0, BlockTableUpdate::BlockStarted(2)), // outer join start + (1, BlockTableUpdate::BlockStarted(2)), // inner join start + (2, BlockTableUpdate::BlockStarted(0)), // mul span start + (4, BlockTableUpdate::BlockEnded(true)), // mul span end + (5, BlockTableUpdate::BlockStarted(0)), // save span start + (7, BlockTableUpdate::BlockEnded(false)), // save span end + (8, BlockTableUpdate::BlockEnded(true)), // inner join end + (9, BlockTableUpdate::BlockStarted(1)), // dyn start + (10, BlockTableUpdate::BlockStarted(0)), // foo span start + (13, BlockTableUpdate::BlockEnded(false)), // foo span end + (14, BlockTableUpdate::BlockEnded(false)), // dyn end + (15, BlockTableUpdate::BlockEnded(false)), // outer join end + ]; + assert_eq!(expected_hints, aux_hints.block_exec_hints()); + + // --- check block stack table hints ---------------------------------------------------------- + let expected_rows = vec![ + BlockStackTableRow::new_test(INIT_ADDR, ZERO, false), // join + BlockStackTableRow::new_test(join_addr, INIT_ADDR, false), // inner join + BlockStackTableRow::new_test(mul_span_addr, join_addr, false), // mul span + BlockStackTableRow::new_test(save_span_addr, join_addr, false), // save span + BlockStackTableRow::new_test(dyn_addr, INIT_ADDR, false), // dyn + BlockStackTableRow::new_test(add_span_addr, dyn_addr, false), // foo span + ]; + assert_eq!(expected_rows, aux_hints.block_stack_table_rows()); + + // --- check block hash table hints ---------------------------------------------------------- + let expected_rows = vec![ + BlockHashTableRow::from_program_hash(program_hash), + BlockHashTableRow::new_test(INIT_ADDR, join_hash, true, false), + BlockHashTableRow::new_test(INIT_ADDR, dyn_hash, false, false), + BlockHashTableRow::new_test(join_addr, mul_span_hash, true, false), + BlockHashTableRow::new_test(join_addr, save_span_hash, false, false), + BlockHashTableRow::new_test(dyn_addr, foo_hash, false, false), + ]; + assert_eq!(expected_rows, aux_hints.block_hash_table_rows()); +} + // HELPER REGISTERS TESTS // ================================================================================================ #[test] @@ -1517,6 +1677,35 @@ fn build_trace(stack_inputs: &[u64], program: &CodeBlock) -> (DecoderTrace, AuxT ) } +fn build_dyn_trace( + stack_inputs: &[u64], + program: &CodeBlock, + fn_block: CodeBlock, +) -> (DecoderTrace, AuxTraceHints, usize) { + let stack_inputs = StackInputs::try_from_values(stack_inputs.iter().copied()).unwrap(); + let advice_provider = MemAdviceProvider::default(); + let mut process = + Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); + + // build code block table + let mut cb_table = CodeBlockTable::default(); + cb_table.insert(fn_block); + + process.execute_code_block(program, &cb_table).unwrap(); + + let (trace, aux_hints, _) = ExecutionTrace::test_finalize_trace(process); + let trace_len = get_trace_len(&trace) - ExecutionTrace::NUM_RAND_ROWS; + + ( + trace[DECODER_TRACE_RANGE] + .to_vec() + .try_into() + .expect("failed to convert vector to array"), + aux_hints.decoder, + trace_len, + ) +} + fn build_call_trace( program: &CodeBlock, fn_block: CodeBlock, From 4911edd23599274de7e50e361ee9a1f51db36fcd Mon Sep 17 00:00:00 2001 From: grjte Date: Wed, 6 Sep 2023 18:27:00 +0100 Subject: [PATCH 080/120] test: add test to validate dyn node constant --- core/src/program/tests.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/src/program/tests.rs b/core/src/program/tests.rs index 5e7efe4cfd..016e2e98a6 100644 --- a/core/src/program/tests.rs +++ b/core/src/program/tests.rs @@ -1,8 +1,15 @@ -use super::{Deserializable, Digest, Felt, Kernel, ProgramInfo, Serializable}; -use crate::Word; +use super::{blocks::Dyn, Deserializable, Digest, Felt, Kernel, ProgramInfo, Serializable}; +use crate::{chiplets::hasher, Word}; use proptest::prelude::*; use rand_utils::prng_array; +#[test] +fn dyn_hash_is_correct() { + let expected_constant = + hasher::merge_in_domain(&[Digest::default(), Digest::default()], Dyn::DOMAIN); + assert_eq!(expected_constant, Dyn::new().hash()); +} + proptest! { #[test] fn arbitrary_program_info_serialization_works( From 95de7caa9390c1803f2752c1ef7b64e1a524e1bf Mon Sep 17 00:00:00 2001 From: grjte Date: Wed, 6 Sep 2023 18:44:43 +0100 Subject: [PATCH 081/120] docs: add dyn block to operation & flag docs --- docs/src/design/stack/op_constraints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/design/stack/op_constraints.md b/docs/src/design/stack/op_constraints.md index 3a18f948cb..c6da2cbada 100644 --- a/docs/src/design/stack/op_constraints.md +++ b/docs/src/design/stack/op_constraints.md @@ -187,7 +187,7 @@ This group contains operations which require constraints with degree up to $3$. | `LOOP` | $85$ | `101_0101` | [Flow control ops](../decoder/main.md) | $5$ | | `SPAN` | $86$ | `101_0110` | [Flow control ops](../decoder/main.md) | $5$ | | `JOIN` | $87$ | `101_0111` | [Flow control ops](../decoder/main.md) | $5$ | -| `` | $88$ | `101_1000` | | $5$ | +| `DYN` | $88$ | `101_1000` | [Flow control ops](../decoder/main.md) | $5$ | | `` | $89$ | `101_1001` | | $5$ | | `` | $90$ | `101_1010` | | $5$ | | `` | $91$ | `101_1011` | | $5$ | From 23e447ea7764b84b8a74c8e0a1bee519043f27c2 Mon Sep 17 00:00:00 2001 From: grjte Date: Wed, 6 Sep 2023 18:54:22 +0100 Subject: [PATCH 082/120] docs: add dyn to decoder docs --- .../decoder/decoder_dyn_block_decoding.png | Bin 0 -> 216644 bytes .../design/decoder/decoder_dyn_operation.png | Bin 0 -> 89542 bytes docs/src/design/decoder/constraints.md | 46 +++++++++++++----- docs/src/design/decoder/main.md | 25 ++++++++++ docs/src/design/programs.md | 17 +++---- docs/src/design/stack/op_constraints.md | 2 +- 6 files changed, 69 insertions(+), 21 deletions(-) create mode 100644 docs/src/assets/design/decoder/decoder_dyn_block_decoding.png create mode 100644 docs/src/assets/design/decoder/decoder_dyn_operation.png diff --git a/docs/src/assets/design/decoder/decoder_dyn_block_decoding.png b/docs/src/assets/design/decoder/decoder_dyn_block_decoding.png new file mode 100644 index 0000000000000000000000000000000000000000..955d88bdba7b7e4da2637686b111f1afd4ddd8f7 GIT binary patch literal 216644 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 z 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 AcmMzZ literal 0 HcmV?d00001 diff --git a/docs/src/assets/design/decoder/decoder_dyn_operation.png b/docs/src/assets/design/decoder/decoder_dyn_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..93426e0d31f51435ec7e8ddd001abfd4d1c98871 GIT binary patch literal 89542 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 literal 0 HcmV?d00001 diff --git a/docs/src/design/decoder/constraints.md b/docs/src/design/decoder/constraints.md index c9f8f00d06..17fec5fcdc 100644 --- a/docs/src/design/decoder/constraints.md +++ b/docs/src/design/decoder/constraints.md @@ -18,15 +18,16 @@ AIR constraints for the decoder involve operations listed in the table below. Fo | `REPEAT` | $f_{repeat}$ | 4 | Top stack element is dropped. | | `SPAN` | $f_{span}$ | 5 | Stack remains unchanged. | | `RESPAN` | $f_{respan}$ | 4 | Stack remains unchanged. | +| `DYN` | $f_{dyn}$ | 5 | Stack remains unchanged. | | `CALL` | $f_{call}$ | 4 | Top stack element is dropped. | | `SYSCALL` | $f_{syscall}$ | 4 | Top stack element is dropped. | | `END` | $f_{end}$ | 4 | When exiting a loop block, top stack element is dropped; otherwise, the stack remains unchanged. | | `HALT` | $f_{halt}$ | 4 | Stack remains unchanged. | | `PUSH` | $f_{push}$ | 4 | An immediate value is pushed onto the stack. | -We also use the [control flow flag](../stack/op_constraints.md#control-flow-flag) $f_{ctrl}$ exposed by the VM, which is set when any one of the above control flow operations is being executed. It has degree $3$. +We also use the [control flow flag](../stack/op_constraints.md#control-flow-flag) $f_{ctrl}$ exposed by the VM, which is set when any one of the above control flow operations is being executed. It has degree $5$. -As described [previously](./main.md#program-decoding), the general idea of the decoder is that the prove provides the program to the VM by populating some of cells in the trace non-deterministically. Values in these are then used to update virtual tables (represented via multiset checks) such as block hash table, block stack table etc. Transition constraints are used to enforce that the tables are updates correctly, and we also apply boundary constraints to enforce the correct initial and final states of these tables. One of these boundary constraints binds the execution trace to the hash of the program being executed. Thus, if the virtual tables were updated correctly and boundary constraints hold, we can be convinced that the prover executed the claimed program on the VM. +As described [previously](./main.md#program-decoding), the general idea of the decoder is that the prover provides the program to the VM by populating some of cells in the trace non-deterministically. Values in these are then used to update virtual tables (represented via multiset checks) such as block hash table, block stack table etc. Transition constraints are used to enforce that the tables are updates correctly, and we also apply boundary constraints to enforce the correct initial and final states of these tables. One of these boundary constraints binds the execution trace to the hash of the program being executed. Thus, if the virtual tables were updated correctly and boundary constraints hold, we can be convinced that the prover executed the claimed program on the VM. In the sections below, we describe constraints according to their logical grouping. However, we start out with a set of general constraints which are applicable to multiple parts of the decoder. @@ -38,6 +39,12 @@ When `SPLIT` or `LOOP` operation is executed, the top of the operand stack must (f_{split} + f_{loop}) \cdot (s_0^2 - s_0) = 0 \text{ | degree} = 7 $$ +When a `DYN` operation is executed, the hasher registers must all be set to $0$: + +> $$ +f_{dyn} \cdot (1 - h_i) = 0 \text { for } i \in [0, 8) \text{ | degree} = 2 +$$ + When `REPEAT` operation is executed, the value at the top of the operand stack must be $1$: > $$ @@ -89,13 +96,13 @@ $$ When the value in `in_span` column is set to $1$, control flow operations cannot be executed on the VM, but when `in_span` flag is $0$, only control flow operations can be executed on the VM: > $$ -1 - sp - f_{ctrl} = 0 \text{ | degree} = 3 +1 - sp - f_{ctrl} = 0 \text{ | degree} = 5 $$ ## Block hash computation constraints As described [previously](./main.md#program-block-hashing), when the VM starts executing a new block, it also initiates computation of the block's hash. There are two separate methodologies for computing block hashes. -For *join*, *split*, and *loop* blocks, the hash is computed directly from the hashes of the block's children. The prover provides these child hashes non-deterministically by populating registers $h_0,..., h_7$. The hasher is initialized using the hash chiplet, and we use the address of the hasher as the block's ID. The result of the hash is available $7$ rows down in the hasher table (i.e., at row with index equal to block ID plus $7$). We read the result from the hasher table at the time the `END` operation is executed for a given block. +For *join*, *split*, and *loop* blocks, the hash is computed directly from the hashes of the block's children. The prover provides these child hashes non-deterministically by populating registers $h_0,..., h_7$. For *dyn*, the hasher registers are populated with zeros, so the resulting hash is a constant value. The hasher is initialized using the hash chiplet, and we use the address of the hasher as the block's ID. The result of the hash is available $7$ rows down in the hasher table (i.e., at row with index equal to block ID plus $7$). We read the result from the hasher table at the time the `END` operation is executed for a given block. For *span* blocks, the hash is computed by absorbing a linear sequence of instructions (organized into operation groups and batches) into the hasher and then returning the result. The prover provides operation batches non-deterministically by populating registers $h_0, ..., h_7$. Similarly to other blocks, the hasher is initialized using the hash chiplet at the start of the block, and we use the address of the hasher as the ID of the first operation batch in the block. As we absorb additional operation batches into the hasher (by executing `RESPAN` operation), the batch address is incremented by $8$. This moves the "pointer" into the hasher table $8$ rows down with every new batch. We read the result from the hasher table at the time the `END` operation is executed for a given block. @@ -130,7 +137,7 @@ $$ In the above, $a$ represents the address value in the decoder which corresponds to the hasher chiplet address at which the hasher was initialized (or the last absorption took place). As such, $a + 7$ corresponds to the hasher chiplet address at which the result is returned. $$ -f_{ctrli} = f_{join} + f_{split} + f_{loop} + f_{call} \text{ | degree} = 5 +f_{ctrli} = f_{join} + f_{split} + f_{loop} + f_{dyn} + f_{call} \text{ | degree} = 5 $$ In the above, $f_{ctrli}$ is set to $1$ when a control flow operation that signifies the initialization of a control block is being executed on the VM. Otherwise, it is set to $0$. An exception is made for the `SYSCALL` operation. Although it also signifies the initialization of a control block, it must additionally send a procedure access request to the [kernel ROM chiplet](../chiplets/kernel_rom.md) via the chiplets bus. Therefore, it is excluded from this flag and its communication with the chiplets bus is handled separately. @@ -143,7 +150,7 @@ In the above, $d$ represents the opcode value of the opcode being executed on th Using the above variables, we define operation values as described below. -When a control block initializer operation (`JOIN`, `SPLIT`, `LOOP`, `CALL`, `SYSCALL`) is executed, a new hasher is initialized and the contents of $h_0, ..., h_7$ are absorbed into the hasher. As mentioned above, the opcode value $d$ is populated in the second capacity resister via the $\alpha_5$ term. +When a control block initializer operation (`JOIN`, `SPLIT`, `LOOP`, `DYN`, `CALL`, `SYSCALL`) is executed, a new hasher is initialized and the contents of $h_0, ..., h_7$ are absorbed into the hasher. As mentioned above, the opcode value $d$ is populated in the second capacity resister via the $\alpha_5$ term. $$ u_{ctrli} = f_{ctrli} \cdot (h_{init} + \alpha_5 \cdot d) \text{ | degree} = 6 @@ -207,7 +214,7 @@ $$ v_{join} = f_{join} \cdot (\alpha_0 + \alpha_1 \cdot a' + \alpha_2 \cdot a) \text{ | degree} = 6 $$ -When `SPLIT` operation is executed, row $(a', a, 0)$ added to the block stack table: +When `SPLIT` operation is executed, row $(a', a, 0)$ is added to the block stack table: $$ v_{split} = f_{split} \cdot (\alpha_0 + \alpha_1 \cdot a' + \alpha_2 \cdot a) \text{ | degree} = 6 @@ -232,6 +239,12 @@ u_{respan} = f_{respan} \cdot (\alpha_0 + \alpha_1 \cdot a + \alpha_2 \cdot h_1' v_{respan} = f_{respan} \cdot (\alpha_0 + \alpha_1 \cdot a' + \alpha_2 \cdot h_1') \text{ | degree} = 5 $$ +When a `DYN` operation is executed, row $(a', a, 0)$ is added to the block stack table: + +$$ +v_{dyn} = f_{dyn} \cdot (\alpha_0 + \alpha_1 \cdot a' + \alpha_2 \cdot a) \text{ | degree} = 6 +$$ + When `END` operation is executed, row $(a, a', h_5)$ is removed from the block span table. Register $h_5$ contains the `is_loop` flag: $$ @@ -241,8 +254,9 @@ $$ Using the above definitions, we can describe the constraint for updating the block stack table as follows: > $$ -p_1' \cdot (u_{end} + u_{respan} + 1 - (f_{end} + f_{respan})) = \\ -p_1 \cdot (v_{join} + v_{split} + v_{loop} + v_{span} + v_{respan} + 1 - (f_{join} + f_{split} + f_{loop} + f_{span} + f_{respan} )) +p_1' \cdot (u_{end} + u_{respan} + 1 - (f_{end} + f_{respan})) = p_1 \cdot \\ +(v_{join} + v_{split} + v_{loop} + v_{span} + v_{respan} + v_{dyn} + 1 - \\ +(f_{join} + f_{split} + f_{loop} + f_{span} + f_{respan} + f_{dyn})) $$ We need to add $1$ and subtract the sum of the relevant operation flags from each side to ensure that when none of the flags is set to $1$, the above constraint reduces to $p_1' = p_1$. @@ -252,7 +266,7 @@ The degree of this constraint is $7$. In addition to the above transition constraint, we also need to impose boundary constraints against the $p_1$ column to make sure the first and the last value in the column is set to $1$. This enforces that the block stack table starts and ends in an empty state. ## Block hash table constraints -As described [previously](./main.md#block-hash-table), when the VM starts executing a new program block, it adds hashes of the block's children to the block hash table. And when the VM finishes executing a block, it removes the block's hash from the block hash table. This means that the block hash tables gets updated when we execute `JOIN`, `SPLIT`, `LOOP`, `REPEAT`, and `END` operations (executing `SPAN` operation does not affect the block hash table because a *span* block has no children). +As described [previously](./main.md#block-hash-table), when the VM starts executing a new program block, it adds hashes of the block's children to the block hash table. And when the VM finishes executing a block, it removes the block's hash from the block hash table. This means that the block hash table gets updated when we execute the `JOIN`, `SPLIT`, `LOOP`, `REPEAT`, `DYN`, and `END` operations (executing `SPAN` operation does not affect the block hash table because a *span* block has no children). Adding and removing entries to/from the block hash table is accomplished as follows: * To add an entry, we multiply the value in column $p_2$ by a value representing a tuple `(prnt_id, block_hash, is_first_child, is_loop_body)`. A constraint to enforce this would look as $p_2' = p_2 \cdot v$, where $v$ is the value representing the row to be added. @@ -301,6 +315,16 @@ When `REPEAT` operation is executed, hash of loop body is added to the block has $$v_{repeat} = f_{repeat} \cdot (ch_1 + \alpha_7) \text{ | } \text{degree} = 5$$ +When the `DYN` operation is executed, the hash of the dynamic child is added to the block hash table. Since the child is dynamically specified by the top four elements of the stack, the value representing the *dyn* block's child must be computed based on the stack rather than from the decoder's hasher registers: + +$$ +ch_{dyn} = \alpha_0 + \alpha_1 \cdot a' + \sum_{i=0}^3(\alpha_{i+2} \cdot s_{3-i}) \text{ | degree} = 1 +$$ + +$$ +v_{dyn} = f_{dyn} \cdot ch_{dyn} \text{ | degree} = 6 +$$ + When `END` operation is executed, hash of the completed block is removed from the block hash table. However, we also need to differentiate between removing the first and the second child of a *join* block. We do this by looking at the next operation. Specifically, if the next operation is neither `END` nor `REPEAT` we know that another block is about to be executed, and thus, we have just finished executing the first child of a *join* block. Thus, if the next operation is neither `END` nor `REPEAT` we need to set the term for $\alpha_6$ coefficient to $1$ as shown below: $$ @@ -311,7 +335,7 @@ Using the above definitions, we can describe the constraint for updating the blo > $$ p_2' \cdot (u_{end} + 1 - f_{end}) = \\ -p_2 \cdot (v_{join} + v_{split} + v_{loop} + v_{repeat} + 1 - (f_{join} + f_{split} + f_{loop} + f_{repeat})) +p_2 \cdot (v_{join} + v_{split} + v_{loop} + v_{repeat} + v_{dyn} + 1 - (f_{join} + f_{split} + f_{loop} + f_{repeat} + f_{dyn})) $$ We need to add $1$ and subtract the sum of the relevant operation flags from each side to ensure that when none of the flags is set to $1$, the above constraint reduces to $p_2' = p_2$. diff --git a/docs/src/design/decoder/main.md b/docs/src/design/decoder/main.md index 92459d88f1..c99d7a010e 100644 --- a/docs/src/design/decoder/main.md +++ b/docs/src/design/decoder/main.md @@ -27,6 +27,7 @@ Managing control flow in the VM is accomplished by executing control flow operat | `REPEAT` | Initiates a new iteration of an executing loop. | | `SPAN` | Initiates processing of a new [Span block](../programs.md#span-block). | | `RESPAN` | Initiates processing of a new operation batch within a span block. | +| `DYN` | Initiates processing of a new [Dyn block](../programs.md#dyn-block). | | `CALL` | Initiates processing of a new [Call block](../programs.md#call-block). | | `SYSCALL` | Initiates processing ofa new [Syscall block](../programs.md#syscall-block). | | `END` | Marks the end of a program block. | @@ -326,6 +327,22 @@ When the VM executes a `SPAN` operation, it does the following: 5. Decrements `group_count` register by $1$. 6. Sets the `op_index` register to $0$. + +#### DYN operation + +Before a `DYN` operation is executed by the VM, the prover populates $h_0, ..., h_7$ registers with $0$ as shown in the diagram below. + +![decoder_dyn_operation](../../assets/design/decoder/decoder_dyn_operation.png) + +In the above diagram, `blk` is the ID of the *dyn* block which is about to be executed. `blk` is also the address of the hasher row in the auxiliary hasher table. `prnt` is the ID of the block's parent. + +When the VM executes a `DYN` operation, it does the following: + +1. Adds a tuple `(blk, prnt, 0)` to the block stack table. +2. Gets the hash of the dynamic code block `dynamic_block_hash` from the top four elements of the stack. +2. Adds the tuple `(blk, dynamic_block_hash, 0, 0)` to the block hash table. +3. Initiates a 2-to-1 hash computation in the hash chiplet (as described [here](#simple-2-to-1-hash)) using `blk` as row address in the auxiliary hashing table and $h_0, ..., h_7$ as input values. + #### END operation Before an `END` operation is executed by the VM, the prover populates $h_0, ..., h_3$ registers with the hash of the block which is about to end. The prover also sets values in $h_4$ and $h_5$ registers as follows: @@ -446,6 +463,14 @@ If the top of the stack is $0$, the VM still executes the `LOOP` operation. But Moreover, since we've set the `is_loop` flag to $0$, executing the `END` operation does not remove any items from the stack. +### DYN block decoding + +When decoding a *dyn* bock, the VM first executes a `DYN` operation, then executes the child block dynamically specified by the top of the stack. Once the child of the *dyn* block has been executed, the VM executes an `END` operation. This is illustrated in the diagram below. + +![decoder_dyn_block_decoding](../../assets/design/decoder/decoder_dyn_block_decoding.png) + +As described previously, when the VM executes a `DYN` operation, the hash of the child is added to the block hash table. This hash is removed only when the `END` operation for the child block is executed. Thus, until the child block corresponding to the dynamically specified target is executed, the block hash table is not cleared. + ### SPAN block decoding As described [here](../programs.md#span-block), a *span* block can contain one or more operation batches, each batch containing up to $8$ operation groups. At the high level, decoding of a span block is done as follows: diff --git a/docs/src/design/programs.md b/docs/src/design/programs.md index 3cb32bc830..3eab4274e3 100644 --- a/docs/src/design/programs.md +++ b/docs/src/design/programs.md @@ -26,6 +26,13 @@ After the body of the loop is executed, the VM checks the top of the stack again A *loop* block must always have one child, and thus, cannot be a leaf node in the tree. +### Dyn block +A **dyn** block is used to describe a node whose target is specified dynamically via the stack. When the VM encounters a *dyn* block, it executes a program which hashes to the target specified by the top of the stack. Thus, it has a dynamic target rather than a hardcoded target. In order to execute a *dyn* block, the VM must be aware of a program with the hash value that is specified by the top of the stack. Otherwise, the execution fails. + +![dyn_block](../assets/design/programs/dyn_block.png) + +A *dyn* block must always have one (dynamically-specified) child. Thus, it cannot be a leaf node in the tree. + ### Call block A **call** block is used to describe a function call which is executed in a [user context](../user_docs/assembly/execution_contexts.md). When the VM encounters a *call* block, it creates a new user context, then executes a program which hashes to the target specified by the *call* block in the new context. Thus, in order to execute a *call* block, the VM must be aware of a program with the specified hash. Otherwise, the execution fails. At the end of the *call* block, execution returns to the previous context. @@ -53,14 +60,6 @@ When executing a *syscall* block, the VM does the following: A *syscall* block does not have any children. Thus, it must be leaf node in the tree. - -### Dyn block -A **dyn** block is used to describe a node whose target is specified dynamically via the stack. When the VM encounters a *dyn* block, it executes a program which hashes to the target specified by the top of the stack. Thus, it has a dynamic target rather than a hardcoded target. In order to execute a *dyn* block, the VM must be aware of a program with the hash value that is specified by the top of the stack. Otherwise, the execution fails. - -![dyn_block](../assets/design/programs/dyn_block.png) - -A *dyn* block must always have one (dynamically-specified) child. Thus, it cannot be a leaf node in the tree. - ### Span block A **span** block is used to describe a linear sequence of operations. When the VM encounters a *span* block, it breaks the sequence of operations into batches and groups according to the following rules: * A group is represented by a single field element. Thus, assuming a single operation can be encoded using 7 bits, and assuming we are using a 64-bit field, a single group may encode up to 9 operations or a single immediate value. @@ -124,8 +123,8 @@ Below we denote $hash$ to be an arithmetization-friendly hash function with $4$- * The hash of a **join** block is computed as $hash_{join}(a, b)$, where $a$ and $b$ are hashes of the code block being joined. * The hash of a **split** block is computed as $hash_{split}(a, b)$, where $a$ is a hash of a code block corresponding to the *true* branch of execution, and $b$ is a hash of a code block corresponding to the *false branch* of execution. * The hash of a **loop** block is computed as $hash_{loop}(a, 0)$, where $a$ is a hash of a code block corresponding to the loop body. +* The hash of a **dyn** block is set to a constant, so it is the same for all *dyn* blocks. It does not depend on the hash of the dynamic child. This constant is computed as the RPO hash of two empty words (`[ZERO, ZERO, ZERO, ZERO]`) using a domain value of `DYN_DOMAIN`, where `DYN_DOMAIN` is the op code of the `Dyn` operation. * The hash of a **call** block is computed as $hash_{call}(a, 0)$, where $a$ is a hash of a program of which the VM is aware. * The hash of a **syscall** block is computed as $hash_{syscall}(a, 0)$, where $a$ is a hash of a program belonging to the kernel against which the code was compiled. -* The hash of a **dyn** block is set to a constant, so it is the same for all *dyn* blocks. It does not depend on the hash of the dynamic child. This constant is computed as the RPO hash of two empty words (`[ZERO, ZERO, ZERO, ZERO]`) using a domain value of `DYN_DOMAIN`, where `DYN_DOMAIN` is the op code of the `Dyn` operation. * The hash of a **span** block is computed as $hash(a_1, ..., a_k)$, where $a_i$ is the $i$th batch of operations in the *span* block. Each batch of operations is defined as containing $8$ field elements, and thus, hashing a $k$-batch *span* block requires $k$ absorption steps. * In cases when the number of operations is insufficient to fill the last batch entirely, `NOOPs` are appended to the end of the last batch to ensure that the number of operations in the batch is always equal to $8$. diff --git a/docs/src/design/stack/op_constraints.md b/docs/src/design/stack/op_constraints.md index c6da2cbada..94ea80e559 100644 --- a/docs/src/design/stack/op_constraints.md +++ b/docs/src/design/stack/op_constraints.md @@ -292,5 +292,5 @@ f_{end,repeat,respan,halt} = e_1 \cdot b_4 \text{ | degree} = 2 $$ $$ -f_{ctrl} = f_{span,join,split,loop} + f_{end,repeat,respan,halt} + f_{call} + f_{syscall} \text{ | degree} = 3 +f_{ctrl} = f_{span,join,split,loop} + f_{end,repeat,respan,halt} + f_{dyn} + f_{call} + f_{syscall} \text{ | degree} = 5 $$ From 62d1c153f64ac64a7fd6213a3f2abcc35fcc3b6f Mon Sep 17 00:00:00 2001 From: grjte Date: Thu, 7 Sep 2023 16:06:38 +0100 Subject: [PATCH 083/120] docs: fix decoder constraints errors --- docs/src/design/decoder/constraints.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/design/decoder/constraints.md b/docs/src/design/decoder/constraints.md index 17fec5fcdc..bf12f217ca 100644 --- a/docs/src/design/decoder/constraints.md +++ b/docs/src/design/decoder/constraints.md @@ -19,8 +19,8 @@ AIR constraints for the decoder involve operations listed in the table below. Fo | `SPAN` | $f_{span}$ | 5 | Stack remains unchanged. | | `RESPAN` | $f_{respan}$ | 4 | Stack remains unchanged. | | `DYN` | $f_{dyn}$ | 5 | Stack remains unchanged. | -| `CALL` | $f_{call}$ | 4 | Top stack element is dropped. | -| `SYSCALL` | $f_{syscall}$ | 4 | Top stack element is dropped. | +| `CALL` | $f_{call}$ | 4 | Stack remains unchanged. | +| `SYSCALL` | $f_{syscall}$ | 4 | Stack remains unchanged. | | `END` | $f_{end}$ | 4 | When exiting a loop block, top stack element is dropped; otherwise, the stack remains unchanged. | | `HALT` | $f_{halt}$ | 4 | Stack remains unchanged. | | `PUSH` | $f_{push}$ | 4 | An immediate value is pushed onto the stack. | @@ -42,7 +42,7 @@ $$ When a `DYN` operation is executed, the hasher registers must all be set to $0$: > $$ -f_{dyn} \cdot (1 - h_i) = 0 \text { for } i \in [0, 8) \text{ | degree} = 2 +f_{dyn} \cdot (1 - h_i) = 0 \text { for } i \in [0, 8) \text{ | degree} = 6 $$ When `REPEAT` operation is executed, the value at the top of the operand stack must be $1$: From ce2af475b9152206704f70ae07b7640825ede6ad Mon Sep 17 00:00:00 2001 From: Rahul Saxena Date: Tue, 5 Sep 2023 03:43:28 +0530 Subject: [PATCH 084/120] missing params descriptive error message --- assembly/src/ast/parsers/adv_ops.rs | 2 +- assembly/src/ast/parsers/io_ops.rs | 14 +++++++------- assembly/src/ast/parsers/mod.rs | 4 ++-- assembly/src/ast/parsers/stack_ops.rs | 8 ++++---- assembly/src/errors.rs | 7 +++++-- assembly/src/tests.rs | 5 ++++- assembly/src/tokens/mod.rs | 17 ++++++++++------- 7 files changed, 33 insertions(+), 24 deletions(-) diff --git a/assembly/src/ast/parsers/adv_ops.rs b/assembly/src/ast/parsers/adv_ops.rs index 3813d929ed..f2d6a94e05 100644 --- a/assembly/src/ast/parsers/adv_ops.rs +++ b/assembly/src/ast/parsers/adv_ops.rs @@ -17,7 +17,7 @@ use super::{ pub fn parse_adv_inject(op: &Token) -> Result { debug_assert_eq!(op.parts()[0], "adv"); if op.num_parts() < 2 { - return Err(ParsingError::missing_param(op)); + return Err(ParsingError::missing_param(op, "adv..")); } let injector = match op.parts()[1] { diff --git a/assembly/src/ast/parsers/io_ops.rs b/assembly/src/ast/parsers/io_ops.rs index e54309c4c5..a0e49af899 100644 --- a/assembly/src/ast/parsers/io_ops.rs +++ b/assembly/src/ast/parsers/io_ops.rs @@ -27,7 +27,7 @@ pub fn parse_push(op: &Token, constants: &LocalConstMap) -> Result unreachable!("missing token"), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "push.")), 2 => { let param_str = op.parts()[1]; match param_str.strip_prefix("0x") { @@ -65,7 +65,7 @@ pub fn parse_locaddr(op: &Token, constants: &LocalConstMap) -> Result unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "locaddr.")), 2 => { let index = parse_param_with_constant_lookup::(op, 1, constants)?; Ok(Instruction(Locaddr(index))) @@ -83,7 +83,7 @@ pub fn parse_adv_push(op: &Token) -> Result { debug_assert_eq!(op.parts()[0], "adv_push"); match op.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "adv_push.")), 2 => { let num_vals = parse_checked_param(op, 1, 1..=ADVICE_READ_LIMIT)?; Ok(Instruction(AdvPush(num_vals))) @@ -120,7 +120,7 @@ pub fn parse_loc_load(op: &Token, constants: &LocalConstMap) -> Result unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "loc_load.")), 2 => { let index = parse_param_with_constant_lookup::(op, 1, constants)?; Ok(Instruction(LocLoad(index))) @@ -157,7 +157,7 @@ pub fn parse_loc_loadw(op: &Token, constants: &LocalConstMap) -> Result unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "loc_loadw.")), 2 => { let index = parse_param_with_constant_lookup::(op, 1, constants)?; Ok(Instruction(LocLoadW(index))) @@ -194,7 +194,7 @@ pub fn parse_loc_store(op: &Token, constants: &LocalConstMap) -> Result unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "loc_store.")), 2 => { let index = parse_param_with_constant_lookup::(op, 1, constants)?; Ok(Instruction(LocStore(index))) @@ -231,7 +231,7 @@ pub fn parse_loc_storew(op: &Token, constants: &LocalConstMap) -> Result unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "loc_storew.")), 2 => { let index = parse_param_with_constant_lookup::(op, 1, constants)?; Ok(Instruction(LocStoreW(index))) diff --git a/assembly/src/ast/parsers/mod.rs b/assembly/src/ast/parsers/mod.rs index 884e57a3b4..3f4a34f250 100644 --- a/assembly/src/ast/parsers/mod.rs +++ b/assembly/src/ast/parsers/mod.rs @@ -57,12 +57,12 @@ pub fn parse_constants(tokens: &mut TokenStream) -> Result Result<(String, u64), ParsingError> { match token.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(token)), + 1 => Err(ParsingError::missing_param(token, "const.=")), 2 => { let const_declaration: Vec<&str> = token.parts()[1].split('=').collect(); match const_declaration.len() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(token)), + 1 => Err(ParsingError::missing_param(token, "const.=")), 2 => { let name = CONSTANT_LABEL_PARSER .parse_label(const_declaration[0]) diff --git a/assembly/src/ast/parsers/stack_ops.rs b/assembly/src/ast/parsers/stack_ops.rs index 5d64525a1f..bc0b56eea4 100644 --- a/assembly/src/ast/parsers/stack_ops.rs +++ b/assembly/src/ast/parsers/stack_ops.rs @@ -126,7 +126,7 @@ pub fn parse_movup(op: &Token) -> Result { debug_assert_eq!(op.parts()[0], "movup"); match op.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "movup.")), 2 => match op.parts()[1] { "2" => Ok(Instruction(MovUp2)), "3" => Ok(Instruction(MovUp3)), @@ -157,7 +157,7 @@ pub fn parse_movdn(op: &Token) -> Result { debug_assert_eq!(op.parts()[0], "movdn"); match op.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "movdn.")), 2 => match op.parts()[1] { "2" => Ok(Instruction(MovDn2)), "3" => Ok(Instruction(MovDn3)), @@ -188,7 +188,7 @@ pub fn parse_movupw(op: &Token) -> Result { debug_assert_eq!(op.parts()[0], "movupw"); match op.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "movupw.")), 2 => match op.parts()[1] { "2" => Ok(Instruction(MovUpW2)), "3" => Ok(Instruction(MovUpW3)), @@ -207,7 +207,7 @@ pub fn parse_movdnw(op: &Token) -> Result { debug_assert_eq!(op.parts()[0], "movdnw"); match op.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(op)), + 1 => Err(ParsingError::missing_param(op, "movdnw.")), 2 => match op.parts()[1] { "2" => Ok(Instruction(MovDnW2)), "3" => Ok(Instruction(MovDnW3)), diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 163f233a64..df1a10ee34 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -273,9 +273,12 @@ impl ParsingError { } } - pub fn missing_param(token: &Token) -> Self { + pub fn missing_param(token: &Token, expected_format: &str) -> Self { + let _actual_params: usize = token.num_parts(); ParsingError { - message: format!("malformed instruction '{token}': missing required parameter"), + message: format!( + "malformed instruction '{token}': expected format `{expected_format}`" + ), location: *token.location(), op: token.to_string(), } diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 9bbb619d0f..05362ef32f 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -1302,7 +1302,10 @@ fn invalid_while() { let program = assembler.compile(source); assert!(program.is_err()); if let Err(error) = program { - assert_eq!(error.to_string(), "malformed instruction 'while': missing required parameter"); + assert_eq!( + error.to_string(), + "malformed instruction 'while': expected format `while.true`" + ); } let source = "begin push.1 add while.abc mul end end"; diff --git a/assembly/src/tokens/mod.rs b/assembly/src/tokens/mod.rs index 8eb9c213c9..c1105b37a7 100644 --- a/assembly/src/tokens/mod.rs +++ b/assembly/src/tokens/mod.rs @@ -116,7 +116,7 @@ impl<'a> Token<'a> { assert_eq!(Self::USE, self.parts[0], "not a use"); match self.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(self)), + 1 => Err(ParsingError::missing_param(self, "use.")), 2 => { if let Some((module_path, module_name)) = self.parts[1].split_once(Self::ALIAS_DELIM) @@ -150,7 +150,7 @@ impl<'a> Token<'a> { let is_export = self.parts[0] == Self::EXPORT; let (name_str, num_locals) = match self.num_parts() { 0 => unreachable!(), - 1 => return Err(ParsingError::missing_param(self)), + 1 => return Err(ParsingError::missing_param(self, "[proc|export].")), 2 => (self.parts[1], 0), 3 => { let num_locals = validate_proc_locals(self.parts[2], self)?; @@ -170,7 +170,7 @@ impl<'a> Token<'a> { assert_eq!(Self::EXPORT, self.parts[0], "not an export"); match self.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(self)), + 1 => Err(ParsingError::missing_param(self, "export.")), 2 => { if self.parts[1].matches(LibraryPath::PATH_DELIM).count() != 1 { return Err(ParsingError::invalid_reexported_procedure(self, self.parts[1])); @@ -201,7 +201,7 @@ impl<'a> Token<'a> { assert_eq!(Self::IF, self.parts[0], "not an if"); match self.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(self)), + 1 => Err(ParsingError::missing_param(self, "if.true")), 2 => { if self.parts[1] != "true" { Err(ParsingError::invalid_param(self, 1)) @@ -226,7 +226,7 @@ impl<'a> Token<'a> { assert_eq!(Self::WHILE, self.parts[0], "not a while"); match self.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(self)), + 1 => Err(ParsingError::missing_param(self, "while.true")), 2 => { if self.parts[1] != "true" { Err(ParsingError::invalid_param(self, 1)) @@ -242,7 +242,7 @@ impl<'a> Token<'a> { assert_eq!(Self::REPEAT, self.parts[0], "not a repeat"); match self.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(self)), + 1 => Err(ParsingError::missing_param(self, "repeat.")), 2 => self.parts[1].parse::().map_err(|_| ParsingError::invalid_param(self, 1)), _ => Err(ParsingError::extra_param(self)), } @@ -255,7 +255,10 @@ impl<'a> Token<'a> { assert_eq!(invocation_token, self.parts[0], "not an {invocation_token}"); match self.num_parts() { 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(self)), + 1 => Err(ParsingError::missing_param( + self, + &format!("{invocation_token}.").to_string(), + )), 2 => InvocationTarget::parse(self.parts[1], self), _ => Err(ParsingError::extra_param(self)), } From 473051545fabf905b5c267e35fa1665280e6ebf2 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Thu, 7 Sep 2023 22:20:28 -0700 Subject: [PATCH 085/120] refactor: replace string reference with as_str() --- assembly/src/tokens/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assembly/src/tokens/mod.rs b/assembly/src/tokens/mod.rs index c1105b37a7..d82499e8f0 100644 --- a/assembly/src/tokens/mod.rs +++ b/assembly/src/tokens/mod.rs @@ -257,7 +257,7 @@ impl<'a> Token<'a> { 0 => unreachable!(), 1 => Err(ParsingError::missing_param( self, - &format!("{invocation_token}.").to_string(), + format!("{invocation_token}.").as_str(), )), 2 => InvocationTarget::parse(self.parts[1], self), _ => Err(ParsingError::extra_param(self)), From f0dc57581627da40a17fd3e511b500b98d34ad42 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Fri, 8 Sep 2023 02:17:23 +0200 Subject: [PATCH 086/120] feat: add procedure name to the ImportedProcModuleNotFound error --- assembly/src/assembler/context.rs | 73 ++++++++++++++++++++----------- assembly/src/assembler/mod.rs | 18 ++++---- assembly/src/ast/mod.rs | 18 ++++++++ assembly/src/errors.rs | 17 ++++--- assembly/src/lib.rs | 2 +- assembly/src/tests.rs | 21 +++++---- miden/src/examples/fibonacci.rs | 2 +- 7 files changed, 97 insertions(+), 54 deletions(-) diff --git a/assembly/src/assembler/context.rs b/assembly/src/assembler/context.rs index e3f7284ec3..a5e035d3f5 100644 --- a/assembly/src/assembler/context.rs +++ b/assembly/src/assembler/context.rs @@ -1,7 +1,9 @@ use super::{ - AssemblyError, CallSet, CodeBlock, CodeBlockTable, Kernel, LibraryPath, NamedProcedure, - Procedure, ProcedureCache, ProcedureId, ProcedureName, RpoDigest, ToString, Vec, + AssemblyError, BTreeMap, CallSet, CodeBlock, CodeBlockTable, Kernel, LibraryPath, + NamedProcedure, Procedure, ProcedureCache, ProcedureId, ProcedureName, RpoDigest, ToString, + Vec, }; +use crate::ast::{ModuleAst, ProgramAst}; // ASSEMBLY CONTEXT // ================================================================================================ @@ -19,33 +21,29 @@ pub struct AssemblyContext { allow_phantom_calls: bool, } -/// Describes which type of Miden assembly modules can be compiled with a given [AssemblyContext]. -#[derive(PartialEq)] -pub enum AssemblyContextType { - Kernel, - Module, - Program, -} - impl AssemblyContext { // CONSTRUCTORS // -------------------------------------------------------------------------------------------- - /// Returns a new [AssemblyContext]. + /// Returns a new [AssemblyContext] for non-execurable kernel and non-kernel modules. /// - /// The `context_type` specifies how the context will be used and the [AssemblyContext] is - /// instantiated accordingly. - pub fn new(context_type: AssemblyContextType) -> Self { - let modules = match context_type { - AssemblyContextType::Kernel | AssemblyContextType::Module => Vec::new(), - // for executable programs we initialize the module stack with the context of the - // executable module itself - AssemblyContextType::Program => vec![ModuleContext::for_program()], - }; + /// The `is_kernel_module` specifies whether provided module is a kernel module. + pub fn for_module(is_kernel_module: bool) -> Self { + Self { + module_stack: Vec::new(), + is_kernel: is_kernel_module, + kernel: None, + allow_phantom_calls: false, + } + } + /// Returns a new [AssemblyContext] for execurable module. + /// + /// The `program` is required to provide data about IDs and names of imported procedures. + pub fn for_program(program: &ProgramAst) -> Self { Self { - module_stack: modules, - is_kernel: context_type == AssemblyContextType::Kernel, + module_stack: vec![ModuleContext::for_program(program.get_imported_procedures_map())], + is_kernel: false, kernel: None, allow_phantom_calls: false, } @@ -77,6 +75,15 @@ impl AssemblyContext { self.current_proc_context().expect("no procedures").num_locals } + /// Returns the name of the procedure by its ID from the procedure map. + pub fn get_imported_procedure_name(&self, id: &ProcedureId) -> Option { + if let Some(module) = self.module_stack.first() { + module.proc_map.get(id).cloned() + } else { + None + } + } + // STATE MUTATORS // -------------------------------------------------------------------------------------------- @@ -87,7 +94,11 @@ impl AssemblyContext { /// /// # Errors /// Returns an error if a module with the same path already exists in the module stack. - pub fn begin_module(&mut self, module_path: &LibraryPath) -> Result<(), AssemblyError> { + pub fn begin_module( + &mut self, + module_path: &LibraryPath, + module_ast: &ModuleAst, + ) -> Result<(), AssemblyError> { if self.is_kernel && self.module_stack.is_empty() { // a kernel context must be initialized with a kernel module path debug_assert!( @@ -103,8 +114,11 @@ impl AssemblyContext { return Err(AssemblyError::circular_module_dependency(&dep_chain)); } + // get the imported procedures map + let proc_map = module_ast.get_imported_procedures_map(); + // push a new module context onto the module stack and return - self.module_stack.push(ModuleContext::for_module(module_path)); + self.module_stack.push(ModuleContext::for_module(module_path, proc_map)); Ok(()) } @@ -323,6 +337,8 @@ struct ModuleContext { path: LibraryPath, /// A combined callset of all procedure callsets in this module. callset: CallSet, + /// A map containing id and names of all imported procedures in the module. + proc_map: BTreeMap, } impl ModuleContext { @@ -333,7 +349,7 @@ impl ModuleContext { /// /// Procedure in the returned module context is initialized with procedure context for the /// "main" procedure. - pub fn for_program() -> Self { + pub fn for_program(proc_map: BTreeMap) -> Self { let name = ProcedureName::main(); let main_proc_context = ProcedureContext::new(name, false, 0); Self { @@ -341,18 +357,23 @@ impl ModuleContext { compiled_procs: Vec::new(), path: LibraryPath::exec_path(), callset: CallSet::default(), + proc_map, } } /// Returns a new [ModuleContext] instantiated for compiling library modules. /// /// A library module must be identified by a unique module path. - pub fn for_module(module_path: &LibraryPath) -> Self { + pub fn for_module( + module_path: &LibraryPath, + proc_map: BTreeMap, + ) -> Self { Self { proc_stack: Vec::new(), compiled_procs: Vec::new(), path: module_path.clone(), callset: CallSet::default(), + proc_map, } } diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index 23b0881353..e4cb4776c5 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -18,7 +18,7 @@ mod span_builder; use span_builder::SpanBuilder; mod context; -pub use context::{AssemblyContext, AssemblyContextType}; +pub use context::AssemblyContext; mod procedure_cache; use procedure_cache::ProcedureCache; @@ -88,7 +88,7 @@ impl Assembler { /// Returns an error if compiling kernel source results in an error. pub fn with_kernel_module(mut self, module: ModuleAst) -> Result { // compile the kernel; this adds all exported kernel procedures to the procedure cache - let mut context = AssemblyContext::new(AssemblyContextType::Kernel); + let mut context = AssemblyContext::for_module(true); let kernel = Module::kernel(module); self.compile_module(&kernel, &mut context)?; @@ -131,7 +131,7 @@ impl Assembler { let program = ProgramAst::parse(source)?; // compile the program - let mut context = AssemblyContext::new(AssemblyContextType::Program); + let mut context = AssemblyContext::for_program(&program); let program_root = self.compile_in_context(&program, &mut context)?; // convert the context into a call block table for the program @@ -191,8 +191,7 @@ impl Assembler { ) -> Result, AssemblyError> { // a variable to track MAST roots of all procedures exported from this module let mut proc_roots = Vec::new(); - - context.begin_module(&module.path)?; + context.begin_module(&module.path, &module.ast)?; // process all re-exported procedures for reexporteed_proc in module.ast.reexported_procs().iter() { @@ -255,7 +254,6 @@ impl Assembler { context: &mut AssemblyContext, ) -> Result<(), AssemblyError> { context.begin_proc(&proc.name, proc.is_export, proc.num_locals)?; - let code = if proc.num_locals > 0 { // for procedures with locals, we need to update fmp register before and after the // procedure body is executed. specifically: @@ -370,10 +368,10 @@ impl Assembler { ) -> Result<(), AssemblyError> { if !self.proc_cache.borrow().contains_id(proc_id) { // if procedure is not in cache, try to get its module and compile it - let module = self - .module_provider - .get_module(proc_id) - .ok_or_else(|| AssemblyError::imported_proc_module_not_found(proc_id))?; + let module = self.module_provider.get_module(proc_id).ok_or_else(|| { + let proc_name = context.get_imported_procedure_name(proc_id); + AssemblyError::imported_proc_module_not_found(proc_id, proc_name) + })?; self.compile_module(module, context)?; // if the procedure is still not in cache, then there was some error if !self.proc_cache.borrow().contains_id(proc_id) { diff --git a/assembly/src/ast/mod.rs b/assembly/src/ast/mod.rs index d30ae6f355..ae7321d9fb 100644 --- a/assembly/src/ast/mod.rs +++ b/assembly/src/ast/mod.rs @@ -152,6 +152,15 @@ impl ProgramAst { &self.body } + /// Returns a map containing IDs and names of imported procedures. + pub fn get_imported_procedures_map(&self) -> BTreeMap { + if let Some(info) = &self.import_info { + info.invoked_procs().iter().map(|(&id, (name, _))| (id, name.clone())).collect() + } else { + BTreeMap::new() + } + } + // PARSER // -------------------------------------------------------------------------------------------- /// Parses the provided source into a [ProgramAst]. @@ -492,6 +501,15 @@ impl ModuleAst { } } + /// Returns a map containing IDs and names of imported procedures. + pub fn get_imported_procedures_map(&self) -> BTreeMap { + if let Some(info) = &self.import_info { + info.invoked_procs().iter().map(|(&id, (name, _))| (id, name.clone())).collect() + } else { + BTreeMap::new() + } + } + // STATE MUTATORS // -------------------------------------------------------------------------------------------- diff --git a/assembly/src/errors.rs b/assembly/src/errors.rs index 163f233a64..8845a31c1a 100644 --- a/assembly/src/errors.rs +++ b/assembly/src/errors.rs @@ -1,6 +1,6 @@ use super::{ ast::ProcReExport, crypto::hash::RpoDigest, tokens::SourceLocation, LibraryNamespace, - ProcedureId, String, ToString, Token, Vec, + ProcedureId, ProcedureName, String, ToString, Token, Vec, }; use core::fmt; @@ -19,7 +19,7 @@ pub enum AssemblyError { DuplicateProcName(String, String), DuplicateProcId(ProcedureId), ExportedProcInProgram(String), - ImportedProcModuleNotFound(ProcedureId), + ImportedProcModuleNotFound(ProcedureId, String), ReExportedProcModuleNotFound(ProcReExport), ImportedProcNotFoundInModule(ProcedureId, String), InvalidProgramAssemblyContext, @@ -71,8 +71,15 @@ impl AssemblyError { Self::ExportedProcInProgram(proc_name.to_string()) } - pub fn imported_proc_module_not_found(proc_id: &ProcedureId) -> Self { - Self::ImportedProcModuleNotFound(*proc_id) + pub fn imported_proc_module_not_found( + proc_id: &ProcedureId, + proc_name: Option, + ) -> Self { + if let Some(proc_name) = proc_name { + Self::ImportedProcModuleNotFound(*proc_id, proc_name.to_string()) + } else { + Self::ImportedProcModuleNotFound(*proc_id, "[unknown]".to_string()) + } } pub fn imported_proc_not_found_in_module(proc_id: &ProcedureId, module_path: &str) -> Self { @@ -135,7 +142,7 @@ impl fmt::Display for AssemblyError { DuplicateProcName(proc_name, module_path) => write!(f, "duplicate proc name '{proc_name}' in module {module_path}"), DuplicateProcId(proc_id) => write!(f, "duplicate proc id {proc_id}"), ExportedProcInProgram(proc_name) => write!(f, "exported procedure '{proc_name}' in executable program"), - ImportedProcModuleNotFound(proc_id) => write!(f, "module for imported procedure {proc_id} not found"), + ImportedProcModuleNotFound(proc_id, proc_name) => write!(f, "module for imported procedure `{proc_name}` with ID {proc_id} not found"), ReExportedProcModuleNotFound(reexport) => write!(f, "re-exported proc {} with id {} not found", reexport.name(), reexport.proc_id()), ImportedProcNotFoundInModule(proc_id, module_path) => write!(f, "imported procedure {proc_id} not found in module {module_path}"), InvalidProgramAssemblyContext => write!(f, "assembly context improperly initialized for program compilation"), diff --git a/assembly/src/lib.rs b/assembly/src/lib.rs index cb3eff7172..5c08aabeea 100644 --- a/assembly/src/lib.rs +++ b/assembly/src/lib.rs @@ -32,7 +32,7 @@ mod errors; pub use errors::{AssemblyError, LabelError, LibraryError, ParsingError, PathError}; mod assembler; -pub use assembler::{Assembler, AssemblyContext, AssemblyContextType}; +pub use assembler::{Assembler, AssemblyContext}; #[cfg(test)] mod tests; diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 9bbb619d0f..427c3678d9 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -1,7 +1,6 @@ use crate::{ ast::{ModuleAst, ProgramAst}, - Assembler, AssemblyContext, AssemblyContextType, Library, LibraryNamespace, LibraryPath, - Module, Version, + Assembler, AssemblyContext, Library, LibraryNamespace, LibraryPath, Module, Version, }; use core::slice::Iter; @@ -134,24 +133,21 @@ fn simple_main_call() { .unwrap(); let account_module = Module::new(account_path, account_code); let _method_roots = assembler - .compile_module( - &account_module, - &mut super::AssemblyContext::new(AssemblyContextType::Module), - ) + .compile_module(&account_module, &mut super::AssemblyContext::for_module(false)) .unwrap(); // compile note 1 program let note_1 = ProgramAst::parse("use.context::account begin call.account::account_method_1 end").unwrap(); let _note_1_root = assembler - .compile_in_context(¬e_1, &mut super::AssemblyContext::new(AssemblyContextType::Program)) + .compile_in_context(¬e_1, &mut super::AssemblyContext::for_program(¬e_1)) .unwrap(); // compile note 2 program let note_2 = ProgramAst::parse("use.context::account begin call.account::account_method_2 end").unwrap(); let _note_2_root = assembler - .compile_in_context(¬e_2, &mut super::AssemblyContext::new(AssemblyContextType::Program)) + .compile_in_context(¬e_2, &mut super::AssemblyContext::for_program(¬e_2)) .unwrap(); } @@ -691,14 +687,14 @@ fn program_with_phantom_mast_call() { let ast = ProgramAst::parse(source).unwrap(); // phantom calls not allowed - let mut context = AssemblyContext::new(AssemblyContextType::Program).with_phantom_calls(false); + let mut context = AssemblyContext::for_program(&ast).with_phantom_calls(false); let result = assembler.compile_in_context(&ast, &mut context); let err = result.err().unwrap(); let expected_error = "cannot call phantom procedure with MAST root 0xc2545da99d3a1f3f38d957c7893c44d78998d8ea8b11aba7e22c8c2b2a213dae: phantom calls not allowed"; assert_eq!(expected_error, err.to_string()); // phantom calls allowed - let mut context = AssemblyContext::new(AssemblyContextType::Program).with_phantom_calls(true); + let mut context = AssemblyContext::for_program(&ast).with_phantom_calls(true); let result = assembler.compile_in_context(&ast, &mut context); assert!(result.is_ok()); } @@ -1073,7 +1069,10 @@ fn program_with_import_errors() { push.4 push.3 \ exec.u256::foo \ end"; - assert!(assembler.compile(source).is_err()); + assert_eq!( + assembler.compile(source).err().unwrap().to_string(), + "module for imported procedure `foo` with ID 0xda3d281108b7ac61ba9591322a200f5cc0b29140 not found" + ); } // COMMENTS diff --git a/miden/src/examples/fibonacci.rs b/miden/src/examples/fibonacci.rs index 5440ed6adc..a8ca87aa9a 100644 --- a/miden/src/examples/fibonacci.rs +++ b/miden/src/examples/fibonacci.rs @@ -1,6 +1,6 @@ use super::{Example, ONE, ZERO}; use miden::{ - math::{Felt, FieldElement, StarkField}, + math::{Felt, StarkField}, Assembler, MemAdviceProvider, Program, StackInputs, }; From a8b317574968ac91f2f96f803c04a1c37d6b7bfe Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 11 Sep 2023 11:03:30 -0700 Subject: [PATCH 087/120] refactor: make ProgramAst parameter for AssemblyContext optional --- assembly/src/assembler/context.rs | 13 ++++++++----- assembly/src/assembler/mod.rs | 2 +- assembly/src/tests.rs | 8 ++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/assembly/src/assembler/context.rs b/assembly/src/assembler/context.rs index a5e035d3f5..4c119d4104 100644 --- a/assembly/src/assembler/context.rs +++ b/assembly/src/assembler/context.rs @@ -25,7 +25,7 @@ impl AssemblyContext { // CONSTRUCTORS // -------------------------------------------------------------------------------------------- - /// Returns a new [AssemblyContext] for non-execurable kernel and non-kernel modules. + /// Returns a new [AssemblyContext] for non-executable kernel and non-kernel modules. /// /// The `is_kernel_module` specifies whether provided module is a kernel module. pub fn for_module(is_kernel_module: bool) -> Self { @@ -37,12 +37,15 @@ impl AssemblyContext { } } - /// Returns a new [AssemblyContext] for execurable module. + /// Returns a new [AssemblyContext] for executable module. /// - /// The `program` is required to provide data about IDs and names of imported procedures. - pub fn for_program(program: &ProgramAst) -> Self { + /// If [ProgramAst] is provided, the context will contain info about the procedures imported + /// by the program, and thus, will be able to determine names of imported procedures for error + /// reporting purposes. + pub fn for_program(program: Option<&ProgramAst>) -> Self { + let program_imports = program.map(|p| p.get_imported_procedures_map()).unwrap_or_default(); Self { - module_stack: vec![ModuleContext::for_program(program.get_imported_procedures_map())], + module_stack: vec![ModuleContext::for_program(program_imports)], is_kernel: false, kernel: None, allow_phantom_calls: false, diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index e4cb4776c5..68ca9ffae0 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -131,7 +131,7 @@ impl Assembler { let program = ProgramAst::parse(source)?; // compile the program - let mut context = AssemblyContext::for_program(&program); + let mut context = AssemblyContext::for_program(Some(&program)); let program_root = self.compile_in_context(&program, &mut context)?; // convert the context into a call block table for the program diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 69c12b065f..b3edddd042 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -140,14 +140,14 @@ fn simple_main_call() { let note_1 = ProgramAst::parse("use.context::account begin call.account::account_method_1 end").unwrap(); let _note_1_root = assembler - .compile_in_context(¬e_1, &mut super::AssemblyContext::for_program(¬e_1)) + .compile_in_context(¬e_1, &mut super::AssemblyContext::for_program(Some(¬e_1))) .unwrap(); // compile note 2 program let note_2 = ProgramAst::parse("use.context::account begin call.account::account_method_2 end").unwrap(); let _note_2_root = assembler - .compile_in_context(¬e_2, &mut super::AssemblyContext::for_program(¬e_2)) + .compile_in_context(¬e_2, &mut super::AssemblyContext::for_program(Some(¬e_2))) .unwrap(); } @@ -687,14 +687,14 @@ fn program_with_phantom_mast_call() { let ast = ProgramAst::parse(source).unwrap(); // phantom calls not allowed - let mut context = AssemblyContext::for_program(&ast).with_phantom_calls(false); + let mut context = AssemblyContext::for_program(Some(&ast)).with_phantom_calls(false); let result = assembler.compile_in_context(&ast, &mut context); let err = result.err().unwrap(); let expected_error = "cannot call phantom procedure with MAST root 0xc2545da99d3a1f3f38d957c7893c44d78998d8ea8b11aba7e22c8c2b2a213dae: phantom calls not allowed"; assert_eq!(expected_error, err.to_string()); // phantom calls allowed - let mut context = AssemblyContext::for_program(&ast).with_phantom_calls(true); + let mut context = AssemblyContext::for_program(Some(&ast)).with_phantom_calls(true); let result = assembler.compile_in_context(&ast, &mut context); assert!(result.is_ok()); } From 319334d3a305600adcca199e65792068be080795 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Tue, 12 Sep 2023 11:55:48 -0700 Subject: [PATCH 088/120] fix: typo in example command name --- miden/src/examples/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miden/src/examples/mod.rs b/miden/src/examples/mod.rs index 1cc8438d32..d6878e1bfb 100644 --- a/miden/src/examples/mod.rs +++ b/miden/src/examples/mod.rs @@ -30,7 +30,7 @@ pub struct ExampleOptions { pub example: ExampleType, /// Number of cycles the program is expected to consume - #[clap(short = 'r', long = "exp-cycles", default_value = "64")] + #[clap(short = 'e', long = "exp-cycles", default_value = "64")] expected_cycles: u32, /// Maximum number of cycles a program is allowed to consume From 11e2554c4fdc82bc70f2e207f8b1eea2273a105b Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sun, 10 Sep 2023 01:47:27 -0700 Subject: [PATCH 089/120] feat: implement basic Debug decorator --- CHANGELOG.md | 1 + assembly/src/assembler/instruction/mod.rs | 9 ++- assembly/src/assembler/span_builder.rs | 3 +- assembly/src/ast/nodes/mod.rs | 3 + assembly/src/ast/nodes/serde/debug.rs | 32 ++++++++++ .../src/ast/nodes/serde/deserialization.rs | 10 +++- assembly/src/ast/nodes/serde/mod.rs | 5 +- assembly/src/ast/nodes/serde/serialization.rs | 7 ++- assembly/src/ast/parsers/context.rs | 9 +-- assembly/src/ast/parsers/debug.rs | 36 ++++++++++++ assembly/src/ast/parsers/mod.rs | 17 +++--- core/src/lib.rs | 3 +- core/src/operations/decorators/debug.rs | 25 ++++++++ core/src/operations/decorators/mod.rs | 50 ++++++++++++---- core/src/operations/mod.rs | 4 +- core/src/program/blocks/span_block.rs | 6 +- docs/src/SUMMARY.md | 1 + docs/src/user_docs/assembly/debugging.md | 10 ++++ miden/Cargo.toml | 2 +- miden/src/cli/run.rs | 2 +- processor/src/decorators/mod.rs | 58 ++++++++++++++++++- processor/src/lib.rs | 14 ++++- processor/src/stack/mod.rs | 9 ++- 23 files changed, 273 insertions(+), 43 deletions(-) create mode 100644 assembly/src/ast/nodes/serde/debug.rs create mode 100644 assembly/src/ast/parsers/debug.rs create mode 100644 core/src/operations/decorators/debug.rs create mode 100644 docs/src/user_docs/assembly/debugging.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 187d3f4442..8063f31b41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Added support for module aliases (#1037). - Added `adv.insert_hperm` decorator (#1042). - Added `adv.push_smtpeek` decorator (#1056). +- Added `debug` decorator (#1069). #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). diff --git a/assembly/src/assembler/instruction/mod.rs b/assembly/src/assembler/instruction/mod.rs index 161eebe889..66ce420a7c 100644 --- a/assembly/src/assembler/instruction/mod.rs +++ b/assembly/src/assembler/instruction/mod.rs @@ -4,7 +4,7 @@ use super::{ }; use crate::utils::bound_into_included_u64; use core::ops::RangeBounds; -use vm_core::{FieldElement, StarkField}; +use vm_core::{Decorator, FieldElement, StarkField}; mod adv_ops; mod crypto_ops; @@ -314,6 +314,13 @@ impl Assembler { } Ok(None) } + + Instruction::Debug(options) => { + if self.in_debug_mode() { + span.push_decorator(Decorator::Debug(*options)) + } + Ok(None) + } }; // compute and update the cycle count of the instruction which just finished executing diff --git a/assembly/src/assembler/span_builder.rs b/assembly/src/assembler/span_builder.rs index 44aadfdf0b..63db32f057 100644 --- a/assembly/src/assembler/span_builder.rs +++ b/assembly/src/assembler/span_builder.rs @@ -147,7 +147,8 @@ impl SpanBuilder { } else if !self.decorators.is_empty() { // this is a bug in the assembler. we shouldn't have decorators added without their // associated operations - unreachable!() + // TODO: change this to an error or allow decorators in empty span blocks + unreachable!("decorators in an empty SPAN block") } } diff --git a/assembly/src/ast/nodes/mod.rs b/assembly/src/ast/nodes/mod.rs index 2eed169b34..c17661cfa6 100644 --- a/assembly/src/ast/nodes/mod.rs +++ b/assembly/src/ast/nodes/mod.rs @@ -2,6 +2,7 @@ use super::{ AstFormatterContext, CodeBody, Felt, FormattableCodeBody, ProcedureId, RpoDigest, ToString, Vec, }; use core::fmt; +use vm_core::DebugOptions; mod advice; pub use advice::AdviceInjectorNode; @@ -297,6 +298,7 @@ pub enum Instruction { // ----- debug decorators --------------------------------------------------------------------- Breakpoint, + Debug(DebugOptions), } impl Instruction { @@ -573,6 +575,7 @@ impl fmt::Display for Instruction { // ----- debug decorators ------------------------------------------------------------- Self::Breakpoint => write!(f, "breakpoint"), + Self::Debug(options) => write!(f, "debug.{options}"), } } } diff --git a/assembly/src/ast/nodes/serde/debug.rs b/assembly/src/ast/nodes/serde/debug.rs new file mode 100644 index 0000000000..18bcb6a6a7 --- /dev/null +++ b/assembly/src/ast/nodes/serde/debug.rs @@ -0,0 +1,32 @@ +use super::{super::DebugOptions, ByteReader, ByteWriter, DeserializationError, ToString}; + +const STACK_ALL: u8 = 0; +const STACK_TOP: u8 = 1; + +/// Writes the provided [DebugOptions] into the provided target. +pub fn write_options_into(target: &mut W, options: &DebugOptions) { + match options { + DebugOptions::StackAll => target.write_u8(STACK_ALL), + DebugOptions::StackTop(n) => { + target.write_u8(STACK_TOP); + target.write_u16(*n); + } + } +} + +/// Reads [DebugOptions] from the provided source. +pub fn read_options_from( + source: &mut R, +) -> Result { + match source.read_u8()? { + STACK_ALL => Ok(DebugOptions::StackAll), + STACK_TOP => { + let n = source.read_u16()?; + if n == 0 { + return Err(DeserializationError::InvalidValue(n.to_string())); + } + Ok(DebugOptions::StackTop(n)) + } + val => Err(DeserializationError::InvalidValue(val.to_string())), + } +} diff --git a/assembly/src/ast/nodes/serde/deserialization.rs b/assembly/src/ast/nodes/serde/deserialization.rs index be0667c230..7e375ee252 100644 --- a/assembly/src/ast/nodes/serde/deserialization.rs +++ b/assembly/src/ast/nodes/serde/deserialization.rs @@ -1,6 +1,6 @@ use super::{ - super::AdviceInjectorNode, ByteReader, CodeBody, Deserializable, DeserializationError, Felt, - Instruction, Node, OpCode, ProcedureId, RpoDigest, ToString, MAX_PUSH_INPUTS, + super::AdviceInjectorNode, debug, ByteReader, CodeBody, Deserializable, DeserializationError, + Felt, Instruction, Node, OpCode, ProcedureId, RpoDigest, ToString, MAX_PUSH_INPUTS, }; // NODE DESERIALIZATION @@ -355,6 +355,12 @@ impl Deserializable for Instruction { OpCode::CallImported => Ok(Instruction::CallImported(ProcedureId::read_from(source)?)), OpCode::SysCall => Ok(Instruction::SysCall(ProcedureId::read_from(source)?)), + // ----- debugging -------------------------------------------------------------------- + OpCode::Debug => { + let options = debug::read_options_from(source)?; + Ok(Instruction::Debug(options)) + } + // ----- control flow ----------------------------------------------------------------- // control flow instructions should be parsed as a part of Node::read_from() and we // should never get here diff --git a/assembly/src/ast/nodes/serde/mod.rs b/assembly/src/ast/nodes/serde/mod.rs index 31653d5b6a..ad04305a59 100644 --- a/assembly/src/ast/nodes/serde/mod.rs +++ b/assembly/src/ast/nodes/serde/mod.rs @@ -1,9 +1,9 @@ use super::{CodeBody, Felt, Instruction, Node, ProcedureId, RpoDigest, ToString}; use crate::MAX_PUSH_INPUTS; use num_enum::TryFromPrimitive; - use vm_core::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; +mod debug; mod deserialization; mod serialization; @@ -273,6 +273,9 @@ pub enum OpCode { CallImported = 238, SysCall = 239, + // ----- debugging ---------------------------------------------------------------------------- + Debug = 240, + // ----- control flow ------------------------------------------------------------------------- IfElse = 253, Repeat = 254, diff --git a/assembly/src/ast/nodes/serde/serialization.rs b/assembly/src/ast/nodes/serde/serialization.rs index e0b33d7e32..1e62fb26c9 100644 --- a/assembly/src/ast/nodes/serde/serialization.rs +++ b/assembly/src/ast/nodes/serde/serialization.rs @@ -1,4 +1,4 @@ -use super::{ByteWriter, Instruction, Node, OpCode, Serializable}; +use super::{debug, ByteWriter, Instruction, Node, OpCode, Serializable}; use crate::ast::MAX_BODY_LEN; // NODE SERIALIZATION @@ -496,6 +496,11 @@ impl Serializable for Instruction { Self::Breakpoint => { // this is a transparent instruction and will not be encoded into the library } + + Self::Debug(options) => { + OpCode::Debug.write_into(target); + debug::write_options_into(target, options); + } } } } diff --git a/assembly/src/ast/parsers/context.rs b/assembly/src/ast/parsers/context.rs index babc300367..dcfa93cfce 100644 --- a/assembly/src/ast/parsers/context.rs +++ b/assembly/src/ast/parsers/context.rs @@ -1,8 +1,8 @@ use super::{ - super::ProcReExport, adv_ops, field_ops, io_ops, stack_ops, u32_ops, CodeBody, Instruction, - InvocationTarget, LibraryPath, LocalConstMap, LocalProcMap, ModuleImports, Node, ParsingError, - ProcedureAst, ProcedureId, ProcedureName, ReExportedProcMap, Token, TokenStream, MAX_BODY_LEN, - MAX_DOCS_LEN, + super::ProcReExport, adv_ops, debug, field_ops, io_ops, stack_ops, u32_ops, CodeBody, + Instruction, InvocationTarget, LibraryPath, LocalConstMap, LocalProcMap, ModuleImports, Node, + ParsingError, ProcedureAst, ProcedureId, ProcedureName, ReExportedProcMap, Token, TokenStream, + MAX_BODY_LEN, MAX_DOCS_LEN, }; use vm_core::utils::{collections::Vec, string::ToString}; @@ -620,6 +620,7 @@ impl ParserContext<'_> { // ----- debug decorators ------------------------------------------------------------- "breakpoint" => simple_instruction(op, Breakpoint), + "debug" => debug::parse_debug(op), // ----- catch all -------------------------------------------------------------------- _ => Err(ParsingError::invalid_op(op)), diff --git a/assembly/src/ast/parsers/debug.rs b/assembly/src/ast/parsers/debug.rs new file mode 100644 index 0000000000..ef7158c784 --- /dev/null +++ b/assembly/src/ast/parsers/debug.rs @@ -0,0 +1,36 @@ +use super::{ + parse_checked_param, + Instruction::*, + Node::{self, Instruction}, + ParsingError, Token, +}; +use vm_core::DebugOptions; + +// INSTRUCTION PARSERS +// ================================================================================================ + +/// Returns `Debug` instruction node. +/// +/// # Errors +/// Returns an error if the instruction token contains a wrong number of parameters, or if +/// the provided parameters are not valid. +pub fn parse_debug(op: &Token) -> Result { + debug_assert_eq!(op.parts()[0], "debug"); + if op.num_parts() < 2 { + return Err(ParsingError::missing_param(op, "debug.stack.")); + } + + let options = match op.parts()[1] { + "stack" => match op.num_parts() { + 2 => DebugOptions::StackAll, + 3 => { + let n: u16 = parse_checked_param(op, 2, 1..=u16::MAX)?; + DebugOptions::StackTop(n) + } + _ => return Err(ParsingError::extra_param(op)), + }, + _ => return Err(ParsingError::invalid_op(op)), + }; + + Ok(Instruction(Debug(options))) +} diff --git a/assembly/src/ast/parsers/mod.rs b/assembly/src/ast/parsers/mod.rs index 3f4a34f250..2ac0a2344b 100644 --- a/assembly/src/ast/parsers/mod.rs +++ b/assembly/src/ast/parsers/mod.rs @@ -7,14 +7,15 @@ use super::{ }; use core::{fmt::Display, ops::RangeBounds}; -pub mod adv_ops; -pub mod field_ops; -pub mod io_ops; -pub mod stack_ops; -pub mod u32_ops; - -pub mod constants; -pub use constants::calculate_const_value; +mod adv_ops; +mod debug; +mod field_ops; +mod io_ops; +mod stack_ops; +mod u32_ops; + +mod constants; +use constants::calculate_const_value; mod context; pub use context::ParserContext; diff --git a/core/src/lib.rs b/core/src/lib.rs index ff4e088037..0908898053 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -40,7 +40,8 @@ pub use program::{blocks as code_blocks, CodeBlockTable, Kernel, Program, Progra mod operations; pub use operations::{ - AdviceInjector, AssemblyOp, Decorator, DecoratorIterator, DecoratorList, Operation, + AdviceInjector, AssemblyOp, DebugOptions, Decorator, DecoratorIterator, DecoratorList, + Operation, }; pub mod stack; diff --git a/core/src/operations/decorators/debug.rs b/core/src/operations/decorators/debug.rs new file mode 100644 index 0000000000..b6bdc81334 --- /dev/null +++ b/core/src/operations/decorators/debug.rs @@ -0,0 +1,25 @@ +use core::fmt; + +// DEBUG OPTIONS +// ================================================================================================ + +/// Options of the `Debug` decorator. +/// +/// These options define the debug info which gets printed out when the Debug decorator is +/// executed. +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum DebugOptions { + /// Print out the entire contents of the stack for the current execution context. + StackAll, + /// Prints out the top n items of the stack for the current context. + StackTop(u16), +} + +impl fmt::Display for DebugOptions { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::StackAll => write!(f, "stack"), + Self::StackTop(n) => write!(f, "stack.{n}"), + } + } +} diff --git a/core/src/operations/decorators/mod.rs b/core/src/operations/decorators/mod.rs index f34a015173..e743a01b55 100644 --- a/core/src/operations/decorators/mod.rs +++ b/core/src/operations/decorators/mod.rs @@ -1,22 +1,35 @@ -mod advice; -mod assembly_op; use crate::utils::collections::Vec; +use core::fmt; + +mod advice; pub use advice::AdviceInjector; + +mod assembly_op; pub use assembly_op::AssemblyOp; -use core::fmt; + +mod debug; +pub use debug::DebugOptions; // DECORATORS // ================================================================================================ +/// A set of decorators which can be executed by the VM. +/// +/// Executing a decorator does not affect the state of the main VM components such as operand stack +/// and memory. However, decorators may modify the advice provider. +/// +/// Executing decorators does not advance the VM clock. As such, many decorators can be executed in +/// a single VM cycle. #[derive(Clone, Debug, Eq, PartialEq)] pub enum Decorator { - /// Pushes zero or more values onto the advice stack, as specified by the injector. This - /// operation affects only the advice stack and has no effect on other VM components (e.g. - /// operand stack, memory), and does not advance the VM clock. + /// Injects new data into the advice provider, as specified by the injector. Advice(AdviceInjector), - /// Adds information about the assembly instruction at a particular index - /// (only applicable in debug mode) + /// Adds information about the assembly instruction at a particular index (only applicable in + /// debug mode). AsmOp(AssemblyOp), + /// Prints out information about the state of the VM based on the specified options. This + /// decorator is executed only in debug mode. + Debug(DebugOptions), } impl fmt::Display for Decorator { @@ -26,6 +39,7 @@ impl fmt::Display for Decorator { Self::AsmOp(assembly_op) => { write!(f, "asmOp({}, {})", assembly_op.op(), assembly_op.num_cycles()) } + Self::Debug(options) => write!(f, "debug({options})"), } } } @@ -46,11 +60,10 @@ impl<'a> DecoratorIterator<'a> { Self { decorators, idx: 0 } } - /// Returns the next decorator at the specified position. - /// - Returns the decorator if a decorator at the specified position exists and increments the internal pointer. - /// - Returns None if no decorator is to be executed at the specified position. + /// Returns the next decorator but only if its position matches the specified position, + /// otherwise, None is returned. #[inline(always)] - pub fn next(&mut self, pos: usize) -> Option<&Decorator> { + pub fn next_filtered(&mut self, pos: usize) -> Option<&Decorator> { if self.idx < self.decorators.len() && self.decorators[self.idx].0 == pos { self.idx += 1; Some(&self.decorators[self.idx - 1].1) @@ -59,3 +72,16 @@ impl<'a> DecoratorIterator<'a> { } } } + +impl<'a> Iterator for DecoratorIterator<'a> { + type Item = &'a Decorator; + + fn next(&mut self) -> Option { + if self.idx < self.decorators.len() { + self.idx += 1; + Some(&self.decorators[self.idx - 1].1) + } else { + None + } + } +} diff --git a/core/src/operations/mod.rs b/core/src/operations/mod.rs index 28eb25c9fa..d16d184987 100644 --- a/core/src/operations/mod.rs +++ b/core/src/operations/mod.rs @@ -1,7 +1,9 @@ use super::Felt; use core::fmt; mod decorators; -pub use decorators::{AdviceInjector, AssemblyOp, Decorator, DecoratorIterator, DecoratorList}; +pub use decorators::{ + AdviceInjector, AssemblyOp, DebugOptions, Decorator, DecoratorIterator, DecoratorList, +}; // OPERATIONS // ================================================================================================ diff --git a/core/src/program/blocks/span_block.rs b/core/src/program/blocks/span_block.rs index 570d194439..e9aadf610b 100644 --- a/core/src/program/blocks/span_block.rs +++ b/core/src/program/blocks/span_block.rs @@ -390,7 +390,7 @@ pub fn get_span_op_group_count(op_batches: &[OpBatch]) -> usize { /// Checks if a given decorators list is valid (only checked in debug mode) /// - Assert the decorator list is in ascending order. -/// - Assert the last op index in decorator list is less than the number of operations. +/// - Assert the last op index in decorator list is less than or equal to the number of operations. #[cfg(debug_assertions)] fn validate_decorators(operations: &[Operation], decorators: &DecoratorList) { if !decorators.is_empty() { @@ -400,8 +400,8 @@ fn validate_decorators(operations: &[Operation], decorators: &DecoratorList) { } // assert the last index in decorator list is less than operations vector length debug_assert!( - operations.len() > decorators.last().expect("empty decorators list").0, - "last op index in decorator list should be less than number of ops" + operations.len() >= decorators.last().expect("empty decorators list").0, + "last op index in decorator list should be less than or equal to the number of ops" ); } } diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 62a956d442..7b162b78a1 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -17,6 +17,7 @@ - [Stack manipulation](./user_docs/assembly/stack_manipulation.md) - [Input / Output Operations](./user_docs/assembly/io_operations.md) - [Cryptographic Operations](./user_docs/assembly/cryptographic_operations.md) + - [Debugging](./user_docs/assembly/debugging.md) - [Miden Standard Library](./user_docs/stdlib/main.md) - [std::collections](./user_docs/stdlib/collections.md) - [std::crypto::fri](./user_docs/stdlib/crypto/fri.md) diff --git a/docs/src/user_docs/assembly/debugging.md b/docs/src/user_docs/assembly/debugging.md new file mode 100644 index 0000000000..173acb4272 --- /dev/null +++ b/docs/src/user_docs/assembly/debugging.md @@ -0,0 +1,10 @@ +# Debugging + +To support basic debugging capabilities, Miden assembly provides a `debug` instruction. This instruction prints out the state of the VM at the time when the `debug` instruction is executed. The instruction can be parameterized as follows: + +- `debug.stack` prints out the entire contents of the stack. +- `debug.stack.` prints out the top $n$ items of the stack. $n$ must be an integer greater than $0$ and smaller than $256$. + +Debug instructions do not affect the VM state and do not change the program hash. + +To make use of the `debug` instruction, programs must be compiled with an assembler instantiated in the debug mode. Otherwise, the assembler will simply ignore the `debug` instructions. \ No newline at end of file diff --git a/miden/Cargo.toml b/miden/Cargo.toml index 61e678b885..487f2d17a9 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -44,7 +44,7 @@ std = ["assembly/std", "log/std", "processor/std", "prover/std", "verifier/std"] [dependencies] assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } -clap = { version = "3.0", features = ["derive"], optional = true } +clap = { version = "4.0", features = ["derive"], optional = true } env_logger = { version = "0.10", default-features = false, optional = true } hex = { version = "0.4", optional = true } log = { version = "0.4", default-features = false } diff --git a/miden/src/cli/run.rs b/miden/src/cli/run.rs index ee6c4e05c6..ab170aa228 100644 --- a/miden/src/cli/run.rs +++ b/miden/src/cli/run.rs @@ -26,7 +26,7 @@ pub struct RunCmd { #[clap(short = 'm', long = "max-cycles", default_value = "4294967295")] max_cycles: u32, - /// Number of ouptuts + /// Number of outputs #[clap(short = 'n', long = "num-outputs", default_value = "16")] num_outputs: usize, diff --git a/processor/src/decorators/mod.rs b/processor/src/decorators/mod.rs index 98278864fc..dcad55921f 100644 --- a/processor/src/decorators/mod.rs +++ b/processor/src/decorators/mod.rs @@ -1,4 +1,7 @@ -use super::{AdviceInjector, AdviceProvider, AdviceSource, Decorator, ExecutionError, Process}; +use super::{ + AdviceInjector, AdviceProvider, AdviceSource, Decorator, ExecutionError, Felt, Process, Vec, +}; +use vm_core::DebugOptions; mod adv_map_injectors; mod adv_stack_injectors; @@ -25,6 +28,7 @@ where self.decoder.append_asmop(self.system.clk(), assembly_op.clone()); } } + Decorator::Debug(options) => self.dec_debug(options)?, } Ok(()) } @@ -33,7 +37,7 @@ where // -------------------------------------------------------------------------------------------- /// Process the specified advice injector. - pub fn dec_advice(&mut self, injector: &AdviceInjector) -> Result<(), ExecutionError> { + fn dec_advice(&mut self, injector: &AdviceInjector) -> Result<(), ExecutionError> { match injector { AdviceInjector::MerkleNodeMerge => self.merge_merkle_nodes(), AdviceInjector::MerkleNodeToStack => self.copy_merkle_node_to_adv_stack(), @@ -83,4 +87,54 @@ where Ok(()) } + + // DEBUG + // -------------------------------------------------------------------------------------------- + + /// Prints the info about the VM state specified by the provided options to stdout. + fn dec_debug(&self, options: &DebugOptions) -> Result<(), ExecutionError> { + let clk = self.system.clk(); + match options { + DebugOptions::StackAll => { + let stack = self.stack.get_state_at(clk); + let n = stack.len(); + print_vm_stack(clk, stack, n); + } + DebugOptions::StackTop(n) => { + let stack = self.stack.get_state_at(clk); + print_vm_stack(clk, stack, *n as usize); + } + } + Ok(()) + } +} + +// HELPER FUNCTIONS +// ================================================================================================ + +#[cfg(feature = "std")] +fn print_vm_stack(clk: u32, stack: Vec, n: usize) { + // determine how many items to print out + let num_items = core::cmp::min(stack.len(), n); + + // print all items except for the last one + println!("Stack state before step {clk}:"); + for (i, element) in stack.iter().take(num_items - 1).enumerate() { + println!("├── {i:>2}: {element}"); + } + + // print the last item, and in case the stack has more items, print the total number of + // un-printed items + let i = num_items - 1; + if num_items == stack.len() { + println!("└── {i:>2}: {}", stack[i]); + } else { + println!("├── {i:>2}: {}", stack[i]); + println!("└── ({} more items)", stack.len() - num_items); + } +} + +#[cfg(not(feature = "std"))] +fn print_vm_stack(_clk: u32, _stack: Vec, _n: usize) { + // in no_std environments, this is a NOOP } diff --git a/processor/src/lib.rs b/processor/src/lib.rs index dbee423758..9d0e85e9e4 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -377,7 +377,17 @@ where op_offset += op_batch.ops().len(); } - self.end_span_block(block) + self.end_span_block(block)?; + + // execute any decorators which have not been executed during span ops execution; this + // can happen for decorators appearing after all operations in a block. these decorators + // are executed after SPAN block is closed to make sure the VM clock cycle advances beyond + // the last clock cycle of the SPAN block ops. + if let Some(decorator) = decorators.next() { + self.execute_decorator(decorator)?; + } + + Ok(()) } /// Executes all operations in an [OpBatch]. This also ensures that all alignment rules are @@ -405,7 +415,7 @@ where // execute operations in the batch one by one for (i, &op) in batch.ops().iter().enumerate() { - while let Some(decorator) = decorators.next(i + op_offset) { + while let Some(decorator) = decorators.next_filtered(i + op_offset) { self.execute_decorator(decorator)?; } diff --git a/processor/src/stack/mod.rs b/processor/src/stack/mod.rs index fce8cf00e5..bbfee3de17 100644 --- a/processor/src/stack/mod.rs +++ b/processor/src/stack/mod.rs @@ -125,11 +125,16 @@ impl Stack { /// stack + overflow entries. /// /// # Panics - /// Panics if invoked on a stack instantiated with `keep_overflow_trace` set to false. + /// Panics if invoked for non-last clock cycle on a stack instantiated with + /// `keep_overflow_trace` set to false. pub fn get_state_at(&self, clk: u32) -> Vec { let mut result = Vec::with_capacity(self.active_depth); self.trace.append_state_into(&mut result, clk); - self.overflow.append_state_into(&mut result, clk as u64); + if clk == self.clk { + self.overflow.append_into(&mut result); + } else { + self.overflow.append_state_into(&mut result, clk as u64); + } result } From cbe384ba7e0f7159a7c01b488beb98e86cd72cb6 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Sun, 17 Sep 2023 22:30:31 -0700 Subject: [PATCH 090/120] feat: add error code to assert operation --- air/src/constraints/stack/op_flags/mod.rs | 2 +- air/src/constraints/stack/system_ops/tests.rs | 6 +-- .../src/assembler/instruction/ext2_ops.rs | 40 +++++++++---------- .../src/assembler/instruction/field_ops.rs | 18 +++++++-- assembly/src/assembler/instruction/u32_ops.rs | 6 +-- assembly/src/tests.rs | 4 +- core/src/operations/mod.rs | 19 +++++---- processor/src/errors.rs | 6 ++- processor/src/operations/mod.rs | 2 +- processor/src/operations/sys_ops.rs | 6 +-- 10 files changed, 63 insertions(+), 46 deletions(-) diff --git a/air/src/constraints/stack/op_flags/mod.rs b/air/src/constraints/stack/op_flags/mod.rs index 9a684326a7..ab41aa9d09 100644 --- a/air/src/constraints/stack/op_flags/mod.rs +++ b/air/src/constraints/stack/op_flags/mod.rs @@ -624,7 +624,7 @@ impl OpFlags { /// Operation Flag of ASSERT operation. #[inline(always)] pub fn assert(&self) -> E { - self.degree7_op_flags[get_op_index(Operation::Assert.op_code())] + self.degree7_op_flags[get_op_index(Operation::Assert(ZERO).op_code())] } /// Operation Flag of EQ operation. diff --git a/air/src/constraints/stack/system_ops/tests.rs b/air/src/constraints/stack/system_ops/tests.rs index 7643caf83f..166a41b48a 100644 --- a/air/src/constraints/stack/system_ops/tests.rs +++ b/air/src/constraints/stack/system_ops/tests.rs @@ -71,7 +71,7 @@ fn get_constraint_evaluation(frame: EvaluationFrame) -> [Felt; NUM_CONSTRA /// Generates the correct current and next rows for the FMPADD operation and inputs and /// returns an EvaluationFrame for testing. pub fn get_fmpadd_test_frame(a: u64) -> EvaluationFrame { - // frame initialised with a fmpadd operation using it's unique opcode. + // frame initialized with a fmpadd operation using it's unique opcode. let mut frame = generate_evaluation_frame(Operation::FmpAdd.op_code() as usize); // Set the output. First element in the next frame should be incremented @@ -101,8 +101,8 @@ pub fn get_fmpupdate_test_frame(a: u64) -> EvaluationFrame { /// Generates the correct current and next rows for the ASSERT operation and inputs and /// returns an EvaluationFrame for testing. pub fn get_assert_test_frame() -> EvaluationFrame { - // frame initialised with a fmpupdate operation using it's unique opcode. - let mut frame = generate_evaluation_frame(Operation::Assert.op_code() as usize); + // frame initialized with a fmpupdate operation using it's unique opcode. + let mut frame = generate_evaluation_frame(Operation::Assert(ZERO).op_code() as usize); // Set the output. The top element in the current frame of the stack should be ONE. frame.current_mut()[STACK_TRACE_OFFSET] = ONE; diff --git a/assembly/src/assembler/instruction/ext2_ops.rs b/assembly/src/assembler/instruction/ext2_ops.rs index 046aa24168..a5642035d7 100644 --- a/assembly/src/assembler/instruction/ext2_ops.rs +++ b/assembly/src/assembler/instruction/ext2_ops.rs @@ -1,4 +1,4 @@ -use super::{AssemblyError, CodeBlock, Operation::*, SpanBuilder}; +use super::{AssemblyError, CodeBlock, Operation::*, SpanBuilder, ZERO}; use vm_core::AdviceInjector::Ext2Inv; /// Given a stack in the following initial configuration [b1, b0, a1, a0, ...] where a = (a0, a1) @@ -55,17 +55,17 @@ pub fn ext2_div(span: &mut SpanBuilder) -> Result, AssemblyErr span.push_advice_injector(Ext2Inv); #[rustfmt::skip] let ops = [ - AdvPop, // [b0', b1, b0, a1, a0, ...] - AdvPop, // [b1', b0', b1, b0, a1, a0, ...] - Ext2Mul, // [b1', b0', 0, 1, a1, a0, ...] - MovUp2, // [0, b1', b0', 1, a1, a0, ...] - Eqz, // [1, b1', b0', 1, a1, a0, ...] - Assert, // [b1', b0', 1, a1, a0, ...] - MovUp2, // [1, b1', b0', a1, a0, ...] - Assert, // [b1', b0', a1, a0, ...] - Ext2Mul, // [b1', b0', a1*b1', a0*b0', ...] - Drop, // [b0', a1*b1', a0*b0'...] - Drop // [a1*b1', a0*b0'...] + AdvPop, // [b0', b1, b0, a1, a0, ...] + AdvPop, // [b1', b0', b1, b0, a1, a0, ...] + Ext2Mul, // [b1', b0', 0, 1, a1, a0, ...] + MovUp2, // [0, b1', b0', 1, a1, a0, ...] + Eqz, // [1, b1', b0', 1, a1, a0, ...] + Assert(ZERO), // [b1', b0', 1, a1, a0, ...] + MovUp2, // [1, b1', b0', a1, a0, ...] + Assert(ZERO), // [b1', b0', a1, a0, ...] + Ext2Mul, // [b1', b0', a1*b1', a0*b0', ...] + Drop, // [b0', a1*b1', a0*b0'...] + Drop // [a1*b1', a0*b0'...] ]; span.add_ops(ops) } @@ -115,14 +115,14 @@ pub fn ext2_inv(span: &mut SpanBuilder) -> Result, AssemblyErr span.push_advice_injector(Ext2Inv); #[rustfmt::skip] let ops = [ - AdvPop, // [a0', a1, a0, ...] - AdvPop, // [a1', a0', a1, a0, ...] - Ext2Mul, // [a1', a0', 0, 1, ...] - MovUp2, // [0, a1', a0', 1, ...] - Eqz, // [1, a1', a0', 1, ...] - Assert, // [a1', a0', 1, ...] - MovUp2, // [1, a1', a0', ...] - Assert // [a1', a0', ...] + AdvPop, // [a0', a1, a0, ...] + AdvPop, // [a1', a0', a1, a0, ...] + Ext2Mul, // [a1', a0', 0, 1, ...] + MovUp2, // [0, a1', a0', 1, ...] + Eqz, // [1, a1', a0', 1, ...] + Assert(ZERO), // [a1', a0', 1, ...] + MovUp2, // [1, a1', a0', ...] + Assert(ZERO), // [a1', a0', ...] ]; span.add_ops(ops) } diff --git a/assembly/src/assembler/instruction/field_ops.rs b/assembly/src/assembler/instruction/field_ops.rs index 98b239a729..34129d3c29 100644 --- a/assembly/src/assembler/instruction/field_ops.rs +++ b/assembly/src/assembler/instruction/field_ops.rs @@ -14,7 +14,19 @@ const TWO: Felt = Felt::new(2); /// /// VM cycles: 11 cycles pub fn assertw(span: &mut SpanBuilder) -> Result, AssemblyError> { - span.add_ops([MovUp4, Eq, Assert, MovUp3, Eq, Assert, MovUp2, Eq, Assert, Eq, Assert]) + span.add_ops([ + MovUp4, + Eq, + Assert(ZERO), + MovUp3, + Eq, + Assert(ZERO), + MovUp2, + Eq, + Assert(ZERO), + Eq, + Assert(ZERO), + ]) } // BASIC ARITHMETIC OPERATIONS @@ -110,7 +122,7 @@ pub fn append_pow2_op(span: &mut SpanBuilder) { // drop the top two elements bit and exp value of the latest bit. span.push_ops([Drop, Drop]); // taking `b` to the top and asserting if it's equal to ZERO after all the right shifts. - span.push_ops([Swap, Eqz, Assert]); + span.push_ops([Swap, Eqz, Assert(ZERO)]); } // EXPONENTIATION OPERATION @@ -139,7 +151,7 @@ pub fn exp(span: &mut SpanBuilder, num_pow_bits: u8) -> Result span.push_ops([Drop, Drop]); // taking `b` to the top and asserting if it's equal to ZERO after all the right shifts. - span.push_ops([Swap, Eqz, Assert]); + span.push_ops([Swap, Eqz, Assert(ZERO)]); Ok(None) } diff --git a/assembly/src/assembler/instruction/u32_ops.rs b/assembly/src/assembler/instruction/u32_ops.rs index 775496ca16..3f3ffaa132 100644 --- a/assembly/src/assembler/instruction/u32_ops.rs +++ b/assembly/src/assembler/instruction/u32_ops.rs @@ -2,7 +2,7 @@ use super::{ field_ops::append_pow2_op, push_u32_value, validate_param, AssemblyError, CodeBlock, Felt, Operation::{self, *}, - SpanBuilder, + SpanBuilder, ZERO, }; use crate::{MAX_U32_ROTATE_VALUE, MAX_U32_SHIFT_VALUE}; @@ -318,7 +318,7 @@ pub fn u32rotr( U32assert2, // Calculate 32 - b and assert that the shift value b <= 31. - Push(Felt::from(MAX_U32_ROTATE_VALUE)), Dup1, U32sub, Not, Assert, Incr, Dup1, + Push(Felt::from(MAX_U32_ROTATE_VALUE)), Dup1, U32sub, Not, Assert(ZERO), Incr, Dup1, // If 32-b = 32, replace it with 0. Eqz, Not, CSwap, Drop, @@ -417,7 +417,7 @@ fn handle_arithmetic_operation( span.push_op(op); if assert_u32_res { - span.add_ops([Eqz, Assert]) + span.add_ops([Eqz, Assert(ZERO)]) } else if drop_high_bits { span.add_op(Drop) } else { diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index b3edddd042..35dddcb7de 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -14,7 +14,7 @@ fn simple_instructions() { let program = assembler.compile(source).unwrap(); let expected = "\ begin \ - span pad eqz assert end \ + span pad eqz assert(0) end \ end"; assert_eq!(expected, format!("{program}")); @@ -1005,7 +1005,7 @@ fn module_alias() { pad incr pad push(2) pad \ swap movup3 u32assert2 \ u32add movup3 movup3 \ - u32assert2 u32add3 eqz assert \ + u32assert2 u32add3 eqz assert(0) \ end \ end"; assert_eq!(expected, format!("{program}")); diff --git a/core/src/operations/mod.rs b/core/src/operations/mod.rs index d16d184987..8d217b2d3c 100644 --- a/core/src/operations/mod.rs +++ b/core/src/operations/mod.rs @@ -18,7 +18,10 @@ pub enum Operation { Noop, /// Pops the stack; if the popped value is not 1, execution fails. - Assert, + /// + /// The internal value specifies an error code associated with the error in case when the + /// execution fails. + Assert(Felt), /// Pops an element off the stack, adds the current value of the `fmp` register to it, and /// pushes the result back onto the stack. @@ -127,14 +130,14 @@ pub enum Operation { /// - accumulated power of base number `a` so far /// - number which needs to be shifted to the right /// - /// At the end of the operation, exponent is replaced with its square, current value of power of base - /// number `a` on exponent is incorported into the accumulator and the number is shifted to the right - /// by one bit. + /// At the end of the operation, exponent is replaced with its square, current value of power + /// of base number `a` on exponent is incorporated into the accumulator and the number is + /// shifted to the right by one bit. Expacc, - // ----- ext2 operations ----------------------------------------------------------------------- + // ----- ext2 operations ---------------------------------------------------------------------- /// Computes the product of two elements in the extension field of degree 2 and pushes the - /// result back onto the stack as the third and fourth elemtns. Pushes 0 onto the stack as + /// result back onto the stack as the third and fourth elements. Pushes 0 onto the stack as /// the first and second elements. Ext2Mul, @@ -469,7 +472,7 @@ impl Operation { Self::SwapDW => 0b0001_1110, // => 0b0001_1111, - Self::Assert => 0b0010_0000, + Self::Assert(_) => 0b0010_0000, Self::Eq => 0b0010_0001, Self::Add => 0b0010_0010, Self::Mul => 0b0010_0011, @@ -572,7 +575,7 @@ impl fmt::Display for Operation { match self { // ----- system operations ------------------------------------------------------------ Self::Noop => write!(f, "noop"), - Self::Assert => write!(f, "assert"), + Self::Assert(err_code) => write!(f, "assert({err_code})"), Self::FmpAdd => write!(f, "fmpadd"), Self::FmpUpdate => write!(f, "fmpupdate"), diff --git a/processor/src/errors.rs b/processor/src/errors.rs index fcdd335306..84ad8832fd 100644 --- a/processor/src/errors.rs +++ b/processor/src/errors.rs @@ -24,7 +24,7 @@ pub enum ExecutionError { CycleLimitExceeded(u32), DivideByZero(u32), Ext2InttError(Ext2InttError), - FailedAssertion(u32), + FailedAssertion(u32, Felt), InvalidFmpValue(Felt, Felt), InvalidFriDomainSegment(u64), InvalidFriLayerFolding(QuadFelt, QuadFelt), @@ -83,7 +83,9 @@ impl Display for ExecutionError { } DivideByZero(clk) => write!(f, "Division by zero at clock cycle {clk}"), Ext2InttError(err) => write!(f, "Failed to execute Ext2Intt operation: {err}"), - FailedAssertion(clk) => write!(f, "Assertion failed at clock cycle {clk}"), + FailedAssertion(clk, err_code) => { + write!(f, "Assertion failed at clock cycle {clk} with error code {err_code}") + } InvalidFmpValue(old, new) => { write!(f, "Updating FMP register from {old} to {new} failed because {new} is outside of {FMP_MIN}..{FMP_MAX}") } diff --git a/processor/src/operations/mod.rs b/processor/src/operations/mod.rs index f1ea69a935..009a55228f 100644 --- a/processor/src/operations/mod.rs +++ b/processor/src/operations/mod.rs @@ -30,7 +30,7 @@ where match op { // ----- system operations ------------------------------------------------------------ Operation::Noop => self.stack.copy_state(0), - Operation::Assert => self.op_assert()?, + Operation::Assert(err_code) => self.op_assert(err_code)?, Operation::FmpAdd => self.op_fmpadd()?, Operation::FmpUpdate => self.op_fmpupdate()?, diff --git a/processor/src/operations/sys_ops.rs b/processor/src/operations/sys_ops.rs index a2c3528806..714bf64b2b 100644 --- a/processor/src/operations/sys_ops.rs +++ b/processor/src/operations/sys_ops.rs @@ -17,9 +17,9 @@ where /// /// # Errors /// Returns an error if the popped value is not ONE. - pub(super) fn op_assert(&mut self) -> Result<(), ExecutionError> { + pub(super) fn op_assert(&mut self, err_code: Felt) -> Result<(), ExecutionError> { if self.stack.get(0) != ONE { - return Err(ExecutionError::FailedAssertion(self.system.clk())); + return Err(ExecutionError::FailedAssertion(self.system.clk(), err_code)); } self.stack.shift_left(1); Ok(()) @@ -128,7 +128,7 @@ mod tests { process.execute_op(Operation::Swap).unwrap(); process.execute_op(Operation::Drop).unwrap(); - assert!(process.execute_op(Operation::Assert).is_ok()); + assert!(process.execute_op(Operation::Assert(ZERO)).is_ok()); } #[test] From 7885f420a4e2a2afa16c46feec7c8f9572b20ccb Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 18 Sep 2023 03:08:25 -0700 Subject: [PATCH 091/120] feat: implement parsing of assert instructions with error codes --- .../src/assembler/instruction/field_ops.rs | 14 +- assembly/src/assembler/instruction/mod.rs | 16 +- assembly/src/ast/nodes/mod.rs | 8 + .../src/ast/nodes/serde/deserialization.rs | 4 + assembly/src/ast/nodes/serde/mod.rs | 484 +++++++++--------- assembly/src/ast/nodes/serde/serialization.rs | 16 + assembly/src/ast/parsers/context.rs | 10 +- assembly/src/ast/parsers/mod.rs | 49 +- assembly/src/ast/parsers/sys_ops.rs | 129 +++++ assembly/src/tests.rs | 105 +++- .../tests/integration/operations/field_ops.rs | 41 -- miden/tests/integration/operations/mod.rs | 1 + miden/tests/integration/operations/sys_ops.rs | 55 ++ 13 files changed, 616 insertions(+), 316 deletions(-) create mode 100644 assembly/src/ast/parsers/sys_ops.rs create mode 100644 miden/tests/integration/operations/sys_ops.rs diff --git a/assembly/src/assembler/instruction/field_ops.rs b/assembly/src/assembler/instruction/field_ops.rs index 34129d3c29..6e27952375 100644 --- a/assembly/src/assembler/instruction/field_ops.rs +++ b/assembly/src/assembler/instruction/field_ops.rs @@ -13,19 +13,23 @@ const TWO: Felt = Felt::new(2); /// Asserts that the top two words in the stack are equal. /// /// VM cycles: 11 cycles -pub fn assertw(span: &mut SpanBuilder) -> Result, AssemblyError> { +pub fn assertw( + span: &mut SpanBuilder, + err_code: Option, +) -> Result, AssemblyError> { + let err_code = err_code.map(Felt::from).unwrap_or(ZERO); span.add_ops([ MovUp4, Eq, - Assert(ZERO), + Assert(err_code), MovUp3, Eq, - Assert(ZERO), + Assert(err_code), MovUp2, Eq, - Assert(ZERO), + Assert(err_code), Eq, - Assert(ZERO), + Assert(err_code), ]) } diff --git a/assembly/src/assembler/instruction/mod.rs b/assembly/src/assembler/instruction/mod.rs index 66ce420a7c..88624f62d2 100644 --- a/assembly/src/assembler/instruction/mod.rs +++ b/assembly/src/assembler/instruction/mod.rs @@ -37,10 +37,18 @@ impl Assembler { } let result = match instruction { - Instruction::Assert => span.add_op(Assert), - Instruction::AssertEq => span.add_ops([Eq, Assert]), - Instruction::AssertEqw => field_ops::assertw(span), - Instruction::Assertz => span.add_ops([Eqz, Assert]), + Instruction::Assert => span.add_op(Assert(ZERO)), + Instruction::AssertWithCode(err_code) => span.add_op(Assert(Felt::from(*err_code))), + Instruction::AssertEq => span.add_ops([Eq, Assert(ZERO)]), + Instruction::AssertEqWithCode(err_code) => { + span.add_ops([Eq, Assert(Felt::from(*err_code))]) + } + Instruction::AssertEqw => field_ops::assertw(span, None), + Instruction::AssertEqwWithCode(err_code) => field_ops::assertw(span, Some(*err_code)), + Instruction::Assertz => span.add_ops([Eqz, Assert(ZERO)]), + Instruction::AssertzWithCode(err_code) => { + span.add_ops([Eqz, Assert(Felt::from(*err_code))]) + } Instruction::Add => span.add_op(Add), Instruction::AddImm(imm) => field_ops::add_imm(span, *imm), diff --git a/assembly/src/ast/nodes/mod.rs b/assembly/src/ast/nodes/mod.rs index c17661cfa6..089da60583 100644 --- a/assembly/src/ast/nodes/mod.rs +++ b/assembly/src/ast/nodes/mod.rs @@ -37,9 +37,13 @@ pub enum Node { #[derive(Clone, PartialEq, Eq, Debug)] pub enum Instruction { Assert, + AssertWithCode(u32), AssertEq, + AssertEqWithCode(u32), AssertEqw, + AssertEqwWithCode(u32), Assertz, + AssertzWithCode(u32), Add, AddImm(Felt), Sub, @@ -312,9 +316,13 @@ impl fmt::Display for Instruction { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Assert => write!(f, "assert"), + Self::AssertWithCode(err_code) => write!(f, "assert.err={err_code}"), Self::AssertEq => write!(f, "assert_eq"), + Self::AssertEqWithCode(err_code) => write!(f, "assert_eq.err={err_code}"), Self::AssertEqw => write!(f, "assert_eqw"), + Self::AssertEqwWithCode(err_code) => write!(f, "assert_eqw.err={err_code}"), Self::Assertz => write!(f, "assertz"), + Self::AssertzWithCode(err_code) => write!(f, "assertz.err={err_code}"), Self::Add => write!(f, "add"), Self::AddImm(value) => write!(f, "add.{value}"), Self::Sub => write!(f, "sub"), diff --git a/assembly/src/ast/nodes/serde/deserialization.rs b/assembly/src/ast/nodes/serde/deserialization.rs index 7e375ee252..b564a13cde 100644 --- a/assembly/src/ast/nodes/serde/deserialization.rs +++ b/assembly/src/ast/nodes/serde/deserialization.rs @@ -59,9 +59,13 @@ impl Deserializable for Instruction { match opcode { OpCode::Assert => Ok(Instruction::Assert), + OpCode::AssertWithCode => Ok(Instruction::AssertWithCode(source.read_u32()?)), OpCode::AssertEq => Ok(Instruction::AssertEq), + OpCode::AssertEqWithCode => Ok(Instruction::AssertEqWithCode(source.read_u32()?)), OpCode::AssertEqw => Ok(Instruction::AssertEqw), + OpCode::AssertEqwWithCode => Ok(Instruction::AssertEqwWithCode(source.read_u32()?)), OpCode::Assertz => Ok(Instruction::Assertz), + OpCode::AssertzWithCode => Ok(Instruction::AssertzWithCode(source.read_u32()?)), OpCode::Add => Ok(Instruction::Add), OpCode::AddImm => Ok(Instruction::AddImm(Felt::read_from(source)?)), OpCode::Sub => Ok(Instruction::Sub), diff --git a/assembly/src/ast/nodes/serde/mod.rs b/assembly/src/ast/nodes/serde/mod.rs index ad04305a59..3cc686ab79 100644 --- a/assembly/src/ast/nodes/serde/mod.rs +++ b/assembly/src/ast/nodes/serde/mod.rs @@ -14,267 +14,271 @@ mod serialization; #[derive(Copy, Clone, Debug, PartialEq, Eq, TryFromPrimitive)] pub enum OpCode { Assert = 0, - AssertEq = 1, - AssertEqw = 2, - Assertz = 3, - Add = 4, - AddImm = 5, - Sub = 6, - SubImm = 7, - Mul = 8, - MulImm = 9, - Div = 10, - DivImm = 11, - Neg = 12, - Inv = 13, - Incr = 14, - Pow2 = 15, - Exp = 16, - ExpImm = 17, - ExpBitLength = 18, - Not = 19, - And = 20, - Or = 21, - Xor = 22, - Eq = 23, - EqImm = 24, - Neq = 25, - NeqImm = 26, - Eqw = 27, - Lt = 28, - Lte = 29, - Gt = 30, - Gte = 31, - IsOdd = 32, + AssertWithCode = 1, + AssertEq = 2, + AssertEqWithCode = 3, + AssertEqw = 4, + AssertEqwWithCode = 5, + Assertz = 6, + AssertzWithCode = 7, + Add = 8, + AddImm = 9, + Sub = 10, + SubImm = 11, + Mul = 12, + MulImm = 13, + Div = 14, + DivImm = 15, + Neg = 16, + Inv = 17, + Incr = 18, + Pow2 = 19, + Exp = 20, + ExpImm = 21, + ExpBitLength = 22, + Not = 23, + And = 24, + Or = 25, + Xor = 26, + Eq = 27, + EqImm = 28, + Neq = 29, + NeqImm = 30, + Eqw = 31, + Lt = 32, + Lte = 33, + Gt = 34, + Gte = 35, + IsOdd = 36, // ----- ext2 operations ---------------------------------------------------------------------- - Ext2Add = 33, - Ext2Sub = 34, - Ext2Mul = 35, - Ext2Div = 36, - Ext2Neg = 37, - Ext2Inv = 38, + Ext2Add = 37, + Ext2Sub = 38, + Ext2Mul = 39, + Ext2Div = 40, + Ext2Neg = 41, + Ext2Inv = 42, // ----- u32 manipulation --------------------------------------------------------------------- - U32Test = 39, - U32TestW = 40, - U32Assert = 41, - U32Assert2 = 42, - U32AssertW = 43, - U32Split = 44, - U32Cast = 45, - U32CheckedAdd = 46, - U32CheckedAddImm = 47, - U32WrappingAdd = 48, - U32WrappingAddImm = 49, - U32OverflowingAdd = 50, - U32OverflowingAddImm = 51, - U32OverflowingAdd3 = 52, - U32WrappingAdd3 = 53, - U32CheckedSub = 54, - U32CheckedSubImm = 55, - U32WrappingSub = 56, - U32WrappingSubImm = 57, - U32OverflowingSub = 58, - U32OverflowingSubImm = 59, - U32CheckedMul = 60, - U32CheckedMulImm = 61, - U32WrappingMul = 62, - U32WrappingMulImm = 63, - U32OverflowingMul = 64, - U32OverflowingMulImm = 65, - U32OverflowingMadd = 66, - U32WrappingMadd = 67, - U32CheckedDiv = 68, - U32CheckedDivImm = 69, - U32UncheckedDiv = 70, - U32UncheckedDivImm = 71, - U32CheckedMod = 72, - U32CheckedModImm = 73, - U32UncheckedMod = 74, - U32UncheckedModImm = 75, - U32CheckedDivMod = 76, - U32CheckedDivModImm = 77, - U32UncheckedDivMod = 78, - U32UncheckedDivModImm = 79, - U32CheckedAnd = 80, - U32CheckedOr = 81, - U32CheckedXor = 82, - U32CheckedNot = 83, - U32CheckedShr = 84, - U32CheckedShrImm = 85, - U32UncheckedShr = 86, - U32UncheckedShrImm = 87, - U32CheckedShl = 88, - U32CheckedShlImm = 89, - U32UncheckedShl = 90, - U32UncheckedShlImm = 91, - U32CheckedRotr = 92, - U32CheckedRotrImm = 93, - U32UncheckedRotr = 94, - U32UncheckedRotrImm = 95, - U32CheckedRotl = 96, - U32CheckedRotlImm = 97, - U32UncheckedRotl = 98, - U32UncheckedRotlImm = 99, - U32CheckedPopcnt = 100, - U32UncheckedPopcnt = 101, - U32CheckedEq = 102, - U32CheckedEqImm = 103, - U32CheckedNeq = 104, - U32CheckedNeqImm = 105, - U32CheckedLt = 106, - U32UncheckedLt = 107, - U32CheckedLte = 108, - U32UncheckedLte = 109, - U32CheckedGt = 110, - U32UncheckedGt = 111, - U32CheckedGte = 112, - U32UncheckedGte = 113, - U32CheckedMin = 114, - U32UncheckedMin = 115, - U32CheckedMax = 116, - U32UncheckedMax = 117, + U32Test = 43, + U32TestW = 44, + U32Assert = 45, + U32Assert2 = 46, + U32AssertW = 47, + U32Split = 48, + U32Cast = 49, + U32CheckedAdd = 50, + U32CheckedAddImm = 51, + U32WrappingAdd = 52, + U32WrappingAddImm = 53, + U32OverflowingAdd = 54, + U32OverflowingAddImm = 55, + U32OverflowingAdd3 = 56, + U32WrappingAdd3 = 57, + U32CheckedSub = 58, + U32CheckedSubImm = 59, + U32WrappingSub = 60, + U32WrappingSubImm = 61, + U32OverflowingSub = 62, + U32OverflowingSubImm = 63, + U32CheckedMul = 64, + U32CheckedMulImm = 65, + U32WrappingMul = 66, + U32WrappingMulImm = 67, + U32OverflowingMul = 68, + U32OverflowingMulImm = 69, + U32OverflowingMadd = 70, + U32WrappingMadd = 71, + U32CheckedDiv = 72, + U32CheckedDivImm = 73, + U32UncheckedDiv = 74, + U32UncheckedDivImm = 75, + U32CheckedMod = 76, + U32CheckedModImm = 77, + U32UncheckedMod = 78, + U32UncheckedModImm = 79, + U32CheckedDivMod = 80, + U32CheckedDivModImm = 81, + U32UncheckedDivMod = 82, + U32UncheckedDivModImm = 83, + U32CheckedAnd = 84, + U32CheckedOr = 85, + U32CheckedXor = 86, + U32CheckedNot = 87, + U32CheckedShr = 88, + U32CheckedShrImm = 89, + U32UncheckedShr = 90, + U32UncheckedShrImm = 91, + U32CheckedShl = 92, + U32CheckedShlImm = 93, + U32UncheckedShl = 94, + U32UncheckedShlImm = 95, + U32CheckedRotr = 96, + U32CheckedRotrImm = 97, + U32UncheckedRotr = 98, + U32UncheckedRotrImm = 99, + U32CheckedRotl = 100, + U32CheckedRotlImm = 101, + U32UncheckedRotl = 102, + U32UncheckedRotlImm = 103, + U32CheckedPopcnt = 104, + U32UncheckedPopcnt = 105, + U32CheckedEq = 106, + U32CheckedEqImm = 107, + U32CheckedNeq = 108, + U32CheckedNeqImm = 109, + U32CheckedLt = 110, + U32UncheckedLt = 111, + U32CheckedLte = 112, + U32UncheckedLte = 113, + U32CheckedGt = 114, + U32UncheckedGt = 115, + U32CheckedGte = 116, + U32UncheckedGte = 117, + U32CheckedMin = 118, + U32UncheckedMin = 119, + U32CheckedMax = 120, + U32UncheckedMax = 121, // ----- stack manipulation ------------------------------------------------------------------- - Drop = 118, - DropW = 119, - PadW = 120, - Dup0 = 121, - Dup1 = 122, - Dup2 = 123, - Dup3 = 124, - Dup4 = 125, - Dup5 = 126, - Dup6 = 127, - Dup7 = 128, - Dup8 = 129, - Dup9 = 130, - Dup10 = 131, - Dup11 = 132, - Dup12 = 133, - Dup13 = 134, - Dup14 = 135, - Dup15 = 136, - DupW0 = 137, - DupW1 = 138, - DupW2 = 139, - DupW3 = 140, - Swap1 = 141, - Swap2 = 142, - Swap3 = 143, - Swap4 = 144, - Swap5 = 145, - Swap6 = 146, - Swap7 = 147, - Swap8 = 148, - Swap9 = 149, - Swap10 = 150, - Swap11 = 151, - Swap12 = 152, - Swap13 = 153, - Swap14 = 154, - Swap15 = 155, - SwapW1 = 156, - SwapW2 = 157, - SwapW3 = 158, - SwapDW = 159, - MovUp2 = 160, - MovUp3 = 161, - MovUp4 = 162, - MovUp5 = 163, - MovUp6 = 164, - MovUp7 = 165, - MovUp8 = 166, - MovUp9 = 167, - MovUp10 = 168, - MovUp11 = 169, - MovUp12 = 170, - MovUp13 = 171, - MovUp14 = 172, - MovUp15 = 173, - MovUpW2 = 174, - MovUpW3 = 175, - MovDn2 = 176, - MovDn3 = 177, - MovDn4 = 178, - MovDn5 = 179, - MovDn6 = 180, - MovDn7 = 181, - MovDn8 = 182, - MovDn9 = 183, - MovDn10 = 184, - MovDn11 = 185, - MovDn12 = 186, - MovDn13 = 187, - MovDn14 = 188, - MovDn15 = 189, - MovDnW2 = 190, - MovDnW3 = 191, - CSwap = 192, - CSwapW = 193, - CDrop = 194, - CDropW = 195, + Drop = 122, + DropW = 123, + PadW = 124, + Dup0 = 125, + Dup1 = 126, + Dup2 = 127, + Dup3 = 128, + Dup4 = 129, + Dup5 = 130, + Dup6 = 131, + Dup7 = 132, + Dup8 = 133, + Dup9 = 134, + Dup10 = 135, + Dup11 = 136, + Dup12 = 137, + Dup13 = 138, + Dup14 = 139, + Dup15 = 140, + DupW0 = 141, + DupW1 = 142, + DupW2 = 143, + DupW3 = 144, + Swap1 = 145, + Swap2 = 146, + Swap3 = 147, + Swap4 = 148, + Swap5 = 149, + Swap6 = 150, + Swap7 = 151, + Swap8 = 152, + Swap9 = 153, + Swap10 = 154, + Swap11 = 155, + Swap12 = 156, + Swap13 = 157, + Swap14 = 158, + Swap15 = 159, + SwapW1 = 160, + SwapW2 = 161, + SwapW3 = 162, + SwapDW = 163, + MovUp2 = 164, + MovUp3 = 165, + MovUp4 = 166, + MovUp5 = 167, + MovUp6 = 168, + MovUp7 = 169, + MovUp8 = 170, + MovUp9 = 171, + MovUp10 = 172, + MovUp11 = 173, + MovUp12 = 174, + MovUp13 = 175, + MovUp14 = 176, + MovUp15 = 177, + MovUpW2 = 178, + MovUpW3 = 179, + MovDn2 = 180, + MovDn3 = 181, + MovDn4 = 182, + MovDn5 = 183, + MovDn6 = 184, + MovDn7 = 185, + MovDn8 = 186, + MovDn9 = 187, + MovDn10 = 188, + MovDn11 = 189, + MovDn12 = 190, + MovDn13 = 191, + MovDn14 = 192, + MovDn15 = 193, + MovDnW2 = 194, + MovDnW3 = 195, + CSwap = 196, + CSwapW = 197, + CDrop = 198, + CDropW = 199, // ----- input / output operations ------------------------------------------------------------ - PushU8 = 196, - PushU16 = 197, - PushU32 = 198, - PushFelt = 199, - PushWord = 200, - PushU8List = 201, - PushU16List = 202, - PushU32List = 203, - PushFeltList = 204, + PushU8 = 200, + PushU16 = 201, + PushU32 = 202, + PushFelt = 203, + PushWord = 204, + PushU8List = 205, + PushU16List = 206, + PushU32List = 207, + PushFeltList = 208, - Locaddr = 205, - Sdepth = 206, - Caller = 207, - Clk = 208, + Locaddr = 209, + Sdepth = 210, + Caller = 211, + Clk = 212, - MemLoad = 209, - MemLoadImm = 210, - MemLoadW = 211, - MemLoadWImm = 212, - LocLoad = 213, - LocLoadW = 214, - MemStore = 215, - MemStoreImm = 216, - LocStore = 217, - MemStoreW = 218, - MemStoreWImm = 219, - LocStoreW = 220, + MemLoad = 213, + MemLoadImm = 214, + MemLoadW = 215, + MemLoadWImm = 216, + LocLoad = 217, + LocLoadW = 218, + MemStore = 219, + MemStoreImm = 220, + LocStore = 221, + MemStoreW = 222, + MemStoreWImm = 223, + LocStoreW = 224, - MemStream = 221, - AdvPipe = 222, + MemStream = 225, + AdvPipe = 226, - AdvPush = 223, - AdvLoadW = 224, + AdvPush = 227, + AdvLoadW = 228, - AdvInject = 225, + AdvInject = 229, // ----- cryptographic operations ------------------------------------------------------------- - Hash = 226, - HMerge = 227, - HPerm = 228, - MTreeGet = 229, - MTreeSet = 230, - MTreeMerge = 231, - MTreeVerify = 232, + Hash = 230, + HMerge = 231, + HPerm = 232, + MTreeGet = 233, + MTreeSet = 234, + MTreeMerge = 235, + MTreeVerify = 236, // ----- STARK proof verification ------------------------------------------------------------- - FriExt2Fold4 = 233, + FriExt2Fold4 = 237, // ----- exec / call -------------------------------------------------------------------------- - ExecLocal = 234, - ExecImported = 235, - CallLocal = 236, - CallMastRoot = 237, - CallImported = 238, - SysCall = 239, + ExecLocal = 238, + ExecImported = 239, + CallLocal = 240, + CallMastRoot = 241, + CallImported = 242, + SysCall = 243, // ----- debugging ---------------------------------------------------------------------------- - Debug = 240, + Debug = 244, // ----- control flow ------------------------------------------------------------------------- IfElse = 253, diff --git a/assembly/src/ast/nodes/serde/serialization.rs b/assembly/src/ast/nodes/serde/serialization.rs index 1e62fb26c9..6af59e1ab0 100644 --- a/assembly/src/ast/nodes/serde/serialization.rs +++ b/assembly/src/ast/nodes/serde/serialization.rs @@ -53,9 +53,25 @@ impl Serializable for Instruction { fn write_into(&self, target: &mut W) { match self { Self::Assert => OpCode::Assert.write_into(target), + Self::AssertWithCode(err_code) => { + OpCode::AssertWithCode.write_into(target); + target.write_u32(*err_code); + } Self::AssertEq => OpCode::AssertEq.write_into(target), + Self::AssertEqWithCode(err_code) => { + OpCode::AssertEqWithCode.write_into(target); + target.write_u32(*err_code); + } Self::AssertEqw => OpCode::AssertEqw.write_into(target), + Self::AssertEqwWithCode(err_code) => { + OpCode::AssertEqwWithCode.write_into(target); + target.write_u32(*err_code); + } Self::Assertz => OpCode::Assertz.write_into(target), + Self::AssertzWithCode(err_code) => { + OpCode::AssertzWithCode.write_into(target); + target.write_u32(*err_code); + } Self::Add => OpCode::Add.write_into(target), Self::AddImm(v) => { OpCode::AddImm.write_into(target); diff --git a/assembly/src/ast/parsers/context.rs b/assembly/src/ast/parsers/context.rs index dcfa93cfce..5fb76d78eb 100644 --- a/assembly/src/ast/parsers/context.rs +++ b/assembly/src/ast/parsers/context.rs @@ -1,5 +1,5 @@ use super::{ - super::ProcReExport, adv_ops, debug, field_ops, io_ops, stack_ops, u32_ops, CodeBody, + super::ProcReExport, adv_ops, debug, field_ops, io_ops, stack_ops, sys_ops, u32_ops, CodeBody, Instruction, InvocationTarget, LibraryPath, LocalConstMap, LocalProcMap, ModuleImports, Node, ParsingError, ProcedureAst, ProcedureId, ProcedureName, ReExportedProcMap, Token, TokenStream, MAX_BODY_LEN, MAX_DOCS_LEN, @@ -438,10 +438,10 @@ impl ParserContext<'_> { // based on the instruction, invoke the correct parser for the operation match op.parts()[0] { // ----- field operations ------------------------------------------------------------- - "assert" => simple_instruction(op, Assert), - "assertz" => simple_instruction(op, Assertz), - "assert_eq" => simple_instruction(op, AssertEq), - "assert_eqw" => simple_instruction(op, AssertEqw), + "assert" => sys_ops::parse_assert(op, &self.local_constants), + "assertz" => sys_ops::parse_assertz(op, &self.local_constants), + "assert_eq" => sys_ops::parse_assert_eq(op, &self.local_constants), + "assert_eqw" => sys_ops::parse_assert_eqw(op, &self.local_constants), "add" => field_ops::parse_add(op), "sub" => field_ops::parse_sub(op), diff --git a/assembly/src/ast/parsers/mod.rs b/assembly/src/ast/parsers/mod.rs index 2ac0a2344b..f647f34c27 100644 --- a/assembly/src/ast/parsers/mod.rs +++ b/assembly/src/ast/parsers/mod.rs @@ -12,6 +12,7 @@ mod debug; mod field_ops; mod io_ops; mod stack_ops; +mod sys_ops; mod u32_ops; mod constants; @@ -81,7 +82,25 @@ fn parse_constant(token: &Token, constants: &LocalConstMap) -> Result<(String, u // HELPER FUNCTIONS // ================================================================================================ -/// Parses a constant value and ensures it falls within bounds specified by the caller +/// If `constant_name` is a valid constant name, returns the value of this constant or an error if +/// the constant does not exist in set of available constants. +/// +/// If `constant_name` is not a valid constant name, returns None. +fn try_get_constant_value( + op: &Token, + const_name: &str, + constants: &LocalConstMap, +) -> Result, ParsingError> { + match CONSTANT_LABEL_PARSER.parse_label(const_name) { + Ok(_) => constants + .get(const_name) + .ok_or_else(|| ParsingError::const_not_found(op)) + .map(|v| Some(*v)), + Err(_) => Ok(None), + } +} + +/// Parses a constant value and ensures it falls within bounds specified by the caller. fn parse_const_value( op: &Token, const_value: &str, @@ -92,12 +111,12 @@ fn parse_const_value( Err(_) => calculate_const_value(op, const_value, constants)?.as_int(), }; - let range = 0..Felt::MODULUS; - range.contains(&result).then_some(result).ok_or_else(|| ParsingError::invalid_const_value(op, const_value, format!( - "constant value must be greater than or equal to {lower_bound} and less than or equal to {upper_bound}", lower_bound = bound_into_included_u64(range.start_bound(), true), - upper_bound = bound_into_included_u64(range.end_bound(), false) - ) - .as_str(),)) + if result >= Felt::MODULUS { + let reason = format!("constant value must be smaller than {}", Felt::MODULUS); + Err(ParsingError::invalid_const_value(op, const_value, &reason)) + } else { + Ok(result) + } } /// Parses a param from the op token with the specified type and index. If the param is a constant @@ -111,17 +130,11 @@ where R: TryFrom + core::str::FromStr, { let param_str = op.parts()[param_idx]; - match CONSTANT_LABEL_PARSER.parse_label(param_str) { - Ok(_) => { - let constant = constants - .get(param_str) - .cloned() - .ok_or_else(|| ParsingError::const_not_found(op))?; - constant - .try_into() - .map_err(|_| ParsingError::const_conversion_failed(op, core::any::type_name::())) - } - Err(_) => parse_param::(op, param_idx), + match try_get_constant_value(op, param_str, constants)? { + Some(val) => val + .try_into() + .map_err(|_| ParsingError::const_conversion_failed(op, core::any::type_name::())), + None => parse_param::(op, param_idx), } } diff --git a/assembly/src/ast/parsers/sys_ops.rs b/assembly/src/ast/parsers/sys_ops.rs new file mode 100644 index 0000000000..d0fe352de8 --- /dev/null +++ b/assembly/src/ast/parsers/sys_ops.rs @@ -0,0 +1,129 @@ +use super::{ + try_get_constant_value, + Instruction::*, + LocalConstMap, + Node::{self, Instruction}, + ParsingError, Token, Vec, +}; + +/// Returns `Assert` instruction node if no error code value is provided, or `AssertWithCode` +/// instruction node otherwise. +/// +/// # Errors +/// Returns an error if the instruction token contains a wrong number of parameters, or if +/// the provided parameter is not a u32 value. +pub fn parse_assert(op: &Token, constants: &LocalConstMap) -> Result { + debug_assert_eq!(op.parts()[0], "assert"); + match op.num_parts() { + 0 => unreachable!(), + 1 => Ok(Instruction(Assert)), + 2 => { + let err_code = parse_error_code(op, constants)?; + if err_code == 0 { + Ok(Instruction(Assert)) + } else { + Ok(Instruction(AssertWithCode(err_code))) + } + } + _ => Err(ParsingError::extra_param(op)), + } +} + +/// Returns `Assertz` instruction node if no error code value is provided, or `AssertzWithCode` +/// instruction node otherwise. +/// +/// # Errors +/// Returns an error if the instruction token contains a wrong number of parameters, or if +/// the provided parameter is not a u32 value. +pub fn parse_assertz(op: &Token, constants: &LocalConstMap) -> Result { + debug_assert_eq!(op.parts()[0], "assertz"); + match op.num_parts() { + 0 => unreachable!(), + 1 => Ok(Instruction(Assertz)), + 2 => { + let err_code = parse_error_code(op, constants)?; + if err_code == 0 { + Ok(Instruction(Assertz)) + } else { + Ok(Instruction(AssertzWithCode(err_code))) + } + } + _ => Err(ParsingError::extra_param(op)), + } +} + +/// Returns `AssertEq` instruction node if no error code value is provided, or `AssertEqWithCode` +/// instruction node otherwise. +/// +/// # Errors +/// Returns an error if the instruction token contains a wrong number of parameters, or if +/// the provided parameter is not a u32 value. +pub fn parse_assert_eq(op: &Token, constants: &LocalConstMap) -> Result { + debug_assert_eq!(op.parts()[0], "assert_eq"); + match op.num_parts() { + 0 => unreachable!(), + 1 => Ok(Instruction(AssertEq)), + 2 => { + let err_code = parse_error_code(op, constants)?; + if err_code == 0 { + Ok(Instruction(AssertEq)) + } else { + Ok(Instruction(AssertEqWithCode(err_code))) + } + } + _ => Err(ParsingError::extra_param(op)), + } +} + +/// Returns `AssertEqw` instruction node if no error code value is provided, or `AssertEqwWithCode` +/// instruction node otherwise. +/// +/// # Errors +/// Returns an error if the instruction token contains a wrong number of parameters, or if +/// the provided parameter is not a u32 value. +pub fn parse_assert_eqw(op: &Token, constants: &LocalConstMap) -> Result { + debug_assert_eq!(op.parts()[0], "assert_eqw"); + match op.num_parts() { + 0 => unreachable!(), + 1 => Ok(Instruction(AssertEqw)), + 2 => { + let err_code = parse_error_code(op, constants)?; + if err_code == 0 { + Ok(Instruction(AssertEqw)) + } else { + Ok(Instruction(AssertEqwWithCode(err_code))) + } + } + _ => Err(ParsingError::extra_param(op)), + } +} + +// HELPER FUNCTIONS +// ================================================================================================ + +/// Parses the error code declaration for an assertion instruction, and returns the value of the +/// code. +/// +/// The code is expected to be specified via the first instruction parameter and have the form +/// `err= Result { + let inst = token.parts()[0]; + let err_code_parts: Vec<&str> = token.parts()[1].split('=').collect(); + match err_code_parts.len() { + 0 => unreachable!(), + 1 => Err(ParsingError::missing_param(token, format!("{inst}.err=").as_str())), + 2 => { + if err_code_parts[0] != "err" { + return Err(ParsingError::invalid_param(token, 1)); + } + + let err_code_str = err_code_parts[1]; + let err_code = match try_get_constant_value(token, err_code_str, constants)? { + Some(val) => val.try_into().map_err(|_| ParsingError::invalid_param(token, 1))?, + None => err_code_str.parse().map_err(|_| ParsingError::invalid_param(token, 1))?, + }; + Ok(err_code) + } + _ => Err(ParsingError::extra_param(token)), + } +} diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 35dddcb7de..f29c404655 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -338,9 +338,9 @@ fn constant_must_be_within_valid_felt_range() { let result = assembler.compile(source); assert!(result.is_err()); let err = result.err().unwrap(); - let expected_error = "malformed constant `const.CONSTANT=18446744073709551615` - invalid value: \ - `18446744073709551615` - reason: constant value must be greater than or equal to 0 and less than or \ - equal to 18446744069414584320"; + let expected_error = + "malformed constant `const.CONSTANT=18446744073709551615` - invalid value: \ + `18446744073709551615` - reason: constant value must be smaller than 18446744069414584321"; assert_eq!(expected_error, err.to_string()); } @@ -527,6 +527,105 @@ fn const_conversion_failed_to_u32() { assert_eq!(expected_error, err.to_string()); } +// ASSERTIONS +// ================================================================================================ + +#[test] +fn assert_with_code() { + let source = format!( + "\ + const.ERR1=1 + + begin + assert + assert.err=ERR1 + assert.err=2 + end + " + ); + let assembler = super::Assembler::default(); + let program = assembler.compile(source).unwrap(); + + let expected = "\ + begin \ + span assert(0) assert(1) assert(2) end \ + end"; + assert_eq!(expected, format!("{program}")); +} + +#[test] +fn assertz_with_code() { + let source = format!( + "\ + const.ERR1=1 + + begin + assertz + assertz.err=ERR1 + assertz.err=2 + end + " + ); + let assembler = super::Assembler::default(); + let program = assembler.compile(source).unwrap(); + + let expected = "\ + begin \ + span eqz assert(0) eqz assert(1) eqz assert(2) end \ + end"; + assert_eq!(expected, format!("{program}")); +} + +#[test] +fn assert_eq_with_code() { + let source = format!( + "\ + const.ERR1=1 + + begin + assert_eq + assert_eq.err=ERR1 + assert_eq.err=2 + end + " + ); + let assembler = super::Assembler::default(); + let program = assembler.compile(source).unwrap(); + + let expected = "\ + begin \ + span eq assert(0) eq assert(1) eq assert(2) end \ + end"; + assert_eq!(expected, format!("{program}")); +} + +#[test] +fn assert_eqw_with_code() { + let source = format!( + "\ + const.ERR1=1 + + begin + assert_eqw + assert_eqw.err=ERR1 + assert_eqw.err=2 + end + " + ); + let assembler = super::Assembler::default(); + let program = assembler.compile(source).unwrap(); + + let expected = "\ + begin \ + span \ + movup4 eq assert(0) movup3 eq assert(0) movup2 eq assert(0) eq assert(0) \ + movup4 eq assert(1) movup3 eq assert(1) movup2 eq assert(1) eq assert(1) \ + movup4 eq assert(2) movup3 eq assert(2) movup2 eq assert(2) eq assert(2) \ + end \ + end"; + assert_eq!(expected, format!("{program}")); +} + // NESTED CONTROL BLOCKS // ================================================================================================ diff --git a/miden/tests/integration/operations/field_ops.rs b/miden/tests/integration/operations/field_ops.rs index 2e1bc6488c..ed4e913fc5 100644 --- a/miden/tests/integration/operations/field_ops.rs +++ b/miden/tests/integration/operations/field_ops.rs @@ -3,47 +3,6 @@ use test_utils::{ StarkField, TestError, ONE, WORD_SIZE, }; -// FIELD OPS ASSERTIONS - MANUAL TESTS -// ================================================================================================ - -#[test] -fn assert() { - let asm_op = "assert"; - - let test = build_op_test!(asm_op, &[1]); - test.expect_stack(&[]); -} - -#[test] -fn assert_fail() { - let asm_op = "assert"; - - let test = build_op_test!(asm_op, &[2]); - test.expect_error(TestError::ExecutionError("FailedAssertion")); -} - -#[test] -fn assert_eq() { - let asm_op = "assert_eq"; - - let test = build_op_test!(asm_op, &[1, 1]); - test.expect_stack(&[]); - - let test = build_op_test!(asm_op, &[3, 3]); - test.expect_stack(&[]); -} - -#[test] -fn assert_eq_fail() { - let asm_op = "assert_eq"; - - let test = build_op_test!(asm_op, &[2, 1]); - test.expect_error(TestError::ExecutionError("FailedAssertion")); - - let test = build_op_test!(asm_op, &[1, 4]); - test.expect_error(TestError::ExecutionError("FailedAssertion")); -} - // FIELD OPS ARITHMETIC - MANUAL TESTS // ================================================================================================ diff --git a/miden/tests/integration/operations/mod.rs b/miden/tests/integration/operations/mod.rs index e60b7d3b1e..2e04f6cb8d 100644 --- a/miden/tests/integration/operations/mod.rs +++ b/miden/tests/integration/operations/mod.rs @@ -5,4 +5,5 @@ mod field_ops; mod fri_ops; mod io_ops; mod stack_ops; +mod sys_ops; mod u32_ops; diff --git a/miden/tests/integration/operations/sys_ops.rs b/miden/tests/integration/operations/sys_ops.rs new file mode 100644 index 0000000000..987b8185d2 --- /dev/null +++ b/miden/tests/integration/operations/sys_ops.rs @@ -0,0 +1,55 @@ +use test_utils::{build_op_test, Felt, TestError}; + +// SYSTEM OPS ASSERTIONS - MANUAL TESTS +// ================================================================================================ + +#[test] +fn assert() { + let asm_op = "assert"; + + let test = build_op_test!(asm_op, &[1]); + test.expect_stack(&[]); +} + +#[test] +fn assert_with_code() { + let asm_op = "assert.err=123"; + + let test = build_op_test!(asm_op, &[1]); + test.expect_stack(&[]); + + // triggered assertion captures both the VM cycle and error code + let expected_err = format!("FailedAssertion(1, BaseElement({}))", Felt::new(123).inner()); + let test = build_op_test!(asm_op, &[0]); + test.expect_error(TestError::ExecutionError(&expected_err)); +} + +#[test] +fn assert_fail() { + let asm_op = "assert"; + + let test = build_op_test!(asm_op, &[2]); + test.expect_error(TestError::ExecutionError("FailedAssertion")); +} + +#[test] +fn assert_eq() { + let asm_op = "assert_eq"; + + let test = build_op_test!(asm_op, &[1, 1]); + test.expect_stack(&[]); + + let test = build_op_test!(asm_op, &[3, 3]); + test.expect_stack(&[]); +} + +#[test] +fn assert_eq_fail() { + let asm_op = "assert_eq"; + + let test = build_op_test!(asm_op, &[2, 1]); + test.expect_error(TestError::ExecutionError("FailedAssertion")); + + let test = build_op_test!(asm_op, &[1, 4]); + test.expect_error(TestError::ExecutionError("FailedAssertion")); +} From 26494944d1f5a962b28b82609e97d45659479480 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 18 Sep 2023 03:29:02 -0700 Subject: [PATCH 092/120] docs: added documentation for custom assert error codes --- .github/workflows/ci.yml | 3 +++ assembly/src/assembler/instruction/mod.rs | 8 +++---- assembly/src/ast/nodes/mod.rs | 21 ++++++++++++------- .../src/ast/nodes/serde/deserialization.rs | 8 +++---- assembly/src/ast/nodes/serde/mod.rs | 8 +++---- assembly/src/ast/nodes/serde/serialization.rs | 16 +++++++------- assembly/src/ast/parsers/sys_ops.rs | 16 +++++++------- .../user_docs/assembly/code_organization.md | 2 +- .../user_docs/assembly/field_operations.md | 6 ++++++ 9 files changed, 51 insertions(+), 37 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 571e57a0a5..8d715ce922 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,6 +95,9 @@ jobs: with: command: clippy args: --all -- -D clippy::all -D warnings + env: + # Seems necessary until https://github.com/rust-lang/rust/pull/115819 is merged. + CARGO_INCREMENTAL: 0 rustfmt: name: rustfmt diff --git a/assembly/src/assembler/instruction/mod.rs b/assembly/src/assembler/instruction/mod.rs index 88624f62d2..291dd53ccd 100644 --- a/assembly/src/assembler/instruction/mod.rs +++ b/assembly/src/assembler/instruction/mod.rs @@ -38,15 +38,15 @@ impl Assembler { let result = match instruction { Instruction::Assert => span.add_op(Assert(ZERO)), - Instruction::AssertWithCode(err_code) => span.add_op(Assert(Felt::from(*err_code))), + Instruction::AssertWithError(err_code) => span.add_op(Assert(Felt::from(*err_code))), Instruction::AssertEq => span.add_ops([Eq, Assert(ZERO)]), - Instruction::AssertEqWithCode(err_code) => { + Instruction::AssertEqWithError(err_code) => { span.add_ops([Eq, Assert(Felt::from(*err_code))]) } Instruction::AssertEqw => field_ops::assertw(span, None), - Instruction::AssertEqwWithCode(err_code) => field_ops::assertw(span, Some(*err_code)), + Instruction::AssertEqwWithError(err_code) => field_ops::assertw(span, Some(*err_code)), Instruction::Assertz => span.add_ops([Eqz, Assert(ZERO)]), - Instruction::AssertzWithCode(err_code) => { + Instruction::AssertzWithError(err_code) => { span.add_ops([Eqz, Assert(Felt::from(*err_code))]) } diff --git a/assembly/src/ast/nodes/mod.rs b/assembly/src/ast/nodes/mod.rs index 089da60583..f907305359 100644 --- a/assembly/src/ast/nodes/mod.rs +++ b/assembly/src/ast/nodes/mod.rs @@ -12,6 +12,11 @@ pub use format::*; mod serde; +// TYPE ALIASES +// ================================================================================================ + +type ErrorCode = u32; + // NODES // ================================================================================================ @@ -37,13 +42,13 @@ pub enum Node { #[derive(Clone, PartialEq, Eq, Debug)] pub enum Instruction { Assert, - AssertWithCode(u32), + AssertWithError(ErrorCode), AssertEq, - AssertEqWithCode(u32), + AssertEqWithError(ErrorCode), AssertEqw, - AssertEqwWithCode(u32), + AssertEqwWithError(ErrorCode), Assertz, - AssertzWithCode(u32), + AssertzWithError(ErrorCode), Add, AddImm(Felt), Sub, @@ -316,13 +321,13 @@ impl fmt::Display for Instruction { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Assert => write!(f, "assert"), - Self::AssertWithCode(err_code) => write!(f, "assert.err={err_code}"), + Self::AssertWithError(err_code) => write!(f, "assert.err={err_code}"), Self::AssertEq => write!(f, "assert_eq"), - Self::AssertEqWithCode(err_code) => write!(f, "assert_eq.err={err_code}"), + Self::AssertEqWithError(err_code) => write!(f, "assert_eq.err={err_code}"), Self::AssertEqw => write!(f, "assert_eqw"), - Self::AssertEqwWithCode(err_code) => write!(f, "assert_eqw.err={err_code}"), + Self::AssertEqwWithError(err_code) => write!(f, "assert_eqw.err={err_code}"), Self::Assertz => write!(f, "assertz"), - Self::AssertzWithCode(err_code) => write!(f, "assertz.err={err_code}"), + Self::AssertzWithError(err_code) => write!(f, "assertz.err={err_code}"), Self::Add => write!(f, "add"), Self::AddImm(value) => write!(f, "add.{value}"), Self::Sub => write!(f, "sub"), diff --git a/assembly/src/ast/nodes/serde/deserialization.rs b/assembly/src/ast/nodes/serde/deserialization.rs index b564a13cde..b56e73c394 100644 --- a/assembly/src/ast/nodes/serde/deserialization.rs +++ b/assembly/src/ast/nodes/serde/deserialization.rs @@ -59,13 +59,13 @@ impl Deserializable for Instruction { match opcode { OpCode::Assert => Ok(Instruction::Assert), - OpCode::AssertWithCode => Ok(Instruction::AssertWithCode(source.read_u32()?)), + OpCode::AssertWithError => Ok(Instruction::AssertWithError(source.read_u32()?)), OpCode::AssertEq => Ok(Instruction::AssertEq), - OpCode::AssertEqWithCode => Ok(Instruction::AssertEqWithCode(source.read_u32()?)), + OpCode::AssertEqWithError => Ok(Instruction::AssertEqWithError(source.read_u32()?)), OpCode::AssertEqw => Ok(Instruction::AssertEqw), - OpCode::AssertEqwWithCode => Ok(Instruction::AssertEqwWithCode(source.read_u32()?)), + OpCode::AssertEqwWithError => Ok(Instruction::AssertEqwWithError(source.read_u32()?)), OpCode::Assertz => Ok(Instruction::Assertz), - OpCode::AssertzWithCode => Ok(Instruction::AssertzWithCode(source.read_u32()?)), + OpCode::AssertzWithError => Ok(Instruction::AssertzWithError(source.read_u32()?)), OpCode::Add => Ok(Instruction::Add), OpCode::AddImm => Ok(Instruction::AddImm(Felt::read_from(source)?)), OpCode::Sub => Ok(Instruction::Sub), diff --git a/assembly/src/ast/nodes/serde/mod.rs b/assembly/src/ast/nodes/serde/mod.rs index 3cc686ab79..8a5023a1db 100644 --- a/assembly/src/ast/nodes/serde/mod.rs +++ b/assembly/src/ast/nodes/serde/mod.rs @@ -14,13 +14,13 @@ mod serialization; #[derive(Copy, Clone, Debug, PartialEq, Eq, TryFromPrimitive)] pub enum OpCode { Assert = 0, - AssertWithCode = 1, + AssertWithError = 1, AssertEq = 2, - AssertEqWithCode = 3, + AssertEqWithError = 3, AssertEqw = 4, - AssertEqwWithCode = 5, + AssertEqwWithError = 5, Assertz = 6, - AssertzWithCode = 7, + AssertzWithError = 7, Add = 8, AddImm = 9, Sub = 10, diff --git a/assembly/src/ast/nodes/serde/serialization.rs b/assembly/src/ast/nodes/serde/serialization.rs index 6af59e1ab0..70329af5b7 100644 --- a/assembly/src/ast/nodes/serde/serialization.rs +++ b/assembly/src/ast/nodes/serde/serialization.rs @@ -53,23 +53,23 @@ impl Serializable for Instruction { fn write_into(&self, target: &mut W) { match self { Self::Assert => OpCode::Assert.write_into(target), - Self::AssertWithCode(err_code) => { - OpCode::AssertWithCode.write_into(target); + Self::AssertWithError(err_code) => { + OpCode::AssertWithError.write_into(target); target.write_u32(*err_code); } Self::AssertEq => OpCode::AssertEq.write_into(target), - Self::AssertEqWithCode(err_code) => { - OpCode::AssertEqWithCode.write_into(target); + Self::AssertEqWithError(err_code) => { + OpCode::AssertEqWithError.write_into(target); target.write_u32(*err_code); } Self::AssertEqw => OpCode::AssertEqw.write_into(target), - Self::AssertEqwWithCode(err_code) => { - OpCode::AssertEqwWithCode.write_into(target); + Self::AssertEqwWithError(err_code) => { + OpCode::AssertEqwWithError.write_into(target); target.write_u32(*err_code); } Self::Assertz => OpCode::Assertz.write_into(target), - Self::AssertzWithCode(err_code) => { - OpCode::AssertzWithCode.write_into(target); + Self::AssertzWithError(err_code) => { + OpCode::AssertzWithError.write_into(target); target.write_u32(*err_code); } Self::Add => OpCode::Add.write_into(target), diff --git a/assembly/src/ast/parsers/sys_ops.rs b/assembly/src/ast/parsers/sys_ops.rs index d0fe352de8..5eb03451a3 100644 --- a/assembly/src/ast/parsers/sys_ops.rs +++ b/assembly/src/ast/parsers/sys_ops.rs @@ -6,7 +6,7 @@ use super::{ ParsingError, Token, Vec, }; -/// Returns `Assert` instruction node if no error code value is provided, or `AssertWithCode` +/// Returns `Assert` instruction node if no error code value is provided, or `AssertWithError` /// instruction node otherwise. /// /// # Errors @@ -22,14 +22,14 @@ pub fn parse_assert(op: &Token, constants: &LocalConstMap) -> Result Err(ParsingError::extra_param(op)), } } -/// Returns `Assertz` instruction node if no error code value is provided, or `AssertzWithCode` +/// Returns `Assertz` instruction node if no error code value is provided, or `AssertzWithError` /// instruction node otherwise. /// /// # Errors @@ -45,14 +45,14 @@ pub fn parse_assertz(op: &Token, constants: &LocalConstMap) -> Result Err(ParsingError::extra_param(op)), } } -/// Returns `AssertEq` instruction node if no error code value is provided, or `AssertEqWithCode` +/// Returns `AssertEq` instruction node if no error code value is provided, or `AssertEqWithError` /// instruction node otherwise. /// /// # Errors @@ -68,7 +68,7 @@ pub fn parse_assert_eq(op: &Token, constants: &LocalConstMap) -> Result Err(ParsingError::extra_param(op)), @@ -91,7 +91,7 @@ pub fn parse_assert_eqw(op: &Token, constants: &LocalConstMap) -> Result Err(ParsingError::extra_param(op)), @@ -105,7 +105,7 @@ pub fn parse_assert_eqw(op: &Token, constants: &LocalConstMap) -> Result`. fn parse_error_code(token: &Token, constants: &LocalConstMap) -> Result { let inst = token.parts()[0]; let err_code_parts: Vec<&str> = token.parts()[1].split('=').collect(); diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index 06bc5e72f2..0fa407da0e 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -119,7 +119,7 @@ end In addition to the locally-defined procedure `foo`, the above module also exports procedures `add` and `mul64` implementations of which will be identical to `add` and `mul` procedures from the `std::math::u64` module respectively. ### Constants -Miden assembly supports constant declarations. These constants are scoped to the module they are defined in and can be used as immediate parameters for Miden assembly instructions. Constants are supported as immediate values for the following instructions: `push`, `locaddr`, `loc_load`, `loc_loadw`, `loc_store`, `loc_storew`, `mem_load`, `mem_loadw`, `mem_store`, `mem_storew`. +Miden assembly supports constant declarations. These constants are scoped to the module they are defined in and can be used as immediate parameters for Miden assembly instructions. Constants are supported as immediate values for the following instructions: `push`, `assert`, `assertz`, `asert_eq`, `assert_eqw`, `locaddr`, `loc_load`, `loc_loadw`, `loc_store`, `loc_storew`, `mem_load`, `mem_loadw`, `mem_store`, `mem_storew`. Constants must be declared right after module imports and before any procedures or program bodies. A constant's name must start with an upper-case letter and can contain any combination of numbers, upper-case ASCII letters, and underscores (`_`). The number of characters in a constant name cannot exceed 100. diff --git a/docs/src/user_docs/assembly/field_operations.md b/docs/src/user_docs/assembly/field_operations.md index 21a15c82d7..6e3fbb9409 100644 --- a/docs/src/user_docs/assembly/field_operations.md +++ b/docs/src/user_docs/assembly/field_operations.md @@ -14,6 +14,12 @@ For instructions where one or more operands can be provided as immediate paramet | assert_eq
      - *(2 cycles)* | [b, a, ...] | [...] | If $a = b$, removes them from the stack.
      Fails if $a \ne b$ | | assert_eqw
      - *(11 cycles)* | [B, A, ...] | [...] | If $A = B$, removes them from the stack.
      Fails if $A \ne B$ | +The aboves instruction can also be parametrized with an error code which can be any 32-bit value specified either directly or via a [named constant](./code_organization.md#constants). For example: +``` +assert.err=123 +assert.err=MY_CONSTANT +``` +If the error code is omitted, the default value of $0$ is assumed. ### Arithmetic and Boolean operations From 75485412e25733e370f1046ed80d318608da7d1a Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Wed, 13 Sep 2023 04:02:42 +0200 Subject: [PATCH 093/120] feat: support PMT in the .input file --- CHANGELOG.md | 1 + docs/src/intro/usage.md | 6 +- .../examples/merkle_store/merkle_store.inputs | 45 +++++++ miden/examples/merkle_store/merkle_store.masm | 41 ++++++ miden/src/cli/data.rs | 124 +++++++++++++++++- processor/src/lib.rs | 5 +- 6 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 miden/examples/merkle_store/merkle_store.inputs create mode 100644 miden/examples/merkle_store/merkle_store.masm diff --git a/CHANGELOG.md b/CHANGELOG.md index 187d3f4442..0e2b992773 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - Allowed the assembler to produce programs with "phantom" calls (#1019). - Added `TraceLenSummary` struct which holds information about traces lengths to the `ExecutionTrace` (#1029). - Imposed the 2^32 limit for the memory addresses used in the memory chiplet (#1049). +- Supported `PartialMerkleTree` as a secret input in `.input` file (#1072). #### Stdlib - Completed `std::collections::smt` module by implementing `insert` and `set` procedures (#1036, #1038, #1046). diff --git a/docs/src/intro/usage.md b/docs/src/intro/usage.md index 0b697964b0..29185daa54 100644 --- a/docs/src/intro/usage.md +++ b/docs/src/intro/usage.md @@ -76,10 +76,10 @@ As described [here](https://0xpolygonmiden.github.io/miden-vm/intro/overview.htm * Secret (or nondeterministic) inputs: * `advice_stack` - can be supplied to the VM. There is no limit on how much data the advice provider can hold. This is provided as a string array where each string entry represents a field element. * `advice_map` - is supplied as a map of 64-character hex keys, each mapped to an array of numbers. The hex keys are interpreted as 4 field elements and the arrays of numbers are interpreted as arrays of field elements. - * `merkle_store` - the Merkle store is container that allows the user to define `merkle_tree` and `sparse_merkle_tree` data structures. + * `merkle_store` - the Merkle store is container that allows the user to define `merkle_tree`, `sparse_merkle_tree` and `partial_merkle_tree` data structures. * `merkle_tree` - is supplied as an array of 64-character hex values where each value represents a leaf (4 elements) in the tree. - * `sparse_merkle_tree` - is supplied an an array of tuples of the form (number, 64-character hex string). The number represents the leaf index and the hex string - represents the leaf value (4 elements). + * `sparse_merkle_tree` - is supplied as an array of tuples of the form (number, 64-character hex string). The number represents the leaf index and the hex string represents the leaf value (4 elements). + * `partial_merkle_tree` - is supplied as an array of tuples of the form ((number, number), 64-character hex string). The internal tuple represents the leaf depth and index at this depth, and the hex string represents the leaf value (4 elements). *Check out the [comparison example](https://github.com/0xPolygonMiden/examples/blob/main/examples/comparison.masm) to see how secret inputs work.* diff --git a/miden/examples/merkle_store/merkle_store.inputs b/miden/examples/merkle_store/merkle_store.inputs new file mode 100644 index 0000000000..47b5d9215d --- /dev/null +++ b/miden/examples/merkle_store/merkle_store.inputs @@ -0,0 +1,45 @@ +{ + "operand_stack": [], + "merkle_store": [ + { + "partial_merkle_tree": [ + [ + [2, 0], + "0x1400000000000000000000000000000000000000000000000000000000000000" + ], + [ + [2, 1], + "0x1500000000000000000000000000000000000000000000000000000000000000" + ], + [ + [1, 1], + "0x0b00000000000000000000000000000000000000000000000000000000000000" + ] + ] + }, + { + "sparse_merkle_tree": [ + [ + 0, + "0x1400000000000000000000000000000000000000000000000000000000000000" + ], + [ + 1, + "0x1500000000000000000000000000000000000000000000000000000000000000" + ], + [ + 3, + "0x1700000000000000000000000000000000000000000000000000000000000000" + ] + ] + }, + { + "merkle_tree": [ + "0x1400000000000000000000000000000000000000000000000000000000000000", + "0x1500000000000000000000000000000000000000000000000000000000000000", + "0x1600000000000000000000000000000000000000000000000000000000000000", + "0x1700000000000000000000000000000000000000000000000000000000000000" + ] + } + ] +} \ No newline at end of file diff --git a/miden/examples/merkle_store/merkle_store.masm b/miden/examples/merkle_store/merkle_store.masm new file mode 100644 index 0000000000..d9051724c9 --- /dev/null +++ b/miden/examples/merkle_store/merkle_store.masm @@ -0,0 +1,41 @@ +begin + # push the root of the Partial Merkle Tree on the stack + push.0x82bb4d9a8e93582f1387611949703eecd8e4c74b904880f9c9c85f1fc1d7576d + + # get value at depth = 2, index = 0 from the Partial Merkle Tree; this value should be 20 + push.0.2 + mtree_get + # check that returned value is equal to 20 + push.20 + assert_eq + + swapw + dropw + + # push the root of the Sparse Merkle Tree on the stack + push.0x444693b04b509c6b69d9ed981e67243342505f3b64aa3d45746211c180d11902 + + # get value at depth = 64, index = 1 from the Sparse Merkle Tree; this value should be 21 + push.1.64 + mtree_get + # check that returned value is equal to 21 + push.21 + assert_eq + + swapw + dropw + + # push the root of the Merkle Tree on the stack + push.0x0463f7d47758ad94b11dbf9675ffb7b331baa9c150d7fac6d784055c313eab0e + + # get value at depth = 2, index = 2 from the Merkle Tree; this value should be 22 + push.2.2 + mtree_get + # check that returned value is equal to 22 + push.22 + assert_eq + + swapw + dropw + +end diff --git a/miden/src/cli/data.rs b/miden/src/cli/data.rs index 7213c1079c..17267b62ad 100644 --- a/miden/src/cli/data.rs +++ b/miden/src/cli/data.rs @@ -1,6 +1,6 @@ use assembly::{Library, MaslLibrary}; use miden::{ - crypto::{MerkleStore, MerkleTree, SimpleSmt}, + crypto::{MerkleStore, MerkleTree, NodeIndex, PartialMerkleTree, RpoDigest, SimpleSmt}, math::Felt, utils::{Deserializable, SliceReader}, AdviceInputs, Assembler, Digest, ExecutionProof, MemAdviceProvider, Program, StackInputs, @@ -39,7 +39,7 @@ impl Debug { /// merkle tree or a Sparse Merkle Tree. #[derive(Deserialize, Debug)] pub enum MerkleData { - /// String representation of a merkle tree. The merkle tree is represented as a vector of + /// String representation of a merkle tree. The merkle tree is represented as a vector of /// 32 byte hex strings where each string represents a leaf in the tree. #[serde(rename = "merkle_tree")] MerkleTree(Vec), @@ -48,6 +48,11 @@ pub enum MerkleData { /// representing the value of the node. #[serde(rename = "sparse_merkle_tree")] SparseMerkleTree(Vec<(u64, String)>), + /// String representation of a Partial Merkle Tree. The Partial Merkle Tree is represented as a + /// vector of tuples where each tuple consists of a leaf index tuple (depth, index) and a 32 + /// byte hex string representing the value of the leaf. + #[serde(rename = "partial_merkle_tree")] + PartialMerkleTree(Vec<((u8, u64), String)>), } // INPUT FILE @@ -194,12 +199,27 @@ impl InputFile { let tree = MerkleTree::new(leaves) .map_err(|e| format!("failed to parse a Merkle tree: {e}"))?; merkle_store.extend(tree.inner_nodes()); + println!("Added Merkle tree with root {} to the Merkle store", tree.root()); } MerkleData::SparseMerkleTree(data) => { let entries = Self::parse_sparse_merkle_tree(data)?; let tree = SimpleSmt::with_leaves(u64::BITS as u8, entries) .map_err(|e| format!("failed to parse a Sparse Merkle Tree: {e}"))?; merkle_store.extend(tree.inner_nodes()); + println!( + "Added Sparse Merkle tree with root {} to the Merkle store", + tree.root() + ); + } + MerkleData::PartialMerkleTree(data) => { + let entries = Self::parse_partial_merkle_tree(data)?; + let tree = PartialMerkleTree::with_leaves(entries) + .map_err(|e| format!("failed to parse a Partial Merkle Tree: {e}"))?; + merkle_store.extend(tree.inner_nodes()); + println!( + "Added Partial Merkle tree with root {} to the Merkle store", + tree.root() + ); } } } @@ -227,10 +247,28 @@ impl InputFile { .collect() } + /// Parse and return Partial Merkle Tree entries. + fn parse_partial_merkle_tree( + tree: &[((u8, u64), String)], + ) -> Result, String> { + tree.iter() + .map(|((depth, index), v)| { + let node_index = NodeIndex::new(*depth, *index).map_err(|e| { + format!( + "failed to create node index with depth {depth} and index {index} - {e}" + ) + })?; + let leaf = Self::parse_word(v)?; + Ok((node_index, RpoDigest::new(leaf))) + }) + .collect() + } + /// Parse a `Word` from a hex string. pub fn parse_word(word_hex: &str) -> Result { + let word_value = &word_hex[2..]; let mut word_data = [0u8; 32]; - hex::decode_to_slice(word_hex, &mut word_data) + hex::decode_to_slice(word_value, &mut word_data) .map_err(|e| format!("failed to decode `Word` from hex {word_hex} - {e}"))?; let mut word = Word::default(); for (i, value) in word_data.chunks(8).enumerate() { @@ -480,3 +518,83 @@ impl Libraries { Ok(Self { libraries }) } } + +// TESTS +// ================================================================================================ +#[cfg(test)] +mod test { + use super::InputFile; + + #[test] + fn test_merkle_data_parsing() { + let program_with_pmt = " + { + \"operand_stack\": [\"1\"], + \"merkle_store\": [ + { + \"partial_merkle_tree\": [ + [ + [2, 0], + \"0x1400000000000000000000000000000000000000000000000000000000000000\" + ], + [ + [2, 1], + \"0x1500000000000000000000000000000000000000000000000000000000000000\" + ], + [ + [1, 1], + \"0x0b00000000000000000000000000000000000000000000000000000000000000\" + ] + ] + } + ] + }"; + let inputs: InputFile = serde_json::from_str(&program_with_pmt).unwrap(); + let merkle_store = inputs.parse_merkle_store().unwrap(); + assert!(merkle_store.is_some()); + + let program_with_smt = " + { + \"operand_stack\": [\"1\"], + \"merkle_store\": [ + { + \"sparse_merkle_tree\": [ + [ + 0, + \"0x1400000000000000000000000000000000000000000000000000000000000000\" + ], + [ + 1, + \"0x1500000000000000000000000000000000000000000000000000000000000000\" + ], + [ + 3, + \"0x1700000000000000000000000000000000000000000000000000000000000000\" + ] + ] + } + ] + }"; + let inputs: InputFile = serde_json::from_str(&program_with_smt).unwrap(); + let merkle_store = inputs.parse_merkle_store().unwrap(); + assert!(merkle_store.is_some()); + + let program_with_merkle_tree = " + { + \"operand_stack\": [\"1\"], + \"merkle_store\": [ + { + \"merkle_tree\": [ + \"0x1400000000000000000000000000000000000000000000000000000000000000\", + \"0x1500000000000000000000000000000000000000000000000000000000000000\", + \"0x1600000000000000000000000000000000000000000000000000000000000000\", + \"0x1700000000000000000000000000000000000000000000000000000000000000\" + ] + } + ] + }"; + let inputs: InputFile = serde_json::from_str(&program_with_merkle_tree).unwrap(); + let merkle_store = inputs.parse_merkle_store().unwrap(); + assert!(merkle_store.is_some()); + } +} diff --git a/processor/src/lib.rs b/processor/src/lib.rs index dbee423758..7cd4416e89 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -72,7 +72,10 @@ pub mod math { pub mod crypto { pub use vm_core::crypto::{ hash::{Blake3_192, Blake3_256, ElementHasher, Hasher, Rpo256, RpoDigest}, - merkle::{MerkleError, MerklePath, MerkleStore, MerkleTree, SimpleSmt}, + merkle::{ + MerkleError, MerklePath, MerkleStore, MerkleTree, NodeIndex, PartialMerkleTree, + SimpleSmt, + }, random::{RandomCoin, RpoRandomCoin, WinterRandomCoin}, }; } From 1347746730e3787145e2fea1a9bd6b7e08d23289 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Wed, 20 Sep 2023 18:35:06 +0200 Subject: [PATCH 094/120] feat: parse long hex strings in litte-endian --- CHANGELOG.md | 1 + assembly/src/ast/parsers/io_ops.rs | 94 ++++++++++++------- assembly/src/ast/tests.rs | 31 +++++- docs/src/user_docs/assembly/io_operations.md | 7 +- .../operations/io_ops/constant_ops.rs | 23 ++--- 5 files changed, 104 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8063f31b41..1e1146e05a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - Added `adv.insert_hperm` decorator (#1042). - Added `adv.push_smtpeek` decorator (#1056). - Added `debug` decorator (#1069). +- Refactored `push` instruction so now it parses long hex string in little-endian (#1076). #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). diff --git a/assembly/src/ast/parsers/io_ops.rs b/assembly/src/ast/parsers/io_ops.rs index a0e49af899..9b2eb1f179 100644 --- a/assembly/src/ast/parsers/io_ops.rs +++ b/assembly/src/ast/parsers/io_ops.rs @@ -9,6 +9,13 @@ use crate::{StarkField, ADVICE_READ_LIMIT, HEX_CHUNK_SIZE, MAX_PUSH_INPUTS}; use core::{convert::TryFrom, ops::RangeBounds}; use vm_core::WORD_SIZE; +/// Helper enum for endianness determination in the parsing functions. +#[derive(Debug)] +enum Endianness { + Little, + Big, +} + // CONSTANTS // ================================================================================================ @@ -33,7 +40,7 @@ pub fn parse_push(op: &Token, constants: &LocalConstMap) -> Result { - let value = parse_hex_value(op, param_str, 1)?; + let value = parse_hex_value(op, param_str, 1, Endianness::Big)?; build_push_one_instruction(value) } // if we have many hex parameters without delimiter @@ -249,7 +256,7 @@ fn parse_param_list(op: &Token, constants: &LocalConstMap) -> Result parse_hex_value(op, param_str, param_idx), + Some(param_str) => parse_hex_value(op, param_str, param_idx, Endianness::Big), None => parse_non_hex_param_with_constants_lookup( op, constants, @@ -281,32 +288,29 @@ fn parse_non_hex_param_with_constants_lookup>( } } -/// Parses a single hexadecimal parameter into multiple values and returns an appropriate push +/// Parses a 64-character hex string into a word (4 field elements) and returns an appropriate push /// instruction node. /// /// # Errors /// Returns an error if: -/// - The length of hex string is not even. -/// - The length of hex string is not divisible by 16. +/// - The length of hex string is not equal to 64. /// - If the string does not contain a valid hexadecimal value. /// - If the parsed value is greater than or equal to the field modulus. -fn parse_long_hex_param(op: &Token, param_str: &str) -> Result { +fn parse_long_hex_param(op: &Token, hex_str: &str) -> Result { // handle error cases where the hex string is poorly formed - if param_str.len() % HEX_CHUNK_SIZE != 0 { + if hex_str.len() != HEX_CHUNK_SIZE * WORD_SIZE { // hex string doesn't contain a valid number of bytes return Err(ParsingError::invalid_param_with_reason( op, 1, - &format!( - "hex string '{param_str}' does not contain a number of characters multiple 16" - ), + &format!("long hex string '{hex_str}' must contain exactly 64 characters"), )); } // iterate over the multi-value hex string and parse each 8-byte chunk into a valid u64 - let values = (0..param_str.len()) + let values = (0..hex_str.len()) .step_by(HEX_CHUNK_SIZE) - .map(|i| parse_hex_value(op, ¶m_str[i..i + HEX_CHUNK_SIZE], 1)); + .map(|i| parse_hex_value(op, &hex_str[i..i + HEX_CHUNK_SIZE], 1, Endianness::Little)); build_push_many_instruction(values) } @@ -315,35 +319,57 @@ fn parse_long_hex_param(op: &Token, param_str: &str) -> Result Result { - if param_str.len() % 2 != 0 { - return Err(ParsingError::invalid_param_with_reason( - op, - param_idx, - &format!("hex string '{param_str}' does not contain an even number of characters"), - )); - } - - if param_str.len() > HEX_CHUNK_SIZE { - return Err(ParsingError::invalid_param_with_reason( - op, - param_idx, - &format!("hex string '{param_str}' contains too many characters"), - )); - } - - let value = u64::from_str_radix(param_str, 16) - .map_err(|_| ParsingError::invalid_param(op, param_idx))?; +fn parse_hex_value( + op: &Token, + hex_str: &str, + param_idx: usize, + endianness: Endianness, +) -> Result { + let value = match endianness { + Endianness::Big => { + if hex_str.len() % 2 != 0 { + return Err(ParsingError::invalid_param_with_reason( + op, + param_idx, + &format!( + "hex string '{hex_str}' does not contain an even number of characters" + ), + )); + } + if hex_str.len() > HEX_CHUNK_SIZE { + return Err(ParsingError::invalid_param_with_reason( + op, + param_idx, + &format!("hex string '{hex_str}' contains too many characters"), + )); + } + u64::from_str_radix(hex_str, 16) + .map_err(|_| ParsingError::invalid_param(op, param_idx))? + } + Endianness::Little => { + if hex_str.len() != HEX_CHUNK_SIZE { + return Err(ParsingError::invalid_param_with_reason( + op, + param_idx, + &format!("hex string chunk '{hex_str}' must contain exactly 16 characters"), + )); + } + u64::from_str_radix(hex_str, 16) + .map(|v| v.swap_bytes()) + .map_err(|_| ParsingError::invalid_param(op, param_idx))? + } + }; if value >= Felt::MODULUS { Err(ParsingError::invalid_param_with_reason( op, param_idx, - &format!("hex string '{param_str}' contains value greater than field modulus"), + &format!("hex string '{hex_str}' contains value greater than field modulus"), )) } else { Ok(value) diff --git a/assembly/src/ast/tests.rs b/assembly/src/ast/tests.rs index bda1166589..5eb5786555 100644 --- a/assembly/src/ast/tests.rs +++ b/assembly/src/ast/tests.rs @@ -23,7 +23,17 @@ fn test_ast_parsing_program_simple() { #[test] fn test_ast_parsing_program_push() { - let source = "begin push.10 push.500 push.70000 push.5000000000 push.5000000000.7000000000.9000000000.11000000000 push.5.7 push.500.700 push.70000.90000 push.5000000000.7000000000 end"; + let source = "\ + begin \ + push.10 push.500 push.70000 push.5000000000 \ + push.5000000000.7000000000.9000000000.11000000000 \ + push.5.7 \ + push.500.700 \ + push.70000.90000 \ + push.5000000000.7000000000 + + push.0x0000000000000000010000000000000002000000000000000300000000000000 + end"; let nodes: Vec = vec![ Node::Instruction(Instruction::PushU8(10)), Node::Instruction(Instruction::PushU16(500)), @@ -46,9 +56,28 @@ fn test_ast_parsing_program_push() { Felt::from(5000000000_u64), Felt::from(7000000000_u64), ])), + Node::Instruction(Instruction::PushU8List(vec![0, 1, 2, 3])), ]; assert_program_output(source, BTreeMap::new(), nodes); + + // Push a hexadecimal string containing more than 4 values + let source_too_long = "begin push.0x00000000000000001000000000000000200000000000000030000000000000004000000000000000"; + let result = ProgramAst::parse(source_too_long) + .expect_err("long hex string must contain exactly 64 characters"); + assert_eq!(result.message(), "malformed instruction 'push.0x00000000000000001000000000000000200000000000000030000000000000004000000000000000', \ + parameter 0x00000000000000001000000000000000200000000000000030000000000000004000000000000000 is invalid: long hex \ + string '00000000000000001000000000000000200000000000000030000000000000004000000000000000' must contain exactly 64 \ + characters"); + + // Push a hexadecimal string containing less than 4 values + let source_too_long = "begin push.0x00000000000000001000000000000000"; + let result = ProgramAst::parse(source_too_long) + .expect_err("long hex string must contain exactly 64 characters"); + assert_eq!(result.message(), "malformed instruction 'push.0x00000000000000001000000000000000', \ + parameter 0x00000000000000001000000000000000 is invalid: long hex \ + string '00000000000000001000000000000000' must contain exactly 64 \ + characters"); } #[test] diff --git a/docs/src/user_docs/assembly/io_operations.md b/docs/src/user_docs/assembly/io_operations.md index e7b01c6623..501c58f0da 100644 --- a/docs/src/user_docs/assembly/io_operations.md +++ b/docs/src/user_docs/assembly/io_operations.md @@ -12,11 +12,12 @@ Miden assembly provides a set of instructions for moving data between the operan | ------------------------------------------------------------------------- | ----------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | push.*a*
      - *(1-2 cycles)*
      push.*a*.*b*
      push.*a*.*b*.*c*... | [ ... ] | [a, ... ]
      [b, a, ... ]
      [c, b, a, ... ] | Pushes values $a$, $b$, $c$ etc. onto the stack. Up to $16$ values can be specified. All values must be valid field elements in decimal (e.g., $123$) or hexadecimal (e.g., $0x7b$) representation. | -When specifying values in hexadecimal format, it is possible to omit the periods between individual values as long as total number of specified bytes is a multiple of $8$. That is, the following are semantically equivalent: +The value can be specified in hexadecimal form without periods between individual values as long as it describes a full word ($4$ field elements or $32$ bytes). Note that hexadecimal values separated by periods (short hexadecimal strings) are assumed to be in big-endian order, while the strings specifying whole words (long hexadecimal strings) are assumed to be in little-endian order. That is, the following are semantically equivalent: ``` -push.0x1234.0xabcd -push.0x0000000000001234000000000000abcd +push.0x00001234.0x00005678.0x00009012.0x0000abcd +push.0x341200000000000078560000000000001290000000000000cdab000000000000 +push.4660.22136.36882.43981 ``` In both case the values must still encode valid field elements. diff --git a/miden/tests/integration/operations/io_ops/constant_ops.rs b/miden/tests/integration/operations/io_ops/constant_ops.rs index 9ebf7c82a8..6c28617d1a 100644 --- a/miden/tests/integration/operations/io_ops/constant_ops.rs +++ b/miden/tests/integration/operations/io_ops/constant_ops.rs @@ -65,20 +65,15 @@ fn push_many() { #[test] fn push_without_separator() { - let base_op = "push"; - - // --- multiple values as a hexadecimal string ------------------------------------------------ - let asm_op = format!("{base_op}.0x0000000000004321000000000000dcba"); - - let test = build_op_test!(asm_op); - test.expect_stack(&[56506, 17185]); - - // --- push the maximum number of hexadecimal values without separators (16) ------------------ - let asm_op = format!("{base_op}.0x0000000000000000000000000000000100000000000000020000000000000003000000000000000400000000000000050000000000000006000000000000000700000000000000080000000000000009000000000000000A000000000000000B000000000000000C000000000000000D000000000000000E000000000000000F"); - let mut expected = Vec::with_capacity(16); - for i in (0..16).rev() { - expected.push(i); - } + // --- push the maximum allowed number of hexadecimal values without separators (4) ------------------ + let asm_op = format!( + "push.0x\ + 0000000000000000\ + 0100000000000000\ + 0200000000000000\ + 0300000000000000" + ); + let expected = vec![3, 2, 1, 0]; let test = build_op_test!(asm_op); test.expect_stack(&expected); From 2d90fafb33a05d74ca32c3ca6baadd45741b7c63 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Tue, 3 Oct 2023 13:53:40 +0200 Subject: [PATCH 095/120] fix: fix the merkle store example --- miden/examples/merkle_store/merkle_store.masm | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/miden/examples/merkle_store/merkle_store.masm b/miden/examples/merkle_store/merkle_store.masm index d9051724c9..ba99e31e5d 100644 --- a/miden/examples/merkle_store/merkle_store.masm +++ b/miden/examples/merkle_store/merkle_store.masm @@ -6,10 +6,9 @@ begin push.0.2 mtree_get # check that returned value is equal to 20 - push.20 - assert_eq + push.20.0.0.0 + assert_eqw - swapw dropw # push the root of the Sparse Merkle Tree on the stack @@ -19,10 +18,9 @@ begin push.1.64 mtree_get # check that returned value is equal to 21 - push.21 - assert_eq + push.21.0.0.0 + assert_eqw - swapw dropw # push the root of the Merkle Tree on the stack @@ -32,10 +30,9 @@ begin push.2.2 mtree_get # check that returned value is equal to 22 - push.22 - assert_eq + push.22.0.0.0 + assert_eqw - swapw dropw end From ea2b6f6c7e76914af40b5252f0d72b05f842b5d9 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Fri, 29 Sep 2023 03:49:46 +0200 Subject: [PATCH 096/120] feat: implement error codes for u32assert instructions --- air/src/constraints/stack/op_flags/mod.rs | 2 +- .../src/assembler/instruction/field_ops.rs | 6 +- assembly/src/assembler/instruction/mod.rs | 22 +- assembly/src/assembler/instruction/u32_ops.rs | 37 +- assembly/src/ast/nodes/mod.rs | 10 +- .../src/ast/nodes/serde/deserialization.rs | 3 + assembly/src/ast/nodes/serde/mod.rs | 401 +++++++++--------- assembly/src/ast/nodes/serde/serialization.rs | 12 + assembly/src/ast/parsers/context.rs | 5 +- assembly/src/ast/parsers/mod.rs | 27 ++ assembly/src/ast/parsers/sys_ops.rs | 34 +- assembly/src/ast/parsers/u32_ops.rs | 70 ++- assembly/src/tests.rs | 106 ++++- core/src/operations/mod.rs | 211 ++++----- .../user_docs/assembly/field_operations.md | 2 +- docs/src/user_docs/assembly/u32_operations.md | 12 +- .../operations/u32_ops/conversion_ops.rs | 23 +- processor/src/chiplets/bitwise/mod.rs | 4 +- processor/src/errors.rs | 9 +- processor/src/operations/mod.rs | 2 +- processor/src/operations/u32_ops.rs | 15 +- stdlib/asm/math/poly512.masm | 2 +- stdlib/asm/math/u64.masm | 38 +- 23 files changed, 598 insertions(+), 455 deletions(-) diff --git a/air/src/constraints/stack/op_flags/mod.rs b/air/src/constraints/stack/op_flags/mod.rs index ab41aa9d09..a38dee06b5 100644 --- a/air/src/constraints/stack/op_flags/mod.rs +++ b/air/src/constraints/stack/op_flags/mod.rs @@ -838,7 +838,7 @@ impl OpFlags { /// Operation Flag of U32ASSERT2 operation. #[inline(always)] pub fn u32assert2(&self) -> E { - self.degree6_op_flags[get_op_index(Operation::U32assert2.op_code())] + self.degree6_op_flags[get_op_index(Operation::U32assert2(ZERO).op_code())] } /// Operation Flag of U32ADD3 operation. diff --git a/assembly/src/assembler/instruction/field_ops.rs b/assembly/src/assembler/instruction/field_ops.rs index 6e27952375..7246b38be3 100644 --- a/assembly/src/assembler/instruction/field_ops.rs +++ b/assembly/src/assembler/instruction/field_ops.rs @@ -13,11 +13,7 @@ const TWO: Felt = Felt::new(2); /// Asserts that the top two words in the stack are equal. /// /// VM cycles: 11 cycles -pub fn assertw( - span: &mut SpanBuilder, - err_code: Option, -) -> Result, AssemblyError> { - let err_code = err_code.map(Felt::from).unwrap_or(ZERO); +pub fn assertw(span: &mut SpanBuilder, err_code: Felt) -> Result, AssemblyError> { span.add_ops([ MovUp4, Eq, diff --git a/assembly/src/assembler/instruction/mod.rs b/assembly/src/assembler/instruction/mod.rs index 291dd53ccd..11e64c4f30 100644 --- a/assembly/src/assembler/instruction/mod.rs +++ b/assembly/src/assembler/instruction/mod.rs @@ -43,8 +43,10 @@ impl Assembler { Instruction::AssertEqWithError(err_code) => { span.add_ops([Eq, Assert(Felt::from(*err_code))]) } - Instruction::AssertEqw => field_ops::assertw(span, None), - Instruction::AssertEqwWithError(err_code) => field_ops::assertw(span, Some(*err_code)), + Instruction::AssertEqw => field_ops::assertw(span, ZERO), + Instruction::AssertEqwWithError(err_code) => { + field_ops::assertw(span, Felt::from(*err_code)) + } Instruction::Assertz => span.add_ops([Eqz, Assert(ZERO)]), Instruction::AssertzWithError(err_code) => { span.add_ops([Eqz, Assert(Felt::from(*err_code))]) @@ -94,9 +96,19 @@ impl Assembler { // ----- u32 manipulation ------------------------------------------------------------- Instruction::U32Test => span.add_ops([Dup0, U32split, Swap, Drop, Eqz]), Instruction::U32TestW => u32_ops::u32testw(span), - Instruction::U32Assert => span.add_ops([Pad, U32assert2, Drop]), - Instruction::U32Assert2 => span.add_op(U32assert2), - Instruction::U32AssertW => u32_ops::u32assertw(span), + Instruction::U32Assert => span.add_ops([Pad, U32assert2(ZERO), Drop]), + Instruction::U32AssertWithError(err_code) => { + span.add_ops([Pad, U32assert2(Felt::from(*err_code)), Drop]) + } + Instruction::U32Assert2 => span.add_op(U32assert2(ZERO)), + Instruction::U32Assert2WithError(err_code) => { + span.add_op(U32assert2(Felt::from(*err_code))) + } + Instruction::U32AssertW => u32_ops::u32assertw(span, ZERO), + Instruction::U32AssertWWithError(err_code) => { + u32_ops::u32assertw(span, Felt::from(*err_code)) + } + Instruction::U32Cast => span.add_ops([U32split, Drop]), Instruction::U32Split => span.add_op(U32split), diff --git a/assembly/src/assembler/instruction/u32_ops.rs b/assembly/src/assembler/instruction/u32_ops.rs index 3f3ffaa132..156fe8d3f9 100644 --- a/assembly/src/assembler/instruction/u32_ops.rs +++ b/assembly/src/assembler/instruction/u32_ops.rs @@ -47,17 +47,20 @@ pub fn u32testw(span: &mut SpanBuilder) -> Result, AssemblyErr /// /// Implemented by executing `U32ASSERT2` on each pair of elements in the word. /// Total of 6 VM cycles. -pub fn u32assertw(span: &mut SpanBuilder) -> Result, AssemblyError> { +pub fn u32assertw( + span: &mut SpanBuilder, + err_code: Felt, +) -> Result, AssemblyError> { #[rustfmt::skip] let ops = [ // Test the first and the second elements - U32assert2, + U32assert2(err_code), // Move 3 and 4 to the top of the stack MovUp3, MovUp3, // Test them - U32assert2, + U32assert2(err_code), // Move the elements back into place MovUp3, MovUp3, @@ -207,7 +210,7 @@ pub fn u32not(span: &mut SpanBuilder) -> Result, AssemblyError let ops = [ // Perform the operation Push(Felt::from(u32::MAX)), - U32assert2, + U32assert2(ZERO), Swap, U32sub, @@ -295,12 +298,12 @@ pub fn u32rotr( match (imm, op_mode) { (Some(0), U32OpMode::Checked) => { // if rotation is performed by 0, just verify that stack top is u32 - span.push_ops([Pad, U32assert2, Drop]); + span.push_ops([Pad, U32assert2(ZERO), Drop]); return Ok(None); } (Some(imm), U32OpMode::Checked) => { validate_param(imm, 1..=MAX_U32_ROTATE_VALUE)?; - span.push_ops([Push(Felt::new(1 << (32 - imm))), U32assert2]); + span.push_ops([Push(Felt::new(1 << (32 - imm))), U32assert2(ZERO)]); } (Some(0), U32OpMode::Unchecked) => { // if rotation is performed by 0, do nothing (Noop) @@ -315,7 +318,7 @@ pub fn u32rotr( #[rustfmt::skip] span.push_ops([ // Verify both b and a are u32. - U32assert2, + U32assert2(ZERO), // Calculate 32 - b and assert that the shift value b <= 31. Push(Felt::from(MAX_U32_ROTATE_VALUE)), Dup1, U32sub, Not, Assert(ZERO), Incr, Dup1, @@ -345,7 +348,7 @@ pub fn u32popcnt( op_mode: U32OpMode, ) -> Result, AssemblyError> { match op_mode { - U32OpMode::Checked => span.push_ops([Pad, U32assert2, Drop]), + U32OpMode::Checked => span.push_ops([Pad, U32assert2(ZERO), Drop]), U32OpMode::Unchecked => (), _ => unreachable!("unsupported operation mode"), } @@ -404,7 +407,7 @@ fn handle_arithmetic_operation( match op_mode { U32OpMode::Checked => { - span.push_op(U32assert2); + span.push_op(U32assert2(ZERO)); assert_u32_res = true; } U32OpMode::Wrapping => { @@ -441,7 +444,7 @@ fn handle_division( match op_mode { U32OpMode::Checked => { - span.push_op(U32assert2); + span.push_op(U32assert2(ZERO)); } U32OpMode::Unchecked => {} _ => unreachable!("unsupported operation mode"), @@ -472,12 +475,12 @@ fn prepare_bitwise( match (imm, op_mode) { (Some(0), U32OpMode::Checked) => { // if shift/rotation is performed by 0, just verify that stack top is u32 - span.push_ops([Pad, U32assert2, Drop]); + span.push_ops([Pad, U32assert2(ZERO), Drop]); return Ok(None); } (Some(imm), U32OpMode::Checked) => { validate_param(imm, 1..=MAX_VALUE)?; - span.push_ops([Push(Felt::new(1 << imm)), U32assert2]); + span.push_ops([Push(Felt::new(1 << imm)), U32assert2(ZERO)]); } (Some(0), U32OpMode::Unchecked) => { // if shift/rotation is performed by 0, do nothing (Noop) @@ -490,7 +493,7 @@ fn prepare_bitwise( (None, U32OpMode::Checked) => { // Assume the dynamic shift value b is on top of the stack. append_pow2_op(span); - span.push_op(U32assert2); + span.push_op(U32assert2(ZERO)); } (None, U32OpMode::Unchecked) => append_pow2_op(span), _ => unreachable!("unsupported operation mode"), @@ -513,7 +516,7 @@ pub fn u32eq(span: &mut SpanBuilder, imm: Option) -> Result write!(f, "u32test"), Self::U32TestW => write!(f, "u32testw"), - Self::U32Assert => write!(f, "u32assert.1"), - Self::U32Assert2 => write!(f, "u32assert.2"), + Self::U32Assert => write!(f, "u32assert"), + Self::U32AssertWithError(err_code) => write!(f, "u32assert.err={err_code}"), + Self::U32Assert2 => write!(f, "u32assert2"), + Self::U32Assert2WithError(err_code) => write!(f, "u32assert2.err={err_code}"), Self::U32AssertW => write!(f, "u32assertw"), + Self::U32AssertWWithError(err_code) => write!(f, "u32assertw.err={err_code}"), Self::U32Split => write!(f, "u32split"), Self::U32Cast => write!(f, "u32cast"), Self::U32CheckedAdd => write!(f, "u32checked_add"), diff --git a/assembly/src/ast/nodes/serde/deserialization.rs b/assembly/src/ast/nodes/serde/deserialization.rs index b56e73c394..4418e404eb 100644 --- a/assembly/src/ast/nodes/serde/deserialization.rs +++ b/assembly/src/ast/nodes/serde/deserialization.rs @@ -108,8 +108,11 @@ impl Deserializable for Instruction { OpCode::U32Test => Ok(Instruction::U32Test), OpCode::U32TestW => Ok(Instruction::U32TestW), OpCode::U32Assert => Ok(Instruction::U32Assert), + OpCode::U32AssertWithError => Ok(Instruction::U32AssertWithError(source.read_u32()?)), OpCode::U32Assert2 => Ok(Instruction::U32Assert2), + OpCode::U32Assert2WithError => Ok(Instruction::U32Assert2WithError(source.read_u32()?)), OpCode::U32AssertW => Ok(Instruction::U32AssertW), + OpCode::U32AssertWWithError => Ok(Instruction::U32AssertWWithError(source.read_u32()?)), OpCode::U32Split => Ok(Instruction::U32Split), OpCode::U32Cast => Ok(Instruction::U32Cast), OpCode::U32CheckedAdd => Ok(Instruction::U32CheckedAdd), diff --git a/assembly/src/ast/nodes/serde/mod.rs b/assembly/src/ast/nodes/serde/mod.rs index 8a5023a1db..0a18f65c20 100644 --- a/assembly/src/ast/nodes/serde/mod.rs +++ b/assembly/src/ast/nodes/serde/mod.rs @@ -63,222 +63,225 @@ pub enum OpCode { U32Test = 43, U32TestW = 44, U32Assert = 45, - U32Assert2 = 46, - U32AssertW = 47, - U32Split = 48, - U32Cast = 49, - U32CheckedAdd = 50, - U32CheckedAddImm = 51, - U32WrappingAdd = 52, - U32WrappingAddImm = 53, - U32OverflowingAdd = 54, - U32OverflowingAddImm = 55, - U32OverflowingAdd3 = 56, - U32WrappingAdd3 = 57, - U32CheckedSub = 58, - U32CheckedSubImm = 59, - U32WrappingSub = 60, - U32WrappingSubImm = 61, - U32OverflowingSub = 62, - U32OverflowingSubImm = 63, - U32CheckedMul = 64, - U32CheckedMulImm = 65, - U32WrappingMul = 66, - U32WrappingMulImm = 67, - U32OverflowingMul = 68, - U32OverflowingMulImm = 69, - U32OverflowingMadd = 70, - U32WrappingMadd = 71, - U32CheckedDiv = 72, - U32CheckedDivImm = 73, - U32UncheckedDiv = 74, - U32UncheckedDivImm = 75, - U32CheckedMod = 76, - U32CheckedModImm = 77, - U32UncheckedMod = 78, - U32UncheckedModImm = 79, - U32CheckedDivMod = 80, - U32CheckedDivModImm = 81, - U32UncheckedDivMod = 82, - U32UncheckedDivModImm = 83, - U32CheckedAnd = 84, - U32CheckedOr = 85, - U32CheckedXor = 86, - U32CheckedNot = 87, - U32CheckedShr = 88, - U32CheckedShrImm = 89, - U32UncheckedShr = 90, - U32UncheckedShrImm = 91, - U32CheckedShl = 92, - U32CheckedShlImm = 93, - U32UncheckedShl = 94, - U32UncheckedShlImm = 95, - U32CheckedRotr = 96, - U32CheckedRotrImm = 97, - U32UncheckedRotr = 98, - U32UncheckedRotrImm = 99, - U32CheckedRotl = 100, - U32CheckedRotlImm = 101, - U32UncheckedRotl = 102, - U32UncheckedRotlImm = 103, - U32CheckedPopcnt = 104, - U32UncheckedPopcnt = 105, - U32CheckedEq = 106, - U32CheckedEqImm = 107, - U32CheckedNeq = 108, - U32CheckedNeqImm = 109, - U32CheckedLt = 110, - U32UncheckedLt = 111, - U32CheckedLte = 112, - U32UncheckedLte = 113, - U32CheckedGt = 114, - U32UncheckedGt = 115, - U32CheckedGte = 116, - U32UncheckedGte = 117, - U32CheckedMin = 118, - U32UncheckedMin = 119, - U32CheckedMax = 120, - U32UncheckedMax = 121, + U32AssertWithError = 46, + U32Assert2 = 47, + U32Assert2WithError = 48, + U32AssertW = 49, + U32AssertWWithError = 50, + U32Split = 51, + U32Cast = 52, + U32CheckedAdd = 53, + U32CheckedAddImm = 54, + U32WrappingAdd = 55, + U32WrappingAddImm = 56, + U32OverflowingAdd = 57, + U32OverflowingAddImm = 58, + U32OverflowingAdd3 = 59, + U32WrappingAdd3 = 60, + U32CheckedSub = 61, + U32CheckedSubImm = 62, + U32WrappingSub = 63, + U32WrappingSubImm = 64, + U32OverflowingSub = 65, + U32OverflowingSubImm = 66, + U32CheckedMul = 67, + U32CheckedMulImm = 68, + U32WrappingMul = 69, + U32WrappingMulImm = 70, + U32OverflowingMul = 71, + U32OverflowingMulImm = 72, + U32OverflowingMadd = 73, + U32WrappingMadd = 74, + U32CheckedDiv = 75, + U32CheckedDivImm = 76, + U32UncheckedDiv = 77, + U32UncheckedDivImm = 78, + U32CheckedMod = 79, + U32CheckedModImm = 80, + U32UncheckedMod = 81, + U32UncheckedModImm = 82, + U32CheckedDivMod = 83, + U32CheckedDivModImm = 84, + U32UncheckedDivMod = 85, + U32UncheckedDivModImm = 86, + U32CheckedAnd = 87, + U32CheckedOr = 88, + U32CheckedXor = 89, + U32CheckedNot = 90, + U32CheckedShr = 91, + U32CheckedShrImm = 92, + U32UncheckedShr = 93, + U32UncheckedShrImm = 94, + U32CheckedShl = 95, + U32CheckedShlImm = 96, + U32UncheckedShl = 97, + U32UncheckedShlImm = 98, + U32CheckedRotr = 99, + U32CheckedRotrImm = 100, + U32UncheckedRotr = 101, + U32UncheckedRotrImm = 102, + U32CheckedRotl = 103, + U32CheckedRotlImm = 104, + U32UncheckedRotl = 105, + U32UncheckedRotlImm = 106, + U32CheckedPopcnt = 107, + U32UncheckedPopcnt = 108, + U32CheckedEq = 109, + U32CheckedEqImm = 110, + U32CheckedNeq = 111, + U32CheckedNeqImm = 112, + U32CheckedLt = 113, + U32UncheckedLt = 114, + U32CheckedLte = 115, + U32UncheckedLte = 116, + U32CheckedGt = 117, + U32UncheckedGt = 118, + U32CheckedGte = 119, + U32UncheckedGte = 120, + U32CheckedMin = 121, + U32UncheckedMin = 122, + U32CheckedMax = 123, + U32UncheckedMax = 124, // ----- stack manipulation ------------------------------------------------------------------- - Drop = 122, - DropW = 123, - PadW = 124, - Dup0 = 125, - Dup1 = 126, - Dup2 = 127, - Dup3 = 128, - Dup4 = 129, - Dup5 = 130, - Dup6 = 131, - Dup7 = 132, - Dup8 = 133, - Dup9 = 134, - Dup10 = 135, - Dup11 = 136, - Dup12 = 137, - Dup13 = 138, - Dup14 = 139, - Dup15 = 140, - DupW0 = 141, - DupW1 = 142, - DupW2 = 143, - DupW3 = 144, - Swap1 = 145, - Swap2 = 146, - Swap3 = 147, - Swap4 = 148, - Swap5 = 149, - Swap6 = 150, - Swap7 = 151, - Swap8 = 152, - Swap9 = 153, - Swap10 = 154, - Swap11 = 155, - Swap12 = 156, - Swap13 = 157, - Swap14 = 158, - Swap15 = 159, - SwapW1 = 160, - SwapW2 = 161, - SwapW3 = 162, - SwapDW = 163, - MovUp2 = 164, - MovUp3 = 165, - MovUp4 = 166, - MovUp5 = 167, - MovUp6 = 168, - MovUp7 = 169, - MovUp8 = 170, - MovUp9 = 171, - MovUp10 = 172, - MovUp11 = 173, - MovUp12 = 174, - MovUp13 = 175, - MovUp14 = 176, - MovUp15 = 177, - MovUpW2 = 178, - MovUpW3 = 179, - MovDn2 = 180, - MovDn3 = 181, - MovDn4 = 182, - MovDn5 = 183, - MovDn6 = 184, - MovDn7 = 185, - MovDn8 = 186, - MovDn9 = 187, - MovDn10 = 188, - MovDn11 = 189, - MovDn12 = 190, - MovDn13 = 191, - MovDn14 = 192, - MovDn15 = 193, - MovDnW2 = 194, - MovDnW3 = 195, - CSwap = 196, - CSwapW = 197, - CDrop = 198, - CDropW = 199, + Drop = 125, + DropW = 126, + PadW = 127, + Dup0 = 128, + Dup1 = 129, + Dup2 = 130, + Dup3 = 131, + Dup4 = 132, + Dup5 = 133, + Dup6 = 134, + Dup7 = 135, + Dup8 = 136, + Dup9 = 137, + Dup10 = 138, + Dup11 = 139, + Dup12 = 140, + Dup13 = 141, + Dup14 = 142, + Dup15 = 143, + DupW0 = 144, + DupW1 = 145, + DupW2 = 146, + DupW3 = 147, + Swap1 = 148, + Swap2 = 149, + Swap3 = 150, + Swap4 = 151, + Swap5 = 152, + Swap6 = 153, + Swap7 = 154, + Swap8 = 155, + Swap9 = 156, + Swap10 = 157, + Swap11 = 158, + Swap12 = 159, + Swap13 = 160, + Swap14 = 161, + Swap15 = 162, + SwapW1 = 163, + SwapW2 = 164, + SwapW3 = 165, + SwapDW = 166, + MovUp2 = 167, + MovUp3 = 168, + MovUp4 = 169, + MovUp5 = 170, + MovUp6 = 171, + MovUp7 = 172, + MovUp8 = 173, + MovUp9 = 174, + MovUp10 = 175, + MovUp11 = 176, + MovUp12 = 177, + MovUp13 = 178, + MovUp14 = 179, + MovUp15 = 180, + MovUpW2 = 181, + MovUpW3 = 182, + MovDn2 = 183, + MovDn3 = 184, + MovDn4 = 185, + MovDn5 = 186, + MovDn6 = 187, + MovDn7 = 188, + MovDn8 = 189, + MovDn9 = 190, + MovDn10 = 191, + MovDn11 = 192, + MovDn12 = 193, + MovDn13 = 194, + MovDn14 = 195, + MovDn15 = 196, + MovDnW2 = 197, + MovDnW3 = 198, + CSwap = 199, + CSwapW = 200, + CDrop = 201, + CDropW = 202, // ----- input / output operations ------------------------------------------------------------ - PushU8 = 200, - PushU16 = 201, - PushU32 = 202, - PushFelt = 203, - PushWord = 204, - PushU8List = 205, - PushU16List = 206, - PushU32List = 207, - PushFeltList = 208, + PushU8 = 203, + PushU16 = 204, + PushU32 = 205, + PushFelt = 206, + PushWord = 207, + PushU8List = 208, + PushU16List = 209, + PushU32List = 210, + PushFeltList = 211, - Locaddr = 209, - Sdepth = 210, - Caller = 211, - Clk = 212, + Locaddr = 212, + Sdepth = 213, + Caller = 214, + Clk = 215, - MemLoad = 213, - MemLoadImm = 214, - MemLoadW = 215, - MemLoadWImm = 216, - LocLoad = 217, - LocLoadW = 218, - MemStore = 219, - MemStoreImm = 220, - LocStore = 221, - MemStoreW = 222, - MemStoreWImm = 223, - LocStoreW = 224, + MemLoad = 216, + MemLoadImm = 217, + MemLoadW = 218, + MemLoadWImm = 219, + LocLoad = 220, + LocLoadW = 221, + MemStore = 222, + MemStoreImm = 223, + LocStore = 224, + MemStoreW = 225, + MemStoreWImm = 226, + LocStoreW = 227, - MemStream = 225, - AdvPipe = 226, + MemStream = 228, + AdvPipe = 229, - AdvPush = 227, - AdvLoadW = 228, + AdvPush = 230, + AdvLoadW = 231, - AdvInject = 229, + AdvInject = 232, // ----- cryptographic operations ------------------------------------------------------------- - Hash = 230, - HMerge = 231, - HPerm = 232, - MTreeGet = 233, - MTreeSet = 234, - MTreeMerge = 235, - MTreeVerify = 236, + Hash = 233, + HMerge = 234, + HPerm = 235, + MTreeGet = 236, + MTreeSet = 237, + MTreeMerge = 238, + MTreeVerify = 239, // ----- STARK proof verification ------------------------------------------------------------- - FriExt2Fold4 = 237, + FriExt2Fold4 = 240, // ----- exec / call -------------------------------------------------------------------------- - ExecLocal = 238, - ExecImported = 239, - CallLocal = 240, - CallMastRoot = 241, - CallImported = 242, - SysCall = 243, + ExecLocal = 241, + ExecImported = 242, + CallLocal = 243, + CallMastRoot = 244, + CallImported = 245, + SysCall = 246, // ----- debugging ---------------------------------------------------------------------------- - Debug = 244, + Debug = 247, // ----- control flow ------------------------------------------------------------------------- IfElse = 253, diff --git a/assembly/src/ast/nodes/serde/serialization.rs b/assembly/src/ast/nodes/serde/serialization.rs index 70329af5b7..0e9279113c 100644 --- a/assembly/src/ast/nodes/serde/serialization.rs +++ b/assembly/src/ast/nodes/serde/serialization.rs @@ -138,8 +138,20 @@ impl Serializable for Instruction { Self::U32Test => OpCode::U32Test.write_into(target), Self::U32TestW => OpCode::U32TestW.write_into(target), Self::U32Assert => OpCode::U32Assert.write_into(target), + Self::U32AssertWithError(err_code) => { + OpCode::U32AssertWithError.write_into(target); + target.write_u32(*err_code); + } Self::U32Assert2 => OpCode::U32Assert2.write_into(target), + Self::U32Assert2WithError(err_code) => { + OpCode::U32Assert2WithError.write_into(target); + target.write_u32(*err_code); + } Self::U32AssertW => OpCode::U32AssertW.write_into(target), + Self::U32AssertWWithError(err_code) => { + OpCode::U32AssertWWithError.write_into(target); + target.write_u32(*err_code); + } Self::U32Split => OpCode::U32Split.write_into(target), Self::U32Cast => OpCode::U32Cast.write_into(target), Self::U32CheckedAdd => OpCode::U32CheckedAdd.write_into(target), diff --git a/assembly/src/ast/parsers/context.rs b/assembly/src/ast/parsers/context.rs index 5fb76d78eb..908266a1da 100644 --- a/assembly/src/ast/parsers/context.rs +++ b/assembly/src/ast/parsers/context.rs @@ -478,8 +478,9 @@ impl ParserContext<'_> { // ----- u32 operations --------------------------------------------------------------- "u32test" => simple_instruction(op, U32Test), "u32testw" => simple_instruction(op, U32TestW), - "u32assert" => u32_ops::parse_u32assert(op), - "u32assertw" => simple_instruction(op, U32AssertW), + "u32assert" => u32_ops::parse_u32assert(op, &self.local_constants), + "u32assert2" => u32_ops::parse_u32assert2(op, &self.local_constants), + "u32assertw" => u32_ops::parse_u32assertw(op, &self.local_constants), "u32cast" => simple_instruction(op, U32Cast), "u32split" => simple_instruction(op, U32Split), diff --git a/assembly/src/ast/parsers/mod.rs b/assembly/src/ast/parsers/mod.rs index f647f34c27..7b86042959 100644 --- a/assembly/src/ast/parsers/mod.rs +++ b/assembly/src/ast/parsers/mod.rs @@ -189,3 +189,30 @@ fn check_div_by_zero(value: u64, op: &Token, param_idx: usize) -> Result<(), Par Ok(()) } } + +/// Parses the error code declaration for an assertion instruction, and returns the value of the +/// code. +/// +/// The code is expected to be specified via the first instruction parameter and have the form +/// `err=`. +fn parse_error_code(token: &Token, constants: &LocalConstMap) -> Result { + let inst = token.parts()[0]; + let err_code_parts: Vec<&str> = token.parts()[1].split('=').collect(); + match err_code_parts.len() { + 0 => unreachable!(), + 1 => Err(ParsingError::missing_param(token, format!("{inst}.err=").as_str())), + 2 => { + if err_code_parts[0] != "err" { + return Err(ParsingError::invalid_param(token, 1)); + } + + let err_code_str = err_code_parts[1]; + let err_code = match try_get_constant_value(token, err_code_str, constants)? { + Some(val) => val.try_into().map_err(|_| ParsingError::invalid_param(token, 1))?, + None => err_code_str.parse().map_err(|_| ParsingError::invalid_param(token, 1))?, + }; + Ok(err_code) + } + _ => Err(ParsingError::extra_param(token)), + } +} diff --git a/assembly/src/ast/parsers/sys_ops.rs b/assembly/src/ast/parsers/sys_ops.rs index 5eb03451a3..82967860d6 100644 --- a/assembly/src/ast/parsers/sys_ops.rs +++ b/assembly/src/ast/parsers/sys_ops.rs @@ -1,9 +1,9 @@ use super::{ - try_get_constant_value, + parse_error_code, Instruction::*, LocalConstMap, Node::{self, Instruction}, - ParsingError, Token, Vec, + ParsingError, Token, }; /// Returns `Assert` instruction node if no error code value is provided, or `AssertWithError` @@ -97,33 +97,3 @@ pub fn parse_assert_eqw(op: &Token, constants: &LocalConstMap) -> Result Err(ParsingError::extra_param(op)), } } - -// HELPER FUNCTIONS -// ================================================================================================ - -/// Parses the error code declaration for an assertion instruction, and returns the value of the -/// code. -/// -/// The code is expected to be specified via the first instruction parameter and have the form -/// `err=`. -fn parse_error_code(token: &Token, constants: &LocalConstMap) -> Result { - let inst = token.parts()[0]; - let err_code_parts: Vec<&str> = token.parts()[1].split('=').collect(); - match err_code_parts.len() { - 0 => unreachable!(), - 1 => Err(ParsingError::missing_param(token, format!("{inst}.err=").as_str())), - 2 => { - if err_code_parts[0] != "err" { - return Err(ParsingError::invalid_param(token, 1)); - } - - let err_code_str = err_code_parts[1]; - let err_code = match try_get_constant_value(token, err_code_str, constants)? { - Some(val) => val.try_into().map_err(|_| ParsingError::invalid_param(token, 1))?, - None => err_code_str.parse().map_err(|_| ParsingError::invalid_param(token, 1))?, - }; - Ok(err_code) - } - _ => Err(ParsingError::extra_param(token)), - } -} diff --git a/assembly/src/ast/parsers/u32_ops.rs b/assembly/src/ast/parsers/u32_ops.rs index 43b789db4f..bbce3bfea9 100644 --- a/assembly/src/ast/parsers/u32_ops.rs +++ b/assembly/src/ast/parsers/u32_ops.rs @@ -1,6 +1,7 @@ use super::{ - check_div_by_zero, parse_checked_param, parse_param, + check_div_by_zero, parse_checked_param, parse_error_code, parse_param, Instruction::*, + LocalConstMap, Node::{self, Instruction}, ParsingError, Token, }; @@ -9,22 +10,71 @@ use crate::{MAX_U32_ROTATE_VALUE, MAX_U32_SHIFT_VALUE}; // INSTRUCTION PARSERS // ================================================================================================ -/// Returns `U32Assert` instruction node if no immediate value is provided or the immediate value -/// is 1. Returns instruction `U32Assert2` if immediate value is equal 2. +/// Returns `U32Assert` instruction node if no error code value is provided, or +/// `U32AssertWithError` instruction node otherwise. /// /// # Errors /// Returns an error if the instruction token contains wrong number of parameters, or if the -/// provided parameter is not 1 or 2. -pub fn parse_u32assert(op: &Token) -> Result { +/// provided parameter is not a u32 value. +pub fn parse_u32assert(op: &Token, constants: &LocalConstMap) -> Result { debug_assert_eq!(op.parts()[0], "u32assert"); match op.num_parts() { 0 => unreachable!(), 1 => Ok(Instruction(U32Assert)), - 2 => match op.parts()[1] { - "1" => Ok(Instruction(U32Assert)), - "2" => Ok(Instruction(U32Assert2)), - _ => Err(ParsingError::invalid_param(op, 1)), - }, + 2 => { + let err_code = parse_error_code(op, constants)?; + if err_code == 0 { + Ok(Instruction(U32Assert)) + } else { + Ok(Instruction(U32AssertWithError(err_code))) + } + } + _ => Err(ParsingError::extra_param(op)), + } +} + +/// Returns `U32Assert2` instruction node if no error code value is provided, or +/// `U32Assert2WithError` instruction node otherwise. +/// +/// # Errors +/// Returns an error if the instruction token contains wrong number of parameters, or if the +/// provided parameter is not a u32 value. +pub fn parse_u32assert2(op: &Token, constants: &LocalConstMap) -> Result { + debug_assert_eq!(op.parts()[0], "u32assert2"); + match op.num_parts() { + 0 => unreachable!(), + 1 => Ok(Instruction(U32Assert2)), + 2 => { + let err_code = parse_error_code(op, constants)?; + if err_code == 0 { + Ok(Instruction(U32Assert2)) + } else { + Ok(Instruction(U32Assert2WithError(err_code))) + } + } + _ => Err(ParsingError::extra_param(op)), + } +} + +/// Returns `U32AssertW` instruction node if no error code value is provided, or +/// `U32AssertWWithError` instruction node otherwise. +/// +/// # Errors +/// Returns an error if the instruction token contains wrong number of parameters, or if the +/// provided parameter is not a u32 value. +pub fn parse_u32assertw(op: &Token, constants: &LocalConstMap) -> Result { + debug_assert_eq!(op.parts()[0], "u32assertw"); + match op.num_parts() { + 0 => unreachable!(), + 1 => Ok(Instruction(U32AssertW)), + 2 => { + let err_code = parse_error_code(op, constants)?; + if err_code == 0 { + Ok(Instruction(U32AssertW)) + } else { + Ok(Instruction(U32AssertWWithError(err_code))) + } + } _ => Err(ParsingError::extra_param(op)), } } diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index f29c404655..498715018e 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -532,8 +532,7 @@ fn const_conversion_failed_to_u32() { #[test] fn assert_with_code() { - let source = format!( - "\ + let source = "\ const.ERR1=1 begin @@ -542,7 +541,7 @@ fn assert_with_code() { assert.err=2 end " - ); + .to_string(); let assembler = super::Assembler::default(); let program = assembler.compile(source).unwrap(); @@ -555,8 +554,7 @@ fn assert_with_code() { #[test] fn assertz_with_code() { - let source = format!( - "\ + let source = "\ const.ERR1=1 begin @@ -565,7 +563,7 @@ fn assertz_with_code() { assertz.err=2 end " - ); + .to_string(); let assembler = super::Assembler::default(); let program = assembler.compile(source).unwrap(); @@ -578,8 +576,7 @@ fn assertz_with_code() { #[test] fn assert_eq_with_code() { - let source = format!( - "\ + let source = "\ const.ERR1=1 begin @@ -588,7 +585,7 @@ fn assert_eq_with_code() { assert_eq.err=2 end " - ); + .to_string(); let assembler = super::Assembler::default(); let program = assembler.compile(source).unwrap(); @@ -601,8 +598,7 @@ fn assert_eq_with_code() { #[test] fn assert_eqw_with_code() { - let source = format!( - "\ + let source = "\ const.ERR1=1 begin @@ -611,7 +607,7 @@ fn assert_eqw_with_code() { assert_eqw.err=2 end " - ); + .to_string(); let assembler = super::Assembler::default(); let program = assembler.compile(source).unwrap(); @@ -626,6 +622,76 @@ fn assert_eqw_with_code() { assert_eq!(expected, format!("{program}")); } +#[test] +fn u32assert_with_code() { + let source = "\ + const.ERR1=1 + + begin + u32assert + u32assert.err=ERR1 + u32assert.err=2 + end + " + .to_string(); + let assembler = super::Assembler::default(); + let program = assembler.compile(source).unwrap(); + + let expected = "\ + begin \ + span pad u32assert2(0) drop pad u32assert2(1) drop pad u32assert2(2) drop end \ + end"; + assert_eq!(expected, format!("{program}")); +} + +#[test] +fn u32assert2_with_code() { + let source = "\ + const.ERR1=1 + + begin + u32assert2 + u32assert2.err=ERR1 + u32assert2.err=2 + end + " + .to_string(); + let assembler = super::Assembler::default(); + let program = assembler.compile(source).unwrap(); + + let expected = "\ + begin \ + span u32assert2(0) u32assert2(1) u32assert2(2) end \ + end"; + assert_eq!(expected, format!("{program}")); +} + +#[test] +fn u32assertw_with_code() { + let source = "\ + const.ERR1=1 + + begin + u32assertw + u32assertw.err=ERR1 + u32assertw.err=2 + end + " + .to_string(); + let assembler = super::Assembler::default(); + let program = assembler.compile(source).unwrap(); + + let expected = "\ + begin \ + span \ + u32assert2(0) movup3 movup3 u32assert2(0) movup3 movup3 \ + u32assert2(1) movup3 movup3 u32assert2(1) movup3 movup3 \ + u32assert2(2) movup3 movup3 u32assert2(2) movup3 movup3 \ + end \ + end"; + assert_eq!(expected, format!("{program}")); +} + // NESTED CONTROL BLOCKS // ================================================================================================ @@ -901,7 +967,7 @@ fn program_with_reexported_proc_in_same_library() { const REF_MODULE: &str = "math::u64"; const REF_MODULE_BODY: &str = r#" export.checked_eqz - u32assert.2 + u32assert2 eq.0 swap eq.0 @@ -971,7 +1037,7 @@ fn program_with_reexported_proc_in_same_library() { begin \ span \ push(4) push(3) \ - u32assert2 \ + u32assert2(0) \ eqz swap eqz and \ eqz swap eqz and \ end \ @@ -987,7 +1053,7 @@ fn program_with_reexported_proc_in_another_library() { const REF_MODULE: &str = "math::u64"; const REF_MODULE_BODY: &str = r#" export.checked_eqz - u32assert.2 + u32assert2 eq.0 swap eq.0 @@ -1041,7 +1107,7 @@ fn program_with_reexported_proc_in_another_library() { begin \ span \ push(4) push(3) \ - u32assert2 \ + u32assert2(0) \ eqz swap eqz and \ eqz swap eqz and \ end \ @@ -1071,11 +1137,11 @@ fn module_alias() { export.checked_add swap movup.3 - u32assert.2 + u32assert2 u32overflowing_add movup.3 movup.3 - u32assert.2 + u32assert2 u32overflowing_add3 eq.0 assert @@ -1102,9 +1168,9 @@ fn module_alias() { begin \ span \ pad incr pad push(2) pad \ - swap movup3 u32assert2 \ + swap movup3 u32assert2(0) \ u32add movup3 movup3 \ - u32assert2 u32add3 eqz assert(0) \ + u32assert2(0) u32add3 eqz assert(0) \ end \ end"; assert_eq!(expected, format!("{program}")); diff --git a/core/src/operations/mod.rs b/core/src/operations/mod.rs index 8d217b2d3c..8d6d515a2c 100644 --- a/core/src/operations/mod.rs +++ b/core/src/operations/mod.rs @@ -155,7 +155,10 @@ pub enum Operation { /// Pops two elements off the stack and checks if each of them represents a 32-bit value. /// If both of them are, they are pushed back onto the stack, otherwise an error is returned. - U32assert2, + /// + /// The internal value specifies an error code associated with the error in case when the + /// assertion fails. + U32assert2(Felt), /// Pops three elements off the stack, adds them together, and splits the result into upper /// and lower 32-bit values. Then pushes the result back onto the stack. @@ -438,108 +441,108 @@ impl Operation { #[rustfmt::skip] pub const fn op_code(&self) -> u8 { match self { - Self::Noop => 0b0000_0000, - Self::Eqz => 0b0000_0001, - Self::Neg => 0b0000_0010, - Self::Inv => 0b0000_0011, - Self::Incr => 0b0000_0100, - Self::Not => 0b0000_0101, - Self::FmpAdd => 0b0000_0110, - Self::MLoad => 0b0000_0111, - Self::Swap => 0b0000_1000, - Self::Caller => 0b0000_1001, - Self::MovUp2 => 0b0000_1010, - Self::MovDn2 => 0b0000_1011, - Self::MovUp3 => 0b0000_1100, - Self::MovDn3 => 0b0000_1101, - Self::AdvPopW => 0b0000_1110, - Self::Expacc => 0b0000_1111, - - Self::MovUp4 => 0b0001_0000, - Self::MovDn4 => 0b0001_0001, - Self::MovUp5 => 0b0001_0010, - Self::MovDn5 => 0b0001_0011, - Self::MovUp6 => 0b0001_0100, - Self::MovDn6 => 0b0001_0101, - Self::MovUp7 => 0b0001_0110, - Self::MovDn7 => 0b0001_0111, - Self::SwapW => 0b0001_1000, - Self::Ext2Mul => 0b0001_1001, - Self::MovUp8 => 0b0001_1010, - Self::MovDn8 => 0b0001_1011, - Self::SwapW2 => 0b0001_1100, - Self::SwapW3 => 0b0001_1101, - Self::SwapDW => 0b0001_1110, - // => 0b0001_1111, - - Self::Assert(_) => 0b0010_0000, - Self::Eq => 0b0010_0001, - Self::Add => 0b0010_0010, - Self::Mul => 0b0010_0011, - Self::And => 0b0010_0100, - Self::Or => 0b0010_0101, - Self::U32and => 0b0010_0110, - Self::U32xor => 0b0010_0111, - Self::FriE2F4 => 0b0010_1000, - Self::Drop => 0b0010_1001, - Self::CSwap => 0b0010_1010, - Self::CSwapW => 0b0010_1011, - Self::MLoadW => 0b0010_1100, - Self::MStore => 0b0010_1101, - Self::MStoreW => 0b0010_1110, - Self::FmpUpdate => 0b0010_1111, - - Self::Pad => 0b0011_0000, - Self::Dup0 => 0b0011_0001, - Self::Dup1 => 0b0011_0010, - Self::Dup2 => 0b0011_0011, - Self::Dup3 => 0b0011_0100, - Self::Dup4 => 0b0011_0101, - Self::Dup5 => 0b0011_0110, - Self::Dup6 => 0b0011_0111, - Self::Dup7 => 0b0011_1000, - Self::Dup9 => 0b0011_1001, - Self::Dup11 => 0b0011_1010, - Self::Dup13 => 0b0011_1011, - Self::Dup15 => 0b0011_1100, - Self::AdvPop => 0b0011_1101, - Self::SDepth => 0b0011_1110, - Self::Clk => 0b0011_1111, - - Self::U32add => 0b0100_0000, - Self::U32sub => 0b0100_0010, - Self::U32mul => 0b0100_0100, - Self::U32div => 0b0100_0110, - Self::U32split => 0b0100_1000, - Self::U32assert2 => 0b0100_1010, - Self::U32add3 => 0b0100_1100, - Self::U32madd => 0b0100_1110, - - Self::HPerm => 0b0101_0000, - Self::MpVerify => 0b0101_0001, - Self::Pipe => 0b0101_0010, - Self::MStream => 0b0101_0011, - Self::Split => 0b0101_0100, - Self::Loop => 0b0101_0101, - Self::Span => 0b0101_0110, - Self::Join => 0b0101_0111, - Self::Dyn => 0b0101_1000, - // => 0b0101_1001, - // => 0b0101_1010, - // => 0b0101_1011, - // => 0b0101_1100, - // => 0b0101_1101, - // => 0b0101_1110, - // => 0b0101_1111, - - Self::MrUpdate => 0b0110_0000, - Self::Push(_) => 0b0110_0100, - Self::SysCall => 0b0110_1000, - Self::Call => 0b0110_1100, - Self::End => 0b0111_0000, - Self::Repeat => 0b0111_0100, - Self::Respan => 0b0111_1000, - Self::Halt => 0b0111_1100, + Self::Noop => 0b0000_0000, + Self::Eqz => 0b0000_0001, + Self::Neg => 0b0000_0010, + Self::Inv => 0b0000_0011, + Self::Incr => 0b0000_0100, + Self::Not => 0b0000_0101, + Self::FmpAdd => 0b0000_0110, + Self::MLoad => 0b0000_0111, + Self::Swap => 0b0000_1000, + Self::Caller => 0b0000_1001, + Self::MovUp2 => 0b0000_1010, + Self::MovDn2 => 0b0000_1011, + Self::MovUp3 => 0b0000_1100, + Self::MovDn3 => 0b0000_1101, + Self::AdvPopW => 0b0000_1110, + Self::Expacc => 0b0000_1111, + + Self::MovUp4 => 0b0001_0000, + Self::MovDn4 => 0b0001_0001, + Self::MovUp5 => 0b0001_0010, + Self::MovDn5 => 0b0001_0011, + Self::MovUp6 => 0b0001_0100, + Self::MovDn6 => 0b0001_0101, + Self::MovUp7 => 0b0001_0110, + Self::MovDn7 => 0b0001_0111, + Self::SwapW => 0b0001_1000, + Self::Ext2Mul => 0b0001_1001, + Self::MovUp8 => 0b0001_1010, + Self::MovDn8 => 0b0001_1011, + Self::SwapW2 => 0b0001_1100, + Self::SwapW3 => 0b0001_1101, + Self::SwapDW => 0b0001_1110, + // => 0b0001_1111, + + Self::Assert(_) => 0b0010_0000, + Self::Eq => 0b0010_0001, + Self::Add => 0b0010_0010, + Self::Mul => 0b0010_0011, + Self::And => 0b0010_0100, + Self::Or => 0b0010_0101, + Self::U32and => 0b0010_0110, + Self::U32xor => 0b0010_0111, + Self::FriE2F4 => 0b0010_1000, + Self::Drop => 0b0010_1001, + Self::CSwap => 0b0010_1010, + Self::CSwapW => 0b0010_1011, + Self::MLoadW => 0b0010_1100, + Self::MStore => 0b0010_1101, + Self::MStoreW => 0b0010_1110, + Self::FmpUpdate => 0b0010_1111, + + Self::Pad => 0b0011_0000, + Self::Dup0 => 0b0011_0001, + Self::Dup1 => 0b0011_0010, + Self::Dup2 => 0b0011_0011, + Self::Dup3 => 0b0011_0100, + Self::Dup4 => 0b0011_0101, + Self::Dup5 => 0b0011_0110, + Self::Dup6 => 0b0011_0111, + Self::Dup7 => 0b0011_1000, + Self::Dup9 => 0b0011_1001, + Self::Dup11 => 0b0011_1010, + Self::Dup13 => 0b0011_1011, + Self::Dup15 => 0b0011_1100, + Self::AdvPop => 0b0011_1101, + Self::SDepth => 0b0011_1110, + Self::Clk => 0b0011_1111, + + Self::U32add => 0b0100_0000, + Self::U32sub => 0b0100_0010, + Self::U32mul => 0b0100_0100, + Self::U32div => 0b0100_0110, + Self::U32split => 0b0100_1000, + Self::U32assert2(_) => 0b0100_1010, + Self::U32add3 => 0b0100_1100, + Self::U32madd => 0b0100_1110, + + Self::HPerm => 0b0101_0000, + Self::MpVerify => 0b0101_0001, + Self::Pipe => 0b0101_0010, + Self::MStream => 0b0101_0011, + Self::Split => 0b0101_0100, + Self::Loop => 0b0101_0101, + Self::Span => 0b0101_0110, + Self::Join => 0b0101_0111, + Self::Dyn => 0b0101_1000, + // => 0b0101_1001, + // => 0b0101_1010, + // => 0b0101_1011, + // => 0b0101_1100, + // => 0b0101_1101, + // => 0b0101_1110, + // => 0b0101_1111, + + Self::MrUpdate => 0b0110_0000, + Self::Push(_) => 0b0110_0100, + Self::SysCall => 0b0110_1000, + Self::Call => 0b0110_1100, + Self::End => 0b0111_0000, + Self::Repeat => 0b0111_0100, + Self::Respan => 0b0111_1000, + Self::Halt => 0b0111_1100, } } @@ -618,7 +621,7 @@ impl fmt::Display for Operation { Self::Ext2Mul => write!(f, "ext2mul"), // ----- u32 operations --------------------------------------------------------------- - Self::U32assert2 => write!(f, "u32assert2"), + Self::U32assert2(err_code) => write!(f, "u32assert2({err_code})"), Self::U32split => write!(f, "u32split"), Self::U32add => write!(f, "u32add"), Self::U32add3 => write!(f, "u32add3"), diff --git a/docs/src/user_docs/assembly/field_operations.md b/docs/src/user_docs/assembly/field_operations.md index 6e3fbb9409..a0ca6c7b00 100644 --- a/docs/src/user_docs/assembly/field_operations.md +++ b/docs/src/user_docs/assembly/field_operations.md @@ -14,7 +14,7 @@ For instructions where one or more operands can be provided as immediate paramet | assert_eq
      - *(2 cycles)* | [b, a, ...] | [...] | If $a = b$, removes them from the stack.
      Fails if $a \ne b$ | | assert_eqw
      - *(11 cycles)* | [B, A, ...] | [...] | If $A = B$, removes them from the stack.
      Fails if $A \ne B$ | -The aboves instruction can also be parametrized with an error code which can be any 32-bit value specified either directly or via a [named constant](./code_organization.md#constants). For example: +The above instructions can also be parametrized with an error code which can be any 32-bit value specified either directly or via a [named constant](./code_organization.md#constants). For example: ``` assert.err=123 assert.err=MY_CONSTANT diff --git a/docs/src/user_docs/assembly/u32_operations.md b/docs/src/user_docs/assembly/u32_operations.md index bb7a61fcb4..c776f942b8 100644 --- a/docs/src/user_docs/assembly/u32_operations.md +++ b/docs/src/user_docs/assembly/u32_operations.md @@ -15,12 +15,18 @@ In all the table below, the number of cycles it takes for the VM to execute each | ---------------------------------------------- | ----------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------ | | u32test
      - *(5 cycles)* | [a, ...] | [b, a, ...] | $b \leftarrow \begin{cases} 1, & \text{if}\ a < 2^{32} \\ 0, & \text{otherwise}\ \end{cases}$ | | u32testw
      - *(23 cycles)* | [A, ...] | [b, A, ...] | $b \leftarrow \begin{cases} 1, & \text{if}\ \forall\ i \in \{0, 1, 2, 3\}\ a_i < 2^{32} \\ 0, & \text{otherwise}\ \end{cases}$ | -| u32assert
      u32assert.1
      - *(3 cycles)* | [a, ...] | [a, ...] | Fails if $a \ge 2^{32}$ | -| u32assert.2
      - *(1 cycle)* | [b, a,...] | [b, a,...] | Fails if $a \ge 2^{32}$ or $b \ge 2^{32}$ | -| u32assertw
      - *(6 cycles)* | [A, ...] | [A, ...] | Fails if $\exists\ i \in \{0, 1, 2, 3\} \ni a_i \ge 2^{32}$ | +| u32assert
      - *(3 cycles)* | [a, ...] | [a, ...] | Fails if $a \ge 2^{32}$ | +| u32assert2
      - *(1 cycle)* | [b, a,...] | [b, a,...] | Fails if $a \ge 2^{32}$ or $b \ge 2^{32}$ | +| u32assertw
      - *(6 cycles)* | [A, ...] | [A, ...] | Fails if $\exists\ i \in \{0, 1, 2, 3\} : a_i \ge 2^{32}$ | | u32cast
      - *(2 cycles)* | [a, ...] | [b, ...] | $b \leftarrow a \mod 2^{32}$ | | u32split
      - *(1 cycle)* | [a, ...] | [c, b, ...] | $b \leftarrow a \mod 2^{32}$, $c \leftarrow \lfloor{a / 2^{32}}\rfloor$ | +The instructions `u32assert`, `u32assert2` and `u32assertw` can also be parametrized with an error code which can be any 32-bit value specified either directly or via a [named constant](./code_organization.md#constants). For example: +``` +u32assert.err=123 +u32assert.err=MY_CONSTANT +``` +If the error code is omitted, the default value of $0$ is assumed. ### Arithmetic operations diff --git a/miden/tests/integration/operations/u32_ops/conversion_ops.rs b/miden/tests/integration/operations/u32_ops/conversion_ops.rs index c8f99bda91..1aa9c23dab 100644 --- a/miden/tests/integration/operations/u32_ops/conversion_ops.rs +++ b/miden/tests/integration/operations/u32_ops/conversion_ops.rs @@ -81,21 +81,16 @@ fn u32testw() { fn u32assert() { // assertion passes and leaves the stack unchanged if a < 2^32 let asm_op = "u32assert"; - let asm_op_1 = "u32assert.1"; let value = 1_u64; let test = build_op_test!(asm_op, &[value]); test.expect_stack(&[value]); - - let test = build_op_test!(asm_op_1, &[value]); - test.expect_stack(&[value]); } #[test] fn u32assert_fail() { // assertion fails if a >= 2^32 let asm_op = "u32assert"; - let asm_op_1 = "u32assert.1"; let err = "NotU32Value"; // vars to test @@ -106,21 +101,15 @@ fn u32assert_fail() { let test = build_op_test!(asm_op, &[equal]); test.expect_error(TestError::ExecutionError(err)); - let test_1 = build_op_test!(asm_op_1, &[equal]); - test_1.expect_error(TestError::ExecutionError(err)); - // --- test when a > 2^32 --------------------------------------------------------------------- let test = build_op_test!(asm_op, &[larger]); test.expect_error(TestError::ExecutionError(err)); - - let test_1 = build_op_test!(asm_op_1, &[larger]); - test_1.expect_error(TestError::ExecutionError(err)); } #[test] fn u32assert2() { // assertion passes and leaves the stack unchanged if a < 2^32 and b < 2^32 - let asm_op = "u32assert.2"; + let asm_op = "u32assert2"; let value_a = 1_u64; let value_b = 2_u64; let test = build_op_test!(asm_op, &[value_a, value_b]); @@ -134,7 +123,7 @@ fn u32assert2() { #[test] fn u32assert2_fail() { - let asm_op = "u32assert.2"; + let asm_op = "u32assert2"; let err = "NotU32Value"; // vars to test @@ -157,14 +146,6 @@ fn u32assert2_fail() { test.expect_error(TestError::ExecutionError(err)); } -#[test] -fn u32assertn_fail() { - let asm_op = "u32assert.3"; - - let test = build_op_test!(asm_op, &[2, 1]); - test.expect_error(TestError::AssemblyError("parameter")); -} - #[test] fn u32assertw() { // assertion passes and leaves the stack unchanged if each element of the word < 2^32 diff --git a/processor/src/chiplets/bitwise/mod.rs b/processor/src/chiplets/bitwise/mod.rs index 37c494417b..b7d84e47a1 100644 --- a/processor/src/chiplets/bitwise/mod.rs +++ b/processor/src/chiplets/bitwise/mod.rs @@ -1,6 +1,6 @@ use super::{ trace::LookupTableRow, utils::get_trace_len, ChipletsBus, ColMatrix, ExecutionError, Felt, - FieldElement, StarkField, TraceFragment, Vec, BITWISE_AND_LABEL, BITWISE_XOR_LABEL, + FieldElement, StarkField, TraceFragment, Vec, BITWISE_AND_LABEL, BITWISE_XOR_LABEL, ZERO, }; use miden_air::trace::chiplets::bitwise::{ A_COL_IDX, A_COL_RANGE, BITWISE_AND, BITWISE_XOR, B_COL_IDX, B_COL_RANGE, OP_CYCLE_LEN, @@ -234,7 +234,7 @@ impl Default for Bitwise { pub fn assert_u32(value: Felt) -> Result { let val_u64 = value.as_int(); if val_u64 > u32::MAX.into() { - Err(ExecutionError::NotU32Value(value)) + Err(ExecutionError::NotU32Value(value, ZERO)) } else { Ok(value) } diff --git a/processor/src/errors.rs b/processor/src/errors.rs index 84ad8832fd..8546ad5f63 100644 --- a/processor/src/errors.rs +++ b/processor/src/errors.rs @@ -38,7 +38,7 @@ pub enum ExecutionError { MerkleStoreLookupFailed(MerkleError), MerkleStoreUpdateFailed(MerkleError), NotBinaryValue(Felt), - NotU32Value(Felt), + NotU32Value(Felt, Felt), ProverError(ProverError), SyscallTargetNotInKernel(Digest), UnexecutableCodeBlock(CodeBlock), @@ -128,8 +128,11 @@ impl Display for ExecutionError { NotBinaryValue(v) => { write!(f, "An operation expected a binary value, but received {v}") } - NotU32Value(v) => { - write!(f, "An operation expected a u32 value, but received {v}") + NotU32Value(v, err_code) => { + write!( + f, + "An operation expected a u32 value, but received {v} (error code: {err_code})" + ) } ProverError(error) => write!(f, "Proof generation failed: {error}"), SyscallTargetNotInKernel(proc) => { diff --git a/processor/src/operations/mod.rs b/processor/src/operations/mod.rs index 009a55228f..09d91812df 100644 --- a/processor/src/operations/mod.rs +++ b/processor/src/operations/mod.rs @@ -84,7 +84,7 @@ where Operation::U32and => self.op_u32and()?, Operation::U32xor => self.op_u32xor()?, - Operation::U32assert2 => self.op_u32assert2()?, + Operation::U32assert2(err_code) => self.op_u32assert2(err_code)?, // ----- stack manipulation ----------------------------------------------------------- Operation::Pad => self.op_pad()?, diff --git a/processor/src/operations/u32_ops.rs b/processor/src/operations/u32_ops.rs index 97e4e5e9b9..923bc64c03 100644 --- a/processor/src/operations/u32_ops.rs +++ b/processor/src/operations/u32_ops.rs @@ -25,20 +25,21 @@ where Ok(()) } - /// Pops top two element off the stack, splits both into low and high 32-bit values, checks if both - /// high are equal to 0, if it passes, put both of them onto the stack, else throws an execution error - pub(super) fn op_u32assert2(&mut self) -> Result<(), ExecutionError> { + /// Pops top two element off the stack, splits them into low and high 32-bit values, checks if + /// the high values are equal to 0; if they are, puts the original elements back onto the + /// stack; if they are not, returns an error. + pub(super) fn op_u32assert2(&mut self, err_code: Felt) -> Result<(), ExecutionError> { let a = self.stack.get(0); let b = self.stack.get(1); if a.as_int() >> 32 != 0 { - return Err(ExecutionError::NotU32Value(a)); + return Err(ExecutionError::NotU32Value(a, err_code)); } if b.as_int() >> 32 != 0 { - return Err(ExecutionError::NotU32Value(b)); + return Err(ExecutionError::NotU32Value(b, err_code)); } - self.add_range_checks(Operation::U32assert2, a, b, false); + self.add_range_checks(Operation::U32assert2(err_code), a, b, false); self.stack.copy_state(0); Ok(()) @@ -279,7 +280,7 @@ mod tests { let stack = StackInputs::try_from_values([d as u64, c as u64, b as u64, a as u64]).unwrap(); let mut process = Process::new_dummy_with_decoder_helpers(stack); - process.execute_op(Operation::U32assert2).unwrap(); + process.execute_op(Operation::U32assert2(ZERO)).unwrap(); let expected = build_expected(&[a, b, c, d]); assert_eq!(expected, process.stack.trace_state()); } diff --git a/stdlib/asm/math/poly512.masm b/stdlib/asm/math/poly512.masm index 08ef0ae52a..fa6a63fde6 100644 --- a/stdlib/asm/math/poly512.masm +++ b/stdlib/asm/math/poly512.masm @@ -81,7 +81,7 @@ export.mod_12289 adv.push_u64div adv_push.2 - u32assert.2 + u32assert2 swap push.12289 diff --git a/stdlib/asm/math/u64.masm b/stdlib/asm/math/u64.masm index f96f847ca1..4e6cabf229 100644 --- a/stdlib/asm/math/u64.masm +++ b/stdlib/asm/math/u64.masm @@ -3,10 +3,10 @@ #! Asserts that both values at the top of the stack are u64 values. #! The input values are assumed to be represented using 32 bit limbs, fails if they are not. proc.u32assert4 - u32assert.2 + u32assert2 movup.3 movup.3 - u32assert.2 + u32assert2 movup.3 movup.3 end @@ -42,11 +42,11 @@ end export.checked_add swap movup.3 - u32assert.2 + u32assert2 u32overflowing_add movup.3 movup.3 - u32assert.2 + u32assert2 u32overflowing_add3 eq.0 assert @@ -78,11 +78,11 @@ end export.checked_sub movup.3 movup.2 - u32assert.2 + u32assert2 u32overflowing_sub movup.3 movup.3 - u32assert.2 + u32assert2 u32overflowing_sub eq.0 assert @@ -163,7 +163,7 @@ end export.checked_mul dup.3 dup.2 - u32assert.2 # make sure lower limbs of operands are 32-bit + u32assert2 # make sure lower limbs of operands are 32-bit u32overflowing_mul dup.4 movup.4 @@ -174,7 +174,7 @@ export.checked_mul u32overflowing_madd movup.5 movup.5 - u32assert.2 # make sure higher limbs of operands are 32-bit + u32assert2 # make sure higher limbs of operands are 32-bit u32overflowing_madd movup.3 movup.2 @@ -212,11 +212,11 @@ end export.checked_lt movup.3 movup.2 - u32assert.2 + u32assert2 u32overflowing_sub movdn.3 drop - u32assert.2 + u32assert2 u32overflowing_sub swap eq.0 @@ -250,11 +250,11 @@ end #! [b_hi, b_lo, a_hi, a_lo, ...] -> [c, ...], where c = 1 when a > b, and 0 otherwise. export.checked_gt movup.2 - u32assert.2 + u32assert2 u32overflowing_sub movup.2 movup.3 - u32assert.2 + u32assert2 u32overflowing_sub swap drop @@ -364,7 +364,7 @@ end #! Stack transition looks as follows: #! [a_hi, a_lo, ...] -> [c, ...], where c = 1 when a == 0, and 0 otherwise. export.checked_eqz - u32assert.2 + u32assert2 eq.0 swap eq.0 @@ -430,7 +430,7 @@ export.unchecked_div adv.push_u64div # push the quotient and the remainder onto the advice stack adv_push.2 # pop the quotient from the advice stack and assert it consists of - u32assert.2 # 32-bit limbs + u32assert2 # 32-bit limbs dup.3 # multiply quotient by the divisor and make sure the resulting value dup.2 # fits into 2 32-bit limbs @@ -452,7 +452,7 @@ export.unchecked_div assert adv_push.2 # pop the remainder from the advice stack and assert it consists of - u32assert.2 # 32-bit limbs + u32assert2 # 32-bit limbs movup.7 # make sure the divisor is greater than the remainder. this also consumes movup.7 # the divisor @@ -495,7 +495,7 @@ export.unchecked_mod adv.push_u64div # push the quotient and the remainder onto the advice stack adv_push.2 # pop the quotient from the advice stack and assert it consists of - u32assert.2 # 32-bit limbs + u32assert2 # 32-bit limbs dup.3 # multiply quotient by the divisor and make sure the resulting value dup.2 # fits into 2 32-bit limbs @@ -517,7 +517,7 @@ export.unchecked_mod assert adv_push.2 # pop the quotient from the advice stack and assert it consists of - u32assert.2 # 32-bit limbs + u32assert2 # 32-bit limbs movup.5 # make sure the divisor is greater than the remainder. this also consumes movup.5 # the divisor @@ -560,7 +560,7 @@ export.unchecked_divmod adv.push_u64div # push the quotient and the remainder onto the advice stack adv_push.2 # pop the quotient from the advice stack and assert it consists of - u32assert.2 # 32-bit limbs + u32assert2 # 32-bit limbs dup.3 # multiply quotient by the divisor and make sure the resulting value dup.2 # fits into 2 32-bit limbs @@ -582,7 +582,7 @@ export.unchecked_divmod assert adv_push.2 # pop the quotient from the advice stack and assert it consists of - u32assert.2 # 32-bit limbs + u32assert2 # 32-bit limbs movup.7 # make sure the divisor is greater than the remainder. this also consumes movup.7 # the divisor From 79f944c6aa46b26882b1cff8d8914152ec0b95a7 Mon Sep 17 00:00:00 2001 From: grjte Date: Wed, 27 Sep 2023 10:28:58 +0100 Subject: [PATCH 097/120] feat(asm): add dynexec assembly instruction --- assembly/src/assembler/instruction/mod.rs | 1 + assembly/src/assembler/instruction/procedures.rs | 5 +++++ assembly/src/ast/nodes/mod.rs | 2 ++ assembly/src/ast/nodes/serde/deserialization.rs | 1 + assembly/src/ast/nodes/serde/mod.rs | 3 ++- assembly/src/ast/nodes/serde/serialization.rs | 1 + assembly/src/ast/parsers/context.rs | 1 + core/src/program/blocks/dyn_block.rs | 2 +- 8 files changed, 14 insertions(+), 2 deletions(-) diff --git a/assembly/src/assembler/instruction/mod.rs b/assembly/src/assembler/instruction/mod.rs index 11e64c4f30..49eee95e47 100644 --- a/assembly/src/assembler/instruction/mod.rs +++ b/assembly/src/assembler/instruction/mod.rs @@ -325,6 +325,7 @@ impl Assembler { Instruction::CallMastRoot(root) => self.call_mast_root(root, ctx), Instruction::CallImported(id) => self.call_imported(id, ctx), Instruction::SysCall(id) => self.syscall(id, ctx), + Instruction::DynExec => self.dynexec(), // ----- debug decorators ------------------------------------------------------------- Instruction::Breakpoint => { diff --git a/assembly/src/assembler/instruction/procedures.rs b/assembly/src/assembler/instruction/procedures.rs index fcd3d8ce48..61f9b5108c 100644 --- a/assembly/src/assembler/instruction/procedures.rs +++ b/assembly/src/assembler/instruction/procedures.rs @@ -123,4 +123,9 @@ impl Assembler { // create a new SYSCALL block for the procedure call and return Ok(Some(CodeBlock::new_syscall(proc.mast_root()))) } + + pub(super) fn dynexec(&self) -> Result, AssemblyError> { + // create a new DYN block for the dynamic code execution and return + Ok(Some(CodeBlock::new_dyn())) + } } diff --git a/assembly/src/ast/nodes/mod.rs b/assembly/src/ast/nodes/mod.rs index d99304c36b..dde4eab8cb 100644 --- a/assembly/src/ast/nodes/mod.rs +++ b/assembly/src/ast/nodes/mod.rs @@ -307,6 +307,7 @@ pub enum Instruction { CallMastRoot(RpoDigest), CallImported(ProcedureId), SysCall(ProcedureId), + DynExec, // ----- debug decorators --------------------------------------------------------------------- Breakpoint, @@ -591,6 +592,7 @@ impl fmt::Display for Instruction { } Self::CallImported(proc_id) => write!(f, "call.{proc_id}"), Self::SysCall(proc_id) => write!(f, "syscall.{proc_id}"), + Self::DynExec => write!(f, "dynexec"), // ----- debug decorators ------------------------------------------------------------- Self::Breakpoint => write!(f, "breakpoint"), diff --git a/assembly/src/ast/nodes/serde/deserialization.rs b/assembly/src/ast/nodes/serde/deserialization.rs index 4418e404eb..922dcae98d 100644 --- a/assembly/src/ast/nodes/serde/deserialization.rs +++ b/assembly/src/ast/nodes/serde/deserialization.rs @@ -361,6 +361,7 @@ impl Deserializable for Instruction { OpCode::CallMastRoot => Ok(Instruction::CallMastRoot(RpoDigest::read_from(source)?)), OpCode::CallImported => Ok(Instruction::CallImported(ProcedureId::read_from(source)?)), OpCode::SysCall => Ok(Instruction::SysCall(ProcedureId::read_from(source)?)), + OpCode::DynExec => Ok(Instruction::DynExec), // ----- debugging -------------------------------------------------------------------- OpCode::Debug => { diff --git a/assembly/src/ast/nodes/serde/mod.rs b/assembly/src/ast/nodes/serde/mod.rs index 0a18f65c20..b57ca1e702 100644 --- a/assembly/src/ast/nodes/serde/mod.rs +++ b/assembly/src/ast/nodes/serde/mod.rs @@ -279,9 +279,10 @@ pub enum OpCode { CallMastRoot = 244, CallImported = 245, SysCall = 246, + DynExec = 247, // ----- debugging ---------------------------------------------------------------------------- - Debug = 247, + Debug = 248, // ----- control flow ------------------------------------------------------------------------- IfElse = 253, diff --git a/assembly/src/ast/nodes/serde/serialization.rs b/assembly/src/ast/nodes/serde/serialization.rs index 0e9279113c..95980a28f3 100644 --- a/assembly/src/ast/nodes/serde/serialization.rs +++ b/assembly/src/ast/nodes/serde/serialization.rs @@ -519,6 +519,7 @@ impl Serializable for Instruction { OpCode::SysCall.write_into(target); imported.write_into(target) } + Self::DynExec => OpCode::DynExec.write_into(target), // ----- debug decorators ------------------------------------------------------------- Self::Breakpoint => { diff --git a/assembly/src/ast/parsers/context.rs b/assembly/src/ast/parsers/context.rs index 908266a1da..6ec159d284 100644 --- a/assembly/src/ast/parsers/context.rs +++ b/assembly/src/ast/parsers/context.rs @@ -615,6 +615,7 @@ impl ParserContext<'_> { "exec" => self.parse_exec(op), "call" => self.parse_call(op), "syscall" => self.parse_syscall(op), + "dynexec" => simple_instruction(op, DynExec), // ----- constant statements ---------------------------------------------------------- "const" => Err(ParsingError::const_invalid_scope(op)), diff --git a/core/src/program/blocks/dyn_block.rs b/core/src/program/blocks/dyn_block.rs index 2e35f1fe86..df347bc937 100644 --- a/core/src/program/blocks/dyn_block.rs +++ b/core/src/program/blocks/dyn_block.rs @@ -57,7 +57,7 @@ impl Default for Dyn { impl fmt::Display for Dyn { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Dyn")?; + write!(f, "dyn")?; Ok(()) } From 12c09a006e7a72a141c8d9a6a218ed60d28b7f42 Mon Sep 17 00:00:00 2001 From: grjte Date: Wed, 27 Sep 2023 10:59:03 +0100 Subject: [PATCH 098/120] test: add simple assembly and integration tests for dynexec instr --- assembly/src/tests.rs | 12 ++++ miden/tests/integration/flow_control/mod.rs | 68 +++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 498715018e..8d05dd60c0 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -806,6 +806,18 @@ fn program_with_exported_procedure() { assert!(assembler.compile(source).is_err()); } +// PROGRAMS WITH DYNAMIC CODE BLOCKS +// ================================================================================================ + +#[test] +fn program_with_dynamic_code_execution() { + let assembler = super::Assembler::default(); + let source = "begin dynexec end"; + let program = assembler.compile(source).unwrap(); + let expected = "begin dyn end"; + assert_eq!(expected, format!("{program}")); +} + // MAST ROOT CALLS // ================================================================================================ diff --git a/miden/tests/integration/flow_control/mod.rs b/miden/tests/integration/flow_control/mod.rs index 5d882ed42f..1a509d3f82 100644 --- a/miden/tests/integration/flow_control/mod.rs +++ b/miden/tests/integration/flow_control/mod.rs @@ -209,3 +209,71 @@ fn simple_syscall() { test.prove_and_verify(vec![1, 2], false); } + +// DYNAMIC CODE EXECUTION +// ================================================================================================ + +#[test] +fn simple_dyn_exec() { + let program_source = " + proc.foo + # drop the top 4 values, since that will be the code hash when we call this dynamically + dropw + add + end + + begin + # call foo directly so it will get added to the CodeBlockTable + padw + call.foo + + # move the first result of foo out of the way + movdn.4 + + # use dynexec to call foo again via its hash, which is on the stack + dynexec + end"; + + // The hash of foo can be obtained from the code block table by: + // let cb_table = test.compile().cb_table(); + // Result: + // [BaseElement(14592192105906586403), BaseElement(9256464248508904838), + // BaseElement(17436090329036592832), BaseElement(10814467189528518943)] + // Integer values can be obtained via Felt::from_mont(14592192105906586403).as_int(), etc. + // As ints: + // [16045159387802755434, 10308872899350860082, 17306481765929021384, 16642043361554117790] + + let test = Test { + source: program_source.to_string(), + kernel: None, + stack_inputs: StackInputs::try_from_values([ + 3, + // put the hash of foo on the stack + 16045159387802755434, + 10308872899350860082, + 17306481765929021384, + 16642043361554117790, + 1, + 2, + ]) + .unwrap(), + advice_inputs: AdviceInputs::default(), + in_debug_mode: false, + libraries: Vec::default(), + }; + + test.expect_stack(&[6]); + + test.prove_and_verify( + vec![ + 3, + 16045159387802755434, + 10308872899350860082, + 17306481765929021384, + 16642043361554117790, + 1, + 2, + ], + false, + ); +} From dcf42ec1a71b5c44eb3e6b1d65bf9118e0ae14b7 Mon Sep 17 00:00:00 2001 From: grjte Date: Wed, 27 Sep 2023 14:36:05 +0100 Subject: [PATCH 099/120] docs: add dynexec to the user docs --- .../src/user_docs/assembly/code_organization.md | 17 +++++++++++++++++ docs/src/user_docs/assembly/flow_control.md | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index 0fa407da0e..9f7787dc32 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -42,6 +42,23 @@ begin end ``` +#### Dynamic procedures + +The dynamic procedure instruction `dynexec` is used to execute a dynamically-specified code target whose hash is not revealed to the verifier. Instead of a code target being specified in the program's MAST, it is specified by the stack, and a [`DYN` node](../../design/programs.md#dyn-block) is placed in the MAST to indicate a dynamically-specified target must be executed. When computing the MAST root of programs, `DYN` nodes all have the same constant value. Thus, `dynexec` can be used to increase privacy, since it enables code block execution without revealing the hash of the code block to the verifier. + +Dynamic code execution is achieved by setting the top $4$ elements of the stack to the hash of the dynamic code block and then executing the following instruction: + +``` +dynexec +``` + +This causes the VM to do the following: + +1. Read the top 4 elements of the stack to get the hash of the dynamic target (leaving the stack unchanged). +2. Execute the code block which hashes to the specified target. The VM must know the specified code block and hash (they must be in the CodeBlockTable of the executing Program). + +> **Note**: The stack is left unchanged. Therefore, if the dynamic code is intended to manipulate the stack, it should start by either dropping or moving the code block hash from the top of the stack. + ### Modules A *module* consists of one or more procedures. There are two types of modules: *library modules* and *executable modules* (also called *programs*). diff --git a/docs/src/user_docs/assembly/flow_control.md b/docs/src/user_docs/assembly/flow_control.md index 8d68bf2ae6..1800ea8700 100644 --- a/docs/src/user_docs/assembly/flow_control.md +++ b/docs/src/user_docs/assembly/flow_control.md @@ -65,4 +65,4 @@ while.true # push the boolean false to the stack, finishing the loop for the next iteration push.0 end -``` +``` \ No newline at end of file From a68a28afb07ad464ac5c54ff34284c10f1a8cc0f Mon Sep 17 00:00:00 2001 From: grjte Date: Thu, 28 Sep 2023 14:19:36 +0100 Subject: [PATCH 100/120] feat(asm): add dyncall assembly instruction --- assembly/src/assembler/instruction/mod.rs | 1 + assembly/src/assembler/instruction/procedures.rs | 5 +++++ assembly/src/ast/nodes/mod.rs | 2 ++ assembly/src/ast/nodes/serde/deserialization.rs | 1 + assembly/src/ast/nodes/serde/mod.rs | 3 ++- assembly/src/ast/nodes/serde/serialization.rs | 1 + assembly/src/ast/parsers/context.rs | 1 + core/src/program/blocks/dyn_block.rs | 5 +++++ core/src/program/blocks/mod.rs | 5 +++++ processor/src/lib.rs | 15 ++++++++++----- 10 files changed, 33 insertions(+), 6 deletions(-) diff --git a/assembly/src/assembler/instruction/mod.rs b/assembly/src/assembler/instruction/mod.rs index 49eee95e47..06875bc411 100644 --- a/assembly/src/assembler/instruction/mod.rs +++ b/assembly/src/assembler/instruction/mod.rs @@ -326,6 +326,7 @@ impl Assembler { Instruction::CallImported(id) => self.call_imported(id, ctx), Instruction::SysCall(id) => self.syscall(id, ctx), Instruction::DynExec => self.dynexec(), + Instruction::DynCall => self.dyncall(), // ----- debug decorators ------------------------------------------------------------- Instruction::Breakpoint => { diff --git a/assembly/src/assembler/instruction/procedures.rs b/assembly/src/assembler/instruction/procedures.rs index 61f9b5108c..43bcee08b2 100644 --- a/assembly/src/assembler/instruction/procedures.rs +++ b/assembly/src/assembler/instruction/procedures.rs @@ -128,4 +128,9 @@ impl Assembler { // create a new DYN block for the dynamic code execution and return Ok(Some(CodeBlock::new_dyn())) } + + pub(super) fn dyncall(&self) -> Result, AssemblyError> { + // create a new CALL block whose target is DYN + Ok(Some(CodeBlock::new_dyncall())) + } } diff --git a/assembly/src/ast/nodes/mod.rs b/assembly/src/ast/nodes/mod.rs index dde4eab8cb..127ae16e2b 100644 --- a/assembly/src/ast/nodes/mod.rs +++ b/assembly/src/ast/nodes/mod.rs @@ -308,6 +308,7 @@ pub enum Instruction { CallImported(ProcedureId), SysCall(ProcedureId), DynExec, + DynCall, // ----- debug decorators --------------------------------------------------------------------- Breakpoint, @@ -593,6 +594,7 @@ impl fmt::Display for Instruction { Self::CallImported(proc_id) => write!(f, "call.{proc_id}"), Self::SysCall(proc_id) => write!(f, "syscall.{proc_id}"), Self::DynExec => write!(f, "dynexec"), + Self::DynCall => write!(f, "dyncall"), // ----- debug decorators ------------------------------------------------------------- Self::Breakpoint => write!(f, "breakpoint"), diff --git a/assembly/src/ast/nodes/serde/deserialization.rs b/assembly/src/ast/nodes/serde/deserialization.rs index 922dcae98d..c6a4209d70 100644 --- a/assembly/src/ast/nodes/serde/deserialization.rs +++ b/assembly/src/ast/nodes/serde/deserialization.rs @@ -362,6 +362,7 @@ impl Deserializable for Instruction { OpCode::CallImported => Ok(Instruction::CallImported(ProcedureId::read_from(source)?)), OpCode::SysCall => Ok(Instruction::SysCall(ProcedureId::read_from(source)?)), OpCode::DynExec => Ok(Instruction::DynExec), + OpCode::DynCall => Ok(Instruction::DynCall), // ----- debugging -------------------------------------------------------------------- OpCode::Debug => { diff --git a/assembly/src/ast/nodes/serde/mod.rs b/assembly/src/ast/nodes/serde/mod.rs index b57ca1e702..f555643ffb 100644 --- a/assembly/src/ast/nodes/serde/mod.rs +++ b/assembly/src/ast/nodes/serde/mod.rs @@ -280,9 +280,10 @@ pub enum OpCode { CallImported = 245, SysCall = 246, DynExec = 247, + DynCall = 248, // ----- debugging ---------------------------------------------------------------------------- - Debug = 248, + Debug = 249, // ----- control flow ------------------------------------------------------------------------- IfElse = 253, diff --git a/assembly/src/ast/nodes/serde/serialization.rs b/assembly/src/ast/nodes/serde/serialization.rs index 95980a28f3..9e73b67fab 100644 --- a/assembly/src/ast/nodes/serde/serialization.rs +++ b/assembly/src/ast/nodes/serde/serialization.rs @@ -520,6 +520,7 @@ impl Serializable for Instruction { imported.write_into(target) } Self::DynExec => OpCode::DynExec.write_into(target), + Self::DynCall => OpCode::DynCall.write_into(target), // ----- debug decorators ------------------------------------------------------------- Self::Breakpoint => { diff --git a/assembly/src/ast/parsers/context.rs b/assembly/src/ast/parsers/context.rs index 6ec159d284..f8ac5b1280 100644 --- a/assembly/src/ast/parsers/context.rs +++ b/assembly/src/ast/parsers/context.rs @@ -616,6 +616,7 @@ impl ParserContext<'_> { "call" => self.parse_call(op), "syscall" => self.parse_syscall(op), "dynexec" => simple_instruction(op, DynExec), + "dyncall" => simple_instruction(op, DynCall), // ----- constant statements ---------------------------------------------------------- "const" => Err(ParsingError::const_invalid_scope(op)), diff --git a/core/src/program/blocks/dyn_block.rs b/core/src/program/blocks/dyn_block.rs index df347bc937..9f93b4069b 100644 --- a/core/src/program/blocks/dyn_block.rs +++ b/core/src/program/blocks/dyn_block.rs @@ -45,6 +45,11 @@ impl Dyn { /// Returns a hash of this code block. pub fn hash(&self) -> Digest { + Self::dyn_hash() + } + + /// Returns a hash of this code block. + pub fn dyn_hash() -> Digest { DYN_CONSTANT } } diff --git a/core/src/program/blocks/mod.rs b/core/src/program/blocks/mod.rs index 604daac9a4..cce75235c0 100644 --- a/core/src/program/blocks/mod.rs +++ b/core/src/program/blocks/mod.rs @@ -79,6 +79,11 @@ impl CodeBlock { Self::Dyn(Dyn::new()) } + /// TODO: add comments + pub fn new_dyncall() -> Self { + Self::Call(Call::new(Dyn::dyn_hash())) + } + /// TODO: add comments pub fn new_proxy(code_hash: Digest) -> Self { Self::Proxy(Proxy::new(code_hash)) diff --git a/processor/src/lib.rs b/processor/src/lib.rs index 2698d4f261..045594820d 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -328,11 +328,16 @@ where self.start_call_block(block)?; - // get function body from the code block table and execute it - let fn_body = cb_table - .get(block.fn_hash()) - .ok_or_else(|| ExecutionError::CodeBlockNotFound(block.fn_hash()))?; - self.execute_code_block(fn_body, cb_table)?; + // if this is a dyncall, execute the dynamic code block + if block.fn_hash() == Dyn::dyn_hash() { + self.execute_dyn_block(&Dyn::new(), cb_table)?; + } else { + // get function body from the code block table and execute it + let fn_body = cb_table + .get(block.fn_hash()) + .ok_or_else(|| ExecutionError::CodeBlockNotFound(block.fn_hash()))?; + self.execute_code_block(fn_body, cb_table)?; + } self.end_call_block(block) } From 406acfb688a52ada2144c30b3412d4d5c32f26cd Mon Sep 17 00:00:00 2001 From: grjte Date: Thu, 28 Sep 2023 14:29:52 +0100 Subject: [PATCH 101/120] test: add simple assembly and integration tests for dyncall instr --- assembly/src/tests.rs | 10 +++ miden/tests/integration/flow_control/mod.rs | 77 ++++++++++++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 8d05dd60c0..562edcb835 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -818,6 +818,16 @@ fn program_with_dynamic_code_execution() { assert_eq!(expected, format!("{program}")); } +#[test] +fn program_with_dynamic_code_execution_in_new_context() { + let assembler = super::Assembler::default(); + let source = "begin dyncall end"; + let program = assembler.compile(source).unwrap(); + let expected = + "begin call.0xc75c340ec6a69e708457544d38783abbb604d881b7dc62d00bfc2b10f52808e6 end"; + assert_eq!(expected, format!("{program}")); +} + // MAST ROOT CALLS // ================================================================================================ diff --git a/miden/tests/integration/flow_control/mod.rs b/miden/tests/integration/flow_control/mod.rs index 1a509d3f82..aec1e0c046 100644 --- a/miden/tests/integration/flow_control/mod.rs +++ b/miden/tests/integration/flow_control/mod.rs @@ -235,7 +235,8 @@ fn simple_dyn_exec() { end"; // The hash of foo can be obtained from the code block table by: - // let cb_table = test.compile().cb_table(); + // let program = test.compile(); + // let cb_table = program.cb_table(); // Result: // [BaseElement(14592192105906586403), BaseElement(9256464248508904838), // BaseElement(17436090329036592832), BaseElement(10814467189528518943)] @@ -277,3 +278,77 @@ fn simple_dyn_exec() { false, ); } + +#[test] +fn simple_dyncall() { + let program_source = " + proc.foo + # drop the top 4 values, since that will be the code hash when we call this dynamically + dropw + + # test that the execution context has changed + mem_load.0 assertz + + # add the two values on top of the stack + add + end + + begin + # write to memory so we can test that `call` and `dyncall` change the execution context + push.5 mem_store.0 + + # call foo directly so it will get added to the CodeBlockTable + padw + call.foo + + # move the first result of foo out of the way + movdn.4 + + # use dyncall to call foo again via its hash, which is on the stack + dyncall + end"; + + // The hash of foo can be obtained from the code block table by: + // let program = test.compile(); + // let cb_table = program.cb_table(); + // Result: + // [BaseElement(3961142802598954486), BaseElement(5305628994393606376), + // BaseElement(7971171833137344204), BaseElement(10465350313512331391)] + // Integer values can be obtained via Felt::from_mont(14592192105906586403).as_int(), etc. + // As ints: + // [8324248212344458853, 17691992706129158519, 18131640149172243086, 16129275750103409835] + + let test = Test { + source: program_source.to_string(), + kernel: None, + stack_inputs: StackInputs::try_from_values([ + 3, + // put the hash of foo on the stack + 8324248212344458853, + 17691992706129158519, + 18131640149172243086, + 16129275750103409835, + 1, + 2, + ]) + .unwrap(), + advice_inputs: AdviceInputs::default(), + in_debug_mode: false, + libraries: Vec::default(), + }; + + test.expect_stack(&[6]); + + test.prove_and_verify( + vec![ + 3, + 8324248212344458853, + 17691992706129158519, + 18131640149172243086, + 16129275750103409835, + 1, + 2, + ], + false, + ); +} From d1432d151a165838cb1b79663a2903c5ed026f3f Mon Sep 17 00:00:00 2001 From: grjte Date: Tue, 3 Oct 2023 09:39:50 +0200 Subject: [PATCH 102/120] docs: add dyncall to the user docs --- docs/src/user_docs/assembly/code_organization.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index 9f7787dc32..a798ecf7ee 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -44,9 +44,11 @@ end #### Dynamic procedures -The dynamic procedure instruction `dynexec` is used to execute a dynamically-specified code target whose hash is not revealed to the verifier. Instead of a code target being specified in the program's MAST, it is specified by the stack, and a [`DYN` node](../../design/programs.md#dyn-block) is placed in the MAST to indicate a dynamically-specified target must be executed. When computing the MAST root of programs, `DYN` nodes all have the same constant value. Thus, `dynexec` can be used to increase privacy, since it enables code block execution without revealing the hash of the code block to the verifier. +There are two dynamic procedure instructions, `dynexec` and `dyncall`, which can be used to execute a dynamically-specified code target whose hash is not revealed to the verifier. Instead of the code target being specified in the program's MAST, it is specified by the stack, and a [`DYN` node](../../design/programs.md#dyn-block) is placed in the MAST to indicate a dynamically-specified target must be executed. When computing the MAST root of programs, `DYN` nodes all have the same constant value. Thus, `dynexec` and `dyncall` can be used to increase privacy, since they enable code block execution without revealing the hash of the code block to the verifier. -Dynamic code execution is achieved by setting the top $4$ elements of the stack to the hash of the dynamic code block and then executing the following instruction: +The difference between `dynexec` and `dyncall` is that `dyncall` will change context before executing the dynamic code target, while `dynexec` will cause the code target to be executed in the current context. Execution contexts are explained in the [next section](./execution_contexts.md). + +Dynamic code execution in the same context is achieved by setting the top $4$ elements of the stack to the hash of the dynamic code block and then executing the following instruction: ``` dynexec @@ -57,7 +59,13 @@ This causes the VM to do the following: 1. Read the top 4 elements of the stack to get the hash of the dynamic target (leaving the stack unchanged). 2. Execute the code block which hashes to the specified target. The VM must know the specified code block and hash (they must be in the CodeBlockTable of the executing Program). -> **Note**: The stack is left unchanged. Therefore, if the dynamic code is intended to manipulate the stack, it should start by either dropping or moving the code block hash from the top of the stack. +Dynamic code execution in a new context can be achieved similarly by setting the top $4$ elements of the stack to the hash of the dynamic code block and then executing the following instruction: + +``` +dyncall +``` + +> **Note**: In both cases, the stack is left unchanged. Therefore, if the dynamic code is intended to manipulate the stack, it should start by either dropping or moving the code block hash from the top of the stack. ### Modules A *module* consists of one or more procedures. There are two types of modules: *library modules* and *executable modules* (also called *programs*). From 8ff713fb7bda80237d916b4aaaa7bbc6b45c5252 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Wed, 4 Oct 2023 14:08:12 -0700 Subject: [PATCH 103/120] docs: minor changes in dynamic proc invocation docs --- docs/src/user_docs/assembly/code_organization.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/src/user_docs/assembly/code_organization.md b/docs/src/user_docs/assembly/code_organization.md index a798ecf7ee..7e2eb2c1d5 100644 --- a/docs/src/user_docs/assembly/code_organization.md +++ b/docs/src/user_docs/assembly/code_organization.md @@ -42,11 +42,8 @@ begin end ``` -#### Dynamic procedures - -There are two dynamic procedure instructions, `dynexec` and `dyncall`, which can be used to execute a dynamically-specified code target whose hash is not revealed to the verifier. Instead of the code target being specified in the program's MAST, it is specified by the stack, and a [`DYN` node](../../design/programs.md#dyn-block) is placed in the MAST to indicate a dynamically-specified target must be executed. When computing the MAST root of programs, `DYN` nodes all have the same constant value. Thus, `dynexec` and `dyncall` can be used to increase privacy, since they enable code block execution without revealing the hash of the code block to the verifier. - -The difference between `dynexec` and `dyncall` is that `dyncall` will change context before executing the dynamic code target, while `dynexec` will cause the code target to be executed in the current context. Execution contexts are explained in the [next section](./execution_contexts.md). +#### Dynamic procedure invocation +It is also possible to invoke procedures dynamically - i.e., without specifying target procedure labels at compile time. There are two instructions, `dynexec` and `dyncall`, which can be used to execute dynamically-specified code targets. Both instructions expect [MAST root](../../design/programs.md) of the target to be provided via the stack. The difference between `dynexec` and `dyncall` is that `dyncall` will [change context](./execution_contexts.md) before executing the dynamic code target, while `dynexec` will cause the code target to be executed in the current context. Dynamic code execution in the same context is achieved by setting the top $4$ elements of the stack to the hash of the dynamic code block and then executing the following instruction: From 2cc5d951af1559934ced9cd373cc236968c69f0e Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Wed, 4 Oct 2023 22:10:11 +0200 Subject: [PATCH 104/120] feat: Falcon verification in MASM --- core/Cargo.toml | 4 +- core/src/lib.rs | 10 +- core/src/random.rs | 2 +- core/src/utils/mod.rs | 2 +- stdlib/Cargo.toml | 4 + stdlib/asm/crypto/dsa/falcon.masm | 278 --- stdlib/asm/crypto/dsa/rpo_falcon512.masm | 655 ++++++ stdlib/asm/math/ntt512.masm | 2258 ------------------ stdlib/asm/math/poly512.masm | 541 ----- stdlib/docs/crypto/dsa/falcon.md | 7 - stdlib/docs/math/ntt512.md | 6 - stdlib/docs/math/poly512.md | 9 - stdlib/tests/crypto/falcon.rs | 2710 +--------------------- stdlib/tests/crypto/mod.rs | 4 +- stdlib/tests/math/mod.rs | 2 - stdlib/tests/math/ntt512.rs | 82 - stdlib/tests/math/poly512.rs | 341 --- test-utils/src/crypto.rs | 1 + 18 files changed, 740 insertions(+), 6176 deletions(-) delete mode 100644 stdlib/asm/crypto/dsa/falcon.masm create mode 100644 stdlib/asm/crypto/dsa/rpo_falcon512.masm delete mode 100644 stdlib/asm/math/ntt512.masm delete mode 100644 stdlib/asm/math/poly512.masm delete mode 100644 stdlib/docs/crypto/dsa/falcon.md delete mode 100644 stdlib/docs/math/ntt512.md delete mode 100644 stdlib/docs/math/poly512.md delete mode 100644 stdlib/tests/math/ntt512.rs delete mode 100644 stdlib/tests/math/poly512.rs diff --git a/core/Cargo.toml b/core/Cargo.toml index 651d7e4ef2..f2cd7315bd 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -17,11 +17,11 @@ doctest = false [features] default = ["std"] -std = ["math/std", "winter-utils/std"] +std = ["math/std", "winter-utils/std", "miden-crypto/std"] [dependencies] math = { package = "winter-math", version = "0.6", default-features = false } -crypto = { package = "miden-crypto", git = "https://github.com/0xPolygonMiden/crypto.git", branch = "next", default-features = false } +miden-crypto = { package = "miden-crypto", git = "https://github.com/0xPolygonMiden/crypto.git", branch = "next", default-features = false } winter-crypto = { package = "winter-crypto", version = "0.6", default-features = false } winter-utils = { package = "winter-utils", version = "0.6", default-features = false } diff --git a/core/src/lib.rs b/core/src/lib.rs index 0908898053..a3f09da52f 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -7,10 +7,10 @@ extern crate alloc; pub mod chiplets; pub mod errors; -pub use ::crypto::{Word, EMPTY_WORD, ONE, WORD_SIZE, ZERO}; +pub use miden_crypto::{Word, EMPTY_WORD, ONE, WORD_SIZE, ZERO}; pub mod crypto { pub mod merkle { - pub use ::crypto::merkle::{ + pub use miden_crypto::merkle::{ DefaultMerkleStore, EmptySubtreeRoots, InnerNodeInfo, MerkleError, MerklePath, MerkleStore, MerkleTree, Mmr, MmrPeaks, NodeIndex, PartialMerkleTree, RecordingMerkleStore, SimpleSmt, StoreNode, TieredSmt, @@ -18,7 +18,7 @@ pub mod crypto { } pub mod hash { - pub use ::crypto::hash::{ + pub use miden_crypto::hash::{ blake::{Blake3Digest, Blake3_160, Blake3_192, Blake3_256}, rpo::{Rpo256, RpoDigest}, ElementHasher, Hasher, @@ -28,6 +28,10 @@ pub mod crypto { pub mod random { pub use crate::random::*; } + + pub mod dsa { + pub use miden_crypto::dsa::rpo_falcon512::*; + } } pub use math::{ diff --git a/core/src/random.rs b/core/src/random.rs index a8bf3972d8..1484dd4dcf 100644 --- a/core/src/random.rs +++ b/core/src/random.rs @@ -1,6 +1,6 @@ use super::{crypto::hash::Rpo256, utils::collections::Vec, Felt, FieldElement}; -use crypto::{hash::rpo::RpoDigest, Word, ZERO}; use math::StarkField; +use miden_crypto::{hash::rpo::RpoDigest, Word, ZERO}; // RE-EXPORTS // ================================================================================================ diff --git a/core/src/utils/mod.rs b/core/src/utils/mod.rs index fc2650d633..54b45be4d9 100644 --- a/core/src/utils/mod.rs +++ b/core/src/utils/mod.rs @@ -14,7 +14,7 @@ pub use winter_utils::{ ByteWriter, Deserializable, DeserializationError, Serializable, SliceReader, }; -pub use crypto::utils::collections; +pub use miden_crypto::utils::collections; pub mod math { pub use math::{batch_inversion, log2}; diff --git a/stdlib/Cargo.toml b/stdlib/Cargo.toml index 55fefd9f88..33ec8d1a76 100644 --- a/stdlib/Cargo.toml +++ b/stdlib/Cargo.toml @@ -19,6 +19,10 @@ doctest = false name = "stdlib" path = "tests/main.rs" +[features] +default = ["std"] +std = ["test-utils/std"] + [dependencies] assembly = { package = "miden-assembly", default-features = false, path = "../assembly", version = "0.7" } diff --git a/stdlib/asm/crypto/dsa/falcon.masm b/stdlib/asm/crypto/dsa/falcon.masm deleted file mode 100644 index 88e6f4bb2d..0000000000 --- a/stdlib/asm/crypto/dsa/falcon.masm +++ /dev/null @@ -1,278 +0,0 @@ -use.std::math::poly512 - -#! Given an element on stack top, this routine normalizes that element in -#! interval (-q/2, q/2] | q = 12289 -#! -#! Imagine, a is the provided element, which needs to be normalized -#! -#! b = normalize(a) -#! = (a + (q >> 1)) % q - (q >> 1) | a ∈ [0, q), q = 12289 -#! -#! Note, normalization requires that we can represent the number as signed integer, -#! which is not allowed inside Miden VM stack. But we can ignore the sign of integer and only -#! store the absolute value as field element. This can be safely done because after normalization -#! anyway `b` will be squared ( for computing norm of a vector i.e. polynomial, where b is a coefficient ). -#! That means we can just drop the sign, and that's what is done in this routine. -#! -#! To be more concrete, normalization of 12166 ( = a ) should result into -123, but absolute value -#! 123 will be kept on stack. While normalization of 21, should result into 21, which has absolute -#! value 21 --- that's what is kept on stack. -#! -#! Expected stack state : -#! -#! [a, ...] -#! -#! After normalization ( represented using unsigned integer i.e. Miden field element ) stack looks like -#! -#! [b, ...] -proc.normalize - dup - push.6144 - gt - - if.true - push.6144 - add - - exec.poly512::mod_12289 - - dup - push.6144 - gte - - if.true - push.6144 - sub - else - push.6144 - swap - sub - end - end -end - -#! Given four elements from Falcon prime field, on stack top, this routine -#! normalizes each of them, using above defined `normalize()` routine. -#! -#! Expected stack state : -#! -#! [a0, a1, a2, a3, ...] -#! -#! Output stack state : -#! -#! [b0, b1, b2, b3, ...] -#! -#! b`i` = normalize(a`i`) | i ∈ [0..4) -proc.normalize_word - exec.normalize - - swap - exec.normalize - swap - - movup.2 - exec.normalize - movdn.2 - - movup.3 - exec.normalize - movdn.3 -end - -#! Given a degree 512 polynomial on stack, using its starting (absolute) memory address, -#! this routine normalizes each coefficient of the polynomial, using above defined -#! `normalize()` routine -#! -#! Imagine, f is the given polynomial of degree 512. It can be normalized using -#! -#! g = [normalize(f[i]) for i in range(512)] -#! -#! Expected stack state : -#! -#! [f_start_addr, g_start_addr, ...] | next 127 absolute addresses can be computed using `INCR` instruction -#! -#! Post normalization stack state looks like -#! -#! [ ... ] -#! -#! Note, input polynomial which is provided using memory addresses, is not mutated. -export.normalize_poly512 - push.0.0.0.0 - - repeat.128 - dup.4 - mem_loadw - - exec.normalize_word - - dup.5 - mem_storew - - movup.5 - add.1 - movdn.5 - - movup.4 - add.1 - movdn.4 - end - - dropw - drop - drop -end - -#! Given four elements on stack top, this routine computes squared norm of that -#! vector ( read polynomial ) with four coefficients. -#! -#! Imagine, given vector is f, which is described as -#! -#! f = [a0, a1, a2, a3] -#! -#! Norm of that vector is -#! -#! √(a0 ^ 2 + a1 ^ 2 + a2 ^ 2 + a3 ^ 2) -#! -#! But we need squared norm, which is just skipping the final square root operation. -#! -#! Expected stack state : -#! -#! [a0, a1, a2, a3, ...] -#! -#! Final stack state : -#! -#! [b, ...] | b = a0 ^ 2 + a1 ^ 2 + a2 ^ 2 + a3 ^ 2 -proc.squared_norm_word - dup - mul - - swap - dup - mul - - add - - swap - dup - mul - - add - - swap - dup - mul - - add -end - -#! Given a degree 512 polynomial in coefficient form, as starting (absolute) memory address -#! on stack, this routine computes squared norm of that vector, using following formula -#! -#! Say, f = [a0, a1, a2, ..., a510, a511] -#! g = sq_norm(f) = a0 ^ 2 + a1 ^ 2 + ... + a510 ^ 2 + a511 ^ 2 -#! -#! Expected input stack state : -#! -#! [f_start_addr, ...] | f_addr`i` holds f[(i << 2) .. ((i+1) << 2)] -#! -#! Consecutive 127 addresses on stack can be computed using `INCR` instruction, because memory -#! addresses are consecutive i.e. monotonically increasing by 1. -#! -#! Final stack state : -#! -#! [g, ...] | g = sq_norm(f) -export.squared_norm_poly512 - push.0.0.0.0.0 - - repeat.128 - dup.5 - mem_loadw - - exec.squared_norm_word - add - - swap - add.1 - swap - - push.0.0.0.0 - end - - dropw - swap - drop -end - -#! Falcon-512 Digital Signature Verification routine -#! -#! Given four degree-511 polynomials, using initial absolute memory addresses on stack, -#! this routine checks whether it's a valid Falcon signature or not. -#! -#! Four degree-511 polynomials, which are provided ( in order ) -#! -#! f = [f0, f1, ..., f510, f511] -> decompressed Falcon-512 signature -#! g = [g0, g1, ..., g510, g511] -> public key used for signing input message -#! h = [h0, h1, ..., h510, h511] -> input message hashed using SHAKE256 XOF and converted to polynomial -#! k = [k0, k1, ..., k510, k511] -> [abs(i) for i in f] | abs(a) = a < 0 ? 0 - a : a -#! -#! Each of these polynomials are represented using starting absolute memory address. Contiguous 127 -#! memory addresses can be computed by repeated application of INCR instruction ( read add.1 ) on previous -#! absolute memory address. -#! -#! f`i` holds f[(i << 2) .. ((i+1) << 2)] | i ∈ [0..128) -#! g`i` holds g[(i << 2) .. ((i+1) << 2)] | i ∈ [0..128) -#! h`i` holds h[(i << 2) .. ((i+1) << 2)] | i ∈ [0..128) -#! k`i` holds k[(i << 2) .. ((i+1) << 2)] | i ∈ [0..128) -#! -#! Expected stack state : -#! -#! [f_start_addr, g_start_addr, h_start_addr, k_start_addr, ...] -#! -#! After execution of verification routine, stack looks like -#! -#! [ ... ] -#! -#! If verification fails, program panics, due to failure in assertion ! -#! -#! Note, input memory addresses are considered to be immutable. -export.verify.257 - locaddr.0 - movdn.2 - exec.poly512::mul_zq - - locaddr.128 - locaddr.0 - exec.poly512::neg_zq - - locaddr.0 - swap - locaddr.128 - exec.poly512::add_zq - - locaddr.128 - locaddr.0 - exec.normalize_poly512 - - # compute squared norm of s0 - - locaddr.128 - exec.squared_norm_poly512 - - locaddr.256 - mem_store - - # compute squared norm of s1 ( where s1 is provided as polynomial - # with coefficients represented using absolute value i.e. signs are ignored ) - - exec.squared_norm_poly512 - - locaddr.256 - mem_load - add - - # check that norm of the signature is small enough - - push.34034726 # constant sig_bound for Falcon-512 signature - lte - assert -end diff --git a/stdlib/asm/crypto/dsa/rpo_falcon512.masm b/stdlib/asm/crypto/dsa/rpo_falcon512.masm new file mode 100644 index 0000000000..140ac74a33 --- /dev/null +++ b/stdlib/asm/crypto/dsa/rpo_falcon512.masm @@ -0,0 +1,655 @@ +use.std::crypto::stark::deep_queries + +# CONSTANTS +# ================================================================================================= + +const.J=77321994752 +const.M=12289 +const.SQUARE_NORM_BOUND=34034726 + +# MODULAR REDUCTION FALCON PRIME +# ============================================================================================= + +#! Given dividend ( i.e. field element a ) on stack top, this routine computes c = a % 12289 +#! +#! Expected stack state +#! +#! [a, ...] +#! +#! Output stack state looks like +#! +#! [c, ...] | c = a % 12289 +export.mod_12289 + u32split + push.M.0 + + adv.push_u64div + + adv_push.2 + u32assert.2 + + swap + push.M + u32overflowing_mul + + movup.2 + push.M + u32overflowing_madd + drop + + adv_push.2 + drop + u32assert + + dup + + movup.3 + u32overflowing_add + + movup.3 + u32overflowing_add + drop + + movup.5 + assert_eq + movup.4 + assert_eq + + swap + drop + swap + drop +end + +# HASH-TO-POINT +# ============================================================================================= + +#! Takes as input a message digest, a nonce of size 40 bytes represented as 8 field elements +#! and a pointer. The procedure absorbs MSG and NONCE into a fresh RPO state and squeezes the +#! coefficients of a polynomial c representing the hash-to-point of (MSG || NONCE). The coefficients +#! are then saved in the memory region [c_ptr, c_ptr + 128). +#! This implementation of the `hash_to_point` procedure avoids the rejection-sampling step +#! required in the per-the-spec algorithm by using the observation on page 31 in +#! https://falcon-sign.info/falcon.pdf +#! +#! Input: [c_ptr, MSG, NONCE1, NONCE0, ...] +#! Output: [...] +#! +#! Cycles: 1327 +export.hash_to_point.2 + # Move pointer out of the way + movdn.12 + + # Store MSG for later absorption + loc_storew.1 dropw + + # Absorb the nonce + padw movdnw.2 + hperm + + # Absorb the message + swapw loc_loadw.1 swapw hperm + + # Squeeze the coefficents and save them + repeat.63 + swapw dup.12 + mem_storew + swapw dup.12 add.2 swap.13 add.1 + mem_storew + hperm + end + + # Save the last remaining coefficients + dup.12 add.1 mem_storew dropw + movup.8 mem_storew dropw + + # Clean up the stack + dropw +end + + +# PROBABILISTIC POLYNOMIAL MULTIPLICATION IN Z_Q[x] +# ============================================================================================= + +#! For an element `tau := (tau0, tau1)` in the quadratic extension field, computes all its powers +#! `tau^i` for `i = 0,..., 512` and stores them in the memory region `[tau_ptr, tau_ptr + 513)`. +#! The procedure returns `tau_ptr + 513`. +#! +#! Input: [tau1, tau0, tau_ptr, ...] +#! Output: [tau_ptr + 513, ...] +#! +#! Cycles: 8323 +export.powers_of_tau + + # 1) Save tau^0 i.e. (0, 1) + push.1 push.0.0.0 + dup.6 add.1 swap.7 + mem_storew + drop drop + #=> [0, 1, tau1, tau0, tau_ptr+1, ...] + + # 2) Compute tau^i + repeat.512 + dupw ext2mul + + movup.3 movup.3 + + dup.6 add.1 swap.7 mem_storew + + drop drop + end + + dropw + #=> [tau_ptr + 513, ...] +end + + +#! Sets the memory region `[ptr, ptr + 512)` to zero. The pointer c_ptr := ptr + 512 is returned +#! to be used to store the hash-to-point polynomial of the message later on. +#! +#! Input: [ptr, ...] +#! Output: [...] +#! +#! Cycles: 2607 +export.set_to_zero + padw + repeat.512 + dup.4 add.1 swap.5 + mem_storew + end + dropw +end + +#! Takes as input PK, the hash of the coefficients of the polynomial `h` representing the expanded +#! public key, and a pointer to the memory location where the coefficients of the polynomial `h` +#! will be stored. +#! The procedure loads `h` from the advice stack and compares its hash with the provided hash `PK`. +#! It then loads the polynomial `s2` representing the signature from the advice stack and lays it +#! in memory right after `h`. +#! It then loads the claimed polynomial `h * s2` in Z_Q[x] where Q is the Miden VM prime from +#! the advice stack and lays it right after `s2`. +#! The hash of `h`, `s2` and the claimed product is also computed and the first two field elements +#! of the digest (i.e., the Fiat-Shamir challenge) are returned on the stack alongside +#! the incremented pointer. +#! +#! Input: [ptr, PK, ...] +#! Output: [tau1, tau0, ptr + 512 ...] +#! +#! Cycles: 5049 +export.load_h_s2_and_product.1 + + # 1) Store PK for later comparison + movdn.4 + loc_storew.0 + + # 2) Prepare stack and load h polynomial. We also range check the coefficients of h. + padw swapw + padw + repeat.64 + adv_pipe + + dupw.1 + u32assert.2 + push.M u32unchecked_lt assert + push.M u32unchecked_lt assert + u32assert.2 + push.M u32unchecked_lt assert + push.M u32unchecked_lt assert + + dupw + u32assert.2 + push.M u32unchecked_lt assert + push.M u32unchecked_lt assert + u32assert.2 + push.M u32unchecked_lt assert + push.M u32unchecked_lt assert + + hperm + end + + # 3) Load saved claimed hash of h and compare + loc_loadw.0 + movup.4 assert_eq + movup.3 assert_eq + movup.2 assert_eq + assert_eq + + # 4) Load s2 (Due to the final norm test we do not need to range check the s2 coefficents) + padw padw + repeat.64 + adv_pipe hperm + end + + # 5) Load claimed h * s2 in Z_Q[x] + repeat.128 + adv_pipe hperm + end + + # 6) Return the challenge point and the incremented pointer + dropw swapw dropw + drop drop + #=> [tau1, tau0, ptr + 512] +end + +#! Checks that pi == h * s2 in Z_Q[x] by evaluating both sides at a random point. +#! The procedure takes as input a pointer h_ptr to h. The other two polynomials +#! are located at h_ptr + 128, for s2, and h_ptr + 256, for pi. The procedure takes +#! also a pointer zeros_ptr to a region of memory [zeros_ptr, zeros_ptr + 1024) +#! and a pointer tau_ptr to powers of the random point we are evaluating at stored +#! as [a_i, b_i, x, x] where (a_i, b_i) := tau^i for i in [0, 1023]. +#! The procedure returns () if the check passes, otherwise it raises an exception +#! related to an unsatisfied assertion. +#! +#! Input: [h_ptr, zeros_ptr, tau_ptr, ...] +#! Output: [...] +#! +#! Cycles: 2504 +export.probablistic_product.4 + # 1) Save the pointers + push.0 movdn.3 + loc_storew.0 + + # 2) Compute the evaluation of the h polynomial at the random challenge + + # Accumulator to compute h(tau) + padw + + # For mem_stream + padw padw + + # Compute h(tau) + repeat.64 + mem_stream + repeat.8 + exec.deep_queries::combine_main + end + end + + # Save the evaluation h(tau) + swapdw loc_storew.1 + dropw + #=> [X, X, X, ...] + + # 3) Compute the evaluation of the s2 polynomial at the random challenge + loc_loadw.0 + add.128 + #=> [s2_ptr, zeros_ptr, tau_ptr, 0, X, X, ...] + + # Accumulator to compute s2(tau) + padw + swapdw + #=> [X, X, 0, 0, 0, 0, s2_ptr, zeros_ptr, tau_ptr, 0, ...] + + # Compute s2(tau) + repeat.64 + mem_stream + repeat.8 + exec.deep_queries::combine_main + end + end + + # Save the evaluation of s2(tau) + swapdw loc_storew.2 + dropw + #=> [X, X, X, ...] + + # 4) Compute the evaluation of the product polynomial pi := h * s2 at the random challenge where + # the product is over Z_Q[x] + # We compute the evaluation of pi at tau as pi(tau) = pi1(tau) + tau^512 * pi2(tau) where pi1 and + # pi2 are the first and second halves of the product polynomial. This is done in order to reduce + # the number of powers of tau needed to compute pi(tau). + + # Setup the pointers + loc_loadw.0 + add.256 + #=> [pi_ptr, zeros_ptr, tau_ptr, 0, X, X, ...] + + # Accumulator to compute pi(tau) + padw + swapdw + #=> [X, X, 0, 0, 0, 0, pi_ptr, zeros_ptr, tau_ptr, 0, ...] + + # Compute pi1(tau) + repeat.64 + mem_stream + repeat.8 + exec.deep_queries::combine_main + end + end + #=> [X, X, ev1, ev0, ev1, ev0, pi_ptr, zeros_ptr, tau_ptr, 0, ...] + # where (ev0, ev1) := pi1(tau) + + # Save pi_1(tau) + swapw.2 loc_storew.3 + + # Setup the pointers + swapw.3 loc_loadw.0 add.384 + + # Accumulator to compute pi2(tau) + swapw dropw padw + swapdw + + # Compute pi2(tau) + repeat.64 + mem_stream + repeat.8 + exec.deep_queries::combine_main + end + end + #=> [X, X, ev1, ev0, ev1, ev0, pi_ptr, zeros_ptr, tau_ptr, 0, ...] + + # Load tau^512 + swapw.3 + #=> [pi_ptr, zeros_ptr, tau_ptr, 0, X, ev1, ev0, ev1, ev0, X, ...] + dup.2 mem_loadw drop drop + #=> [tn1, tn0, X, ev1, ev0, ev1, ev0, X, ...] + + # Compute (a0, a1) := tau^512 * pi2(tau) + movup.7 movup.7 ext2mul + #=> [a1, a0, X, x, x, X, ...] + + # Compute (res0, res1) := pi(tau) + swapw loc_loadw.3 drop drop + ext2add + #=> [res1, res0, x, x, X, ...] + + + # 5) Check product + + ## a) Load h(tau) + swapw + loc_loadw.1 + + ## b) Load s2(tau) + push.0.0 + loc_loadw.2 + + ## c) compute the product + drop drop + ext2mul + + ## d) assert equality + movup.2 + assert_eq + assert_eq + + ## e) clean up the stack + drop drop + #=> [...] +end + + +# SQUARE NORM OF Z_q[x]/(phi) POLYNOMIALS +# ============================================================================================= + +#! Normalizes an `e` in [0, q) to be in [-(q-1) << 1, (q-1) << 1) and returns its square norm. +#! +#! We use the following formula to do so: +#! normalize(e) = e^2 - phi * (2*q*e - q^2) where phi := (e > (q - 1)/2) +#! +#! The formula implements: +#! +#! if e > (q-1)/2: +#! return (q - e)^2 +#! else: +#! return e^2 +#! +#! The use of the formula avoids using the if-else block. +#! +#! Input: [e, ...] +#! Output [norm(e)^2, ...] +#! +#! Cycles: 21 +export.norm_sq + + dup + dup mul + swap + #=> [e, e^2, ...] + + dup + push.6144 + u32unchecked_gt + #=> [phi, e, e^2, ...] + + swap + mul.24578 # 2*q + push.151019521 # q^2 + sub + #=> [2*q*e - q^2, phi, e^2, ...] + + mul sub + #=> [norm(e)^2, ...] +end + +#! On input a tuple (u, w, v), the following computes (v - (u + (- w % q) % q) % q). +#! We can avoid doing three modular reductions by using the following facts: +#! +#! 1. q is much smaller than the Miden prime. Precisely, q * 2^50 < Q +#! 2. The coefficients of the product polynomial, u and w, are less than J := 512 * q^2 +#! 3. The coefficients of c are less than q. +#! +#! This means that we can substitute (v - (u + (- w % q) % q) % q) with v + w + J - u without +#! risking Q-overflow since |v + w + J - u| < 1025 * q^2 +#! +#! To get the final result we reduce (v + w + J - u) modulo q. +#! +#! Input: [v, w, u, ...] +#! Output: [e, ...] +#! +#! Cycles: 44 +export.diff_mod_q + + # 1) v + w + J + add push.J add + #=> [v + w + J, u] + + # 2) v + w + J - u + swap sub + #=> [v + w + J - u] + + # 3) Reduce modulo q + exec.mod_12289 + #=> [e, ...] +end + +#! Takes a pointer to a polynomial pi of degree less than 1024 with coefficients in Z_Q and +#! a polynomial c of degree 512 with coefficients also in Z_Q, where Q is the Miden prime. +#! The goal is to compute s1 = c - pi = c - h * s2 in Z_q[x]/(phi) where q is the Falcon prime. +#! The pointer pi_ptr points both to pi and c through the relation c_ptr = pi_ptr + offset +#! where offset := 1281. +#! The naive way to compute s1 would be to first reduce the polynomial pi modulo the Falcon +#! prime q and then modulo the irreducible polynomial phi = x^512 + 1. Then we would need to negate +#! the coefficients of pi modulo q and only then can we add these coefficients to the coefficients +#! of c and then reduce the result modulo q one more time. +#! Knowing that the end goal of computing c is to compute its norm squared, we can do better. +#! +#! We can compute s1 in a single pass by delaying the q-modular reduction til the end. This can +#! be achieved through a careful analysis of the computation of the difference between pi and c. +#! +#! The i-th coefficient s1_i of s1 is equal to c_i - (pi_i - pi_{512 + i}) which is equal to +#! c_i + pi_{512 + i} - pi_i. Now, we know that the size of the pi_i coefficients is bounded by +#! J := 512 * q^2 and this means that J + pi_{512 + i} - pi_i does not Q-underflow and since +#! J = 0 modulo q, the addition of J does not affect the final result. It is also important to +#! note that adding J does not Q-overflow by virtue of q * 2^50 < Q. +#! All of the above implies that we can compute s1_i with only one modular reduction at the end, +#! in addition to one modular reduction applied to c_i. +#! Moreover, since we are only interested in the square norm of s1_i, we do not have to store +#! s1_i and then load it at a later point, and instead we can immediatly follow the computation +#! of s1_i with computing its square norm. +#! After computing the square norm of s1_i, we can accumulate into an accumulator to compute the +#! sum of the square norms of all the coefficients of polynomial c. Using the overflow stack, this +#! can be delayed til the end. +#! +#! Input: [pi_ptr, ...] +#! Output: [norm_sq(s1), ...] +#! +#! Cycles: 58888 +export.compute_s1_norm_sq + repeat.128 + # 1) Load the next 4 * 3 coefficients + # load c_i + padw + dup.4 add.1281 + mem_loadw + + # load pi_{i+512} + padw + dup.8 add.128 + mem_loadw + + # load pi_i + padw + dup.12 + mem_loadw + #=> [PI, PI_{i+512}, C, pi_ptr, ...] + + # 2) Compute the squared norm of (i + 0)-th coefficient of s1 + movup.8 + exec.mod_12289 + movup.5 + #=> [v, w, u, ...] where u is the i-th coefficient of `pi`, v is the i-th + # coefficient of `c` and w is the (512 + i)-th coefficient of `pi` polynomial. + + exec.diff_mod_q + #=> [e, ...] + + exec.norm_sq + #=> [norm(e)^2, ...] + + # Move the result out of the way so that we can process the remaining coefficents + movdn.10 + + # 3) Compute the squared norm of (i + 1)-th coefficient of s1 + movup.6 + exec.mod_12289 + movup.4 + exec.diff_mod_q + exec.norm_sq + movdn.7 + + # 4) Compute the squared norm of (i + 2)-th coefficient of s1 + movup.4 + exec.mod_12289 + movup.3 + exec.diff_mod_q + exec.norm_sq + movdn.4 + + # 5) Compute the squared norm of (i + 3)-th coefficient of s1 + movup.2 + exec.mod_12289 + movup.2 + exec.diff_mod_q + exec.norm_sq + swap + + # 6) Increment the pointer + add.1 + end + + # Sum up the squared norm of all the coefficients of s1 + drop # drop the pointer + repeat.511 + add + end + #=> [norm_sq(s1), ...] +end + +#! Compute the square norm of the polynomial s2 given a pointer to its coefficients. +#! +#! Input: [s2_ptr, ...] +#! Output: [norm_sq(s2), ...] +#! +#! Cycles: 13322 +export.compute_s2_norm_sq + repeat.128 + padw + dup.4 add.1 swap.5 + mem_loadw + + repeat.4 + exec.norm_sq + movdn.4 + end + + end + drop + repeat.511 + add + end +end + + +# FALCON SIGNATURE VERIFICATION ALGORITHM +# ============================================================================================= + +#! Verifies a signature against a public key and a message. The procedure gets as inputs the hash +#! of the public key and the hash of the message via the operand stack. The signature is provided +#! via the advice stack. +#! The signature is valid if and only if the procedure returns. +#! +#! Input: [PK, MSG, NONCE1, NONCE1, ...] +#! Output: [...] +#! +#! Cycles: ~ 92029 +export.verify.1665 + + # 1) Load the public key polynomial h and the signature polynomial s2 and the product of + # the two polynomials pi := h * s2 in Z_Q[x]. This also checks that h hashes to the provided + # digest PK. While loading the polynomials, the hash of the three polynomials is computed + # and the first half of the digest is kept on the stack for later use by the + # `probablistic_product` procedure. + + locaddr.0 + exec.load_h_s2_and_product + #=> [tau1, tau0, tau_ptr, MSG, NONCE1, NONCE1, ...] (Cycles: 5050) + + exec.powers_of_tau + #=> [zeros_ptr, MSG, NONCE1, NONCE1, ...] (Cycles: 8323) + + exec.set_to_zero + #=> [c_ptr, MSG, NONCE1, NONCE1, ...] (Cycles: 2607) + + # 2) Compute the hash-to-point of the message MSG from the provided NONCE and save + # the resulting polynomial c in the memory region [c_ptr, c_ptr + 128) + + exec.hash_to_point + #=> [...] (Cycles: 1327) + + # 3) Check that we indeed have pi := h * s2 in Z_Q[x] by checking that pi(tau) = h(tau) * s2(tau) + # where tau is a random (Fiat-Shamir) challenge resulting from hashing h, s2 and pi. + + locaddr.512 # tau_ptr + locaddr.1025 # z_ptr + locaddr.0 # h ptr + #=> [h_ptr, zeros_ptr, tau_ptr, ...] + + exec.probablistic_product + #=> [...] (Cycles: 2504) + + # 4) Compute the squared norm of s1 := c - h * s2 (in Z_q[x]/(phi)) + + locaddr.256 + #=> [pi_ptr, ...] + + exec.compute_s1_norm_sq + #=> [norm_sq(s1), ...] (Cycles: 58888) + + # 5) Compute the squared norm of s2 + + locaddr.128 + #=> [s2_ptr, norm_sq(s1), ...] + + exec.compute_s2_norm_sq + #=> [norm_sq(s2), norm_sq(s1), ...] (Cycles: 13322) + + # 6) Check that ||(s1, s2)||^2 < K + + add + #=> [norm_sq(s1) + norm_sq(s2), ...] + + push.SQUARE_NORM_BOUND + u32checked_lt assert + #=> [...] (Cycles: 8) +end \ No newline at end of file diff --git a/stdlib/asm/math/ntt512.masm b/stdlib/asm/math/ntt512.masm deleted file mode 100644 index c3bd0f8ca1..0000000000 --- a/stdlib/asm/math/ntt512.masm +++ /dev/null @@ -1,2258 +0,0 @@ -#! Applies four NTT butterflies on four different indices, given following stack state -#! -#! [k0, k1, k2, k3, A0, B0, C0, D0, A1, B1, C1, D1] -#! -#! Here k`i` => i-th constant i.e. ω raised to *some* power | ω => 2N -th primitive root of unity, N = 512 -#! -#! A{0, 1} -> first butterfly will be applied on these two elements -#! B{0, 1} -> second butterfly will be applied on these two elements -#! C{0, 1} -> third butterfly will be applied on these two elements -#! D{0, 1} -> fourth butterfly will be applied on these two elements -#! -#! Four independent butterflies are applied in following way -#! -#! ζ = k0 * A0 | ζ = k1 * B0 | ζ = k2 * C0 | ζ = k3 * D0 -#! --- --- --- --- --- --- --- --- --- --- --- --- --- --- - -#! A0' = A1 - ζ | B0' = B1 - ζ | C0' = C1 - ζ | D0' = D1 - ζ -#! A1' = A1 + ζ | B1' = B1 + ζ | C1' = C1 + ζ | D1' = D1 + ζ -#! -#! After four independent butterflies are applied, resulting stack state should look like -#! -#! [A0', B0', C0', D0', A1', B1', C1', D1'] -proc.butterfly - movup.4 - mul - - swap - movup.4 - mul - swap - - movup.2 - movup.4 - mul - movdn.2 - - movup.3 - movup.4 - mul - movdn.3 - - dupw - dupw.2 - - movup.4 - add - - swap - movup.4 - add - swap - - movup.2 - movup.4 - add - movdn.2 - - movup.3 - movup.4 - add - movdn.3 - - swapw - movupw.2 - - movup.4 - sub - - swap - movup.4 - sub - swap - - movup.2 - movup.4 - sub - movdn.2 - - movup.3 - movup.4 - sub - movdn.3 -end - -#! Applies forward NTT on a vector of length 512, where each element ∈ Zp | p = 2^64 − 2^32 + 1, -#! producing elements in frequency domain in bit-reversed order. -#! -#! Expected stack state as input: -#! -#! [start_addr, ...] | Single absolute memory address, where polynomial starts -#! -#! Note, total 128 memory addresses are required for storing whole polynomial. Next 127 -#! addresses are consecutive i.e. computable by using `add.1` instruction on previous address. -#! -#! addr{i} holds values V[(i << 2) .. ((i+1) << 2)] | i ∈ [0, 128) and addr0 = start_addr -#! -#! After applying NTT, bit-reversed order vector is returned back as single absolute memory -#! addresses on stack, where it begins storing the polynomial. Consecutive 127 addresses should be -#! computable using `add.1` instruction. -#! -#! [start_addr', ...] | Single absolute memory address, where resulting polynomial starts -#! -#! Note, input memory allocation is not mutated, instead output is stored in different memory allocation. -export.forward.128 - # prepare input - - locaddr.0 - push.0.0.0.0 - - repeat.128 - dup.5 - mem_loadw - - dup.4 - mem_storew - - movup.5 - add.1 - movdn.5 - - movup.4 - add.1 - movdn.4 - end - - dropw - drop - drop - - # iter = 0 - - push.18446462594437873665.18446462594437873665.18446462594437873665.18446462594437873665 - repeat.63 - dupw - end - - push.0.0.0.0.0.0.0.0 - - locaddr.64 - movdn.8 - locaddr.0 - movdn.8 - - repeat.64 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 1 - - push.16777216.16777216.16777216.16777216 - repeat.31 - dupw - end - - push.1099511627520.1099511627520.1099511627520.1099511627520 - repeat.31 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.32 - movdn.8 - locaddr.0 - movdn.8 - - repeat.2 - repeat.32 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.32 - movdn.8 - - movup.9 - add.32 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 2 - - push.17293822564807737345.17293822564807737345.17293822564807737345.17293822564807737345 - repeat.15 - dupw - end - - push.4096.4096.4096.4096 - repeat.15 - dupw - end - - push.4503599626321920.4503599626321920.4503599626321920.4503599626321920 - repeat.15 - dupw - end - - push.18446744000695107585.18446744000695107585.18446744000695107585.18446744000695107585 - repeat.15 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.16 - movdn.8 - locaddr.0 - movdn.8 - - repeat.4 - repeat.16 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.16 - movdn.8 - - movup.9 - add.16 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 3 - - push.1073741824.1073741824.1073741824.1073741824 - repeat.7 - dupw - end - - push.70368744161280.70368744161280.70368744161280.70368744161280 - repeat.7 - dupw - end - - push.18428729670905102337.18428729670905102337.18428729670905102337.18428729670905102337 - repeat.7 - dupw - end - - push.64.64.64.64 - repeat.7 - dupw - end - - push.288230376084602880.288230376084602880.288230376084602880.288230376084602880 - repeat.7 - dupw - end - - push.18446739671368073217.18446739671368073217.18446739671368073217.18446739671368073217 - repeat.7 - dupw - end - - push.262144.262144.262144.262144 - repeat.7 - dupw - end - - push.17179869180.17179869180.17179869180.17179869180 - repeat.7 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.8 - movdn.8 - locaddr.0 - movdn.8 - - repeat.8 - repeat.8 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.8 - movdn.8 - - movup.9 - add.8 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 4 - - push.9223372032559808513.9223372032559808513.9223372032559808513.9223372032559808513 - repeat.3 - dupw - end - - push.32768.32768.32768.32768 - repeat.3 - dupw - end - - push.36028797010575360.36028797010575360.36028797010575360.36028797010575360 - repeat.3 - dupw - end - - push.18446743519658770433.18446743519658770433.18446743519658770433.18446743519658770433 - repeat.3 - dupw - end - - push.134217728.134217728.134217728.134217728 - repeat.3 - dupw - end - - push.8796093020160.8796093020160.8796093020160.8796093020160 - repeat.3 - dupw - end - - push.18444492269600899073.18444492269600899073.18444492269600899073.18444492269600899073 - repeat.3 - dupw - end - - push.8.8.8.8 - repeat.3 - dupw - end - - push.2305843008676823040.2305843008676823040.2305843008676823040.2305843008676823040 - repeat.3 - dupw - end - - push.18446708885042495489.18446708885042495489.18446708885042495489.18446708885042495489 - repeat.3 - dupw - end - - push.2097152.2097152.2097152.2097152 - repeat.3 - dupw - end - - push.137438953440.137438953440.137438953440.137438953440 - repeat.3 - dupw - end - - push.18302628881338728449.18302628881338728449.18302628881338728449.18302628881338728449 - repeat.3 - dupw - end - - push.512.512.512.512 - repeat.3 - dupw - end - - push.562949953290240.562949953290240.562949953290240.562949953290240 - repeat.3 - dupw - end - - push.18446744060824649729.18446744060824649729.18446744060824649729.18446744060824649729 - repeat.3 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.4 - movdn.8 - locaddr.0 - movdn.8 - - repeat.16 - repeat.4 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.4 - movdn.8 - - movup.9 - add.4 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 5 - - push.36028797018964096.36028797018964096.36028797018964096.36028797018964096 - push.36028797018964096.36028797018964096.36028797018964096.36028797018964096 - - push.36028797018963840.36028797018963840.36028797018963840.36028797018963840 - push.36028797018963840.36028797018963840.36028797018963840.36028797018963840 - - push.18446603329778778113.18446603329778778113.18446603329778778113.18446603329778778113 - push.18446603329778778113.18446603329778778113.18446603329778778113.18446603329778778113 - - push.18446603334073745409.18446603334073745409.18446603334073745409.18446603334073745409 - push.18446603334073745409.18446603334073745409.18446603334073745409.18446603334073745409 - - push.34359214072.34359214072.34359214072.34359214072 - push.34359214072.34359214072.34359214072.34359214072 - - push.18446744035054321673.18446744035054321673.18446744035054321673.18446744035054321673 - push.18446744035054321673.18446744035054321673.18446744035054321673.18446744035054321673 - - push.17870292113338400769.17870292113338400769.17870292113338400769.17870292113338400769 - push.17870292113338400769.17870292113338400769.17870292113338400769.17870292113338400769 - - push.576469548262227968.576469548262227968.576469548262227968.576469548262227968 - push.576469548262227968.576469548262227968.576469548262227968.576469548262227968 - - push.18437736732722987009.18437736732722987009.18437736732722987009.18437736732722987009 - push.18437736732722987009.18437736732722987009.18437736732722987009.18437736732722987009 - - push.18437737007600893953.18437737007600893953.18437737007600893953.18437737007600893953 - push.18437737007600893953.18437737007600893953.18437737007600893953.18437737007600893953 - - push.2305843009213685760.2305843009213685760.2305843009213685760.2305843009213685760 - push.2305843009213685760.2305843009213685760.2305843009213685760.2305843009213685760 - - push.16140901060200882177.16140901060200882177.16140901060200882177.16140901060200882177 - push.16140901060200882177.16140901060200882177.16140901060200882177.16140901060200882177 - - push.562949953421314.562949953421314.562949953421314.562949953421314 - push.562949953421314.562949953421314.562949953421314.562949953421314 - - push.562949953421310.562949953421310.562949953421310.562949953421310 - push.562949953421310.562949953421310.562949953421310.562949953421310 - - push.18446741870357774849.18446741870357774849.18446741870357774849.18446741870357774849 - push.18446741870357774849.18446741870357774849.18446741870357774849.18446741870357774849 - - push.18446741870424883713.18446741870424883713.18446741870424883713.18446741870424883713 - push.18446741870424883713.18446741870424883713.18446741870424883713.18446741870424883713 - - push.274873712576.274873712576.274873712576.274873712576 - push.274873712576.274873712576.274873712576.274873712576 - - push.18446743794532483137.18446743794532483137.18446743794532483137.18446743794532483137 - push.18446743794532483137.18446743794532483137.18446743794532483137.18446743794532483137 - - push.13835128420805115905.13835128420805115905.13835128420805115905.13835128420805115905 - push.13835128420805115905.13835128420805115905.13835128420805115905.13835128420805115905 - - push.4611756386097823744.4611756386097823744.4611756386097823744.4611756386097823744 - push.4611756386097823744.4611756386097823744.4611756386097823744.4611756386097823744 - - push.18445618152328134657.18445618152328134657.18445618152328134657.18445618152328134657 - push.18445618152328134657.18445618152328134657.18445618152328134657.18445618152328134657 - - push.18445618186687873025.18445618186687873025.18445618186687873025.18445618186687873025 - push.18445618186687873025.18445618186687873025.18445618186687873025.18445618186687873025 - - push.288230376151710720.288230376151710720.288230376151710720.288230376151710720 - push.288230376151710720.288230376151710720.288230376151710720.288230376151710720 - - push.18158513693262871553.18158513693262871553.18158513693262871553.18158513693262871553 - push.18158513693262871553.18158513693262871553.18158513693262871553.18158513693262871553 - - push.4503599627370512.4503599627370512.4503599627370512.4503599627370512 - push.4503599627370512.4503599627370512.4503599627370512.4503599627370512 - - push.4503599627370480.4503599627370480.4503599627370480.4503599627370480 - push.4503599627370480.4503599627370480.4503599627370480.4503599627370480 - - push.18446726476960108545.18446726476960108545.18446726476960108545.18446726476960108545 - push.18446726476960108545.18446726476960108545.18446726476960108545.18446726476960108545 - - push.18446726477496979457.18446726477496979457.18446726477496979457.18446726477496979457 - push.18446726477496979457.18446726477496979457.18446726477496979457.18446726477496979457 - - push.4294901759.4294901759.4294901759.4294901759 - push.4294901759.4294901759.4294901759.4294901759 - - push.18446744065119551490.18446744065119551490.18446744065119551490.18446744065119551490 - push.18446744065119551490.18446744065119551490.18446744065119551490.18446744065119551490 - - push.18374687574905061377.18374687574905061377.18374687574905061377.18374687574905061377 - push.18374687574905061377.18374687574905061377.18374687574905061377.18374687574905061377 - - push.72058693532778496.72058693532778496.72058693532778496.72058693532778496 - push.72058693532778496.72058693532778496.72058693532778496.72058693532778496 - - push.0.0.0.0 - dupw - - locaddr.2 - movdn.8 - locaddr.0 - movdn.8 - - repeat.32 - repeat.2 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.2 - movdn.8 - - movup.9 - add.2 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 6 - - push.10900537202625306992.10900537202625306992.10900537202625306992.10900537202625306992 - push.16016224591364643153.16016224591364643153.16016224591364643153.16016224591364643153 - push.3051558327610197629.3051558327610197629.3051558327610197629.3051558327610197629 - push.10853271128879547664.10853271128879547664.10853271128879547664.10853271128879547664 - push.5834015391316509212.5834015391316509212.5834015391316509212.5834015391316509212 - push.10967010099451201909.10967010099451201909.10967010099451201909.10967010099451201909 - push.16792080670893602455.16792080670893602455.16792080670893602455.16792080670893602455 - push.7709569171718681254.7709569171718681254.7709569171718681254.7709569171718681254 - push.10832292272906805046.10832292272906805046.10832292272906805046.10832292272906805046 - push.12079821679951430619.12079821679951430619.12079821679951430619.12079821679951430619 - push.10467450029535024137.10467450029535024137.10467450029535024137.10467450029535024137 - push.3341893669734556710.3341893669734556710.3341893669734556710.3341893669734556710 - push.4782006911144666502.4782006911144666502.4782006911144666502.4782006911144666502 - push.13797081185216407910.13797081185216407910.13797081185216407910.13797081185216407910 - push.912371727122717978.912371727122717978.912371727122717978.912371727122717978 - push.14004640413449681173.14004640413449681173.14004640413449681173.14004640413449681173 - push.9778634991702905054.9778634991702905054.9778634991702905054.9778634991702905054 - push.13949104517951277988.13949104517951277988.13949104517951277988.13949104517951277988 - push.5209436881246729393.5209436881246729393.5209436881246729393.5209436881246729393 - push.6336321165505697069.6336321165505697069.6336321165505697069.6336321165505697069 - push.5965722551466996711.5965722551466996711.5965722551466996711.5965722551466996711 - push.13039192753378044028.13039192753378044028.13039192753378044028.13039192753378044028 - push.17449332314429639298.17449332314429639298.17449332314429639298.17449332314429639298 - push.5029422726070465669.5029422726070465669.5029422726070465669.5029422726070465669 - push.1362567150328163374.1362567150328163374.1362567150328163374.1362567150328163374 - push.18142929134658341675.18142929134658341675.18142929134658341675.18142929134658341675 - push.7298973816981743824.7298973816981743824.7298973816981743824.7298973816981743824 - push.1356658891109943458.1356658891109943458.1356658891109943458.1356658891109943458 - push.9952623958621855812.9952623958621855812.9952623958621855812.9952623958621855812 - push.8288405288461869359.8288405288461869359.8288405288461869359.8288405288461869359 - push.4404853092538523347.4404853092538523347.4404853092538523347.4404853092538523347 - push.5575382163818481237.5575382163818481237.5575382163818481237.5575382163818481237 - push.4195631349813649467.4195631349813649467.4195631349813649467.4195631349813649467 - push.9274800740290006948.9274800740290006948.9274800740290006948.9274800740290006948 - push.9516004302527281633.9516004302527281633.9516004302527281633.9516004302527281633 - push.15951685255325333175.15951685255325333175.15951685255325333175.15951685255325333175 - push.7737793303239342069.7737793303239342069.7737793303239342069.7737793303239342069 - push.7059463857684370340.7059463857684370340.7059463857684370340.7059463857684370340 - push.18182056015521604139.18182056015521604139.18182056015521604139.18182056015521604139 - push.416595521271101505.416595521271101505.416595521271101505.416595521271101505 - push.281721071064741919.281721071064741919.281721071064741919.281721071064741919 - push.6336932523019185545.6336932523019185545.6336932523019185545.6336932523019185545 - push.3291437157293746400.3291437157293746400.3291437157293746400.3291437157293746400 - push.8180754653145198927.8180754653145198927.8180754653145198927.8180754653145198927 - push.1506708620263852673.1506708620263852673.1506708620263852673.1506708620263852673 - push.8215369291935911999.8215369291935911999.8215369291935911999.8215369291935911999 - push.9083829225849678056.9083829225849678056.9083829225849678056.9083829225849678056 - push.2843318466875884251.2843318466875884251.2843318466875884251.2843318466875884251 - push.6562114217670983589.6562114217670983589.6562114217670983589.6562114217670983589 - push.1135478653231209757.1135478653231209757.1135478653231209757.1135478653231209757 - push.16329239638270742865.16329239638270742865.16329239638270742865.16329239638270742865 - push.3332764170168812040.3332764170168812040.3332764170168812040.3332764170168812040 - push.2341058142559915780.2341058142559915780.2341058142559915780.2341058142559915780 - push.16933017626115159474.16933017626115159474.16933017626115159474.16933017626115159474 - push.411429644661718300.411429644661718300.411429644661718300.411429644661718300 - push.3328437340319972906.3328437340319972906.3328437340319972906.3328437340319972906 - push.12053668962110821384.12053668962110821384.12053668962110821384.12053668962110821384 - push.10382722127243543029.10382722127243543029.10382722127243543029.10382722127243543029 - push.17330401598553671485.17330401598553671485.17330401598553671485.17330401598553671485 - push.4299803665592489687.4299803665592489687.4299803665592489687.4299803665592489687 - push.7884753188935386879.7884753188935386879.7884753188935386879.7884753188935386879 - push.10105805016917838453.10105805016917838453.10105805016917838453.10105805016917838453 - push.13801972045324315718.13801972045324315718.13801972045324315718.13801972045324315718 - push.16192975500896648969.16192975500896648969.16192975500896648969.16192975500896648969 - - push.0.0.0.0 - dupw - - locaddr.1 - movdn.8 - locaddr.0 - movdn.8 - - repeat.64 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.2 - movdn.8 - - movup.9 - add.2 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 7 - - push.12418052014939319938.12418052014939319938.17799792287555502819.17799792287555502819 - push.8917938738259842505.8917938738259842505.4022135219920766353.4022135219920766353 - push.6416647500902310032.6416647500902310032.11779090253969091270.11779090253969091270 - push.1723406808235183235.1723406808235183235.15122929597976639421.15122929597976639421 - push.17345757166192390690.17345757166192390690.17608981172539450419.17608981172539450419 - push.13935318169262536835.13935318169262536835.16901410098125234092.16901410098125234092 - push.18064315379978805435.18064315379978805435.8636802660946538252.8636802660946538252 - push.15992013477438468440.15992013477438468440.13609673538787597335.13609673538787597335 - push.14439691868389311614.14439691868389311614.1999001684679808555.1999001684679808555 - push.13787254465881465880.13787254465881465880.10302972367325609442.10302972367325609442 - push.16003277697834987077.16003277697834987077.13730337689951546503.13730337689951546503 - push.13271129814541932305.13271129814541932305.11336048296972946422.11336048296972946422 - push.15387314553928353233.15387314553928353233.13754189079328553053.13754189079328553053 - push.17255643403020241594.17255643403020241594.16643667963227857075.16643667963227857075 - push.802080937612788754.802080937612788754.6084072299099782489.6084072299099782489 - push.11744640894413513105.11744640894413513105.8807895225777549048.8807895225777549048 - push.5932183857725394514.5932183857725394514.12113519742882795430.12113519742882795430 - push.3877499600194655066.3877499600194655066.17920296056720464863.17920296056720464863 - push.13682064192112842111.13682064192112842111.14583602245206205734.14583602245206205734 - push.1937996126393065589.1937996126393065589.408281368649950045.408281368649950045 - push.8352301510068328051.8352301510068328051.3200815326405523330.3200815326405523330 - push.502012629086366038.502012629086366038.7721858563281021845.7721858563281021845 - push.13351287672668691770.13351287672668691770.7683263524182218559.7683263524182218559 - push.11013340222467950926.11013340222467950926.9791607036678152304.9791607036678152304 - push.17222793189829815283.17222793189829815283.5988353545162139946.5988353545162139946 - push.15503969011144524712.15503969011144524712.3266250949199600360.3266250949199600360 - push.12573252732142656207.12573252732142656207.14235159967861628657.14235159967861628657 - push.4674437595989441835.4674437595989441835.7882761346440596851.7882761346440596851 - push.14576581034276612555.14576581034276612555.6125875985213995509.6125875985213995509 - push.14319745502085270124.14319745502085270124.4545880015766881148.4545880015766881148 - push.4016101032690928304.4016101032690928304.6434636298004421797.6434636298004421797 - push.7159778541829602319.7159778541829602319.6968564197111712876.6968564197111712876 - push.16873708294018933551.16873708294018933551.1691643236322650437.1691643236322650437 - push.12981983163322084213.12981983163322084213.8096577031901772269.8096577031901772269 - push.11441669947107069577.11441669947107069577.5240855794895625891.5240855794895625891 - push.14780429931651188987.14780429931651188987.7760115154989660995.7760115154989660995 - push.743439328957095187.743439328957095187.1672096098105064228.1672096098105064228 - push.16031446777576706363.16031446777576706363.8440569278248727675.8440569278248727675 - push.5163568085532294797.5163568085532294797.17032024114559111334.17032024114559111334 - push.3373377623857539246.3373377623857539246.5602886161730919912.5602886161730919912 - push.17746383299198219332.17746383299198219332.5033358220335838486.5033358220335838486 - push.7562975036722005970.7562975036722005970.6740689031673534997.6740689031673534997 - push.11622144959503752099.11622144959503752099.9432384046970425189.9432384046970425189 - push.13533145890581203496.13533145890581203496.12584286203165206160.12584286203165206160 - push.4415056545429189734.4415056545429189734.7128984430570800425.7128984430570800425 - push.8540276921445729647.8540276921445729647.7929601155018190654.7929601155018190654 - push.17571109804126144978.17571109804126144978.12184322017746068437.12184322017746068437 - push.13376768784840513824.13376768784840513824.12499229437757822825.12499229437757822825 - push.3264989070758626945.3264989070758626945.6396200096592884887.6396200096592884887 - push.13615673215290265491.13615673215290265491.16589430531118646239.16589430531118646239 - push.4459017075746761332.4459017075746761332.494216498237666005.494216498237666005 - push.10949047808060940701.10949047808060940701.13156576080775535568.13156576080775535568 - push.4406114516091528337.4406114516091528337.10259142034962052999.10259142034962052999 - push.3528436654823777706.3528436654823777706.12401628304422887372.12401628304422887372 - push.18209529147560584987.18209529147560584987.11917386045977981907.11917386045977981907 - push.13183111817796039999.13183111817796039999.9770812262840623888.9770812262840623888 - push.17225392536559506335.17225392536559506335.3953731985901328040.3953731985901328040 - push.13805406186829188324.13805406186829188324.13018888299131362939.13018888299131362939 - push.16691665375249202323.16691665375249202323.3588235763047079665.3588235763047079665 - push.14276112633913910454.14276112633913910454.10773575572760153082.10773575572760153082 - push.16549024694582589649.16549024694582589649.3105368020750933651.3105368020750933651 - push.13231174195295398387.13231174195295398387.4379521825066653820.4379521825066653820 - push.9780749169175637327.9780749169175637327.6979306088310177371.6979306088310177371 - push.8286160002038086708.8286160002038086708.1644572010096941946.1644572010096941946 - - push.0.0.0.0 - dupw - - locaddr.1 - movdn.8 - locaddr.0 - movdn.8 - - repeat.64 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movdn.5 - movdn.5 - movup.7 - movup.7 - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - movdn.5 - movdn.5 - movup.7 - movup.7 - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.2 - movdn.8 - - movup.9 - add.2 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 8 - - push.18188848021460212523.11534607820881582817.1646875315973942213.5486745524883165993 - push.3642072560212772351.4877800464475578311.5575393374484204350.5907035176470557038 - push.13166299875259380027.663576273645521453.345137759837927448.16505347069079795072 - push.6337038648111976301.9115369905823964012.17031324615803662768.6715029048772165709 - push.10689836412287594487.2128915576975457846.7709658857044466158.10362793272935287662 - push.13175002527791537704.7000476060236159302.43142219979740931.2063168383634974384 - push.13802821046066641766.17582727038347959133.7123388440527211897.16826744251348157030 - push.2761102078703419584.2915568066736270329.5308610189164171624.5350065414412465710 - push.13873674549069150927.3192518480993723602.9233735841019365682.6558703133813132827 - push.16260897004766174524.7847524879092096009.5988671030957288016.12890081553990608899 - push.663283603972705376.13928631036919645866.1406998020037882997.15975288260888972401 - push.14340064592974746604.13308480401157259412.4179502387700367909.10767003651596136761 - push.959967552227305945.7439966824493015109.11015880108829135486.10886932084851949587 - push.82910450496588172.15576136931675893974.7093403778535204495.18137812093348882831 - push.4040052327310466906.14234122862185153691.14989275032188358951.12349052935110756804 - push.11255984160303063976.17121841670624273282.748583878869661002.13140475237632941313 - push.529102008834432265.6665967936588919331.9705858230261340096.8818882629200544327 - push.2623445534628784696.9513972005086392438.3418361291673462874.15984902507394762860 - push.12432372446044483551.11006166186397307298.2346834345155397801.3030959573425503682 - push.15860937903541196405.8462836655462685385.151654034847833439.16566926477903622666 - push.2540820207615693247.2324799763032802220.8900146263973118671.17198755642670596954 - push.3859889564432383484.15210828825360601653.16434255353882186006.14213927998739126201 - push.16207038811842065314.12362461035457730117.1213232278782667512.3408203337326891081 - push.327930691828598087.5800932517989445135.14262353213520121100.11221484848131637518 - push.1368250456540211762.7691156232252781355.8463154943360171265.2852412519294352506 - push.14383800816696994133.3456327113326256432.6692683090235989383.14796202496157022040 - push.6686338362028015651.16533704610107301495.12618653059398814374.4665691128499368837 - push.4056604178567881129.6173012213905610189.18290750489319984117.1773951202121591538 - push.4389942117088447138.9203872837195467135.16647976583058746422.7689155552768670394 - push.12365007338637617157.4372556084940235727.6189017649778497877.7500740417092890225 - push.14006089359128464711.12490609572415712870.17198795428657782689.14191609616972732304 - push.8715504128117593387.432040889165782054.3142428394956321713.1849525312019627755 - push.13756831773860918871.10084557685654730061.7112675246154377750.3929858786378642316 - push.4088309022520035137.6820186327231405039.11140760477401398424.12337821426711963180 - push.12489358087930152296.11703289425843512051.18222393521806856990.5006481804801239664 - push.12032395915935294938.14857320394153102038.12216811346274483113.15049383599936516047 - push.14259728110745696775.17668002479022071670.15339107541552850108.6468851066622783835 - push.1561169760991269037.12992126221614554207.6889485207579503204.625810225600154958 - push.4025446980409437899.8178098736737310378.5500770423122943299.9714604383004622450 - push.16651939688552765673.3158366299580748670.1392595059675174803.10765599713046287558 - push.10461664704817933990.8882481555027559655.6954937180696424269.1572137324173280490 - push.5665144507324065868.807842315821754643.1560799588066959011.12796895112978970121 - push.2394121898621129512.8383068400017029755.15076497439326288290.12982989459991844517 - push.7657453289212455099.7344548176412377620.14808420073763128510.6365632919551470868 - push.8427667919763358302.6462738526574037144.12486396704535672088.10141440556758839363 - push.299265237327641189.12577098593386243920.15719620231976724277.8540402708529449685 - push.5919394105455887829.3416153203055267997.7786896173617522154.14031575217582598302 - push.9931515098122800394.11630195332861834531.11724314991892485077.17740512949860132546 - push.12053974342864933269.7161240326935577237.3639634848410716242.15919780095311700439 - push.2117308758935292362.8854965448075557493.16625729085584007730.15471613066104988457 - push.11575701465310827636.4295002282146690441.15597523257926919464.3308892972056812266 - push.12582249520745188423.12505800551746292235.13315466594398149922.12066191983457963400 - push.16938470071482338896.15499491376360706981.3878624198769971593.13092440112352401730 - push.10670334717871145615.16677776346006097586.1949690407240864933.14248669673568039774 - push.8424275818888585779.7812684066897416275.14290012408112277771.4295815520590785595 - push.14099721646927849786.8024399707039913807.15913274187758939207.18074852694000884838 - push.12316227567088954246.17527399748276289503.5152080643914132488.14561398366328274390 - push.15948194847534211277.4576915052531526319.5164132063260791647.152897937997792376 - push.16138512030456545775.9592291974280344910.14948939724807468932.4971430691134054059 - push.16909802868642731951.9785468031858712064.16221402320798919601.12333197645027200248 - push.16905094363786184290.18168576350837626231.4419568367257164534.1223183503982339008 - push.4323157012483891262.5810722514138689194.11091989500308225777.12150643879775871958 - push.6151214463239765361.4496767977211359228.644010080489266561.6431860813144680379 - push.8911053381972245530.2877957390243263830.2951359516584421996.19112242249724047 - - push.0.0.0.0 - dupw - - locaddr.1 - movdn.8 - locaddr.0 - movdn.8 - - repeat.64 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.2 - swap - movup.6 - movup.5 - - movup.5 - movup.5 - movup.7 - movup.7 - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.butterfly - - movup.5 - swap - movup.5 - - movup.5 - movup.7 - movup.6 - movup.7 - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.2 - movdn.8 - - movup.9 - add.2 - movdn.9 - end - - drop - drop - - dropw - dropw - - # bit-reversed order NTT vector lives in absolute memory address - # starting at 👇; total 128 consecutive addresses are used for storing - # whole polynomial ( of degree 512 ) - - locaddr.0 -end - -#! Applies four inverse NTT butterflies on four different indices, given following stack state -#! -#! [k0, k1, k2, k3, A0, B0, C0, D0, A1, B1, C1, D1] -#! -#! Here k`i` => i-th constant i.e. negative of ω raised to *some* power | ω => 2N -th primitive root of unity, N = 512 -#! -#! A{0, 1} -> first inverse butterfly will be applied on these two elements -#! B{0, 1} -> second inverse butterfly will be applied on these two elements -#! C{0, 1} -> third inverse butterfly will be applied on these two elements -#! D{0, 1} -> fourth inverse butterfly will be applied on these two elements -#! -#! Four independent inverse butterflies are applied in following way -#! -#! t0 = A1 | t1 = B1 | t2 = C1 | t3 = D1 -#! --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- - -#! A1' = t0 + A0 | B1' = t1 + B0 | C1' = t2 + C0 | D1' = t3 + D0 -#! A0' = (t0 - A0) * k0 | B0' = (t1 - B0) * k1 | C0' = (t2 - C0) * k2 | D0' = (t3 - D0) * k3 -#! -#! After four independent butterflies are applied, resulting stack state should look like -#! -#! [A0', B0', C0', D0', A1', B1', C1', D1'] -proc.ibutterfly - dupw.2 - dupw.2 - - movup.4 - add - - swap - movup.4 - add - swap - - movup.2 - movup.4 - add - movdn.2 - - movup.3 - movup.4 - add - movdn.3 - - movupw.2 - movupw.3 - - movup.4 - sub - - swap - movup.4 - sub - swap - - movup.2 - movup.4 - sub - movdn.2 - - movup.3 - movup.4 - sub - movdn.3 - - movupw.2 - - movup.4 - mul - - swap - movup.4 - mul - swap - - movup.2 - movup.4 - mul - movdn.2 - - movup.3 - movup.4 - mul - movdn.3 -end - -#! Given four elements on stack top, this routine multiplies each of them by invN = 18410715272404008961, -#! such that N = 512 -#! -#! invN = (1/ 512) modulo q | q = 2^64 - 2^32 + 1 -#! -#! Expected input stack state: -#! -#! [a0, a1, a2, a3] -#! -#! After applying routine, stack looks like -#! -#! [a0', a1', a2', a3'] -#! -#! a{i}' = (a{i} * invN) modulo q | i ∈ [0, 4) -proc.mul_by_invN - push.18410715272404008961 - mul - - swap - push.18410715272404008961 - mul - swap - - movup.2 - push.18410715272404008961 - mul - movdn.2 - - movup.3 - push.18410715272404008961 - mul - movdn.3 -end - -#! Applies inverse NTT on a vector of length 512, where each element ∈ Zp | p = 2^64 − 2^32 + 1, -#! producing elements in time domain in standard order, while input vector is expected to be in -#! bit-reversed order. -#! -#! Expected stack state as input: -#! -#! [start_addr, ...] | Single absolute memory address, where polynomial starts -#! -#! Note, total 128 memory addresses are required for storing whole polynomial. Next 127 -#! addresses are consecutive i.e. computable by using `add.1` instruction on previous address. -#! -#! addr{i} holds values V[(i << 2) .. ((i+1) << 2)] | i ∈ [0, 128) and addr0 = start_addr -#! -#! After applying iNTT, normal order vector is returned back as single absolute memory -#! addresses on stack, where it begins storing the polynomial. Consecutive 127 addresses should -#! similarly be computable using `add.1` instruction. -#! -#! [start_addr', ...] | Single absolute memory address, where resulting polynomial starts -#! -#! Note, input memory allocation is not mutated, instead output is stored in different memory allocation. -export.backward.128 - # prepare input - - locaddr.0 - push.0.0.0.0 - - repeat.128 - dup.5 - mem_loadw - - dup.4 - mem_storew - - movup.5 - add.1 - movdn.5 - - movup.4 - add.1 - movdn.4 - end - - dropw - drop - drop - - # iter = 0 - - push.18427631827164860274.15495384552830162325.15568786679171320491.9535690687442338791 - push.12014883256269903942.17802733988925317760.13949976092203225093.12295529606174818960 - push.6296100189638712363.7354754569106358544.12636021555275895127.14123587056930693059 - push.17223560565432245313.14027175702157419787.278167718576958090.1541649705628400031 - push.6113546424387384073.2225341748615664720.8661276037555872257.1536941200771852370 - push.13475313378280530262.3497804344607115389.8854452095134239411.2308232038958038546 - push.18293846131416791945.13282612006153792674.13869829016883058002.2498549221880373044 - push.3885345703086309931.13294663425500451833.919344321138294818.6130516502325630075 - push.371891375413699483.2533469881655645114.10422344362374670514.4347022422486734535 - push.14150928548823798726.4156731661302306550.10634060002517168046.10022468250525998542 - push.4198074395846544547.16497053662173719388.1768967723408486735.7776409351543438706 - push.5354303957062182591.14568119870644612728.2947252693053877340.1508273997932245425 - push.6380552085956620921.5131277475016434399.5940943517668292086.5864494548669395898 - push.15137851097357772055.2849220811487664857.14151741787267893880.6871042604103756685 - push.2975131003309595864.1821014983830576591.9591778621339026828.16329435310479291959 - push.2526963974102883882.14807109221003868079.11285503742479007084.6392769726549651052 - push.706231119554451775.6722429077522099244.6816548736552749790.8515228971291783927 - push.4415168851831986019.10659847895797062167.15030590866359316324.12527349963958696492 - push.9906341360885134636.2727123837437860044.5869645476028340401.18147478832086943132 - push.8305303512655744958.5960347364878912233.11984005542840547177.10019076149651226019 - push.12081111149863113453.3638323995651455811.11102195893002206701.10789290780202129222 - push.5463754609422739804.3370246630088296031.10063675669397554566.16052622170793454809 - push.5649848956435614200.16885944481347625310.17638901753592829678.12781599562090518453 - push.16874606745241303831.11491806888718160052.9564262514387024666.7985079364596650331 - push.7681144356368296763.17054149009739409518.15288377769833835651.1794804380861818648 - push.8732139686409961871.12945973646291641022.10268645332677273943.14421297089005146422 - push.17820933843814429363.11557258861835081117.5454617847800030114.16885574308423315284 - push.11977893002791800486.3107636527861734213.778741590392512651.4187015958668887546 - push.3397360469478068274.6229932723140101208.3589423675261482283.6414348153479289383 - push.13440262264613344657.224350547607727331.6743454643571072270.5957385981484432025 - push.6108922642702621141.7305983592013185897.11626557742183179282.14358435046894549184 - push.14516885283035942005.11334068823260206571.8362186383759854260.4689912295553665450 - push.16597218757394956566.15304315674458262608.18014703180248802267.9731239941296990934 - push.4255134452441852017.1247948640756801632.5956134496998871451.4440654710286119610 - push.10946003652321694096.12257726419636086444.14074187984474348594.6081736730776967164 - push.10757588516645913927.1798767486355837899.9242871232219117186.14056801952326137183 - push.16672792867292992783.155993580094600204.12273731855508974132.14390139890846703192 - push.13781052940915215484.5828091010015769947.1913039459307282826.11760405707386568670 - push.3650541573257562281.11754060979178594938.14990416956088327889.4062943252717590188 - push.15594331550120231815.9983589126054413056.10755587837161802966.17078493612874372559 - push.7225259221282946803.4184390855894463221.12645811551425139186.18118813377585986234 - push.15038540732087693240.17233511790631916809.6084283033956854204.2239705257572519007 - push.4232816070675458120.2012488715532398315.3235915244053982668.14586854504982200837 - push.1247988426743987367.9546597805441465650.16121944306381782101.15905923861798891074 - push.1879817591510961655.18295090034566750882.9983907413951898936.2585806165873387916 - push.15415784495989080639.16099909724259186520.7440577883017277023.6014371623370100770 - push.2461841562019821461.15028382777741121447.8932772064328191883.15823298534785799625 - push.9627861440214039994.8740885839153244225.11780776132825664990.17917642060580152056 - push.5306268831781643008.17698160190544923319.1324902398790311039.7190759909111520345 - push.6097691134303827517.3457469037226225370.4212621207229430630.14406691742104117415 - push.308931976065701490.11353340290879379826.2870607137738690347.18363833618917996149 - push.7559811984562634734.7430863960585448835.11006777244921569212.17486776517187278376 - push.7679740417818447560.14267241681714216412.5138263668257324909.4106679476439837717 - push.2471455808525611920.17039746049376701324.4518113032494938455.17783460465441878945 - push.5556662515423975422.12458073038457296305.10599219190322488312.2185847064648409797 - push.11888040935601451494.9213008228395218639.15254225588420860719.4573069520345433394 - push.13096678655002118611.13138133880250412697.15531176002678313992.15685641990711164737 - push.1619999818066427291.11323355628887372424.864017031066625188.4643923023347942555 - push.16383575685779609937.18403601849434843390.11446268009178425019.5271741541623046617 - push.8083950796479296659.10737085212370118163.16317828492439126475.7756907657126989834 - push.11731715020642418612.1415419453610921553.9331374163590620309.12109705421302608020 - push.1941397000334789249.18101606309576656873.17783167795769062868.5280444194155204294 - push.12539708892944027283.12871350694930379971.13568943604939006010.14804671509201811970 - push.12959998544531418328.16799868753440642108.6912136248533001504.257896047954371798 - - push.0.0.0.0 - dupw - - locaddr.1 - movdn.8 - locaddr.0 - movdn.8 - - repeat.64 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.2 - swap - movup.6 - movup.5 - - movup.5 - movup.5 - movup.7 - movup.7 - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - movup.5 - swap - movup.5 - - movup.5 - movup.7 - movup.6 - movup.7 - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.2 - movdn.8 - - movup.9 - add.2 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 1 - - push.16802172059317642375.16802172059317642375.10160584067376497613.10160584067376497613 - push.11467437981104406950.11467437981104406950.8665994900238946994.8665994900238946994 - push.14067222244347930501.14067222244347930501.5215569874119185934.5215569874119185934 - push.15341376048663650670.15341376048663650670.1897719374831994672.1897719374831994672 - push.7673168496654431239.7673168496654431239.4170631435500673867.4170631435500673867 - push.14858508306367504656.14858508306367504656.1755078694165381998.1755078694165381998 - push.5427855770283221382.5427855770283221382.4641337882585395997.4641337882585395997 - push.14493012083513256281.14493012083513256281.1221351532855077986.1221351532855077986 - push.8675931806573960433.8675931806573960433.5263632251618544322.5263632251618544322 - push.6529358023436602414.6529358023436602414.237214921853999334.237214921853999334 - push.6045115764991696949.6045115764991696949.14918307414590806615.14918307414590806615 - push.8187602034452531322.8187602034452531322.14040629553323055984.14040629553323055984 - push.5290167988639048753.5290167988639048753.7497696261353643620.7497696261353643620 - push.17952527571176918316.17952527571176918316.13987726993667822989.13987726993667822989 - push.1857313538295938082.1857313538295938082.4831070854124318830.4831070854124318830 - push.12050543972821699434.12050543972821699434.15181754998655957376.15181754998655957376 - push.5947514631656761496.5947514631656761496.5069975284574070497.5069975284574070497 - push.6262422051668515884.6262422051668515884.875634265288439343.875634265288439343 - push.10517142914396393667.10517142914396393667.9906467147968854674.9906467147968854674 - push.11317759638843783896.11317759638843783896.14031687523985394587.14031687523985394587 - push.5862457866249378161.5862457866249378161.4913598178833380825.4913598178833380825 - push.9014360022444159132.9014360022444159132.6824599109910832222.6824599109910832222 - push.11706055037741049324.11706055037741049324.10883769032692578351.10883769032692578351 - push.13413385849078745835.13413385849078745835.700360770216364989.700360770216364989 - push.12843857907683664409.12843857907683664409.15073366445557045075.15073366445557045075 - push.1414719954855472987.1414719954855472987.13283175983882289524.13283175983882289524 - push.10006174791165856646.10006174791165856646.2415297291837877958.2415297291837877958 - push.16774647971309520093.16774647971309520093.17703304740457489134.17703304740457489134 - push.10686628914424923326.10686628914424923326.3666314137763395334.3666314137763395334 - push.13205888274518958430.13205888274518958430.7005074122307514744.7005074122307514744 - push.10350167037512812052.10350167037512812052.5464760906092500108.5464760906092500108 - push.16755100833091933884.16755100833091933884.1573035775395650770.1573035775395650770 - push.11478179872302871445.11478179872302871445.11286965527584982002.11286965527584982002 - push.12012107771410162524.12012107771410162524.14430643036723656017.14430643036723656017 - push.13900864053647703173.13900864053647703173.4126998567329314197.4126998567329314197 - push.12320868084200588812.12320868084200588812.3870163035137971766.3870163035137971766 - push.10563982722973987470.10563982722973987470.13772306473425142486.13772306473425142486 - push.4211584101552955664.4211584101552955664.5873491337271928114.5873491337271928114 - push.15180493120214983961.15180493120214983961.2942775058270059609.2942775058270059609 - push.12458390524252444375.12458390524252444375.1223950879584769038.1223950879584769038 - push.8655137032736432017.8655137032736432017.7433403846946633395.7433403846946633395 - push.10763480545232365762.10763480545232365762.5095456396745892551.5095456396745892551 - push.10724885506133562476.10724885506133562476.17944731440328218283.17944731440328218283 - push.15245928743009060991.15245928743009060991.10094442559346256270.10094442559346256270 - push.18038462700764634276.18038462700764634276.16508747943021518732.16508747943021518732 - push.3863141824208378587.3863141824208378587.4764679877301742210.4764679877301742210 - push.526448012694119458.526448012694119458.14569244469219929255.14569244469219929255 - push.6333224326531788891.6333224326531788891.12514560211689189807.12514560211689189807 - push.9638848843637035273.9638848843637035273.6702103175001071216.6702103175001071216 - push.12362671770314801832.12362671770314801832.17644663131801795567.17644663131801795567 - push.1803076106186727246.1803076106186727246.1191100666394342727.1191100666394342727 - push.4692554990086031268.4692554990086031268.3059429515486231088.3059429515486231088 - push.7110695772441637899.7110695772441637899.5175614254872652016.5175614254872652016 - push.4716406379463037818.4716406379463037818.2443466371579597244.2443466371579597244 - push.8143771702088974879.8143771702088974879.4659489603533118441.4659489603533118441 - push.16447742384734775766.16447742384734775766.4007052201025272707.4007052201025272707 - push.4837070530626986986.4837070530626986986.2454730591976115881.2454730591976115881 - push.9809941408468046069.9809941408468046069.382428689435778886.382428689435778886 - push.1545333971289350229.1545333971289350229.4511425900152047486.4511425900152047486 - push.837762896875133902.837762896875133902.1100986903222193631.1100986903222193631 - push.3323814471437944900.3323814471437944900.16723337261179401086.16723337261179401086 - push.6667653815445493051.6667653815445493051.12030096568512274289.12030096568512274289 - push.14424608849493817968.14424608849493817968.9528805331154741816.9528805331154741816 - push.646951781859081502.646951781859081502.6028692054475264383.6028692054475264383 - - push.0.0.0.0 - dupw - - locaddr.1 - movdn.8 - locaddr.0 - movdn.8 - - repeat.64 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movdn.5 - movdn.5 - movup.7 - movup.7 - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - movdn.5 - movdn.5 - movup.7 - movup.7 - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.2 - movdn.8 - - movup.9 - add.2 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 2 - - push.2253768568517935352.2253768568517935352.2253768568517935352.2253768568517935352 - push.4644772024090268603.4644772024090268603.4644772024090268603.4644772024090268603 - push.8340939052496745868.8340939052496745868.8340939052496745868.8340939052496745868 - push.10561990880479197442.10561990880479197442.10561990880479197442.10561990880479197442 - push.14146940403822094634.14146940403822094634.14146940403822094634.14146940403822094634 - push.1116342470860912836.1116342470860912836.1116342470860912836.1116342470860912836 - push.8064021942171041292.8064021942171041292.8064021942171041292.8064021942171041292 - push.6393075107303762937.6393075107303762937.6393075107303762937.6393075107303762937 - push.15118306729094611415.15118306729094611415.15118306729094611415.15118306729094611415 - push.18035314424752866021.18035314424752866021.18035314424752866021.18035314424752866021 - push.1513726443299424847.1513726443299424847.1513726443299424847.1513726443299424847 - push.16105685926854668541.16105685926854668541.16105685926854668541.16105685926854668541 - push.15113979899245772281.15113979899245772281.15113979899245772281.15113979899245772281 - push.2117504431143841456.2117504431143841456.2117504431143841456.2117504431143841456 - push.17311265416183374564.17311265416183374564.17311265416183374564.17311265416183374564 - push.11884629851743600732.11884629851743600732.11884629851743600732.11884629851743600732 - push.15603425602538700070.15603425602538700070.15603425602538700070.15603425602538700070 - push.9362914843564906265.9362914843564906265.9362914843564906265.9362914843564906265 - push.10231374777478672322.10231374777478672322.10231374777478672322.10231374777478672322 - push.16940035449150731648.16940035449150731648.16940035449150731648.16940035449150731648 - push.10265989416269385394.10265989416269385394.10265989416269385394.10265989416269385394 - push.15155306912120837921.15155306912120837921.15155306912120837921.15155306912120837921 - push.12109811546395398776.12109811546395398776.12109811546395398776.12109811546395398776 - push.18165022998349842402.18165022998349842402.18165022998349842402.18165022998349842402 - push.18030148548143482816.18030148548143482816.18030148548143482816.18030148548143482816 - push.264688053892980182.264688053892980182.264688053892980182.264688053892980182 - push.11387280211730213981.11387280211730213981.11387280211730213981.11387280211730213981 - push.10708950766175242252.10708950766175242252.10708950766175242252.10708950766175242252 - push.2495058814089251146.2495058814089251146.2495058814089251146.2495058814089251146 - push.8930739766887302688.8930739766887302688.8930739766887302688.8930739766887302688 - push.9171943329124577373.9171943329124577373.9171943329124577373.9171943329124577373 - push.14251112719600934854.14251112719600934854.14251112719600934854.14251112719600934854 - push.12871361905596103084.12871361905596103084.12871361905596103084.12871361905596103084 - push.14041890976876060974.14041890976876060974.14041890976876060974.14041890976876060974 - push.10158338780952714962.10158338780952714962.10158338780952714962.10158338780952714962 - push.8494120110792728509.8494120110792728509.8494120110792728509.8494120110792728509 - push.17090085178304640863.17090085178304640863.17090085178304640863.17090085178304640863 - push.11147770252432840497.11147770252432840497.11147770252432840497.11147770252432840497 - push.303814934756242646.303814934756242646.303814934756242646.303814934756242646 - push.17084176919086420947.17084176919086420947.17084176919086420947.17084176919086420947 - push.13417321343344118652.13417321343344118652.13417321343344118652.13417321343344118652 - push.997411754984945023.997411754984945023.997411754984945023.997411754984945023 - push.5407551316036540293.5407551316036540293.5407551316036540293.5407551316036540293 - push.12481021517947587610.12481021517947587610.12481021517947587610.12481021517947587610 - push.12110422903908887252.12110422903908887252.12110422903908887252.12110422903908887252 - push.13237307188167854928.13237307188167854928.13237307188167854928.13237307188167854928 - push.4497639551463306333.4497639551463306333.4497639551463306333.4497639551463306333 - push.8668109077711679267.8668109077711679267.8668109077711679267.8668109077711679267 - push.4442103655964903148.4442103655964903148.4442103655964903148.4442103655964903148 - push.17534372342291866343.17534372342291866343.17534372342291866343.17534372342291866343 - push.4649662884198176411.4649662884198176411.4649662884198176411.4649662884198176411 - push.13664737158269917819.13664737158269917819.13664737158269917819.13664737158269917819 - push.15104850399680027611.15104850399680027611.15104850399680027611.15104850399680027611 - push.7979294039879560184.7979294039879560184.7979294039879560184.7979294039879560184 - push.6366922389463153702.6366922389463153702.6366922389463153702.6366922389463153702 - push.7614451796507779275.7614451796507779275.7614451796507779275.7614451796507779275 - push.10737174897695903067.10737174897695903067.10737174897695903067.10737174897695903067 - push.1654663398520981866.1654663398520981866.1654663398520981866.1654663398520981866 - push.7479733969963382412.7479733969963382412.7479733969963382412.7479733969963382412 - push.12612728678098075109.12612728678098075109.12612728678098075109.12612728678098075109 - push.7593472940535036657.7593472940535036657.7593472940535036657.7593472940535036657 - push.15395185741804386692.15395185741804386692.15395185741804386692.15395185741804386692 - push.2430519478049941168.2430519478049941168.2430519478049941168.2430519478049941168 - push.7546206866789277329.7546206866789277329.7546206866789277329.7546206866789277329 - - push.0.0.0.0 - dupw - - locaddr.1 - movdn.8 - locaddr.0 - movdn.8 - - repeat.64 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.2 - movdn.8 - - movup.9 - add.2 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 3 - - push.18374685375881805825.18374685375881805825.18374685375881805825.18374685375881805825 - push.18374685375881805825.18374685375881805825.18374685375881805825.18374685375881805825 - - push.72056494509522944.72056494509522944.72056494509522944.72056494509522944 - push.72056494509522944.72056494509522944.72056494509522944.72056494509522944 - - push.4295032831.4295032831.4295032831.4295032831 - push.4295032831.4295032831.4295032831.4295032831 - - push.18446744065119682562.18446744065119682562.18446744065119682562.18446744065119682562 - push.18446744065119682562.18446744065119682562.18446744065119682562.18446744065119682562 - - push.17591917604864.17591917604864.17591917604864.17591917604864 - push.17591917604864.17591917604864.17591917604864.17591917604864 - - push.17592454475776.17592454475776.17592454475776.17592454475776 - push.17592454475776.17592454475776.17592454475776.17592454475776 - - push.18442240469787213841.18442240469787213841.18442240469787213841.18442240469787213841 - push.18442240469787213841.18442240469787213841.18442240469787213841.18442240469787213841 - - push.18442240469787213809.18442240469787213809.18442240469787213809.18442240469787213809 - push.18442240469787213809.18442240469787213809.18442240469787213809.18442240469787213809 - - push.288230376151712768.288230376151712768.288230376151712768.288230376151712768 - push.288230376151712768.288230376151712768.288230376151712768.288230376151712768 - - push.18158513693262873601.18158513693262873601.18158513693262873601.18158513693262873601 - push.18158513693262873601.18158513693262873601.18158513693262873601.18158513693262873601 - - push.1125882726711296.1125882726711296.1125882726711296.1125882726711296 - push.1125882726711296.1125882726711296.1125882726711296.1125882726711296 - - push.1125917086449664.1125917086449664.1125917086449664.1125917086449664 - push.1125917086449664.1125917086449664.1125917086449664.1125917086449664 - - push.13834987683316760577.13834987683316760577.13834987683316760577.13834987683316760577 - push.13834987683316760577.13834987683316760577.13834987683316760577.13834987683316760577 - - push.4611615648609468416.4611615648609468416.4611615648609468416.4611615648609468416 - push.4611615648609468416.4611615648609468416.4611615648609468416.4611615648609468416 - - push.274882101184.274882101184.274882101184.274882101184 - push.274882101184.274882101184.274882101184.274882101184 - - push.18446743794540871745.18446743794540871745.18446743794540871745.18446743794540871745 - push.18446743794540871745.18446743794540871745.18446743794540871745.18446743794540871745 - - push.2198989700608.2198989700608.2198989700608.2198989700608 - push.2198989700608.2198989700608.2198989700608.2198989700608 - - push.2199056809472.2199056809472.2199056809472.2199056809472 - push.2199056809472.2199056809472.2199056809472.2199056809472 - - push.18446181119461163011.18446181119461163011.18446181119461163011.18446181119461163011 - push.18446181119461163011.18446181119461163011.18446181119461163011.18446181119461163011 - - push.18446181119461163007.18446181119461163007.18446181119461163007.18446181119461163007 - push.18446181119461163007.18446181119461163007.18446181119461163007.18446181119461163007 - - push.2305843009213702144.2305843009213702144.2305843009213702144.2305843009213702144 - push.2305843009213702144.2305843009213702144.2305843009213702144.2305843009213702144 - - push.16140901060200898561.16140901060200898561.16140901060200898561.16140901060200898561 - push.16140901060200898561.16140901060200898561.16140901060200898561.16140901060200898561 - - push.9007061813690368.9007061813690368.9007061813690368.9007061813690368 - push.9007061813690368.9007061813690368.9007061813690368.9007061813690368 - - push.9007336691597312.9007336691597312.9007336691597312.9007336691597312 - push.9007336691597312.9007336691597312.9007336691597312.9007336691597312 - - push.17870274521152356353.17870274521152356353.17870274521152356353.17870274521152356353 - push.17870274521152356353.17870274521152356353.17870274521152356353.17870274521152356353 - - push.576451956076183552.576451956076183552.576451956076183552.576451956076183552 - push.576451956076183552.576451956076183552.576451956076183552.576451956076183552 - - push.34360262648.34360262648.34360262648.34360262648 - push.34360262648.34360262648.34360262648.34360262648 - - push.18446744035055370249.18446744035055370249.18446744035055370249.18446744035055370249 - push.18446744035055370249.18446744035055370249.18446744035055370249.18446744035055370249 - - push.140735340838912.140735340838912.140735340838912.140735340838912 - push.140735340838912.140735340838912.140735340838912.140735340838912 - - push.140739635806208.140739635806208.140739635806208.140739635806208 - push.140739635806208.140739635806208.140739635806208.140739635806208 - - push.18410715272395620481.18410715272395620481.18410715272395620481.18410715272395620481 - push.18410715272395620481.18410715272395620481.18410715272395620481.18410715272395620481 - - push.18410715272395620225.18410715272395620225.18410715272395620225.18410715272395620225 - push.18410715272395620225.18410715272395620225.18410715272395620225.18410715272395620225 - - push.0.0.0.0 - dupw - - locaddr.2 - movdn.8 - locaddr.0 - movdn.8 - - repeat.32 - repeat.2 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.2 - movdn.8 - - movup.9 - add.2 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 4 - - push.8589934592.8589934592.8589934592.8589934592 - repeat.3 - dupw - end - - push.18446181119461294081.18446181119461294081.18446181119461294081.18446181119461294081 - repeat.3 - dupw - end - - push.18446744069414583809.18446744069414583809.18446744069414583809.18446744069414583809 - repeat.3 - dupw - end - - push.144115188075855872.144115188075855872.144115188075855872.144115188075855872 - repeat.3 - dupw - end - - push.18446743931975630881.18446743931975630881.18446743931975630881.18446743931975630881 - repeat.3 - dupw - end - - push.18446744069412487169.18446744069412487169.18446744069412487169.18446744069412487169 - repeat.3 - dupw - end - - push.35184372088832.35184372088832.35184372088832.35184372088832 - repeat.3 - dupw - end - - push.16140901060737761281.16140901060737761281.16140901060737761281.16140901060737761281 - repeat.3 - dupw - end - - push.18446744069414584313.18446744069414584313.18446744069414584313.18446744069414584313 - repeat.3 - dupw - end - - push.2251799813685248.2251799813685248.2251799813685248.2251799813685248 - repeat.3 - dupw - end - - push.18446735273321564161.18446735273321564161.18446735273321564161.18446735273321564161 - repeat.3 - dupw - end - - push.18446744069280366593.18446744069280366593.18446744069280366593.18446744069280366593 - repeat.3 - dupw - end - - push.549755813888.549755813888.549755813888.549755813888 - repeat.3 - dupw - end - - push.18410715272404008961.18410715272404008961.18410715272404008961.18410715272404008961 - repeat.3 - dupw - end - - push.18446744069414551553.18446744069414551553.18446744069414551553.18446744069414551553 - repeat.3 - dupw - end - - push.9223372036854775808.9223372036854775808.9223372036854775808.9223372036854775808 - repeat.3 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.4 - movdn.8 - locaddr.0 - movdn.8 - - repeat.16 - repeat.4 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.4 - movdn.8 - - movup.9 - add.4 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 5 - - push.18446744052234715141.18446744052234715141.18446744052234715141.18446744052234715141 - repeat.7 - dupw - end - - push.18446744069414322177.18446744069414322177.18446744069414322177.18446744069414322177 - repeat.7 - dupw - end - - push.4398046511104.4398046511104.4398046511104.4398046511104 - repeat.7 - dupw - end - - push.18158513693329981441.18158513693329981441.18158513693329981441.18158513693329981441 - repeat.7 - dupw - end - - push.18446744069414584257.18446744069414584257.18446744069414584257.18446744069414584257 - repeat.7 - dupw - end - - push.18014398509481984.18014398509481984.18014398509481984.18014398509481984 - repeat.7 - dupw - end - - push.18446673700670423041.18446673700670423041.18446673700670423041.18446673700670423041 - repeat.7 - dupw - end - - push.18446744068340842497.18446744068340842497.18446744068340842497.18446744068340842497 - repeat.7 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.8 - movdn.8 - locaddr.0 - movdn.8 - - repeat.8 - repeat.8 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.8 - movdn.8 - - movup.9 - add.8 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 6 - - push.68719476736.68719476736.68719476736.68719476736 - repeat.15 - dupw - end - - push.18442240469788262401.18442240469788262401.18442240469788262401.18442240469788262401 - repeat.15 - dupw - end - - push.18446744069414580225.18446744069414580225.18446744069414580225.18446744069414580225 - repeat.15 - dupw - end - - push.1152921504606846976.1152921504606846976.1152921504606846976.1152921504606846976 - repeat.15 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.16 - movdn.8 - locaddr.0 - movdn.8 - - repeat.4 - repeat.16 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.16 - movdn.8 - - movup.9 - add.16 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 7 - - push.18446742969902956801.18446742969902956801.18446742969902956801.18446742969902956801 - repeat.31 - dupw - end - - push.18446744069397807105.18446744069397807105.18446744069397807105.18446744069397807105 - repeat.31 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.32 - movdn.8 - locaddr.0 - movdn.8 - - repeat.2 - repeat.32 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - movup.8 - add.32 - movdn.8 - - movup.9 - add.32 - movdn.9 - end - - drop - drop - - dropw - dropw - - # iter = 8 - - push.281474976710656.281474976710656.281474976710656.281474976710656 - repeat.63 - dupw - end - - push.0.0.0.0 - dupw - - locaddr.64 - movdn.8 - locaddr.0 - movdn.8 - - repeat.64 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - movup.13 - movup.13 - movup.13 - movup.13 - - exec.ibutterfly - - dup.9 - mem_storew - - swapw - - dup.8 - mem_storew - - movup.8 - add.1 - movdn.8 - - movup.9 - add.1 - movdn.9 - end - - drop - drop - - # multiply by inverse of N (= 512) - - dropw - - locaddr.0 - movdn.4 - - repeat.128 - dup.4 - mem_loadw - - exec.mul_by_invN - - dup.4 - mem_storew - - movup.4 - add.1 - movdn.4 - end - - dropw - drop - - # normal order iNTT vector lives in absolute memory address - # starting at 👇; total 128 consecutive addresses are used for storing - # whole polynomial ( of degree 512 ) - - locaddr.0 -end diff --git a/stdlib/asm/math/poly512.masm b/stdlib/asm/math/poly512.masm deleted file mode 100644 index fa6a63fde6..0000000000 --- a/stdlib/asm/math/poly512.masm +++ /dev/null @@ -1,541 +0,0 @@ -use.std::math::ntt512 -use.std::math::u64 - -#! Given two consecutive words on stack, this routine performs -#! element wise multiplication, while keeping resulting single -#! word on stack. -#! -#! Expected stack state looks like -#! -#! [a0, a1, a2, a3, b0, b1, b2, b3] -#! -#! What this routine does is -#! -#! c`i` = a`i` * b`i` mod P | i ∈ [0, 4), P = 2 ^ 64 - 2 ^ 32 + 1 -#! -#! Output stack state looks like -#! -#! [c0, c1, c2, c3] -proc.mul_word - movup.4 - mul - movdn.6 - - movup.3 - mul - movdn.5 - - movup.2 - mul - movdn.4 - - mul - movdn.3 -end - -#! Given two consecutive words on stack, this routine performs -#! element wise addition, while keeping resulting single -#! word on stack. -#! -#! Expected stack state looks like -#! -#! [a0, a1, a2, a3, b0, b1, b2, b3] -#! -#! What this routine does is -#! -#! c`i` = a`i` + b`i` mod P | i ∈ [0, 4), P = 2 ^ 64 - 2 ^ 32 + 1 -#! -#! Output stack state looks like -#! -#! [c0, c1, c2, c3] -proc.add_word - movup.4 - add - movdn.6 - - movup.3 - add - movdn.5 - - movup.2 - add - movdn.4 - - add - movdn.3 -end - -#! Given dividend ( i.e. field element a ) on stack top, this routine computes c = a % 12289 -#! -#! Expected stack state -#! -#! [a, ...] -#! -#! Output stack state looks like -#! -#! [c, ...] | c = a % 12289 -export.mod_12289 - u32split - push.12289.0 - - adv.push_u64div - - adv_push.2 - u32assert2 - - swap - push.12289 - u32overflowing_mul - - movup.2 - push.12289 - u32overflowing_madd - drop - - adv_push.2 - drop - u32assert - - dup - - movup.3 - u32overflowing_add - - movup.3 - u32overflowing_add - drop - - movup.5 - assert_eq - movup.4 - assert_eq - - swap - drop - swap - drop -end - -#! Given four elements on stack top, this routine reduces them by applying -#! modular division by 12289 ( = Falcon Signature Algorithm's Prime Number ) -#! -#! Input stack state : -#! -#! [a0, a1, a3, a3, ...] -#! -#! Operated such that -#! -#! b`i` = a`i` % 12289 | i ∈ [0..4) -#! -#! Output stack state : -#! -#! [b0, b1, b2, b3, ...] -proc.mod_12289_word - exec.mod_12289 - - swap - exec.mod_12289 - swap - - movup.2 - exec.mod_12289 - movdn.2 - - movup.3 - exec.mod_12289 - movdn.3 -end - -#! Given an operand on stack, this routine negates the element, using modular arithmetic -#! over Falcon Digital Signature Algorithm's prime field = 12289. -#! -#! All this routine does is -#! -#! b = (0 - a) % Q -#! = Q - a % Q | Q = 12289 -#! -#! Input stack state -#! -#! [a, ...] -#! -#! Output stack state looks like -#! -#! [b, ...] | b ∈ [0..12289) -proc.neg - exec.mod_12289 - - push.12289 - swap - sub -end - -#! Given four elements on stack, this routine negates those, using modular arithmetic -#! over Falcon Digital Signature Algorithm's prime field = 12289. -#! -#! All this routine does is -#! -#! b`i` = (0 - a`i`) % Q -#! = Q - a`i` % Q | Q = 12289 & i ∈ [0..4) -#! -#! Input stack state -#! -#! [a0, a1, a2, a3, ...] -#! -#! Output stack state looks like -#! -#! [b0, b1, b2, b3 ...] | b`i` ∈ [0..12289) -proc.neg_word - exec.neg - - swap - exec.neg - swap - - movup.2 - exec.neg - movdn.2 - - movup.3 - exec.neg - movdn.3 -end - -#! Given a field element, this routine does centered reduction using Miden VM -#! prime ( say Q ) and then reduces it using Falcon Post Quantum Digital -#! Signature Algorithm prime ( say Q' ) -#! -#! Q = 2 ^ 64 - 2 ^ 32 + 1 -#! Q' = 12289 -#! -#! Expected stack state -#! -#! [a, ...] -#! -#! All this routine does is -#! -#! if a > (Q >> 1): -#! b = (a - Q) % Q' -#! else: -#! b = a % Q' -#! -#! Final stack state looks like -#! -#! [b, ...] -proc.reduce - dup - push.9223372034707292160 - gt - - if.true - exec.mod_12289 - - dup - push.7002 - u32unchecked_gte - - if.true - sub.7002 - else - push.7002 - swap - sub - - push.12289 - swap - sub - end - else - exec.mod_12289 - end -end - -#! Reduces four consecutive elements living on stack top using `reduce` routine ( defined above ) -#! -#! Expected stack state -#! -#! [a0, a1, a2, a3, ...] -#! -#! What this routine does is -#! -#! b`i` = reduce(a`i`) -#! -#! Final stack state looks like -#! -#! [b0, b1, b2, b3, ...] -proc.reduce_word - exec.reduce - - swap - exec.reduce - swap - - movup.2 - exec.reduce - movdn.2 - - movup.3 - exec.reduce - movdn.3 -end - -#! Given two polynomials of degree 512 on stack as absolute memory addresses, -#! this routine computes polynomial multiplication, using NTT and iNTT. -#! -#! Imagine, two polynomials are f, g -#! -#! h = f . g, can be computed using -#! -#! iNTT(NTT(f) * NTT(g)) -#! -#! Note, * -> element wise multiplication of polynomial coefficients in NTT domain -#! -#! Input stack state : -#! -#! [f_start_addr, g_start_addr, h_start_addr, ...] -#! -#! - {f, g, h}_addr`i` -> {f, g, h}[ (i << 2) .. ((i+1) << 2) ), address holding four consecutive coefficients -#! - {f, g, h}_addr0 -> {f, g, h}_start_addr -#! -#! Output stack state : -#! -#! [ ... ] -#! -#! Consecutive 127 memory addresses can be computed from starting memory address ( living on stack top ) by -#! continuing to apply `INCR` ( = add.1 ) instruction on previous absolute memory address. -#! -#! Note, input memory addresses are considered to be read-only, they are not mutated. -export.mul_zq.128 - exec.ntt512::forward - - locaddr.0 - push.0.0.0.0 - - repeat.128 - dup.5 - mem_loadw - - dup.4 - mem_storew - - movup.5 - add.1 - movdn.5 - - movup.4 - add.1 - movdn.4 - end - - dropw - drop - drop - - exec.ntt512::forward - - locaddr.0 - push.0.0.0.0.0.0.0.0 - - repeat.128 - dup.9 - mem_loadw - - swapw - - dup.8 - mem_loadw - - exec.mul_word - - dup.4 - mem_storew - - movup.5 - add.1 - movdn.5 - - movup.4 - add.1 - movdn.4 - - push.0.0.0.0 - end - - dropw - dropw - drop - drop - - locaddr.0 - - exec.ntt512::backward - - push.0.0.0.0 - - repeat.128 - dup.4 - mem_loadw - - exec.reduce_word - - dup.5 - mem_storew - - movup.5 - add.1 - movdn.5 - - movup.4 - add.1 - movdn.4 - end - - dropw - drop - drop -end - -#! Given two polynomials of degree 512 on stack as absolute memory addresses, -#! this routine computes polynomial addition. -#! -#! Imagine, two polynomials f, g -#! -#! h = f + g, can be computed as -#! -#! [(f[i] + g[i]) % Q for i in range(512)] | Q = 12289 ( = Falcon Digital Signature Algorithm's Prime Number ) -#! -#! Input stack state : -#! -#! [f_start_addr, g_start_addr, h_start_addr, ...] -#! -#! - {f, g, h}_addr`i` -> {f, g, h}[ (i << 2) .. ((i+1) << 2) ), address holding four consecutive coefficients -#! - {f, g, h}_addr0 -> {f, g, h}_start_addr -#! -#! Output stack state : -#! -#! [ ... ] -#! -#! Consecutive 127 memory addresses can be computed from starting memory address ( living on stack top ) by -#! continuing to apply `INCR` ( = add.1 ) instruction on previous absolute memory address. -#! -#! Note, input memory addresses are considered to be read-only, they are not mutated. -export.add_zq - push.0.0.0.0.0.0.0.0 - - repeat.128 - dup.8 - mem_loadw - - swapw - - dup.9 - mem_loadw - - exec.add_word - exec.mod_12289_word - - dup.6 - mem_storew - - movup.6 - add.1 - movdn.6 - - movup.5 - add.1 - movdn.5 - - movup.4 - add.1 - movdn.4 - - push.0.0.0.0 - end - - push.0 - dropw - dropw - dropw -end - -#! Given one polynomial of degree 512 on stack as absolute memory addresses, -#! this routine negates each coefficient of that polynomial. -#! -#! Imagine, polynomial f -#! -#! g = -f, can be computed as -#! -#! [(-f[i]) % Q for i in range(512)] | Q = 12289 ( = Falcon Digital Signature Algorithm's Prime Number ) -#! -#! Input stack state : -#! -#! [f_start_addr, g_start_addr, ...] -#! -#! - {f,g}_addr`i` -> {f,g}[ (i << 2) .. ((i+1) << 2) ), address holding four consecutive coefficients -#! - {f,g}_addr0 -> {f,g}_start_addr -#! -#! Output stack state : -#! -#! [ ... ] -#! -#! Consecutive 127 memory addresses can be computed from starting memory address ( living on stack top ) by -#! continuing to apply `INCR` ( = add.1 ) instruction on previous absolute memory address. -#! -#! Note, input memory addresses are considered to be read-only, they are not mutated. -export.neg_zq - push.0.0.0.0 - - repeat.128 - dup.4 - mem_loadw - - exec.neg_word - - dup.5 - mem_storew - - movup.5 - add.1 - movdn.5 - - movup.4 - add.1 - movdn.4 - end - - dropw - drop - drop -end - -#! Given two polynomials of degree 512 on stack as absolute memory addresses, -#! this routine subtracts second polynomial from first one. -#! -#! Imagine, two polynomials f, g -#! -#! h = f - g, can be computed as -#! -#! [(f[i] - g[i]) % Q for i in range(512)] | Q = 12289 ( = Falcon Digital Signature Algorithm's Prime Number ) -#! -#! Input stack state : -#! -#! [f_start_addr, g_start_addr, h_start_addr ...] -#! -#! - {f, g, h}_addr`i` -> {f, g, h}[ (i << 2) .. ((i+1) << 2) ), address holding four consecutive coefficients -#! - {f, g, h}_addr0 -> {f, g, h}_start_addr -#! -#! Output stack state : -#! -#! [ ... ] -#! -#! Consecutive 127 memory addresses can be computed from starting memory address ( living on stack top ) by -#! continuing to apply `INCR` ( = add.1 ) instruction on previous absolute memory address. -#! -#! Note, input memory addresses are considered to be read-only, they are not mutated. -export.sub_zq.128 - locaddr.0 - movup.2 - exec.neg_zq - - locaddr.0 - exec.add_zq -end diff --git a/stdlib/docs/crypto/dsa/falcon.md b/stdlib/docs/crypto/dsa/falcon.md deleted file mode 100644 index ec7a4fe450..0000000000 --- a/stdlib/docs/crypto/dsa/falcon.md +++ /dev/null @@ -1,7 +0,0 @@ - -## std::crypto::dsa::falcon -| Procedure | Description | -| ----------- | ------------- | -| normalize_poly512 | Given a degree 512 polynomial on stack, using its starting (absolute) memory address,

      this routine normalizes each coefficient of the polynomial, using above defined

      `normalize()` routine

      Imagine, f is the given polynomial of degree 512. It can be normalized using

      g = [normalize(f[i]) for i in range(512)]

      Expected stack state :

      [f_start_addr, g_start_addr, ...] \| next 127 absolute addresses can be computed using `INCR` instruction

      Post normalization stack state looks like

      [ ... ]

      Note, input polynomial which is provided using memory addresses, is not mutated. | -| squared_norm_poly512 | Given a degree 512 polynomial in coefficient form, as starting (absolute) memory address

      on stack, this routine computes squared norm of that vector, using following formula

      Say, f = [a0, a1, a2, ..., a510, a511]

      g = sq_norm(f) = a0 ^ 2 + a1 ^ 2 + ... + a510 ^ 2 + a511 ^ 2

      Expected input stack state :

      [f_start_addr, ...] \| f_addr`i` holds f[(i << 2) .. ((i+1) << 2)]

      Consecutive 127 addresses on stack can be computed using `INCR` instruction, because memory

      addresses are consecutive i.e. monotonically increasing by 1.

      Final stack state :

      [g, ...] \| g = sq_norm(f) | -| verify | Falcon-512 Digital Signature Verification routine

      Given four degree-511 polynomials, using initial absolute memory addresses on stack,

      this routine checks whether it's a valid Falcon signature or not.

      Four degree-511 polynomials, which are provided ( in order )

      f = [f0, f1, ..., f510, f511] -> decompressed Falcon-512 signature

      g = [g0, g1, ..., g510, g511] -> public key used for signing input message

      h = [h0, h1, ..., h510, h511] -> input message hashed using SHAKE256 XOF and converted to polynomial

      k = [k0, k1, ..., k510, k511] -> [abs(i) for i in f] \| abs(a) = a < 0 ? 0 - a : a

      Each of these polynomials are represented using starting absolute memory address. Contiguous 127

      memory addresses can be computed by repeated application of INCR instruction ( read add.1 ) on previous

      absolute memory address.

      f`i` holds f[(i << 2) .. ((i+1) << 2)] \| i ∈ [0..128)

      g`i` holds g[(i << 2) .. ((i+1) << 2)] \| i ∈ [0..128)

      h`i` holds h[(i << 2) .. ((i+1) << 2)] \| i ∈ [0..128)

      k`i` holds k[(i << 2) .. ((i+1) << 2)] \| i ∈ [0..128)

      Expected stack state :

      [f_start_addr, g_start_addr, h_start_addr, k_start_addr, ...]

      After execution of verification routine, stack looks like

      [ ... ]

      If verification fails, program panics, due to failure in assertion !

      Note, input memory addresses are considered to be immutable. | diff --git a/stdlib/docs/math/ntt512.md b/stdlib/docs/math/ntt512.md deleted file mode 100644 index b2f359f182..0000000000 --- a/stdlib/docs/math/ntt512.md +++ /dev/null @@ -1,6 +0,0 @@ - -## std::math::ntt512 -| Procedure | Description | -| ----------- | ------------- | -| forward | Applies forward NTT on a vector of length 512, where each element ∈ Zp \| p = 2^64 − 2^32 + 1,

      producing elements in frequency domain in bit-reversed order.

      Expected stack state as input:

      [start_addr, ...] \| Single absolute memory address, where polynomial starts

      Note, total 128 memory addresses are required for storing whole polynomial. Next 127

      addresses are consecutive i.e. computable by using `add.1` instruction on previous address.

      addr{i} holds values V[(i << 2) .. ((i+1) << 2)] \| i ∈ [0, 128) and addr0 = start_addr

      After applying NTT, bit-reversed order vector is returned back as single absolute memory

      addresses on stack, where it begins storing the polynomial. Consecutive 127 addresses should be

      computable using `add.1` instruction.

      [start_addr', ...] \| Single absolute memory address, where resulting polynomial starts

      Note, input memory allocation is not mutated, instead output is stored in different memory allocation. | -| backward | Applies inverse NTT on a vector of length 512, where each element ∈ Zp \| p = 2^64 − 2^32 + 1,

      producing elements in time domain in standard order, while input vector is expected to be in

      bit-reversed order.

      Expected stack state as input:

      [start_addr, ...] \| Single absolute memory address, where polynomial starts

      Note, total 128 memory addresses are required for storing whole polynomial. Next 127

      addresses are consecutive i.e. computable by using `add.1` instruction on previous address.

      addr{i} holds values V[(i << 2) .. ((i+1) << 2)] \| i ∈ [0, 128) and addr0 = start_addr

      After applying iNTT, normal order vector is returned back as single absolute memory

      addresses on stack, where it begins storing the polynomial. Consecutive 127 addresses should

      similarly be computable using `add.1` instruction.

      [start_addr', ...] \| Single absolute memory address, where resulting polynomial starts

      Note, input memory allocation is not mutated, instead output is stored in different memory allocation. | diff --git a/stdlib/docs/math/poly512.md b/stdlib/docs/math/poly512.md deleted file mode 100644 index ffc412b51e..0000000000 --- a/stdlib/docs/math/poly512.md +++ /dev/null @@ -1,9 +0,0 @@ - -## std::math::poly512 -| Procedure | Description | -| ----------- | ------------- | -| mod_12289 | Given dividend ( i.e. field element a ) on stack top, this routine computes c = a % 12289

      Expected stack state

      [a, ...]

      Output stack state looks like

      [c, ...] \| c = a % 12289 | -| mul_zq | Given two polynomials of degree 512 on stack as absolute memory addresses,

      this routine computes polynomial multiplication, using NTT and iNTT.

      Imagine, two polynomials are f, g

      h = f . g, can be computed using

      iNTT(NTT(f) * NTT(g))

      Note, * -> element wise multiplication of polynomial coefficients in NTT domain

      Input stack state :

      [f_start_addr, g_start_addr, h_start_addr, ...]

      - {f, g, h}_addr`i` -> {f, g, h}[ (i << 2) .. ((i+1) << 2) ), address holding four consecutive coefficients

      - {f, g, h}_addr0 -> {f, g, h}_start_addr

      Output stack state :

      [ ... ]

      Consecutive 127 memory addresses can be computed from starting memory address ( living on stack top ) by

      continuing to apply `INCR` ( = add.1 ) instruction on previous absolute memory address.

      Note, input memory addresses are considered to be read-only, they are not mutated. | -| add_zq | Given two polynomials of degree 512 on stack as absolute memory addresses,

      this routine computes polynomial addition.

      Imagine, two polynomials f, g

      h = f + g, can be computed as

      [(f[i] + g[i]) % Q for i in range(512)] \| Q = 12289 ( = Falcon Digital Signature Algorithm's Prime Number )

      Input stack state :

      [f_start_addr, g_start_addr, h_start_addr, ...]

      - {f, g, h}_addr`i` -> {f, g, h}[ (i << 2) .. ((i+1) << 2) ), address holding four consecutive coefficients

      - {f, g, h}_addr0 -> {f, g, h}_start_addr

      Output stack state :

      [ ... ]

      Consecutive 127 memory addresses can be computed from starting memory address ( living on stack top ) by

      continuing to apply `INCR` ( = add.1 ) instruction on previous absolute memory address.

      Note, input memory addresses are considered to be read-only, they are not mutated. | -| neg_zq | Given one polynomial of degree 512 on stack as absolute memory addresses,

      this routine negates each coefficient of that polynomial.

      Imagine, polynomial f

      g = -f, can be computed as

      [(-f[i]) % Q for i in range(512)] \| Q = 12289 ( = Falcon Digital Signature Algorithm's Prime Number )

      Input stack state :

      [f_start_addr, g_start_addr, ...]

      - {f,g}_addr`i` -> {f,g}[ (i << 2) .. ((i+1) << 2) ), address holding four consecutive coefficients

      - {f,g}_addr0 -> {f,g}_start_addr

      Output stack state :

      [ ... ]

      Consecutive 127 memory addresses can be computed from starting memory address ( living on stack top ) by

      continuing to apply `INCR` ( = add.1 ) instruction on previous absolute memory address.

      Note, input memory addresses are considered to be read-only, they are not mutated. | -| sub_zq | Given two polynomials of degree 512 on stack as absolute memory addresses,

      this routine subtracts second polynomial from first one.

      Imagine, two polynomials f, g

      h = f - g, can be computed as

      [(f[i] - g[i]) % Q for i in range(512)] \| Q = 12289 ( = Falcon Digital Signature Algorithm's Prime Number )

      Input stack state :

      [f_start_addr, g_start_addr, h_start_addr ...]

      - {f, g, h}_addr`i` -> {f, g, h}[ (i << 2) .. ((i+1) << 2) ), address holding four consecutive coefficients

      - {f, g, h}_addr0 -> {f, g, h}_start_addr

      Output stack state :

      [ ... ]

      Consecutive 127 memory addresses can be computed from starting memory address ( living on stack top ) by

      continuing to apply `INCR` ( = add.1 ) instruction on previous absolute memory address.

      Note, input memory addresses are considered to be read-only, they are not mutated. | diff --git a/stdlib/tests/crypto/falcon.rs b/stdlib/tests/crypto/falcon.rs index 33dc07e7b2..ecac149343 100644 --- a/stdlib/tests/crypto/falcon.rs +++ b/stdlib/tests/crypto/falcon.rs @@ -1,2663 +1,85 @@ -use crate::build_test; -use core::fmt::Write; -use test_utils::rand::rand_array; +use miden_air::{Felt, StarkField}; -#[test] -fn test_falcon512_normalize_poly() { - let source = " - use.std::crypto::dsa::falcon - - proc.wrapper.256 - # prepare polynomial `f` - - push.12166.99.10.121 - push.18.262.12124.12226 - push.12102.180.265.139 - push.12184.12230.12194.141 - push.122.31.95.12225 - push.12048.19.93.12036 - push.12277.12027.75.163 - push.142.12200.12117.12200 - push.12219.12280.128.49 - push.12115.12253.12072.12125 - push.439.12223.220.12193 - push.11727.31.279.11956 - push.12192.11854.12131.12250 - push.17.12232.12206.12288 - push.243.12099.145.12176 - push.138.12235.234.12200 - push.12144.12132.177.12053 - push.12103.12164.12217.179 - push.12123.12189.290.19 - push.89.12161.12283.12138 - push.12071.43.12031.43 - push.62.48.88.12239 - push.12182.31.12165.9 - push.12142.12101.138.104 - push.282.12207.151.12156 - push.12213.139.200.88 - push.12247.10.204.12234 - push.12151.40.12010.90 - push.12249.12117.250.12141 - push.75.12031.12049.168 - push.10.12105.2.128 - push.12039.12219.301.110 - push.12073.17.331.12261 - push.12240.12280.0.12283 - push.13.12052.32.16 - push.72.12240.7.197 - push.61.12209.12206.304 - push.184.29.12269.136 - push.1.286.43.329 - push.241.173.12202.14 - push.169.12077.12224.12253 - push.12066.12208.185.242 - push.12212.12205.12051.202 - push.61.389.12196.73 - push.11974.11990.50.12166 - push.238.277.12284.12276 - push.12237.12273.12169.130 - push.12143.172.205.12201 - push.12175.79.364.235 - push.12045.7.47.87 - push.21.12021.12280.40 - push.97.12077.262.12132 - push.203.112.12067.12214 - push.192.12126.37.12208 - push.117.12156.184.141 - push.224.12174.12254.12022 - push.12280.12188.12274.12172 - push.260.153.5.20 - push.12053.251.12078.17 - push.12169.12214.25.12232 - push.207.12148.12258.63 - push.12269.78.12280.132 - push.12019.12268.12164.137 - push.10.109.151.12143 - push.12254.12087.12191.106 - push.192.12221.12082.52 - push.147.12144.12244.40 - push.12244.12155.11995.364 - push.224.92.60.12268 - push.14.179.12220.108 - push.135.91.133.232 - push.12198.284.12222.12257 - push.106.95.70.12210 - push.128.12264.58.155 - push.12256.11973.110.35 - push.12076.65.4.12196 - push.82.12155.11999.34 - push.12265.115.380.11974 - push.12142.81.46.394 - push.14.12088.12254.133 - push.12134.328.12265.187 - push.11953.49.12093.12137 - push.12160.12044.18.12043 - push.78.148.22.12203 - push.66.12138.410.379 - push.12232.162.92.53 - push.156.12241.12163.117 - push.1.12193.20.12275 - push.11959.12229.207.98 - push.88.12186.16.12282 - push.12145.12263.195.12114 - push.12035.62.72.256 - push.313.12230.12204.67 - push.263.12159.183.12204 - push.171.99.12129.285 - push.136.12064.12196.44 - push.12088.12205.271.98 - push.56.86.30.68 - push.48.267.260.12129 - push.44.149.12286.4 - push.12156.294.62.256 - push.347.318.149.12214 - push.161.12124.12225.11989 - push.12010.12156.143.12271 - push.345.12200.12140.12201 - push.270.12089.131.300 - push.12118.189.12212.5 - push.12258.12027.12197.12229 - push.235.12235.45.97 - push.138.50.5.12209 - push.129.10.209.12245 - push.22.118.273.140 - push.12195.88.12164.12017 - push.12079.9.12021.12021 - push.12232.12206.37.170 - push.12124.42.12130.124 - push.105.12244.12211.12155 - push.12191.8.322.122 - push.154.12230.12240.12226 - push.85.12265.12040.171 - push.156.80.12090.11757 - push.12096.250.184.171 - push.12181.12088.137.30 - push.382.252.109.12193 - push.82.12224.60.12138 - push.12139.12288.244.227 - push.296.31.12131.12229 - push.12214.12269.12236.12137 - - locaddr.127 - - repeat.128 - movup.4 - movup.4 - movup.4 - movup.4 - - dup.4 - mem_storew - dropw - - sub.1 - end - - drop - - # prepare argument ( absolute memory address ) for normalizing given polynomial - - locaddr.128 # output - locaddr.0 # input - - exec.falcon::normalize_poly512 - - # check for functional correctness ( using known answer test ) - - locaddr.128 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.121 - assert_eq - push.10 - assert_eq - push.99 - assert_eq - push.123 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.63 - assert_eq - push.165 - assert_eq - push.262 - assert_eq - push.18 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.139 - assert_eq - push.265 - assert_eq - push.180 - assert_eq - push.187 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.141 - assert_eq - push.95 - assert_eq - push.59 - assert_eq - push.105 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.64 - assert_eq - push.95 - assert_eq - push.31 - assert_eq - push.122 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.253 - assert_eq - push.93 - assert_eq - push.19 - assert_eq - push.241 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.163 - assert_eq - push.75 - assert_eq - push.262 - assert_eq - push.12 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.89 - assert_eq - push.172 - assert_eq - push.89 - assert_eq - push.142 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.49 - assert_eq - push.128 - assert_eq - push.9 - assert_eq - push.70 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.164 - assert_eq - push.217 - assert_eq - push.36 - assert_eq - push.174 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.96 - assert_eq - push.220 - assert_eq - push.66 - assert_eq - push.439 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.333 - assert_eq - push.279 - assert_eq - push.31 - assert_eq - push.562 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.39 - assert_eq - push.158 - assert_eq - push.435 - assert_eq - push.97 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.1 - assert_eq - push.83 - assert_eq - push.57 - assert_eq - push.17 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.113 - assert_eq - push.145 - assert_eq - push.190 - assert_eq - push.243 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.89 - assert_eq - push.234 - assert_eq - push.54 - assert_eq - push.138 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.236 - assert_eq - push.177 - assert_eq - push.157 - assert_eq - push.145 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.179 - assert_eq - push.72 - assert_eq - push.125 - assert_eq - push.186 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.19 - assert_eq - push.290 - assert_eq - push.100 - assert_eq - push.166 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.151 - assert_eq - push.6 - assert_eq - push.128 - assert_eq - push.89 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.43 - assert_eq - push.258 - assert_eq - push.43 - assert_eq - push.218 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.50 - assert_eq - push.88 - assert_eq - push.48 - assert_eq - push.62 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.9 - assert_eq - push.124 - assert_eq - push.31 - assert_eq - push.107 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.104 - assert_eq - push.138 - assert_eq - push.188 - assert_eq - push.147 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.133 - assert_eq - push.151 - assert_eq - push.82 - assert_eq - push.282 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.88 - assert_eq - push.200 - assert_eq - push.139 - assert_eq - push.76 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.55 - assert_eq - push.204 - assert_eq - push.10 - assert_eq - push.42 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.90 - assert_eq - push.279 - assert_eq - push.40 - assert_eq - push.138 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.148 - assert_eq - push.250 - assert_eq - push.172 - assert_eq - push.40 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.168 - assert_eq - push.240 - assert_eq - push.258 - assert_eq - push.75 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.128 - assert_eq - push.2 - assert_eq - push.184 - assert_eq - push.10 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.110 - assert_eq - push.301 - assert_eq - push.70 - assert_eq - push.250 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.28 - assert_eq - push.331 - assert_eq - push.17 - assert_eq - push.216 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.6 - assert_eq - push.0 - assert_eq - push.9 - assert_eq - push.49 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.16 - assert_eq - push.32 - assert_eq - push.237 - assert_eq - push.13 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.197 - assert_eq - push.7 - assert_eq - push.49 - assert_eq - push.72 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.304 - assert_eq - push.83 - assert_eq - push.80 - assert_eq - push.61 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.136 - assert_eq - push.20 - assert_eq - push.29 - assert_eq - push.184 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.329 - assert_eq - push.43 - assert_eq - push.286 - assert_eq - push.1 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.14 - assert_eq - push.87 - assert_eq - push.173 - assert_eq - push.241 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.36 - assert_eq - push.65 - assert_eq - push.212 - assert_eq - push.169 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.242 - assert_eq - push.185 - assert_eq - push.81 - assert_eq - push.223 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.202 - assert_eq - push.238 - assert_eq - push.84 - assert_eq - push.77 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.73 - assert_eq - push.93 - assert_eq - push.389 - assert_eq - push.61 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.123 - assert_eq - push.50 - assert_eq - push.299 - assert_eq - push.315 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.13 - assert_eq - push.5 - assert_eq - push.277 - assert_eq - push.238 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.130 - assert_eq - push.120 - assert_eq - push.16 - assert_eq - push.52 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.88 - assert_eq - push.205 - assert_eq - push.172 - assert_eq - push.146 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.235 - assert_eq - push.364 - assert_eq - push.79 - assert_eq - push.114 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.87 - assert_eq - push.47 - assert_eq - push.7 - assert_eq - push.244 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.40 - assert_eq - push.9 - assert_eq - push.268 - assert_eq - push.21 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.157 - assert_eq - push.262 - assert_eq - push.212 - assert_eq - push.97 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.75 - assert_eq - push.222 - assert_eq - push.112 - assert_eq - push.203 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.81 - assert_eq - push.37 - assert_eq - push.163 - assert_eq - push.192 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.141 - assert_eq - push.184 - assert_eq - push.133 - assert_eq - push.117 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.267 - assert_eq - push.35 - assert_eq - push.115 - assert_eq - push.224 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.117 - assert_eq - push.15 - assert_eq - push.101 - assert_eq - push.9 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.20 - assert_eq - push.5 - assert_eq - push.153 - assert_eq - push.260 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.17 - assert_eq - push.211 - assert_eq - push.251 - assert_eq - push.236 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.57 - assert_eq - push.25 - assert_eq - push.75 - assert_eq - push.120 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.63 - assert_eq - push.31 - assert_eq - push.141 - assert_eq - push.207 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.132 - assert_eq - push.9 - assert_eq - push.78 - assert_eq - push.20 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.137 - assert_eq - push.125 - assert_eq - push.21 - assert_eq - push.270 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.146 - assert_eq - push.151 - assert_eq - push.109 - assert_eq - push.10 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.106 - assert_eq - push.98 - assert_eq - push.202 - assert_eq - push.35 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.52 - assert_eq - push.207 - assert_eq - push.68 - assert_eq - push.192 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.40 - assert_eq - push.45 - assert_eq - push.145 - assert_eq - push.147 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.364 - assert_eq - push.294 - assert_eq - push.134 - assert_eq - push.45 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.21 - assert_eq - push.60 - assert_eq - push.92 - assert_eq - push.224 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.108 - assert_eq - push.69 - assert_eq - push.179 - assert_eq - push.14 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.232 - assert_eq - push.133 - assert_eq - push.91 - assert_eq - push.135 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.32 - assert_eq - push.67 - assert_eq - push.284 - assert_eq - push.91 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.79 - assert_eq - push.70 - assert_eq - push.95 - assert_eq - push.106 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.155 - assert_eq - push.58 - assert_eq - push.25 - assert_eq - push.128 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.35 - assert_eq - push.110 - assert_eq - push.316 - assert_eq - push.33 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.93 - assert_eq - push.4 - assert_eq - push.65 - assert_eq - push.213 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.34 - assert_eq - push.290 - assert_eq - push.134 - assert_eq - push.82 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.315 - assert_eq - push.380 - assert_eq - push.115 - assert_eq - push.24 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.394 - assert_eq - push.46 - assert_eq - push.81 - assert_eq - push.147 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.133 - assert_eq - push.35 - assert_eq - push.201 - assert_eq - push.14 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.187 - assert_eq - push.24 - assert_eq - push.328 - assert_eq - push.155 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.152 - assert_eq - push.196 - assert_eq - push.49 - assert_eq - push.336 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.246 - assert_eq - push.18 - assert_eq - push.245 - assert_eq - push.129 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.86 - assert_eq - push.22 - assert_eq - push.148 - assert_eq - push.78 - assert_eq - add.1 +use std::vec; +use test_utils::{ + crypto::{KeyPair, Polynomial, Rpo256, Signature}, + rand::rand_vector, + Test, Word, +}; - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.379 - assert_eq - push.410 - assert_eq - push.151 - assert_eq - push.66 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.53 - assert_eq - push.92 - assert_eq - push.162 - assert_eq - push.57 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.117 - assert_eq - push.126 - assert_eq - push.48 - assert_eq - push.156 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.14 - assert_eq - push.20 - assert_eq - push.96 - assert_eq - push.1 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.98 - assert_eq - push.207 - assert_eq - push.60 - assert_eq - push.330 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.7 - assert_eq - push.16 - assert_eq - push.103 - assert_eq - push.88 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.175 - assert_eq - push.195 - assert_eq - push.26 - assert_eq - push.144 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.256 - assert_eq - push.72 - assert_eq - push.62 - assert_eq - push.254 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.67 - assert_eq - push.85 - assert_eq - push.59 - assert_eq - push.313 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.85 - assert_eq - push.183 - assert_eq - push.130 - assert_eq - push.263 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.285 - assert_eq - push.160 - assert_eq - push.99 - assert_eq - push.171 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.44 - assert_eq - push.93 - assert_eq - push.225 - assert_eq - push.136 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.98 - assert_eq - push.271 - assert_eq - push.84 - assert_eq - push.201 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.68 - assert_eq - push.30 - assert_eq - push.86 - assert_eq - push.56 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.160 - assert_eq - push.260 - assert_eq - push.267 - assert_eq - push.48 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.4 - assert_eq - push.3 - assert_eq - push.149 - assert_eq - push.44 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.256 - assert_eq - push.62 - assert_eq - push.294 - assert_eq - push.133 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.75 - assert_eq - push.149 - assert_eq - push.318 - assert_eq - push.347 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.300 - assert_eq - push.64 - assert_eq - push.165 - assert_eq - push.161 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.18 - assert_eq - push.143 - assert_eq - push.133 - assert_eq - push.279 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.88 - assert_eq - push.149 - assert_eq - push.89 - assert_eq - push.345 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.300 - assert_eq - push.131 - assert_eq - push.200 - assert_eq - push.270 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.5 - assert_eq - push.77 - assert_eq - push.189 - assert_eq - push.171 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.60 - assert_eq - push.92 - assert_eq - push.262 - assert_eq - push.31 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.97 - assert_eq - push.45 - assert_eq - push.54 - assert_eq - push.235 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.80 - assert_eq - push.5 - assert_eq - push.50 - assert_eq - push.138 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.44 - assert_eq - push.209 - assert_eq - push.10 - assert_eq - push.129 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.140 - assert_eq - push.273 - assert_eq - push.118 - assert_eq - push.22 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.272 - assert_eq - push.125 - assert_eq - push.88 - assert_eq - push.94 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.268 - assert_eq - push.268 - assert_eq - push.9 - assert_eq - push.210 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.170 - assert_eq - push.37 - assert_eq - push.83 - assert_eq - push.57 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.124 - assert_eq - push.159 - assert_eq - push.42 - assert_eq - push.165 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.134 - assert_eq - push.78 - assert_eq - push.45 - assert_eq - push.105 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.122 - assert_eq - push.322 - assert_eq - push.8 - assert_eq - push.98 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.63 - assert_eq - push.49 - assert_eq - push.59 - assert_eq - push.154 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.171 - assert_eq - push.249 - assert_eq - push.24 - assert_eq - push.85 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.532 - assert_eq - push.199 - assert_eq - push.80 - assert_eq - push.156 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.171 - assert_eq - push.184 - assert_eq - push.250 - assert_eq - push.193 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.30 - assert_eq - push.137 - assert_eq - push.201 - assert_eq - push.108 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.96 - assert_eq - push.109 - assert_eq - push.252 - assert_eq - push.382 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.151 - assert_eq - push.60 - assert_eq - push.65 - assert_eq - push.82 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.227 - assert_eq - push.244 - assert_eq - push.1 - assert_eq - push.150 - assert_eq - add.1 - - dup - push.0.0.0.0 - movup.4 - mem_loadw - push.60 - assert_eq - push.158 - assert_eq - push.31 - assert_eq - push.296 - assert_eq - add.1 - - push.0.0.0.0 - movup.4 - mem_loadw - push.152 - assert_eq - push.53 - assert_eq - push.20 - assert_eq - push.75 - assert_eq - end +#[test] +fn test_falcon() { + let keypair = KeyPair::new().unwrap(); - begin - exec.wrapper - end - "; + let message = rand_vector::(4).try_into().unwrap(); - let test = build_test!(source, &[]); - assert!(test.execute().is_ok()); + let signature = keypair.sign(message).unwrap(); + let test = generate_test(keypair, message, signature); + test.expect_stack(&[]) } #[test] -fn test_falcon512_vector_squared_norm() { - const WORDS: usize = 128; - const COEFFICIENTS: usize = WORDS << 2; - const FALCON_PRIME: u64 = 12289; - const MIDEN_PRIME: u64 = 18446744069414584321; - - let mut in_str = String::new(); - let in_vec = rand_array::().map(|v| v % FALCON_PRIME); +fn test_falcon_wrong_pub_key() { + let keypair = KeyPair::new().unwrap(); - let sqrd_norm = (0..COEFFICIENTS) - .map(|i| in_vec[i] * in_vec[i]) - .reduce(|acc, cur| (acc + cur) % MIDEN_PRIME) - .unwrap(); + let keypair_wrong = KeyPair::new().unwrap(); - for i in 0..WORDS { - writeln!( - in_str, - "push.{}.{}.{}.{}\nloc_storew.{}\ndropw\n", - in_vec[(i << 2) ^ 3], - in_vec[(i << 2) ^ 2], - in_vec[(i << 2) ^ 1], - in_vec[(i << 2) ^ 0], - i - ) - .unwrap(); - } - - let source = format!( - " - use.std::crypto::dsa::falcon - - proc.wrapper.128 - # prepare input polynomial `f` - {in_str} - - # prepare argument ( absolute memory address ) for computing squared norm - # of a vector ( read polynomial ) - - locaddr.0 - exec.falcon::squared_norm_poly512 - - # check for functional correctness ( using known answer test ) - - push.{sqrd_norm} - assert_eq - end - - begin - exec.wrapper - end - " - ); - - let test = build_test!(&source, &[]); - assert!(test.execute().is_ok()); + let message = rand_vector::(4).try_into().unwrap(); + let signature = keypair.sign(message).unwrap(); + let test = generate_test(keypair_wrong, message, signature); + assert!(test.execute().is_err()); } #[test] -fn test_falcon512_verify() { - let source = " - use.std::crypto::dsa::falcon - - proc.wrapper.512 - # prepare polynomial `f` ( read decompressed signature ) - - locaddr.0 - - repeat.128 - movup.4 - movup.4 - movup.4 - movup.4 - - dup.4 - mem_storew - dropw - - add.1 - end - - drop - - push.18446744069414584303.128.23.18446744069414584303 - push.18446744069414584210.18446744069414584264.226.155 - push.101.18446744069414584266.18446744069414584135.18446744069414584248 - push.18446744069414584187.348.15.332 - push.18446744069414584036.231.18446744069414584220.18446744069414584273 - push.155.63.18446744069414584189.226 - push.18446744069414584292.18446744069414584216.18446744069414583997.240 - push.18446744069414583940.135.18446744069414584286.18446744069414584093 - push.106.24.185.18446744069414584133 - push.18446744069414584198.18446744069414584022.18446744069414584303.18446744069414584152 - push.18446744069414584301.183.38.18446744069414584233 - push.18446744069414584287.299.18446744069414584221.18446744069414584312 - push.168.18446744069414584148.16.18446744069414584173 - push.18446744069414584307.18446744069414584204.403.18446744069414584172 - push.18446744069414584195.18446744069414584215.18446744069414584318.30 - push.304.18446744069414584183.18446744069414584249.18446744069414584284 - push.18446744069414584309.51.125.103 - push.18446744069414584286.18446744069414584269.76.18446744069414584293 - push.18446744069414584123.203.271.55 - push.65.99.125.230 - push.150.48.226.41 - push.184.18446744069414584163.18446744069414584295.8 - push.159.18446744069414584242.127.18446744069414584291 - push.167.18446744069414584228.18446744069414584287.18446744069414584255 - push.144.18446744069414584264.18446744069414584268.51 - push.78.205.408.18446744069414584271 - push.18446744069414584077.58.196.18446744069414584273 - push.18446744069414584057.18446744069414584128.31.18446744069414584255 - push.22.18446744069414584148.18446744069414584217.136 - push.18446744069414584119.18446744069414584240.18446744069414584288.18446744069414584031 - push.18446744069414584164.221.73.18446744069414584285 - push.18446744069414584220.18446744069414584202.183.18446744069414584226 - push.18446744069414584274.124.4.18446744069414584292 - push.5.18446744069414583953.20.25 - push.209.242.86.18446744069414584275 - push.176.18446744069414584315.131.54 - push.8.135.177.18446744069414584142 - push.108.66.178.331 - push.18446744069414584224.6.170.110 - push.67.18446744069414584124.18446744069414584134.18446744069414584012 - push.118.228.23.18446744069414584319 - push.25.18446744069414583961.160.18446744069414584181 - push.18446744069414584202.18446744069414584212.18446744069414584246.18446744069414584141 - push.0.18446744069414584164.18446744069414584158.19 - push.18446744069414583944.48.41.18446744069414584177 - push.18446744069414583980.22.18446744069414584160.234 - push.18446744069414584119.18446744069414584091.18446744069414584116.58 - push.18446744069414584315.16.18446744069414583851.8 - push.18446744069414584027.18446744069414584229.18446744069414584254.49 - push.18446744069414584278.6.34.107 - push.18446744069414584153.89.18446744069414584012.21 - push.18446744069414584164.18446744069414584004.337.18446744069414584315 - push.110.106.43.18446744069414584175 - push.18446744069414584262.15.105.98 - push.81.30.105.196 - push.18446744069414584021.18446744069414584315.18446744069414584274.18446744069414584310 - push.18446744069414584295.177.2.167 - push.195.18446744069414584163.124.18446744069414583936 - push.67.247.18446744069414583995.18446744069414584134 - push.35.234.211.18446744069414584211 - push.18446744069414584274.18446744069414583923.59.18446744069414584314 - push.18446744069414584289.45.18446744069414584139.18446744069414584280 - push.8.72.13.88 - push.69.141.18446744069414584226.18446744069414584199 - push.15.82.18446744069414584287.18446744069414584208 - push.200.18446744069414584288.18446744069414584065.18446744069414584296 - push.18446744069414584170.374.18446744069414584048.82 - push.293.175.158.18446744069414584250 - push.20.18446744069414584280.18446744069414584191.100 - push.138.18446744069414584231.18446744069414584044.18446744069414584270 - push.18446744069414584179.18446744069414584228.18446744069414584289.139 - push.18446744069414584133.18446744069414584291.334.76 - push.18446744069414584242.18446744069414584172.18446744069414584222.18446744069414584297 - push.127.291.100.18446744069414584151 - push.51.149.389.18446744069414584136 - push.18446744069414584199.243.18446744069414584130.18446744069414583899 - push.273.18446744069414584306.18446744069414584114.185 - push.18446744069414583974.18446744069414584302.2.67 - push.403.9.18446744069414584210.298 - push.18446744069414584271.18446744069414584102.18446744069414584203.18446744069414584237 - push.19.200.121.132 - push.18446744069414584022.18446744069414584234.18446744069414584143.93 - push.18446744069414584234.484.18446744069414584271.18446744069414584120 - push.18446744069414584244.114.4.88 - push.27.18446744069414584035.18446744069414584120.18446744069414584019 - push.37.18446744069414584266.18446744069414584161.3 - push.18446744069414584167.18446744069414584206.212.18446744069414584175 - push.18446744069414584279.25.18446744069414584245.4 - push.18446744069414584049.73.117.4 - push.180.18446744069414584078.61.18446744069414584287 - push.273.18446744069414584320.18446744069414584168.18446744069414584178 - push.18446744069414584284.18446744069414584200.18446744069414584134.18446744069414584290 - push.182.41.18446744069414584094.18446744069414584174 - push.18446744069414584275.59.306.18446744069414584295 - push.80.238.18446744069414584224.61 - push.18446744069414584305.18446744069414584086.18446744069414583951.149 - push.18446744069414584271.18446744069414584144.18446744069414584080.18446744069414584265 - push.18446744069414584315.77.18446744069414584287.152 - push.118.16.18446744069414584073.18446744069414584190 - push.42.18446744069414584251.187.170 - push.18446744069414583929.18446744069414584276.18446744069414584214.18446744069414584279 - push.14.18446744069414584262.18446744069414584192.162 - push.18446744069414584253.17.18446744069414584298.18446744069414584117 - push.168.60.85.18446744069414584291 - push.18446744069414584151.18446744069414584282.18446744069414584231.72 - push.18446744069414584292.207.33.18446744069414584246 - push.53.100.53.56 - push.18446744069414584249.122.18446744069414584091.18446744069414584286 - push.18446744069414584061.18446744069414584261.18446744069414584241.0 - push.18446744069414584186.82.92.47 - push.8.18446744069414584155.18446744069414584174.18446744069414584209 - push.18446744069414584214.164.378.18446744069414584300 - push.18446744069414584140.18446744069414584170.18446744069414584173.18446744069414584221 - push.45.189.331.18446744069414584104 - push.18446744069414584275.133.18446744069414584196.18446744069414584239 - push.128.160.18446744069414584044.52 - push.8.97.18446744069414584047.14 - push.18446744069414584173.18446744069414584178.130.18446744069414584204 - push.34.18446744069414583997.103.20 - push.18446744069414584192.18446744069414584126.18.18446744069414584151 - push.18446744069414584299.39.18446744069414584160.302 - push.32.184.18446744069414584288.18446744069414584126 - push.283.18446744069414584308.18446744069414584287.18446744069414584288 - push.43.18446744069414584073.121.18446744069414584082 - push.18446744069414584294.18446744069414584154.18446744069414584111.100 - push.246.241.18446744069414584043.18446744069414584117 - push.18446744069414584114.144.18446744069414584301.18446744069414584118 - push.18446744069414584294.132.18446744069414584309.80 - - locaddr.127 - - repeat.128 - movup.4 - movup.4 - movup.4 - movup.4 - - dup.4 - mem_storew - dropw - - sub.1 - end - - drop - - # prepare polynomial `g` ( read public key ) - - push.8513.6367.8750.11496 - push.7720.11184.2801.9698 - push.6495.12169.6551.3044 - push.2608.3965.10601.2608 - push.11190.5015.5266.6931 - push.6906.2735.11241.11904 - push.9359.4500.6600.7831 - push.2589.8774.5436.4245 - push.8332.696.8983.4561 - push.7575.2855.1996.4550 - push.12283.869.2784.2429 - push.2406.8000.11327.7148 - push.10658.9693.7003.9422 - push.1465.240.7617.1286 - push.10912.6893.9727.4821 - push.5020.11575.10947.4320 - push.982.12228.9103.1246 - push.1984.5066.5442.1652 - push.6828.11600.10958.5969 - push.8427.11562.9074.10785 - push.9884.3146.10225.7384 - push.7012.6914.10528.227 - push.2442.2344.618.11418 - push.9.4659.1590.12118 - push.7889.1062.2974.6054 - push.3953.10955.11552.7428 - push.6419.3360.5488.11650 - push.10273.11937.7855.2018 - push.9827.2946.10619.11760 - push.7879.10081.5288.1391 - push.4719.10976.2821.436 - push.2921.9630.9319.3805 - push.822.8476.11006.4919 - push.2966.3539.6488.3362 - push.6766.3581.11199.9066 - push.1904.8230.5432.9874 - push.3017.650.9536.10886 - push.10043.11999.3273.8013 - push.9709.3001.8661.9288 - push.5174.3436.7455.1944 - push.10546.7710.5047.887 - push.6055.10870.11586.5349 - push.7852.2913.5456.587 - push.6656.11242.89.4569 - push.1074.11556.5474.7772 - push.11848.6103.8253.5017 - push.5651.4405.6126.4716 - push.7603.11740.369.6845 - push.6450.915.7584.7746 - push.9124.256.10494.9542 - push.1531.7618.8698.4106 - push.1120.1711.9513.11543 - push.7814.947.11319.6401 - push.1379.10521.7342.4649 - push.6221.6053.4336.7114 - push.10946.8195.3752.1914 - push.6416.11370.1259.5208 - push.7596.8682.5381.5131 - push.11788.11339.2484.8281 - push.6449.2273.5553.7058 - push.2901.4196.11847.608 - push.9934.3256.6603.12045 - push.907.11513.8114.7986 - push.4038.4668.6623.8637 - push.6388.4283.5537.11237 - push.2128.2128.8930.6134 - push.7762.8973.7004.2963 - push.745.7196.10591.171 - push.8891.10421.2633.2586 - push.4723.2007.4224.3400 - push.722.8976.2104.10362 - push.6241.6325.2652.11441 - push.9040.7855.11748.2988 - push.867.9770.9407.7088 - push.1082.12110.4362.2077 - push.10985.4330.4862.1850 - push.2619.7677.10483.5379 - push.6398.2103.3252.2355 - push.9556.3245.3782.11488 - push.8587.8334.4738.5907 - push.8498.6495.5343.6139 - push.10159.8532.10335.7104 - push.12269.10616.9264.8308 - push.1508.4838.1430.4354 - push.11497.6956.2651.10559 - push.4011.2791.1131.8752 - push.5714.9498.3438.4253 - push.5019.5480.10070.10445 - push.3066.1261.7725.6473 - push.3496.2246.7815.198 - push.5569.5866.739.8064 - push.8395.668.2244.11456 - push.9293.4408.2772.5445 - push.11571.3718.761.11014 - push.10321.3579.368.3404 - push.529.10187.11875.6736 - push.4932.2568.2368.280 - push.7205.7792.7260.6205 - push.3502.11963.1381.11919 - push.4892.9950.7457.11363 - push.711.10007.5957.10373 - push.8934.8529.2571.11549 - push.5302.6209.4109.5748 - push.7545.3825.1970.5566 - push.2503.7545.11519.351 - push.4183.2813.1449.3567 - push.8500.6684.12054.7617 - push.10069.4403.2228.1397 - push.1364.9204.4417.7801 - push.9585.8282.3708.3084 - push.6005.4234.10093.5338 - push.5204.3841.1525.8209 - push.8948.3108.2267.2613 - push.9187.7324.7531.8153 - push.5060.4422.684.2570 - push.707.3214.11619.8768 - push.4774.169.5379.7175 - push.11514.3021.6510.6508 - push.3453.3931.4509.179 - push.12029.4043.4992.7772 - push.5730.8752.9766.8039 - push.9754.8370.2055.5298 - push.2970.9288.731.2872 - push.4920.10632.5281.315 - push.3040.4981.5117.609 - push.10176.695.1530.9677 - push.6452.2120.3336.5260 - push.4868.5640.3911.6772 - - locaddr.255 - - repeat.128 - movup.4 - movup.4 - movup.4 - movup.4 - - dup.4 - mem_storew - dropw - - sub.1 - end - - drop - - # prepare polynomial `h` ( read message hash converted polynomial ) - - push.7618.7764.7271.4394 - push.240.9007.7416.2384 - push.151.696.5752.9855 - push.11254.226.6491.7068 - push.10516.11999.4160.8221 - push.5661.2131.1543.1886 - push.10731.11960.10244.5368 - push.1223.5240.4765.9963 - push.10751.2666.9203.7421 - push.8385.360.12030.6617 - push.2200.1559.7969.7859 - push.1688.5958.1035.1013 - push.6134.5570.5407.6433 - push.8960.2113.318.5227 - push.10371.11650.6156.5958 - push.3686.2823.11955.8012 - push.6769.9419.3993.4488 - push.81.190.3011.11793 - push.9463.3396.2171.3566 - push.10744.852.10397.2509 - push.10901.9641.11403.4222 - push.5217.7112.8609.9784 - push.8544.1738.3735.11320 - push.11983.7633.734.2530 - push.5079.3436.811.9673 - push.8968.5560.12079.9088 - push.2836.7454.4608.862 - push.639.6743.1732.10708 - push.4875.4161.6301.9212 - push.11218.67.11674.11861 - push.7210.5869.5014.6718 - push.2706.380.2286.3909 - push.2070.4599.6989.1000 - push.826.2997.165.6746 - push.3094.391.2166.7591 - push.532.1595.11816.195 - push.10009.8671.9088.6851 - push.522.11178.5937.3377 - push.573.12185.9043.8081 - push.3058.11401.7664.6180 - push.348.9627.4467.8534 - push.4289.5381.1181.11304 - push.6045.2243.11189.7050 - push.5918.11542.11147.4685 - push.1817.6002.11775.3084 - push.3440.3810.7250.7448 - push.2387.919.2999.4003 - push.4436.9507.1425.6738 - push.9287.11417.10830.6660 - push.7950.1656.1297.476 - push.283.8597.11086.5239 - push.589.8488.8795.7944 - push.3503.9815.11322.8029 - push.5579.8690.7495.2906 - push.12064.6795.2785.6564 - push.3853.3671.1751.4550 - push.5527.3345.4434.11097 - push.5401.2248.8989.3040 - push.11125.2582.6380.5365 - push.11771.8238.11912.8595 - push.2163.8230.4250.5354 - push.6625.3398.1150.8063 - push.3488.2537.10432.3812 - push.10661.8269.1789.7507 - push.5770.6350.5495.8113 - push.2282.737.650.10641 - push.9439.10085.3053.5555 - push.11982.11108.164.840 - push.5117.5300.4751.11981 - push.4584.11753.6888.3782 - push.3948.10542.4745.6791 - push.434.3061.6757.5192 - push.3139.8759.4495.10332 - push.1111.9712.9100.10891 - push.8147.5643.10068.5768 - push.2232.8988.9849.2057 - push.7467.1020.11978.10889 - push.4118.8060.5659.7640 - push.6317.10621.10523.755 - push.5309.1323.10963.886 - push.11317.3194.7864.8345 - push.3535.10043.4283.6121 - push.6200.8954.6105.1139 - push.2251.11220.6486.8163 - push.4813.11843.11216.10137 - push.10813.5679.8204.1648 - push.11375.8547.9702.7582 - push.2277.3642.6576.3166 - push.11404.3420.12135.6431 - push.9549.10272.3869.7997 - push.1975.2226.12018.95 - push.8421.11391.10714.9038 - push.6620.6649.3572.3789 - push.5219.4008.11203.9672 - push.6510.5476.11484.7022 - push.3490.7500.9936.7836 - push.11572.10815.10576.3575 - push.1421.9053.4035.8613 - push.9806.2186.10907.11868 - push.7376.9934.5963.2861 - push.9101.5434.10503.2109 - push.446.209.1679.4296 - push.4701.3682.4013.508 - push.10643.6272.10058.6575 - push.3016.5032.8623.12217 - push.91.4684.7233.53 - push.9335.9009.4008.5022 - push.9012.9274.2276.415 - push.5016.10207.940.1750 - push.7365.10035.7526.9703 - push.2274.7850.5694.8346 - push.11501.10018.4533.7010 - push.10479.9972.11407.12055 - push.4024.4270.12158.9184 - push.454.12075.8262.6427 - push.3104.6247.6381.4144 - push.10312.2842.2999.6860 - push.3072.9317.11223.9895 - push.8506.9148.4979.5304 - push.8913.623.8621.4430 - push.8722.94.4069.8477 - push.4166.9022.10574.5812 - push.1765.6902.6646.1069 - push.11125.318.2169.9207 - push.10176.6543.6207.8256 - push.5924.1719.8671.3325 - push.352.11961.8580.1130 - push.1268.10938.11332.7679 - - locaddr.383 - - repeat.128 - movup.4 - movup.4 - movup.4 - movup.4 - - dup.4 - mem_storew - dropw - - sub.1 - end - - drop - - # prepare polynomial `k` ( read decompressed signature, where coefficients are kept in absolute value form ) - - push.18.128.23.18 - push.111.57.226.155 - push.101.55.186.73 - push.134.348.15.332 - push.285.231.101.48 - push.155.63.132.226 - push.29.105.324.240 - push.381.135.35.228 - push.106.24.185.188 - push.123.299.18.169 - push.20.183.38.88 - push.34.299.100.9 - push.168.173.16.148 - push.14.117.403.149 - push.126.106.3.30 - push.304.138.72.37 - push.12.51.125.103 - push.35.52.76.28 - push.198.203.271.55 - push.65.99.125.230 - push.150.48.226.41 - push.184.158.26.8 - push.159.79.127.30 - push.167.93.34.66 - push.144.57.53.51 - push.78.205.408.50 - push.244.58.196.48 - push.264.193.31.66 - push.22.173.104.136 - push.202.81.33.290 - push.157.221.73.36 - push.101.119.183.95 - push.47.124.4.29 - push.5.368.20.25 - push.209.242.86.46 - push.176.6.131.54 - push.8.135.177.179 - push.108.66.178.331 - push.97.6.170.110 - push.67.197.187.309 - push.118.228.23.2 - push.25.360.160.140 - push.119.109.75.180 - push.0.157.163.19 - push.377.48.41.144 - push.341.22.161.234 - push.202.230.205.58 - push.6.16.470.8 - push.294.92.67.49 - push.43.6.34.107 - push.168.89.309.21 - push.157.317.337.6 - push.110.106.43.146 - push.59.15.105.98 - push.81.30.105.196 - push.300.6.47.11 - push.26.177.2.167 - push.195.158.124.385 - push.67.247.326.187 - push.35.234.211.110 - push.47.398.59.7 - push.32.45.182.41 - push.8.72.13.88 - push.69.141.95.122 - push.15.82.34.113 - push.200.33.256.25 - push.151.374.273.82 - push.293.175.158.71 - push.20.41.130.100 - push.138.90.277.51 - push.142.93.32.139 - push.188.30.334.76 - push.79.149.99.24 - push.127.291.100.170 - push.51.149.389.185 - push.122.243.191.422 - push.273.15.207.185 - push.347.19.2.67 - push.403.9.111.298 - push.50.219.118.84 - push.19.200.121.132 - push.299.87.178.93 - push.87.484.50.201 - push.77.114.4.88 - push.27.286.201.302 - push.37.55.160.3 - push.154.115.212.146 - push.42.25.76.4 - push.272.73.117.4 - push.180.243.61.34 - push.273.1.153.143 - push.37.121.187.31 - push.182.41.227.147 - push.46.59.306.26 - push.80.238.97.61 - push.16.235.370.149 - push.50.177.241.56 - push.6.77.34.152 - push.118.16.248.131 - push.42.70.187.170 - push.392.45.107.42 - push.14.59.129.162 - push.68.17.23.204 - push.168.60.85.30 - push.170.39.90.72 - push.29.207.33.75 - push.53.100.53.56 - push.72.122.230.35 - push.260.60.80.0 - push.135.82.92.47 - push.8.166.147.112 - push.107.164.378.21 - push.181.151.148.100 - push.45.189.331.217 - push.46.133.125.82 - push.128.160.277.52 - push.8.97.274.14 - push.148.143.130.117 - push.34.324.103.20 - push.129.195.18.170 - push.22.39.161.302 - push.32.184.33.195 - push.283.13.34.33 - push.43.248.121.239 - push.27.167.210.100 - push.246.241.278.204 - push.207.144.20.203 - push.27.132.12.80 - - locaddr.511 - - repeat.128 - movup.4 - movup.4 - movup.4 - movup.4 - - dup.4 - mem_storew - dropw - - sub.1 - end - - drop - - # prepare argument ( absolute memory addresses ) for verifying falcon signature - - locaddr.384 - locaddr.256 - locaddr.128 - locaddr.0 - - # verify Falcon-512 signature, if verification fails execution will - # be stopped ( at assertion failure ) +fn test_falcon_wrong_message() { + let keypair = KeyPair::new().unwrap(); + + let message = rand_vector::(4).try_into().unwrap(); + let message_wrong = rand_vector::(4).try_into().unwrap(); + let signature = keypair.sign(message).unwrap(); + let test = generate_test(keypair, message_wrong, signature); + assert!(test.execute().is_err()); +} - exec.falcon::verify - end +fn generate_test(keypair: KeyPair, message: Word, signature: Signature) -> Test { + let source = " + use.std::crypto::dsa::rpo_falcon512 begin - exec.wrapper + exec.rpo_falcon512::verify end "; - let test = build_test!(source, &[]); - assert!(test.execute().is_ok()); + let h = Polynomial::from_pub_key(&keypair.expanded_public_key()).unwrap(); + let s2: Polynomial = (signature).sig_poly(); + let nonce = signature.nonce(); + + let prod = Polynomial::mul_modulo_p(&h, &s2) + .into_iter() + .map(|a| a as u64) + .collect::>(); + let s2 = s2.inner().into_iter().map(|a| a as u64).collect::>(); + + let h_felt = h.inner().into_iter().map(|a| Felt::new(a as u64)).collect::>(); + let h_digest = Rpo256::hash_elements(&h_felt) + .as_elements() + .iter() + .map(|a| a.as_int()) + .collect::>(); + let h = h.inner().into_iter().map(|a| a as u64).collect::>(); + let nonce = nonce.into_iter().map(|a| a.as_int() as u64).collect::>(); + let message = message.into_iter().map(|a| a.as_int() as u64).collect::>(); + + let mut adv_stack = vec![]; + adv_stack.extend_from_slice(&h); + adv_stack.extend_from_slice(&s2); + adv_stack.extend_from_slice(&prod); + + let mut op_stack = vec![]; + op_stack.extend_from_slice(&nonce); + op_stack.extend_from_slice(&message); + op_stack.extend_from_slice(&h_digest); + let test = build_test!(source, &op_stack, &adv_stack); + + test } diff --git a/stdlib/tests/crypto/mod.rs b/stdlib/tests/crypto/mod.rs index dfcd14bf91..848b9e1f62 100644 --- a/stdlib/tests/crypto/mod.rs +++ b/stdlib/tests/crypto/mod.rs @@ -1,7 +1,9 @@ +#[cfg(feature = "std")] +mod falcon; + mod blake3; mod ecdsa_secp256k1; mod elgamal; -mod falcon; mod fri; mod keccak256; mod native; diff --git a/stdlib/tests/math/mod.rs b/stdlib/tests/math/mod.rs index fbba1f1641..fe670f8eb6 100644 --- a/stdlib/tests/math/mod.rs +++ b/stdlib/tests/math/mod.rs @@ -1,6 +1,4 @@ pub mod ecgfp5; -mod ntt512; -mod poly512; mod secp256k1; mod u256_mod; mod u64_mod; diff --git a/stdlib/tests/math/ntt512.rs b/stdlib/tests/math/ntt512.rs deleted file mode 100644 index c9c913dd1b..0000000000 --- a/stdlib/tests/math/ntt512.rs +++ /dev/null @@ -1,82 +0,0 @@ -use crate::build_test; -use core::fmt::Write; -use test_utils::rand::rand_array; - -#[test] -fn test_ntt512() { - let source = generate_test_script_ntt512(); - - let test = build_test!(&source, &[]); - assert!(test.execute().is_ok()); -} - -fn generate_test_script_ntt512() -> String { - const POLYNOMIAL_LENGTH: usize = 512; - const WORDS: usize = 128; - const Q: u64 = (((1u64 << 32) - 1) << 32) + 1; // Miden Field Prime - - let polynomial = rand_array::().map(|v| v % Q); - - let mut polynomial_script = String::new(); - let mut check_result_script = String::new(); - - for i in 0..WORDS { - let _ = writeln!( - polynomial_script, - "push.{}.{}.{}.{}", - polynomial[4 * i + 3], - polynomial[4 * i + 2], - polynomial[4 * i + 1], - polynomial[4 * i] - ); - let _ = writeln!(polynomial_script, "loc_storew.{i}"); - polynomial_script.push_str("dropw\n"); - - check_result_script.push_str("dup\n"); - check_result_script.push_str("push.0.0.0.0\n"); - check_result_script.push_str("movup.4\n"); - check_result_script.push_str("mem_loadw\n"); - let _ = writeln!(check_result_script, "push.{}", polynomial[4 * i]); - check_result_script.push_str("assert_eq\n"); - let _ = writeln!(check_result_script, "push.{}", polynomial[4 * i + 1]); - check_result_script.push_str("assert_eq\n"); - let _ = writeln!(check_result_script, "push.{}", polynomial[4 * i + 2]); - check_result_script.push_str("assert_eq\n"); - let _ = writeln!(check_result_script, "push.{}", polynomial[4 * i + 3]); - check_result_script.push_str("assert_eq\n"); - check_result_script.push_str("add.1\n"); - } - - let script = format!( - " - use.std::math::ntt512 - - proc.wrapper.128 - # prepare input vector - - {polynomial_script} - - # place starting absolute memory addresses on stack, where input vector is kept, - # next addresses are computable using `add.1` instruction. - - locaddr.0 - - exec.ntt512::forward # apply forward NTT - exec.ntt512::backward # apply inverse NTT - - # test that v == v' | v -> forward -> backward -> v' - # where v = input vector - # v' = output vector holding result of iNTT(NTT(v)) - - {check_result_script} - - drop - end - - begin - exec.wrapper - end - " - ); - script -} diff --git a/stdlib/tests/math/poly512.rs b/stdlib/tests/math/poly512.rs deleted file mode 100644 index bbabc7fefc..0000000000 --- a/stdlib/tests/math/poly512.rs +++ /dev/null @@ -1,341 +0,0 @@ -use crate::build_test; -use core::fmt::Write; -use test_utils::{math::polynom, rand::rand_array, Felt, StarkField}; - -const POLYNOMIAL_LENGTH: usize = 512; -const WORDS: usize = 128; -const Q: u32 = 12289; // Prime Number - -#[test] -fn test_poly512_add_zq() { - let source = generate_test_script_add_zq(); - - let test = build_test!(&source, &[]); - assert!(test.execute().is_ok()); -} - -fn generate_test_script_add_zq() -> String { - let polynomial_1 = rand_array::().map(|v| v % Q); - let polynomial_2 = rand_array::().map(|v| v % Q); - - let result_polynomial: Vec = (0..POLYNOMIAL_LENGTH) - .map(|i| (polynomial_1[i] + polynomial_2[i]) % Q) - .collect(); - - let mut polynomial_1_script = String::new(); - let mut polynomial_2_script = String::new(); - let mut check_result_script = String::new(); - - for i in 0..WORDS { - // fill script for polynomial 1 - writeln!( - polynomial_1_script, - "push.{}.{}.{}.{}", - polynomial_1[4 * i + 3], - polynomial_1[4 * i + 2], - polynomial_1[4 * i + 1], - polynomial_1[4 * i] - ) - .unwrap(); - writeln!(polynomial_1_script, "loc_storew.{i}").unwrap(); - writeln!(polynomial_1_script, "dropw").unwrap(); - - // fill script for polynomial 2 - writeln!( - polynomial_2_script, - "push.{}.{}.{}.{}", - polynomial_2[4 * i + 3], - polynomial_2[4 * i + 2], - polynomial_2[4 * i + 1], - polynomial_2[4 * i] - ) - .unwrap(); - writeln!(polynomial_2_script, "loc_storew.{}", i + 128).unwrap(); - writeln!(polynomial_2_script, "dropw").unwrap(); - - // fill script for checking the result - writeln!(check_result_script, "push.0.0.0.0").unwrap(); - writeln!(check_result_script, "loc_loadw.{}", i + 256).unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 1]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 2]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 3]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - } - - let script = format!( - " - use.std::math::poly512 - - proc.wrapper.384 - {polynomial_1_script} - - {polynomial_2_script} - - locaddr.256 # output - locaddr.128 # input 1 - locaddr.0 # input 0 - - exec.poly512::add_zq - - {check_result_script} - end - - begin - exec.wrapper - end - " - ); - script -} - -#[test] -fn test_poly512_neg_zq() { - let source = generate_test_script_neg_zq(); - - let test = build_test!(&source, &[]); - assert!(test.execute().is_ok()); -} - -fn generate_test_script_neg_zq() -> String { - let polynomial_1 = rand_array::().map(|v| v % Q); - - let result_polynomial: Vec = (0..POLYNOMIAL_LENGTH).map(|i| Q - polynomial_1[i]).collect(); - - let mut polynomial_1_script = String::new(); - let mut check_result_script = String::new(); - - for i in 0..WORDS { - // fill script for polynomial 1 - writeln!( - polynomial_1_script, - "push.{}.{}.{}.{}", - polynomial_1[4 * i + 3], - polynomial_1[4 * i + 2], - polynomial_1[4 * i + 1], - polynomial_1[4 * i] - ) - .unwrap(); - writeln!(polynomial_1_script, "loc_storew.{i}").unwrap(); - writeln!(polynomial_1_script, "dropw").unwrap(); - - // fill script for checking the result - writeln!(check_result_script, "push.0.0.0.0").unwrap(); - writeln!(check_result_script, "loc_loadw.{}", i + 128).unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 1]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 2]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 3]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - } - - let script = format!( - " - use.std::math::poly512 - - proc.wrapper.256 - {polynomial_1_script} - - locaddr.128 # output - locaddr.0 # input 0 - - exec.poly512::neg_zq - - {check_result_script} - end - - begin - exec.wrapper - end - " - ); - script -} - -#[test] -fn test_poly512_sub_zq() { - let source = generate_test_script_sub_zq(); - - let test = build_test!(&source, &[]); - assert!(test.execute().is_ok()); -} - -fn generate_test_script_sub_zq() -> String { - let polynomial_1 = rand_array::().map(|v| v % Q); - let polynomial_2 = rand_array::().map(|v| v % Q); - - let result_polynomial: Vec = (0..POLYNOMIAL_LENGTH) - .map(|i| (polynomial_1[i] + Q - polynomial_2[i]) % Q) - .collect(); - - let mut polynomial_1_script = String::new(); - let mut polynomial_2_script = String::new(); - let mut check_result_script = String::new(); - - for i in 0..WORDS { - // fill script for polynomial 1 - writeln!( - polynomial_1_script, - "push.{}.{}.{}.{}", - polynomial_1[4 * i + 3], - polynomial_1[4 * i + 2], - polynomial_1[4 * i + 1], - polynomial_1[4 * i] - ) - .unwrap(); - writeln!(polynomial_1_script, "loc_storew.{i}").unwrap(); - writeln!(polynomial_1_script, "dropw").unwrap(); - - // fill script for polynomial 2 - writeln!( - polynomial_2_script, - "push.{}.{}.{}.{}", - polynomial_2[4 * i + 3], - polynomial_2[4 * i + 2], - polynomial_2[4 * i + 1], - polynomial_2[4 * i] - ) - .unwrap(); - writeln!(polynomial_2_script, "loc_storew.{}", i + 128).unwrap(); - writeln!(polynomial_1_script, "dropw").unwrap(); - - // fill script for checking the result - writeln!(check_result_script, "push.0.0.0.0").unwrap(); - writeln!(check_result_script, "loc_loadw.{}", i + 256).unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 1]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 2]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 3]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - } - - let script = format!( - " - use.std::math::poly512 - - proc.wrapper.384 - {polynomial_1_script} - - {polynomial_2_script} - - locaddr.256 # output - locaddr.128 # input 1 - locaddr.0 # input 0 - - exec.poly512::sub_zq - - {check_result_script} - end - - begin - exec.wrapper - end - " - ); - script -} - -#[test] -fn test_poly512_mul_zq() { - let source = generate_test_script_mul_zq(); - - let test = build_test!(&source, &[]); - assert!(test.execute().is_ok()); -} - -fn generate_test_script_mul_zq() -> String { - const Q: u64 = 12289; // Prime Number - - let polynomial_1 = rand_array::().map(|v| Felt::new(v % Q)); - let polynomial_2 = rand_array::().map(|v| Felt::new(v % Q)); - - let result_polynomial: Vec = polynom::mul(&polynomial_1, &polynomial_2) - .iter() - .map(|v| v.as_int() % Q) - .collect(); - - let (lower, upper) = result_polynomial.split_at(512); - let mut upper = upper.to_vec(); - upper.push(0); - - let result_polynomial: Vec = - (0..POLYNOMIAL_LENGTH).map(|i| (lower[i] + Q - upper[i]) % Q).collect(); - - let mut polynomial_1_script = String::new(); - let mut polynomial_2_script = String::new(); - let mut check_result_script = String::new(); - - for i in 0..WORDS { - // fill script for polynomial 1 - writeln!( - polynomial_1_script, - "push.{}.{}.{}.{}", - polynomial_1[4 * i + 3], - polynomial_1[4 * i + 2], - polynomial_1[4 * i + 1], - polynomial_1[4 * i] - ) - .unwrap(); - writeln!(polynomial_1_script, "loc_storew.{i}").unwrap(); - writeln!(polynomial_1_script, "dropw").unwrap(); - - // fill script for polynomial 2 - writeln!( - polynomial_2_script, - "push.{}.{}.{}.{}", - polynomial_2[4 * i + 3], - polynomial_2[4 * i + 2], - polynomial_2[4 * i + 1], - polynomial_2[4 * i] - ) - .unwrap(); - writeln!(polynomial_2_script, "loc_storew.{}", i + 128).unwrap(); - writeln!(polynomial_1_script, "dropw").unwrap(); - - // fill script for checking the result - writeln!(check_result_script, "push.0.0.0.0").unwrap(); - writeln!(check_result_script, "loc_loadw.{}", i + 256).unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 1]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 2]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - writeln!(check_result_script, "push.{}", result_polynomial[4 * i + 3]).unwrap(); - writeln!(check_result_script, "assert_eq").unwrap(); - } - - let script = format!( - " - use.std::math::poly512 - - proc.wrapper.384 - {polynomial_1_script} - - {polynomial_2_script} - - locaddr.256 # output - locaddr.128 # input 1 - locaddr.0 # input 0 - - exec.poly512::mul_zq - - {check_result_script} - end - - begin - exec.wrapper - end - " - ); - script -} diff --git a/test-utils/src/crypto.rs b/test-utils/src/crypto.rs index faba323c56..6aded79b56 100644 --- a/test-utils/src/crypto.rs +++ b/test-utils/src/crypto.rs @@ -4,6 +4,7 @@ use super::{Felt, Vec, Word, ZERO}; // ================================================================================================ pub use vm_core::crypto::{ + dsa::*, hash::{Rpo256, RpoDigest}, merkle::{ EmptySubtreeRoots, MerkleError, MerklePath, MerkleStore, MerkleTree, Mmr, MmrPeaks, From 71091b7bcf18489a0c7a866d044b622411056829 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Thu, 5 Oct 2023 01:11:00 -0700 Subject: [PATCH 105/120] fix: assert2 errors and minor refactoring --- core/src/lib.rs | 2 +- stdlib/Cargo.toml | 10 +++++----- stdlib/asm/crypto/dsa/rpo_falcon512.masm | 10 +++++----- stdlib/docs/crypto/dsa/rpo_falcon512.md | 15 +++++++++++++++ stdlib/tests/crypto/falcon.rs | 5 ++++- 5 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 stdlib/docs/crypto/dsa/rpo_falcon512.md diff --git a/core/src/lib.rs b/core/src/lib.rs index a3f09da52f..b7d3050f94 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -30,7 +30,7 @@ pub mod crypto { } pub mod dsa { - pub use miden_crypto::dsa::rpo_falcon512::*; + pub use miden_crypto::dsa::rpo_falcon512; } } diff --git a/stdlib/Cargo.toml b/stdlib/Cargo.toml index 33ec8d1a76..6ce166c368 100644 --- a/stdlib/Cargo.toml +++ b/stdlib/Cargo.toml @@ -27,13 +27,13 @@ std = ["test-utils/std"] assembly = { package = "miden-assembly", default-features = false, path = "../assembly", version = "0.7" } [dev-dependencies] -blake3 = "1.3.3" +blake3 = "1.4" miden-air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } -num-bigint = "0.4.3" +num-bigint = "0.4" processor = { package = "miden-processor", path = "../processor", version = "0.7", features = ["internals"], default-features = false } -serde_json = "1.0.94" -sha2 = "0.10.6" -sha3 = "0.10.6" +serde_json = "1.0" +sha2 = "0.10" +sha3 = "0.10" test-utils = { package = "miden-test-utils", path = "../test-utils" } winter-air = { package = "winter-air", version = "0.6" } winter-fri = { package = "winter-fri", version = "0.6" } diff --git a/stdlib/asm/crypto/dsa/rpo_falcon512.masm b/stdlib/asm/crypto/dsa/rpo_falcon512.masm index 140ac74a33..5558fa1723 100644 --- a/stdlib/asm/crypto/dsa/rpo_falcon512.masm +++ b/stdlib/asm/crypto/dsa/rpo_falcon512.masm @@ -26,7 +26,7 @@ export.mod_12289 adv.push_u64div adv_push.2 - u32assert.2 + u32assert2 swap push.M @@ -189,18 +189,18 @@ export.load_h_s2_and_product.1 adv_pipe dupw.1 - u32assert.2 + u32assert2 push.M u32unchecked_lt assert push.M u32unchecked_lt assert - u32assert.2 + u32assert2 push.M u32unchecked_lt assert push.M u32unchecked_lt assert dupw - u32assert.2 + u32assert2 push.M u32unchecked_lt assert push.M u32unchecked_lt assert - u32assert.2 + u32assert2 push.M u32unchecked_lt assert push.M u32unchecked_lt assert diff --git a/stdlib/docs/crypto/dsa/rpo_falcon512.md b/stdlib/docs/crypto/dsa/rpo_falcon512.md new file mode 100644 index 0000000000..f9c7e5c13f --- /dev/null +++ b/stdlib/docs/crypto/dsa/rpo_falcon512.md @@ -0,0 +1,15 @@ + +## std::crypto::dsa::rpo_falcon512 +| Procedure | Description | +| ----------- | ------------- | +| mod_12289 | Given dividend ( i.e. field element a ) on stack top, this routine computes c = a % 12289

      Expected stack state

      [a, ...]

      Output stack state looks like

      [c, ...] \| c = a % 12289 | +| hash_to_point | Takes as input a message digest, a nonce of size 40 bytes represented as 8 field elements

      and a pointer. The procedure absorbs MSG and NONCE into a fresh RPO state and squeezes the

      coefficients of a polynomial c representing the hash-to-point of (MSG \|\| NONCE). The coefficients

      are then saved in the memory region [c_ptr, c_ptr + 128).

      This implementation of the `hash_to_point` procedure avoids the rejection-sampling step

      required in the per-the-spec algorithm by using the observation on page 31 in

      https://falcon-sign.info/falcon.pdf

      Input: [c_ptr, MSG, NONCE1, NONCE0, ...]

      Output: [...]

      Cycles: 1327 | +| powers_of_tau | For an element `tau := (tau0, tau1)` in the quadratic extension field, computes all its powers

      `tau^i` for `i = 0,..., 512` and stores them in the memory region `[tau_ptr, tau_ptr + 513)`.

      The procedure returns `tau_ptr + 513`.

      Input: [tau1, tau0, tau_ptr, ...]

      Output: [tau_ptr + 513, ...]

      Cycles: 8323 | +| set_to_zero | Sets the memory region `[ptr, ptr + 512)` to zero. The pointer c_ptr := ptr + 512 is returned

      to be used to store the hash-to-point polynomial of the message later on.

      Input: [ptr, ...]

      Output: [...]

      Cycles: 2607 | +| load_h_s2_and_product | Takes as input PK, the hash of the coefficients of the polynomial `h` representing the expanded

      public key, and a pointer to the memory location where the coefficients of the polynomial `h`

      will be stored.

      The procedure loads `h` from the advice stack and compares its hash with the provided hash `PK`.

      It then loads the polynomial `s2` representing the signature from the advice stack and lays it

      in memory right after `h`.

      It then loads the claimed polynomial `h * s2` in Z_Q[x] where Q is the Miden VM prime from

      the advice stack and lays it right after `s2`.

      The hash of `h`, `s2` and the claimed product is also computed and the first two field elements

      of the digest (i.e., the Fiat-Shamir challenge) are returned on the stack alongside

      the incremented pointer.

      Input: [ptr, PK, ...]

      Output: [tau1, tau0, ptr + 512 ...]

      Cycles: 5049 | +| probablistic_product | Checks that pi == h * s2 in Z_Q[x] by evaluating both sides at a random point.

      The procedure takes as input a pointer h_ptr to h. The other two polynomials

      are located at h_ptr + 128, for s2, and h_ptr + 256, for pi. The procedure takes

      also a pointer zeros_ptr to a region of memory [zeros_ptr, zeros_ptr + 1024)

      and a pointer tau_ptr to powers of the random point we are evaluating at stored

      as [a_i, b_i, x, x] where (a_i, b_i) := tau^i for i in [0, 1023].

      The procedure returns () if the check passes, otherwise it raises an exception

      related to an unsatisfied assertion.

      Input: [h_ptr, zeros_ptr, tau_ptr, ...]

      Output: [...]

      Cycles: 2504 | +| norm_sq | Normalizes an `e` in [0, q) to be in [-(q-1) << 1, (q-1) << 1) and returns its square norm.

      We use the following formula to do so:

      normalize(e) = e^2 - phi * (2*q*e - q^2) where phi := (e > (q - 1)/2)

      The formula implements:

      if e > (q-1)/2:

      return (q - e)^2

      else:

      return e^2

      The use of the formula avoids using the if-else block.

      Input: [e, ...]

      Output [norm(e)^2, ...]

      Cycles: 21 | +| diff_mod_q | On input a tuple (u, w, v), the following computes (v - (u + (- w % q) % q) % q).

      We can avoid doing three modular reductions by using the following facts:

      1. q is much smaller than the Miden prime. Precisely, q * 2^50 < Q

      2. The coefficients of the product polynomial, u and w, are less than J := 512 * q^2

      3. The coefficients of c are less than q.

      This means that we can substitute (v - (u + (- w % q) % q) % q) with v + w + J - u without

      risking Q-overflow since \|v + w + J - u\| < 1025 * q^2

      To get the final result we reduce (v + w + J - u) modulo q.

      Input: [v, w, u, ...]

      Output: [e, ...]

      Cycles: 44 | +| compute_s1_norm_sq | Takes a pointer to a polynomial pi of degree less than 1024 with coefficients in Z_Q and

      a polynomial c of degree 512 with coefficients also in Z_Q, where Q is the Miden prime.

      The goal is to compute s1 = c - pi = c - h * s2 in Z_q[x]/(phi) where q is the Falcon prime.

      The pointer pi_ptr points both to pi and c through the relation c_ptr = pi_ptr + offset

      where offset := 1281.

      The naive way to compute s1 would be to first reduce the polynomial pi modulo the Falcon

      prime q and then modulo the irreducible polynomial phi = x^512 + 1. Then we would need to negate

      the coefficients of pi modulo q and only then can we add these coefficients to the coefficients

      of c and then reduce the result modulo q one more time.

      Knowing that the end goal of computing c is to compute its norm squared, we can do better.

      We can compute s1 in a single pass by delaying the q-modular reduction til the end. This can

      be achieved through a careful analysis of the computation of the difference between pi and c.

      The i-th coefficient s1_i of s1 is equal to c_i - (pi_i - pi_{512 + i}) which is equal to

      c_i + pi_{512 + i} - pi_i. Now, we know that the size of the pi_i coefficients is bounded by

      J := 512 * q^2 and this means that J + pi_{512 + i} - pi_i does not Q-underflow and since

      J = 0 modulo q, the addition of J does not affect the final result. It is also important to

      note that adding J does not Q-overflow by virtue of q * 2^50 < Q.

      All of the above implies that we can compute s1_i with only one modular reduction at the end,

      in addition to one modular reduction applied to c_i.

      Moreover, since we are only interested in the square norm of s1_i, we do not have to store

      s1_i and then load it at a later point, and instead we can immediatly follow the computation

      of s1_i with computing its square norm.

      After computing the square norm of s1_i, we can accumulate into an accumulator to compute the

      sum of the square norms of all the coefficients of polynomial c. Using the overflow stack, this

      can be delayed til the end.

      Input: [pi_ptr, ...]

      Output: [norm_sq(s1), ...]

      Cycles: 58888 | +| compute_s2_norm_sq | Compute the square norm of the polynomial s2 given a pointer to its coefficients.

      Input: [s2_ptr, ...]

      Output: [norm_sq(s2), ...]

      Cycles: 13322 | +| verify | Verifies a signature against a public key and a message. The procedure gets as inputs the hash

      of the public key and the hash of the message via the operand stack. The signature is provided

      via the advice stack.

      The signature is valid if and only if the procedure returns.

      Input: [PK, MSG, NONCE1, NONCE1, ...]

      Output: [...]

      Cycles: ~ 92029 | diff --git a/stdlib/tests/crypto/falcon.rs b/stdlib/tests/crypto/falcon.rs index ecac149343..f149addfae 100644 --- a/stdlib/tests/crypto/falcon.rs +++ b/stdlib/tests/crypto/falcon.rs @@ -2,7 +2,10 @@ use miden_air::{Felt, StarkField}; use std::vec; use test_utils::{ - crypto::{KeyPair, Polynomial, Rpo256, Signature}, + crypto::{ + rpo_falcon512::{KeyPair, Polynomial, Signature}, + Rpo256, + }, rand::rand_vector, Test, Word, }; From b3e8967fa060ce4380afb305e92322088b381415 Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:13:58 +0200 Subject: [PATCH 106/120] feat: Falcon DSA decorator --- assembly/src/ast/nodes/advice.rs | 24 +++- assembly/src/ast/nodes/serde/mod.rs | 1 + assembly/src/ast/nodes/serde/signatures.rs | 24 ++++ assembly/src/ast/parsers/adv_ops.rs | 10 ++ core/Cargo.toml | 2 +- core/src/lib.rs | 2 +- core/src/operations/decorators/advice.rs | 17 +++ core/src/operations/decorators/mod.rs | 17 +++ core/src/operations/mod.rs | 1 + processor/src/advice/dsa.rs | 104 ++++++++++++++++++ processor/src/advice/mod.rs | 20 ++++ processor/src/advice/providers.rs | 30 ++++- processor/src/decorators/adv_map_injectors.rs | 30 ++++- processor/src/decorators/mod.rs | 1 + stdlib/asm/crypto/dsa/rpo_falcon512.masm | 23 ++-- stdlib/docs/crypto/dsa/rpo_falcon512.md | 2 +- stdlib/tests/crypto/falcon.rs | 68 +++--------- 17 files changed, 305 insertions(+), 71 deletions(-) create mode 100644 assembly/src/ast/nodes/serde/signatures.rs create mode 100644 processor/src/advice/dsa.rs diff --git a/assembly/src/ast/nodes/advice.rs b/assembly/src/ast/nodes/advice.rs index a95507ffb4..e821664f74 100644 --- a/assembly/src/ast/nodes/advice.rs +++ b/assembly/src/ast/nodes/advice.rs @@ -1,9 +1,14 @@ -use super::super::{ - ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, ToString, - MAX_STACK_WORD_OFFSET, +use crate::ast::nodes::serde::signatures; + +use super::{ + super::{ + ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, ToString, + MAX_STACK_WORD_OFFSET, + }, + serde::signatures::read_options_from, }; use core::fmt; -use vm_core::{AdviceInjector, Felt, ZERO}; +use vm_core::{AdviceInjector, Felt, SignatureKind, ZERO}; // ADVICE INJECTORS // ================================================================================================ @@ -29,6 +34,7 @@ pub enum AdviceInjectorNode { InsertHdword, InsertHdwordImm { domain: u8 }, InsertHperm, + PushSignature { kind: SignatureKind }, } impl From<&AdviceInjectorNode> for AdviceInjector { @@ -63,6 +69,7 @@ impl From<&AdviceInjectorNode> for AdviceInjector { domain: Felt::from(*domain), }, InsertHperm => Self::HpermToMap, + PushSignature { kind } => Self::SigToStack { kind: *kind }, } } } @@ -85,6 +92,7 @@ impl fmt::Display for AdviceInjectorNode { InsertHdword => write!(f, "insert_hdword"), InsertHdwordImm { domain } => write!(f, "insert_hdword.{domain}"), InsertHperm => writeln!(f, "insert_hperm"), + PushSignature { kind } => write!(f, "push_sig.{kind}"), } } } @@ -106,6 +114,7 @@ const INSERT_MEM: u8 = 10; const INSERT_HDWORD: u8 = 11; const INSERT_HDWORD_IMM: u8 = 12; const INSERT_HPERM: u8 = 13; +const PUSH_SIG: u8 = 14; impl Serializable for AdviceInjectorNode { fn write_into(&self, target: &mut W) { @@ -134,6 +143,10 @@ impl Serializable for AdviceInjectorNode { target.write_u8(*domain); } InsertHperm => target.write_u8(INSERT_HPERM), + PushSignature { kind } => { + target.write_u8(PUSH_SIG); + signatures::write_options_into(target, kind) + } } } } @@ -170,6 +183,9 @@ impl Deserializable for AdviceInjectorNode { Ok(AdviceInjectorNode::InsertHdwordImm { domain }) } INSERT_HPERM => Ok(AdviceInjectorNode::InsertHperm), + PUSH_SIG => Ok(AdviceInjectorNode::PushSignature { + kind: read_options_from(source)?, + }), val => Err(DeserializationError::InvalidValue(val.to_string())), } } diff --git a/assembly/src/ast/nodes/serde/mod.rs b/assembly/src/ast/nodes/serde/mod.rs index f555643ffb..b901e75f4d 100644 --- a/assembly/src/ast/nodes/serde/mod.rs +++ b/assembly/src/ast/nodes/serde/mod.rs @@ -6,6 +6,7 @@ use vm_core::utils::{ByteReader, ByteWriter, Deserializable, DeserializationErro mod debug; mod deserialization; mod serialization; +pub mod signatures; // OPERATION CODES ENUM // ================================================================================================ diff --git a/assembly/src/ast/nodes/serde/signatures.rs b/assembly/src/ast/nodes/serde/signatures.rs new file mode 100644 index 0000000000..3f141dad06 --- /dev/null +++ b/assembly/src/ast/nodes/serde/signatures.rs @@ -0,0 +1,24 @@ +use vm_core::SignatureKind; + +use super::{ByteReader, ByteWriter, DeserializationError, ToString}; + +const RPOFALCON512: u8 = 0; + +/// Writes the provided [SignatureKind] into the provided target. +pub fn write_options_into(target: &mut W, options: &SignatureKind) { + match options { + SignatureKind::RpoFalcon512 => { + target.write_u8(RPOFALCON512); + } + } +} + +/// Reads [SignatureKind] from the provided source. +pub fn read_options_from( + source: &mut R, +) -> Result { + match source.read_u8()? { + RPOFALCON512 => Ok(SignatureKind::RpoFalcon512), + val => Err(DeserializationError::InvalidValue(val.to_string())), + } +} diff --git a/assembly/src/ast/parsers/adv_ops.rs b/assembly/src/ast/parsers/adv_ops.rs index f2d6a94e05..748b0011ee 100644 --- a/assembly/src/ast/parsers/adv_ops.rs +++ b/assembly/src/ast/parsers/adv_ops.rs @@ -5,6 +5,7 @@ use super::{ Node::{self, Instruction}, ParsingError, Token, MAX_STACK_WORD_OFFSET, }; +use vm_core::SignatureKind; // INSTRUCTION PARSERS // ================================================================================================ @@ -89,6 +90,15 @@ pub fn parse_adv_inject(op: &Token) -> Result { 2 => AdvInject(InsertHperm), _ => return Err(ParsingError::extra_param(op)), }, + "sig_to_stack" => match op.num_parts() { + 3 => match op.parts()[2] { + "rpo_falcon512" => AdvInject(PushSignature { + kind: SignatureKind::RpoFalcon512, + }), + _ => return Err(ParsingError::invalid_param(op, 1)), + }, + _ => return Err(ParsingError::extra_param(op)), + }, _ => return Err(ParsingError::invalid_op(op)), }; diff --git a/core/Cargo.toml b/core/Cargo.toml index f2cd7315bd..a2933e2634 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -21,7 +21,7 @@ std = ["math/std", "winter-utils/std", "miden-crypto/std"] [dependencies] math = { package = "winter-math", version = "0.6", default-features = false } -miden-crypto = { package = "miden-crypto", git = "https://github.com/0xPolygonMiden/crypto.git", branch = "next", default-features = false } +miden-crypto = {git = "https://github.com/0xPolygonMiden/crypto", branch = "al-falcon-decorator-tmp" } winter-crypto = { package = "winter-crypto", version = "0.6", default-features = false } winter-utils = { package = "winter-utils", version = "0.6", default-features = false } diff --git a/core/src/lib.rs b/core/src/lib.rs index b7d3050f94..edf5028864 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -45,7 +45,7 @@ pub use program::{blocks as code_blocks, CodeBlockTable, Kernel, Program, Progra mod operations; pub use operations::{ AdviceInjector, AssemblyOp, DebugOptions, Decorator, DecoratorIterator, DecoratorList, - Operation, + Operation, SignatureKind, }; pub mod stack; diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index af90f1d4c1..2f2bda5b11 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -1,3 +1,4 @@ +use super::SignatureKind; use crate::Felt; use core::fmt; @@ -247,6 +248,21 @@ pub enum AdviceInjector { /// Where KEY is computed by extracting the digest elements from hperm([C, A, B]). For example, /// if C is [0, d, 0, 0], KEY will be set as hash(A || B, d). HpermToMap, + + /// Reads two words from the stack and pushes values onto the advice stack which are required + /// for verification of a DSA in Miden VM. + /// + /// Inputs: + /// Operand stack: [PK, MSG, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [PK, MSG, ...] + /// Advice stack: [SIG_DATA] + /// + /// Where PK is the public key corresponding to the signing key, MSG is the message, SIG_DATA + /// is the signature data. + SigToStack { kind: SignatureKind }, } impl fmt::Display for AdviceInjector { @@ -273,6 +289,7 @@ impl fmt::Display for AdviceInjector { Self::MemToMap => write!(f, "mem_to_map"), Self::HdwordToMap { domain } => write!(f, "hdword_to_map.{domain}"), Self::HpermToMap => write!(f, "hperm_to_map"), + Self::SigToStack { kind } => write!(f, "sig_to_stack.{kind}"), } } } diff --git a/core/src/operations/decorators/mod.rs b/core/src/operations/decorators/mod.rs index e743a01b55..70b63c28cb 100644 --- a/core/src/operations/decorators/mod.rs +++ b/core/src/operations/decorators/mod.rs @@ -85,3 +85,20 @@ impl<'a> Iterator for DecoratorIterator<'a> { } } } + +// TYPES AND INTERFACES +// ================================================================================================ + +// Collection of signature schemes supported +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum SignatureKind { + RpoFalcon512, +} + +impl fmt::Display for SignatureKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::RpoFalcon512 => write!(f, "rpo_falcon512"), + } + } +} diff --git a/core/src/operations/mod.rs b/core/src/operations/mod.rs index 8d6d515a2c..fb18a59626 100644 --- a/core/src/operations/mod.rs +++ b/core/src/operations/mod.rs @@ -3,6 +3,7 @@ use core::fmt; mod decorators; pub use decorators::{ AdviceInjector, AssemblyOp, DebugOptions, Decorator, DecoratorIterator, DecoratorList, + SignatureKind, }; // OPERATIONS diff --git a/processor/src/advice/dsa.rs b/processor/src/advice/dsa.rs new file mode 100644 index 0000000000..3e96f5f203 --- /dev/null +++ b/processor/src/advice/dsa.rs @@ -0,0 +1,104 @@ +use super::{ExecutionError, Felt, StarkField, Vec, Word}; +use vm_core::crypto::dsa::rpo_falcon512::{ + KeyPair, Polynomial, PublicKeyBytes, SecretKeyBytes, PK_LEN, SK_LEN, +}; + +/// Gets as input a vector containing an expanded public key and its associated secret key, and a +/// word representing a message and outputs a vector of values to be pushed onto the advice stack. +/// The values are the ones required for a Falcon signature verification inside the VM and they are: +/// +/// 1. The nonce represented as 8 field elements. +/// 2. The expanded public key represented as the coefficients of a polynomial of degree < 512. +/// 3. The signature represented as the coefficients of a polynomial of degree < 512. +/// 4. The product of the above two polynomials in the ring of polynomials with coefficients +/// in the Miden field. +/// +/// Inputs: +/// Operand stack: [PK, MSG, ...] +/// Advice stack: [...] +/// Advice map: {PK: [pk_raw, sk_raw]} +/// +/// Outputs: +/// Operand stack: [PK, MSG, ...] +/// Advice stack: [NONCE1, NONCE0, h, s2, pi] +/// Advice map: {PK: [pk_raw, sk_raw]} +/// +/// Where: +/// - PK is the digest of an expanded public. +/// - MSG is the digest of the message to be signed. +/// - [NONCE0, NONCE1] is a double-word representing a 40 bit nonce that is used in the Falcon +/// hash-to-point algorithm. +/// - h is the polynomial representing the expanded public key corresponding to the digest PK. +/// - s2 is the polynomial representing the signature with the secret key associated to PK on +/// the message MSG. +/// - pi is the product of the above two polynomials. +/// - pk_raw are raw bytes of the expanded public key. +/// - sk_raw are raw bytes of the secret key. +/// +/// # Errors +/// Will return an error if either: +/// - The advice map does not contain an entry with key PK. +/// - The advice map entry under key PK is not a vector of the expected length. +/// /// +/// The function only generates non-deterministic input that is required for the Falcon verification +/// procedure inside the VM and as such does interact with the VM only through the advice provider. +pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionError> { + if pk_sk.len() != (PK_LEN + SK_LEN) { + return Err(ExecutionError::AdviceStackReadFailed(0)); + } + + // To generate a signature, we need the expanded key as well as the secret key + let pk_exp = pk_sk[..PK_LEN].to_vec(); + let pk_exp: PublicKeyBytes = vec_felt_to_u8(&pk_exp) + .try_into() + .expect("Should not fail as we've checked the length of the combined vector"); + + let sk = pk_sk[PK_LEN..].to_vec(); + let sk: SecretKeyBytes = vec_felt_to_u8(&sk) + .try_into() + .expect("Should not fail as we've checked the length of the combined vector"); + + // Create the corresponding key pair + let key_pair = KeyPair::new_existing(&pk_exp, &sk).expect("Should not fail given the above"); + + //// We need to convert the message to a byte array + //let msg_u64 = vec_felt_to_u64(&msg); + //let msg = elements_as_bytes(&msg_u64); + + // We can now generate the signature + let sig = key_pair.sign(msg).expect("TODO: handle failure here"); + + // The signature is composed of a nonce and a polynomial s2 + + // We first convert the nonce, a [40; u8], to 8 field elements. + let nonce = sig.nonce(); + + // We convert the signature to a polynomial + let s2: Polynomial = sig.sig_poly(); + + // We also need in the VM the expanded key corresponding to the public key the was provided + // via the operand stack + let h: Polynomial = + Polynomial::from_pub_key(&pk_exp).expect("Should not fail given the above checks"); + + // Lastly, for the probabilistic product routine that is part of the verification procedure, + // we need to compute the product of the expanded key and the signature polynomial in + // the ring of polynomials with coefficients in the Miden field. + let pi = Polynomial::mul_modulo_p(&h, &s2); + + // We now push the nonce, the expanded key, the signature polynomial, and the product of the + // expanded key and the signature polynomial to the advice stack. + let mut result: Vec = nonce.to_vec(); + result.extend(h.inner().iter().map(|a| Felt::new(*a as u64)).collect::>()); + result.extend(s2.inner().iter().map(|&a| Felt::new(a as u64)).collect::>()); + result.extend(pi.iter().map(|&a| Felt::new(a)).collect::>()); + result.reverse(); + Ok(result) +} + +// HELPERS +// ================================================================================================ + +fn vec_felt_to_u8(felts: &[Felt]) -> Vec { + felts.iter().map(|f| f.as_int() as u8).collect() +} diff --git a/processor/src/advice/mod.rs b/processor/src/advice/mod.rs index e21d0bbc57..d847b10611 100644 --- a/processor/src/advice/mod.rs +++ b/processor/src/advice/mod.rs @@ -9,6 +9,7 @@ use vm_core::{ collections::{BTreeMap, KvMap, RecordingMap, Vec}, IntoBytes, }, + SignatureKind, }; mod inputs; @@ -20,6 +21,8 @@ pub use providers::{MemAdviceProvider, RecAdviceProvider}; mod source; pub use source::AdviceSource; +mod dsa; + // ADVICE PROVIDER // ================================================================================================ @@ -107,6 +110,14 @@ pub trait AdviceProvider { /// are replaced with the specified values. fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError>; + /// Returns a signature on a message using a public key. + fn get_signature( + &self, + kind: SignatureKind, + pub_key: Word, + msg: Word, + ) -> Result, ExecutionError>; + // MERKLE STORE // -------------------------------------------------------------------------------------------- @@ -310,4 +321,13 @@ where fn advance_clock(&mut self) { T::advance_clock(self) } + + fn get_signature( + &self, + kind: SignatureKind, + pub_key: Word, + msg: Word, + ) -> Result, ExecutionError> { + T::get_signature(self, kind, pub_key, msg) + } } diff --git a/processor/src/advice/providers.rs b/processor/src/advice/providers.rs index 73fc05021b..81ab74fdce 100644 --- a/processor/src/advice/providers.rs +++ b/processor/src/advice/providers.rs @@ -1,7 +1,9 @@ use super::{ - AdviceInputs, AdviceProvider, AdviceSource, BTreeMap, ExecutionError, Felt, IntoBytes, KvMap, - MerklePath, MerkleStore, NodeIndex, RecordingMap, RpoDigest, StarkField, StoreNode, Vec, Word, + super::advice::dsa::falcon_sign, AdviceInputs, AdviceProvider, AdviceSource, BTreeMap, + ExecutionError, Felt, IntoBytes, KvMap, MerklePath, MerkleStore, NodeIndex, RecordingMap, + RpoDigest, StarkField, StoreNode, Vec, Word, }; +use vm_core::SignatureKind; // TYPE ALIASES // ================================================================================================ @@ -103,6 +105,22 @@ where Ok(()) } + fn get_signature( + &self, + kind: SignatureKind, + pub_key: Word, + msg: Word, + ) -> Result, ExecutionError> { + let pk_sk = self + .map + .get(&pub_key.into_bytes()) + .ok_or(ExecutionError::AdviceMapKeyNotFound(pub_key))?; + + match kind { + SignatureKind::RpoFalcon512 => falcon_sign(pk_sk, msg), + } + } + // ADVICE MAP // -------------------------------------------------------------------------------------------- @@ -286,6 +304,10 @@ impl AdviceProvider for MemAdviceProvider { self.provider.insert_into_map(key, values) } + fn get_signature(&self, kind: SignatureKind, pub_key: Word, msg: Word) -> Result, ExecutionError> { + self.provider.get_signature(kind, pub_key, msg) + } + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { self.provider.get_mapped_values(key) } @@ -414,6 +436,10 @@ impl AdviceProvider for RecAdviceProvider { fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError> { self.provider.insert_into_map(key, values) } + + fn get_signature(&self, kind: SignatureKind, pub_key: Word, msg: Word) -> Result, ExecutionError> { + self.provider.get_signature(kind, pub_key, msg) + } fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { self.provider.get_mapped_values(key) diff --git a/processor/src/decorators/adv_map_injectors.rs b/processor/src/decorators/adv_map_injectors.rs index e7c8ddf698..cf0e0d9021 100644 --- a/processor/src/decorators/adv_map_injectors.rs +++ b/processor/src/decorators/adv_map_injectors.rs @@ -1,8 +1,10 @@ +use crate::AdviceSource; + use super::{AdviceProvider, ExecutionError, Process}; use vm_core::{ crypto::hash::{Rpo256, RpoDigest}, utils::collections::Vec, - Felt, StarkField, EMPTY_WORD, WORD_SIZE, + Felt, SignatureKind, StarkField, EMPTY_WORD, WORD_SIZE, }; // ADVICE INJECTORS @@ -149,4 +151,30 @@ where Ok((start_addr as u32, end_addr as u32)) } + + /// Pushes values onto the advice stack which are required for verification of a DSA in Miden VM. + /// + /// Inputs: + /// Operand stack: [PK, MSG, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [PK, MSG, ...] + /// Advice stack: [DATA] + /// + /// Where: + /// - PK is the digest of an expanded public. + /// - MSG is the digest of the message to be signed. + /// - DATA is the needed data for signature verification in the VM. + /// + /// The advice provider is expected to contain the private key associated to the public key PK. + pub(super) fn push_signature(&mut self, kind: SignatureKind) -> Result<(), ExecutionError> { + let pub_key = self.stack.get_word(0); + let msg = self.stack.get_word(1); + let result: Vec = self.advice_provider.get_signature(kind, pub_key, msg)?; + for r in result { + self.advice_provider.push_stack(AdviceSource::Value(r))?; + } + Ok(()) + } } diff --git a/processor/src/decorators/mod.rs b/processor/src/decorators/mod.rs index dcad55921f..ab4ed119f2 100644 --- a/processor/src/decorators/mod.rs +++ b/processor/src/decorators/mod.rs @@ -54,6 +54,7 @@ where AdviceInjector::MemToMap => self.insert_mem_values_into_adv_map(), AdviceInjector::HdwordToMap { domain } => self.insert_hdword_into_adv_map(*domain), AdviceInjector::HpermToMap => self.insert_hperm_into_adv_map(), + AdviceInjector::SigToStack { kind: sign_kind } => self.push_signature(*sign_kind), } } diff --git a/stdlib/asm/crypto/dsa/rpo_falcon512.masm b/stdlib/asm/crypto/dsa/rpo_falcon512.masm index 5558fa1723..61b89e67ac 100644 --- a/stdlib/asm/crypto/dsa/rpo_falcon512.masm +++ b/stdlib/asm/crypto/dsa/rpo_falcon512.masm @@ -589,18 +589,27 @@ end #! via the advice stack. #! The signature is valid if and only if the procedure returns. #! -#! Input: [PK, MSG, NONCE1, NONCE1, ...] +#! Input: [PK, MSG, ...] #! Output: [...] #! #! Cycles: ~ 92029 export.verify.1665 - # 1) Load the public key polynomial h and the signature polynomial s2 and the product of + # 1) Generate a Falcon signature using the secret key associated to PK on message MSG. + adv.sig_to_stack.rpo_falcon512 + #=> [PK, MSG, ...] + + # 2) Load the NONCE from the advice provider. This is encoded as 8 field elements + padw adv_loadw padw adv_loadw + #=> [PK, MSG, NONCE1, NONCE0, ...] + + # 3) Load the public key polynomial h and the signature polynomial s2 and the product of # the two polynomials pi := h * s2 in Z_Q[x]. This also checks that h hashes to the provided # digest PK. While loading the polynomials, the hash of the three polynomials is computed # and the first half of the digest is kept on the stack for later use by the # `probablistic_product` procedure. + swapdw locaddr.0 exec.load_h_s2_and_product #=> [tau1, tau0, tau_ptr, MSG, NONCE1, NONCE1, ...] (Cycles: 5050) @@ -611,13 +620,13 @@ export.verify.1665 exec.set_to_zero #=> [c_ptr, MSG, NONCE1, NONCE1, ...] (Cycles: 2607) - # 2) Compute the hash-to-point of the message MSG from the provided NONCE and save + # 4) Compute the hash-to-point of the message MSG from the provided NONCE and save # the resulting polynomial c in the memory region [c_ptr, c_ptr + 128) exec.hash_to_point #=> [...] (Cycles: 1327) - # 3) Check that we indeed have pi := h * s2 in Z_Q[x] by checking that pi(tau) = h(tau) * s2(tau) + # 5) Check that we indeed have pi := h * s2 in Z_Q[x] by checking that pi(tau) = h(tau) * s2(tau) # where tau is a random (Fiat-Shamir) challenge resulting from hashing h, s2 and pi. locaddr.512 # tau_ptr @@ -628,7 +637,7 @@ export.verify.1665 exec.probablistic_product #=> [...] (Cycles: 2504) - # 4) Compute the squared norm of s1 := c - h * s2 (in Z_q[x]/(phi)) + # 6) Compute the squared norm of s1 := c - h * s2 (in Z_q[x]/(phi)) locaddr.256 #=> [pi_ptr, ...] @@ -636,7 +645,7 @@ export.verify.1665 exec.compute_s1_norm_sq #=> [norm_sq(s1), ...] (Cycles: 58888) - # 5) Compute the squared norm of s2 + # 7) Compute the squared norm of s2 locaddr.128 #=> [s2_ptr, norm_sq(s1), ...] @@ -644,7 +653,7 @@ export.verify.1665 exec.compute_s2_norm_sq #=> [norm_sq(s2), norm_sq(s1), ...] (Cycles: 13322) - # 6) Check that ||(s1, s2)||^2 < K + # 8) Check that ||(s1, s2)||^2 < K add #=> [norm_sq(s1) + norm_sq(s2), ...] diff --git a/stdlib/docs/crypto/dsa/rpo_falcon512.md b/stdlib/docs/crypto/dsa/rpo_falcon512.md index f9c7e5c13f..f82a167465 100644 --- a/stdlib/docs/crypto/dsa/rpo_falcon512.md +++ b/stdlib/docs/crypto/dsa/rpo_falcon512.md @@ -12,4 +12,4 @@ | diff_mod_q | On input a tuple (u, w, v), the following computes (v - (u + (- w % q) % q) % q).

      We can avoid doing three modular reductions by using the following facts:

      1. q is much smaller than the Miden prime. Precisely, q * 2^50 < Q

      2. The coefficients of the product polynomial, u and w, are less than J := 512 * q^2

      3. The coefficients of c are less than q.

      This means that we can substitute (v - (u + (- w % q) % q) % q) with v + w + J - u without

      risking Q-overflow since \|v + w + J - u\| < 1025 * q^2

      To get the final result we reduce (v + w + J - u) modulo q.

      Input: [v, w, u, ...]

      Output: [e, ...]

      Cycles: 44 | | compute_s1_norm_sq | Takes a pointer to a polynomial pi of degree less than 1024 with coefficients in Z_Q and

      a polynomial c of degree 512 with coefficients also in Z_Q, where Q is the Miden prime.

      The goal is to compute s1 = c - pi = c - h * s2 in Z_q[x]/(phi) where q is the Falcon prime.

      The pointer pi_ptr points both to pi and c through the relation c_ptr = pi_ptr + offset

      where offset := 1281.

      The naive way to compute s1 would be to first reduce the polynomial pi modulo the Falcon

      prime q and then modulo the irreducible polynomial phi = x^512 + 1. Then we would need to negate

      the coefficients of pi modulo q and only then can we add these coefficients to the coefficients

      of c and then reduce the result modulo q one more time.

      Knowing that the end goal of computing c is to compute its norm squared, we can do better.

      We can compute s1 in a single pass by delaying the q-modular reduction til the end. This can

      be achieved through a careful analysis of the computation of the difference between pi and c.

      The i-th coefficient s1_i of s1 is equal to c_i - (pi_i - pi_{512 + i}) which is equal to

      c_i + pi_{512 + i} - pi_i. Now, we know that the size of the pi_i coefficients is bounded by

      J := 512 * q^2 and this means that J + pi_{512 + i} - pi_i does not Q-underflow and since

      J = 0 modulo q, the addition of J does not affect the final result. It is also important to

      note that adding J does not Q-overflow by virtue of q * 2^50 < Q.

      All of the above implies that we can compute s1_i with only one modular reduction at the end,

      in addition to one modular reduction applied to c_i.

      Moreover, since we are only interested in the square norm of s1_i, we do not have to store

      s1_i and then load it at a later point, and instead we can immediatly follow the computation

      of s1_i with computing its square norm.

      After computing the square norm of s1_i, we can accumulate into an accumulator to compute the

      sum of the square norms of all the coefficients of polynomial c. Using the overflow stack, this

      can be delayed til the end.

      Input: [pi_ptr, ...]

      Output: [norm_sq(s1), ...]

      Cycles: 58888 | | compute_s2_norm_sq | Compute the square norm of the polynomial s2 given a pointer to its coefficients.

      Input: [s2_ptr, ...]

      Output: [norm_sq(s2), ...]

      Cycles: 13322 | -| verify | Verifies a signature against a public key and a message. The procedure gets as inputs the hash

      of the public key and the hash of the message via the operand stack. The signature is provided

      via the advice stack.

      The signature is valid if and only if the procedure returns.

      Input: [PK, MSG, NONCE1, NONCE1, ...]

      Output: [...]

      Cycles: ~ 92029 | +| verify | Verifies a signature against a public key and a message. The procedure gets as inputs the hash

      of the public key and the hash of the message via the operand stack. The signature is provided

      via the advice stack.

      The signature is valid if and only if the procedure returns.

      Input: [PK, MSG, ...]

      Output: [...]

      Cycles: ~ 92029 | diff --git a/stdlib/tests/crypto/falcon.rs b/stdlib/tests/crypto/falcon.rs index f149addfae..7ad94ba06c 100644 --- a/stdlib/tests/crypto/falcon.rs +++ b/stdlib/tests/crypto/falcon.rs @@ -1,11 +1,10 @@ +use assembly::utils::Serializable; use miden_air::{Felt, StarkField}; +use processor::Digest; use std::vec; use test_utils::{ - crypto::{ - rpo_falcon512::{KeyPair, Polynomial, Signature}, - Rpo256, - }, + crypto::{rpo_falcon512::KeyPair, MerkleStore}, rand::rand_vector, Test, Word, }; @@ -16,35 +15,11 @@ fn test_falcon() { let message = rand_vector::(4).try_into().unwrap(); - let signature = keypair.sign(message).unwrap(); - let test = generate_test(keypair, message, signature); + let test = generate_test(keypair, message); test.expect_stack(&[]) } -#[test] -fn test_falcon_wrong_pub_key() { - let keypair = KeyPair::new().unwrap(); - - let keypair_wrong = KeyPair::new().unwrap(); - - let message = rand_vector::(4).try_into().unwrap(); - let signature = keypair.sign(message).unwrap(); - let test = generate_test(keypair_wrong, message, signature); - assert!(test.execute().is_err()); -} - -#[test] -fn test_falcon_wrong_message() { - let keypair = KeyPair::new().unwrap(); - - let message = rand_vector::(4).try_into().unwrap(); - let message_wrong = rand_vector::(4).try_into().unwrap(); - let signature = keypair.sign(message).unwrap(); - let test = generate_test(keypair, message_wrong, signature); - assert!(test.execute().is_err()); -} - -fn generate_test(keypair: KeyPair, message: Word, signature: Signature) -> Test { +fn generate_test(keypair: KeyPair, message: Word) -> Test { let source = " use.std::crypto::dsa::rpo_falcon512 @@ -53,36 +28,21 @@ fn generate_test(keypair: KeyPair, message: Word, signature: Signature) -> Test end "; - let h = Polynomial::from_pub_key(&keypair.expanded_public_key()).unwrap(); - let s2: Polynomial = (signature).sig_poly(); - let nonce = signature.nonce(); + let pk: Word = keypair.public_key().into(); + let pk: Digest = pk.into(); + let pk_sk_bytes = keypair.to_bytes(); + let to_adv_map = pk_sk_bytes.iter().map(|a| Felt::new(*a as u64)).collect::>(); - let prod = Polynomial::mul_modulo_p(&h, &s2) - .into_iter() - .map(|a| a as u64) - .collect::>(); - let s2 = s2.inner().into_iter().map(|a| a as u64).collect::>(); + let advice_map: Vec<([u8; 32], Vec)> = vec![(pk.as_bytes(), to_adv_map.into())]; - let h_felt = h.inner().into_iter().map(|a| Felt::new(a as u64)).collect::>(); - let h_digest = Rpo256::hash_elements(&h_felt) - .as_elements() - .iter() - .map(|a| a.as_int()) - .collect::>(); - let h = h.inner().into_iter().map(|a| a as u64).collect::>(); - let nonce = nonce.into_iter().map(|a| a.as_int() as u64).collect::>(); let message = message.into_iter().map(|a| a.as_int() as u64).collect::>(); - let mut adv_stack = vec![]; - adv_stack.extend_from_slice(&h); - adv_stack.extend_from_slice(&s2); - adv_stack.extend_from_slice(&prod); - let mut op_stack = vec![]; - op_stack.extend_from_slice(&nonce); op_stack.extend_from_slice(&message); - op_stack.extend_from_slice(&h_digest); - let test = build_test!(source, &op_stack, &adv_stack); + op_stack.extend_from_slice(&pk.as_elements().iter().map(|a| a.as_int()).collect::>()); + let adv_stack = vec![]; + let store = MerkleStore::new(); + let test = build_test!(source, &op_stack, &adv_stack, store, advice_map.into_iter()); test } From e3834b38bdbd4e35f8bc63e38ca57a0a03020abc Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Fri, 6 Oct 2023 11:03:01 +0200 Subject: [PATCH 107/120] chore: minor nits plus simplifications --- assembly/src/ast/nodes/advice.rs | 6 +- assembly/src/ast/nodes/serde/signatures.rs | 1 - processor/src/advice/dsa.rs | 80 ++++++---------------- processor/src/errors.rs | 6 ++ 4 files changed, 30 insertions(+), 63 deletions(-) diff --git a/assembly/src/ast/nodes/advice.rs b/assembly/src/ast/nodes/advice.rs index e821664f74..d386377fec 100644 --- a/assembly/src/ast/nodes/advice.rs +++ b/assembly/src/ast/nodes/advice.rs @@ -1,11 +1,9 @@ -use crate::ast::nodes::serde::signatures; - use super::{ super::{ ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable, ToString, MAX_STACK_WORD_OFFSET, }, - serde::signatures::read_options_from, + serde::signatures, }; use core::fmt; use vm_core::{AdviceInjector, Felt, SignatureKind, ZERO}; @@ -184,7 +182,7 @@ impl Deserializable for AdviceInjectorNode { } INSERT_HPERM => Ok(AdviceInjectorNode::InsertHperm), PUSH_SIG => Ok(AdviceInjectorNode::PushSignature { - kind: read_options_from(source)?, + kind: signatures::read_options_from(source)?, }), val => Err(DeserializationError::InvalidValue(val.to_string())), } diff --git a/assembly/src/ast/nodes/serde/signatures.rs b/assembly/src/ast/nodes/serde/signatures.rs index 3f141dad06..c4e57826a3 100644 --- a/assembly/src/ast/nodes/serde/signatures.rs +++ b/assembly/src/ast/nodes/serde/signatures.rs @@ -1,5 +1,4 @@ use vm_core::SignatureKind; - use super::{ByteReader, ByteWriter, DeserializationError, ToString}; const RPOFALCON512: u8 = 0; diff --git a/processor/src/advice/dsa.rs b/processor/src/advice/dsa.rs index 3e96f5f203..47a97b5d2b 100644 --- a/processor/src/advice/dsa.rs +++ b/processor/src/advice/dsa.rs @@ -1,6 +1,7 @@ use super::{ExecutionError, Felt, StarkField, Vec, Word}; -use vm_core::crypto::dsa::rpo_falcon512::{ - KeyPair, Polynomial, PublicKeyBytes, SecretKeyBytes, PK_LEN, SK_LEN, +use vm_core::{ + crypto::dsa::rpo_falcon512::{KeyPair, Polynomial}, + utils::Deserializable, }; /// Gets as input a vector containing an expanded public key and its associated secret key, and a @@ -13,64 +14,35 @@ use vm_core::crypto::dsa::rpo_falcon512::{ /// 4. The product of the above two polynomials in the ring of polynomials with coefficients /// in the Miden field. /// -/// Inputs: -/// Operand stack: [PK, MSG, ...] -/// Advice stack: [...] -/// Advice map: {PK: [pk_raw, sk_raw]} -/// -/// Outputs: -/// Operand stack: [PK, MSG, ...] -/// Advice stack: [NONCE1, NONCE0, h, s2, pi] -/// Advice map: {PK: [pk_raw, sk_raw]} -/// -/// Where: -/// - PK is the digest of an expanded public. -/// - MSG is the digest of the message to be signed. -/// - [NONCE0, NONCE1] is a double-word representing a 40 bit nonce that is used in the Falcon -/// hash-to-point algorithm. -/// - h is the polynomial representing the expanded public key corresponding to the digest PK. -/// - s2 is the polynomial representing the signature with the secret key associated to PK on -/// the message MSG. -/// - pi is the product of the above two polynomials. -/// - pk_raw are raw bytes of the expanded public key. -/// - sk_raw are raw bytes of the secret key. -/// /// # Errors /// Will return an error if either: /// - The advice map does not contain an entry with key PK. /// - The advice map entry under key PK is not a vector of the expected length. -/// /// +/// /// The function only generates non-deterministic input that is required for the Falcon verification /// procedure inside the VM and as such does interact with the VM only through the advice provider. pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionError> { - if pk_sk.len() != (PK_LEN + SK_LEN) { - return Err(ExecutionError::AdviceStackReadFailed(0)); - } - - // To generate a signature, we need the expanded key as well as the secret key - let pk_exp = pk_sk[..PK_LEN].to_vec(); - let pk_exp: PublicKeyBytes = vec_felt_to_u8(&pk_exp) - .try_into() - .expect("Should not fail as we've checked the length of the combined vector"); - - let sk = pk_sk[PK_LEN..].to_vec(); - let sk: SecretKeyBytes = vec_felt_to_u8(&sk) - .try_into() - .expect("Should not fail as we've checked the length of the combined vector"); - // Create the corresponding key pair - let key_pair = KeyPair::new_existing(&pk_exp, &sk).expect("Should not fail given the above"); + let mut key_pair_bytes = Vec::with_capacity(pk_sk.len()); + for element in pk_sk { + let value = element.as_int(); + if value > u8::MAX as u64 { + return Err(ExecutionError::MalformedSignatureKey("RPO Falcon512")); + } + key_pair_bytes.push(value as u8); + } - //// We need to convert the message to a byte array - //let msg_u64 = vec_felt_to_u64(&msg); - //let msg = elements_as_bytes(&msg_u64); + let key_pair = KeyPair::read_from_bytes(&key_pair_bytes) + .map_err(|_| ExecutionError::MalformedSignatureKey("RPO Falcon512"))?; // We can now generate the signature - let sig = key_pair.sign(msg).expect("TODO: handle failure here"); + let sig = key_pair + .sign(msg) + .map_err(|_| ExecutionError::FailedSignatureGeneration("RPO Falcon512"))?; // The signature is composed of a nonce and a polynomial s2 - // We first convert the nonce, a [40; u8], to 8 field elements. + // The nonce is represented as 8 field elements. let nonce = sig.nonce(); // We convert the signature to a polynomial @@ -78,8 +50,7 @@ pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionErro // We also need in the VM the expanded key corresponding to the public key the was provided // via the operand stack - let h: Polynomial = - Polynomial::from_pub_key(&pk_exp).expect("Should not fail given the above checks"); + let h: Polynomial = sig.pub_key_poly(); // Lastly, for the probabilistic product routine that is part of the verification procedure, // we need to compute the product of the expanded key and the signature polynomial in @@ -89,16 +60,9 @@ pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionErro // We now push the nonce, the expanded key, the signature polynomial, and the product of the // expanded key and the signature polynomial to the advice stack. let mut result: Vec = nonce.to_vec(); - result.extend(h.inner().iter().map(|a| Felt::new(*a as u64)).collect::>()); - result.extend(s2.inner().iter().map(|&a| Felt::new(a as u64)).collect::>()); - result.extend(pi.iter().map(|&a| Felt::new(a)).collect::>()); + result.extend(h.inner().iter().map(|a| Felt::new(*a as u64))); + result.extend(s2.inner().iter().map(|a| Felt::new(*a as u64))); + result.extend(pi.iter().map(|a| Felt::new(*a))); result.reverse(); Ok(result) } - -// HELPERS -// ================================================================================================ - -fn vec_felt_to_u8(felts: &[Felt]) -> Vec { - felts.iter().map(|f| f.as_int() as u8).collect() -} diff --git a/processor/src/errors.rs b/processor/src/errors.rs index 8546ad5f63..8730456ca5 100644 --- a/processor/src/errors.rs +++ b/processor/src/errors.rs @@ -42,6 +42,8 @@ pub enum ExecutionError { ProverError(ProverError), SyscallTargetNotInKernel(Digest), UnexecutableCodeBlock(CodeBlock), + MalformedSignatureKey(&'static str), + FailedSignatureGeneration(&'static str), } impl Display for ExecutionError { @@ -142,6 +144,10 @@ impl Display for ExecutionError { UnexecutableCodeBlock(block) => { write!(f, "Execution reached unexecutable code block {block:?}") } + MalformedSignatureKey(signature) => write!(f, "Malformed signature key: {signature}"), + FailedSignatureGeneration(signature) => { + write!(f, "Failed to generate signature: {signature}") + } } } } From f2d092f9a11cb9e4cab1f244c0bb611b61054f09 Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Fri, 6 Oct 2023 11:04:26 +0200 Subject: [PATCH 108/120] chore: rustfmt fix --- assembly/src/ast/nodes/serde/signatures.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assembly/src/ast/nodes/serde/signatures.rs b/assembly/src/ast/nodes/serde/signatures.rs index c4e57826a3..48ba14bb0f 100644 --- a/assembly/src/ast/nodes/serde/signatures.rs +++ b/assembly/src/ast/nodes/serde/signatures.rs @@ -1,5 +1,5 @@ -use vm_core::SignatureKind; use super::{ByteReader, ByteWriter, DeserializationError, ToString}; +use vm_core::SignatureKind; const RPOFALCON512: u8 = 0; From 031aca2b951d449609fe9c78f4ec2ca7c6161dee Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Fri, 6 Oct 2023 17:16:17 +0200 Subject: [PATCH 109/120] chore: minor nits --- assembly/src/ast/parsers/adv_ops.rs | 2 +- processor/src/advice/dsa.rs | 11 ++++------- stdlib/asm/crypto/dsa/rpo_falcon512.masm | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/assembly/src/ast/parsers/adv_ops.rs b/assembly/src/ast/parsers/adv_ops.rs index 748b0011ee..4d758bf971 100644 --- a/assembly/src/ast/parsers/adv_ops.rs +++ b/assembly/src/ast/parsers/adv_ops.rs @@ -90,7 +90,7 @@ pub fn parse_adv_inject(op: &Token) -> Result { 2 => AdvInject(InsertHperm), _ => return Err(ParsingError::extra_param(op)), }, - "sig_to_stack" => match op.num_parts() { + "push_sig" => match op.num_parts() { 3 => match op.parts()[2] { "rpo_falcon512" => AdvInject(PushSignature { kind: SignatureKind::RpoFalcon512, diff --git a/processor/src/advice/dsa.rs b/processor/src/advice/dsa.rs index 47a97b5d2b..9c37ee94a2 100644 --- a/processor/src/advice/dsa.rs +++ b/processor/src/advice/dsa.rs @@ -16,11 +16,8 @@ use vm_core::{ /// /// # Errors /// Will return an error if either: -/// - The advice map does not contain an entry with key PK. -/// - The advice map entry under key PK is not a vector of the expected length. -/// -/// The function only generates non-deterministic input that is required for the Falcon verification -/// procedure inside the VM and as such does interact with the VM only through the advice provider. +/// - The keys are malformed due to either incorrect length or failed decoding. +/// - The signature generation failed. pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionError> { // Create the corresponding key pair let mut key_pair_bytes = Vec::with_capacity(pk_sk.len()); @@ -60,8 +57,8 @@ pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionErro // We now push the nonce, the expanded key, the signature polynomial, and the product of the // expanded key and the signature polynomial to the advice stack. let mut result: Vec = nonce.to_vec(); - result.extend(h.inner().iter().map(|a| Felt::new(*a as u64))); - result.extend(s2.inner().iter().map(|a| Felt::new(*a as u64))); + result.extend(h.inner().iter().map(|a| Felt::from(*a))); + result.extend(s2.inner().iter().map(|a| Felt::from(*a))); result.extend(pi.iter().map(|a| Felt::new(*a))); result.reverse(); Ok(result) diff --git a/stdlib/asm/crypto/dsa/rpo_falcon512.masm b/stdlib/asm/crypto/dsa/rpo_falcon512.masm index 61b89e67ac..7dd00b59e9 100644 --- a/stdlib/asm/crypto/dsa/rpo_falcon512.masm +++ b/stdlib/asm/crypto/dsa/rpo_falcon512.masm @@ -596,7 +596,7 @@ end export.verify.1665 # 1) Generate a Falcon signature using the secret key associated to PK on message MSG. - adv.sig_to_stack.rpo_falcon512 + adv.push_sig.rpo_falcon512 #=> [PK, MSG, ...] # 2) Load the NONCE from the advice provider. This is encoded as 8 field elements From 22aab193dfb9ba6b69c93249d15284090121b509 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Fri, 6 Oct 2023 10:11:35 -0700 Subject: [PATCH 110/120] fix: signature in no_std context --- core/Cargo.toml | 2 +- processor/src/advice/dsa.rs | 8 ++++++++ processor/src/advice/providers.rs | 8 ++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index a2933e2634..cfa0117884 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -21,7 +21,7 @@ std = ["math/std", "winter-utils/std", "miden-crypto/std"] [dependencies] math = { package = "winter-math", version = "0.6", default-features = false } -miden-crypto = {git = "https://github.com/0xPolygonMiden/crypto", branch = "al-falcon-decorator-tmp" } +miden-crypto = {git = "https://github.com/0xPolygonMiden/crypto", branch = "next", default-features = false } winter-crypto = { package = "winter-crypto", version = "0.6", default-features = false } winter-utils = { package = "winter-utils", version = "0.6", default-features = false } diff --git a/processor/src/advice/dsa.rs b/processor/src/advice/dsa.rs index 9c37ee94a2..7f3e6996e3 100644 --- a/processor/src/advice/dsa.rs +++ b/processor/src/advice/dsa.rs @@ -18,6 +18,7 @@ use vm_core::{ /// Will return an error if either: /// - The keys are malformed due to either incorrect length or failed decoding. /// - The signature generation failed. +#[cfg(feature = "std")] pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionError> { // Create the corresponding key pair let mut key_pair_bytes = Vec::with_capacity(pk_sk.len()); @@ -63,3 +64,10 @@ pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionErro result.reverse(); Ok(result) } + +#[cfg(not(feature = "std"))] +pub fn falcon_sign(pk_sk: &[Felt], msg: Word) -> Result, ExecutionError> { + Err(ExecutionError::FailedSignatureGeneration( + "RPO Falcon512 signature generation is not available in no_std context", + )) +} diff --git a/processor/src/advice/providers.rs b/processor/src/advice/providers.rs index 81ab74fdce..3b96f0a193 100644 --- a/processor/src/advice/providers.rs +++ b/processor/src/advice/providers.rs @@ -1,7 +1,7 @@ use super::{ - super::advice::dsa::falcon_sign, AdviceInputs, AdviceProvider, AdviceSource, BTreeMap, - ExecutionError, Felt, IntoBytes, KvMap, MerklePath, MerkleStore, NodeIndex, RecordingMap, - RpoDigest, StarkField, StoreNode, Vec, Word, + dsa, AdviceInputs, AdviceProvider, AdviceSource, BTreeMap, ExecutionError, Felt, IntoBytes, + KvMap, MerklePath, MerkleStore, NodeIndex, RecordingMap, RpoDigest, StarkField, StoreNode, Vec, + Word, }; use vm_core::SignatureKind; @@ -117,7 +117,7 @@ where .ok_or(ExecutionError::AdviceMapKeyNotFound(pub_key))?; match kind { - SignatureKind::RpoFalcon512 => falcon_sign(pk_sk, msg), + SignatureKind::RpoFalcon512 => dsa::falcon_sign(pk_sk, msg), } } From b5aea223fb1f423e4baa7d54e9a8825d0a4f7bed Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Wed, 27 Sep 2023 22:37:14 +0200 Subject: [PATCH 111/120] feat: compile module without path --- assembly/src/assembler/context.rs | 17 +- assembly/src/assembler/mod.rs | 68 +++++--- assembly/src/assembler/procedure_cache.rs | 23 ++- assembly/src/ast/mod.rs | 3 +- assembly/src/library/path.rs | 11 ++ assembly/src/procedures/mod.rs | 10 -- assembly/src/tests.rs | 187 +++++++++++++++------- 7 files changed, 209 insertions(+), 110 deletions(-) diff --git a/assembly/src/assembler/context.rs b/assembly/src/assembler/context.rs index 4c119d4104..2f3452bc72 100644 --- a/assembly/src/assembler/context.rs +++ b/assembly/src/assembler/context.rs @@ -432,18 +432,7 @@ impl ModuleContext { /// This also updates module callset to include the callset of the newly compiled procedure. pub fn complete_proc(&mut self, code: CodeBlock) { let proc_context = self.proc_stack.pop().expect("no procedures"); - - // build an ID for the procedure as follows: - // - for exported procedures: hash("module_path::proc_name") - // - for internal procedures: hash("module_path::proc_index") - let proc_id = if proc_context.is_export { - ProcedureId::from_name(&proc_context.name, &self.path) - } else { - let proc_idx = self.compiled_procs.len() as u16; - ProcedureId::from_index(proc_idx, &self.path) - }; - - let proc = proc_context.into_procedure(proc_id, code); + let proc = proc_context.into_procedure(code); self.callset.append(proc.callset()); self.compiled_procs.push(proc); } @@ -560,7 +549,7 @@ impl ProcedureContext { &self.name } - pub fn into_procedure(self, id: ProcedureId, code_root: CodeBlock) -> NamedProcedure { + pub fn into_procedure(self, code_root: CodeBlock) -> NamedProcedure { let Self { name, is_export, @@ -568,6 +557,6 @@ impl ProcedureContext { callset, } = self; - NamedProcedure::new(id, name, is_export, num_locals as u32, code_root, callset) + NamedProcedure::new(name, is_export, num_locals as u32, code_root, callset) } } diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index 68ca9ffae0..8dbd584fb0 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -90,7 +90,7 @@ impl Assembler { // compile the kernel; this adds all exported kernel procedures to the procedure cache let mut context = AssemblyContext::for_module(true); let kernel = Module::kernel(module); - self.compile_module(&kernel, &mut context)?; + self.compile_module(&kernel.ast, Some(&kernel.path), &mut context)?; // convert the context into Kernel; this builds the kernel from hashes of procedures // exported form the kernel module @@ -186,38 +186,48 @@ impl Assembler { /// - If a lock to the [ProcedureCache] can not be attained. pub fn compile_module( &self, - module: &Module, + module: &ModuleAst, + path: Option<&LibraryPath>, context: &mut AssemblyContext, ) -> Result, AssemblyError> { // a variable to track MAST roots of all procedures exported from this module let mut proc_roots = Vec::new(); - context.begin_module(&module.path, &module.ast)?; + context.begin_module(path.unwrap_or(&LibraryPath::anon_path()), module)?; // process all re-exported procedures - for reexporteed_proc in module.ast.reexported_procs().iter() { + for reexporteed_proc in module.reexported_procs().iter() { // make sure the re-exported procedure is loaded into the procedure cache let ref_proc_id = reexporteed_proc.proc_id(); self.ensure_procedure_is_in_cache(&ref_proc_id, context).map_err(|_| { AssemblyError::ReExportedProcModuleNotFound(reexporteed_proc.clone()) })?; - // build procedure ID for the alias, and add it to the procedure cache - let proc_name = reexporteed_proc.name(); - let alias_proc_id = ProcedureId::from_name(proc_name, &module.path); - let proc_mast_root = self - .proc_cache - .try_borrow_mut() - .map_err(|_| AssemblyError::InvalidCacheLock)? - .insert_proc_alias(alias_proc_id, ref_proc_id)?; + // if the library path is provided, build procedure ID for the alias and add it to the + // procedure cache + let proc_mast_root = if let Some(path) = path { + let proc_name = reexporteed_proc.name(); + let alias_proc_id = ProcedureId::from_name(proc_name, path); + self.proc_cache + .try_borrow_mut() + .map_err(|_| AssemblyError::InvalidCacheLock)? + .insert_proc_alias(alias_proc_id, ref_proc_id)? + } else { + self.proc_cache + .try_borrow_mut() + .map_err(|_| AssemblyError::InvalidCacheLock)? + .get_proc_root_by_id(&ref_proc_id) + .expect("procedure ID not in cache") + }; // add the MAST root of the re-exported procedure to the set of procedures exported // from this module proc_roots.push(proc_mast_root); } - // compile all local procedures in the module; once the compilation is complete, we get - // all compiled procedures (and their combined callset) from the context - for proc_ast in module.ast.procs().iter() { + // compile all local (internal end exported) procedures in the module; once the compilation + // is complete, we get all compiled procedures (and their combined callset) from the + // context + for proc_ast in module.procs().iter() { self.compile_procedure(proc_ast, context)?; } let (module_procs, module_callset) = context.complete_module(); @@ -227,17 +237,20 @@ impl Assembler { // - a procedure is exported from the module, or // - a procedure is present in the combined callset - i.e., it is an internal procedure // which has been invoked via a local call instruction. - for proc in module_procs.into_iter() { + for (proc_index, proc) in module_procs.into_iter().enumerate() { if proc.is_export() { proc_roots.push(proc.mast_root()); } if proc.is_export() || module_callset.contains(&proc.mast_root()) { + // build the procedure ID if this module has the library path + let proc_id = build_procedure_id(path, &proc, proc_index); + // this is safe because we fail if the cache is borrowed. self.proc_cache .try_borrow_mut() .map_err(|_| AssemblyError::InvalidCacheLock)? - .insert(proc)?; + .insert(proc, proc_id)?; } } @@ -372,7 +385,7 @@ impl Assembler { let proc_name = context.get_imported_procedure_name(proc_id); AssemblyError::imported_proc_module_not_found(proc_id, proc_name) })?; - self.compile_module(module, context)?; + self.compile_module(&module.ast, Some(&module.path), context)?; // if the procedure is still not in cache, then there was some error if !self.proc_cache.borrow().contains_id(proc_id) { return Err(AssemblyError::imported_proc_not_found_in_module( @@ -480,3 +493,22 @@ fn combine_spans(spans: &mut Vec) -> CodeBlock { }); CodeBlock::new_span_with_decorators(ops, decorators) } + +/// Builds a procedure ID based on the provided parameters. +/// +/// Returns [ProcedureId] if `path` is provided, [None] otherwise. +fn build_procedure_id( + path: Option<&LibraryPath>, + proc: &NamedProcedure, + proc_index: usize, +) -> Option { + let mut proc_id = None; + if let Some(path) = path { + if proc.is_export() { + proc_id = Some(ProcedureId::from_name(proc.name(), path)); + } else { + proc_id = Some(ProcedureId::from_index(proc_index as u16, path)) + } + } + proc_id +} diff --git a/assembly/src/assembler/procedure_cache.rs b/assembly/src/assembler/procedure_cache.rs index f6a4931064..3caa49a1c5 100644 --- a/assembly/src/assembler/procedure_cache.rs +++ b/assembly/src/assembler/procedure_cache.rs @@ -42,6 +42,11 @@ impl ProcedureCache { self.procedures.get(mast_root) } + /// Returns a MAST root ([RpoDigest]) reference corresponding to the provided [ProcedureId]. + pub fn get_proc_root_by_id(&self, id: &ProcedureId) -> Option { + self.proc_id_map.get(id).cloned() + } + /// Returns true if the [ProcedureCache] contains a [Procedure] for the specified /// [ProcedureId]. pub fn contains_id(&self, id: &ProcedureId) -> bool { @@ -58,10 +63,14 @@ impl ProcedureCache { /// - A procedure with the same ID is already in the cache. /// - A procedure with the same MAST root but conflicting procedure metadata exists in the /// cache. - pub fn insert(&mut self, proc: NamedProcedure) -> Result<(), AssemblyError> { + pub fn insert( + &mut self, + proc: NamedProcedure, + id: Option, + ) -> Result<(), AssemblyError> { // if a procedure with the same id is already in the cache, return an error - if self.contains_id(proc.id()) { - return Err(AssemblyError::duplicate_proc_id(proc.id())); + if id.is_some_and(|id| self.contains_id(&id)) { + return Err(AssemblyError::duplicate_proc_id(&id.unwrap())); } // If the entry is `Vacant` then insert the Procedure. If the procedure with the same MAST @@ -72,12 +81,16 @@ impl ProcedureCache { if proc.num_locals() != cached_proc.num_locals() { Err(AssemblyError::conflicting_num_locals(proc.name())) } else { - self.proc_id_map.insert(*proc.id(), proc.mast_root()); + if let Some(id) = id { + self.proc_id_map.insert(id, proc.mast_root()); + } Ok(()) } } Entry::Vacant(entry) => { - self.proc_id_map.insert(*proc.id(), proc.mast_root()); + if let Some(id) = id { + self.proc_id_map.insert(id, proc.mast_root()); + } entry.insert(proc.into_inner()); Ok(()) } diff --git a/assembly/src/ast/mod.rs b/assembly/src/ast/mod.rs index ae7321d9fb..f423d1b6f1 100644 --- a/assembly/src/ast/mod.rs +++ b/assembly/src/ast/mod.rs @@ -384,8 +384,7 @@ impl fmt::Display for ProgramAst { /// An abstract syntax tree of a Miden module. /// /// A module AST consists of a list of procedure ASTs, a list of re-exported procedures, a list of -/// imports, a map from procedure ids to procedure names for imported procedures used in the module, -/// and module documentation. Local procedures could be internal or exported. +/// imports, and module documentation. Local procedures could be internal or exported. #[derive(Debug, Clone, PartialEq, Eq)] pub struct ModuleAst { local_procs: Vec, diff --git a/assembly/src/library/path.rs b/assembly/src/library/path.rs index 590d6596e8..600d81d435 100644 --- a/assembly/src/library/path.rs +++ b/assembly/src/library/path.rs @@ -32,6 +32,9 @@ impl LibraryPath { /// Path for an executable module. pub const EXEC_PATH: &'static str = "#exec"; + /// Path for a module without library path. + pub const ANON_PATH: &'static str = "#anon"; + // CONSTRUCTORS // -------------------------------------------------------------------------------------------- @@ -72,6 +75,14 @@ impl LibraryPath { } } + /// Returns a path for a module without library path. + pub fn anon_path() -> Self { + Self { + path: Self::ANON_PATH.into(), + num_components: 1, + } + } + // PUBLIC ACCESSORS // -------------------------------------------------------------------------------------------- diff --git a/assembly/src/procedures/mod.rs b/assembly/src/procedures/mod.rs index 01ede682a9..5a6591da9d 100644 --- a/assembly/src/procedures/mod.rs +++ b/assembly/src/procedures/mod.rs @@ -54,13 +54,10 @@ impl Procedure { /// /// Procedure metadata includes: /// - Procedure name. -/// - Procedure ID which is computed as a hash of the procedure's fully qualified path. /// - A boolean flag indicating whether the procedure is exported from a module. -/// - Number of procedure locals available to the procedure. /// - A set of MAST roots of procedures which are invoked from this procedure. #[derive(Clone, Debug)] pub struct NamedProcedure { - id: ProcedureId, name: ProcedureName, is_export: bool, procedure: Procedure, @@ -71,7 +68,6 @@ impl NamedProcedure { // -------------------------------------------------------------------------------------------- /// Returns a new [Procedure] instantiated with the specified properties. pub fn new( - id: ProcedureId, name: ProcedureName, is_export: bool, num_locals: u32, @@ -79,7 +75,6 @@ impl NamedProcedure { callset: CallSet, ) -> Self { NamedProcedure { - id, name, is_export, procedure: Procedure { @@ -93,11 +88,6 @@ impl NamedProcedure { // PUBLIC ACCESSORS // -------------------------------------------------------------------------------------------- - /// Returns ID of this procedure. - pub fn id(&self) -> &ProcedureId { - &self.id - } - /// Returns a label of this procedure. pub fn name(&self) -> &ProcedureName { &self.name diff --git a/assembly/src/tests.rs b/assembly/src/tests.rs index 498715018e..ae439fdda3 100644 --- a/assembly/src/tests.rs +++ b/assembly/src/tests.rs @@ -9,7 +9,7 @@ use core::slice::Iter; #[test] fn simple_instructions() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin push.0 assertz end"; let program = assembler.compile(source).unwrap(); let expected = "\ @@ -37,7 +37,7 @@ fn simple_instructions() { #[test] fn empty_program() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin end"; let program = assembler.compile(source).unwrap(); let expected = "begin span noop end end"; @@ -46,7 +46,7 @@ fn empty_program() { #[test] fn empty_if() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin if.true end end"; let program = assembler.compile(source).unwrap(); let expected = "begin if.true span noop end else span noop end end end"; @@ -55,7 +55,7 @@ fn empty_if() { #[test] fn empty_while() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin while.true end end"; let program = assembler.compile(source).unwrap(); let expected = "begin while.true span noop end end end"; @@ -64,7 +64,7 @@ fn empty_while() { #[test] fn empty_repeat() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin repeat.5 end end"; let program = assembler.compile(source).unwrap(); let expected = "begin span noop noop noop noop noop end end"; @@ -73,7 +73,7 @@ fn empty_repeat() { #[test] fn single_span() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin push.1 push.2 add end"; let program = assembler.compile(source).unwrap(); let expected = "begin span pad incr push(2) add end end"; @@ -82,7 +82,7 @@ fn single_span() { #[test] fn span_and_simple_if() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); // if with else let source = "begin push.2 push.3 if.true add else mul end end"; @@ -115,7 +115,7 @@ fn span_and_simple_if() { #[test] fn simple_main_call() { // instantiate assembler - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); // compile account module let account_path = LibraryPath::new("context::account").unwrap(); @@ -131,23 +131,88 @@ fn simple_main_call() { ", ) .unwrap(); - let account_module = Module::new(account_path, account_code); let _method_roots = assembler - .compile_module(&account_module, &mut super::AssemblyContext::for_module(false)) + .compile_module(&account_code, Some(&account_path), &mut AssemblyContext::for_module(false)) .unwrap(); // compile note 1 program let note_1 = ProgramAst::parse("use.context::account begin call.account::account_method_1 end").unwrap(); let _note_1_root = assembler - .compile_in_context(¬e_1, &mut super::AssemblyContext::for_program(Some(¬e_1))) + .compile_in_context(¬e_1, &mut AssemblyContext::for_program(Some(¬e_1))) .unwrap(); // compile note 2 program let note_2 = ProgramAst::parse("use.context::account begin call.account::account_method_2 end").unwrap(); let _note_2_root = assembler - .compile_in_context(¬e_2, &mut super::AssemblyContext::for_program(Some(¬e_2))) + .compile_in_context(¬e_2, &mut AssemblyContext::for_program(Some(¬e_2))) + .unwrap(); +} + +#[test] +fn call_without_path() { + // instantiate assembler + let assembler = Assembler::default(); + + // compile first module + let account_code1 = ModuleAst::parse( + "\ + export.account_method_1 + push.2.1 add + end + + export.account_method_2 + push.3.1 sub + end + ", + ) + .unwrap(); + assembler + .compile_module(&account_code1, None, &mut AssemblyContext::for_module(false)) + .unwrap(); + + //--------------------------------------------------------------------------------------------- + + // compile second module + let account_code2 = ModuleAst::parse( + "\ + export.account_method_1 + push.2.2 add + end + + export.account_method_2 + push.4.1 sub + end + ", + ) + .unwrap(); + assembler + .compile_module(&account_code2, None, &mut AssemblyContext::for_module(false)) + .unwrap(); + + //--------------------------------------------------------------------------------------------- + + // compile program in which functions from different modules but with equal names are called + let source = ProgramAst::parse( + "begin + # call the account_method_1 from the first module (account_code1) + call.0x81e0b1afdbd431e4c9d4b86599b82c3852ecf507ae318b71c099cdeba0169068 + + # call the account_method_2 from the first module (account_code1) + call.0x1bc375fc794af6637af3f428286bf6ac1a24617640ed29f8bc533f48316c6d75 + + # call the account_method_1 from the second module (account_code2) + call.0xcfadd74886ea075d15826a4f59fb4db3a10cde6e6e953603cba96b4dcbb94321 + + # call the account_method_2 from the second module (account_code2) + call.0x1976bf72d457bd567036d3648b7e3f3c22eca4096936931e59796ec05c0ecb10 + end", + ) + .unwrap(); + + assembler + .compile_in_context(&source, &mut AssemblyContext::for_program(Some(&source))) .unwrap(); } @@ -156,7 +221,7 @@ fn simple_main_call() { #[test] fn simple_constant() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.TEST_CONSTANT=7 \ begin \ push.TEST_CONSTANT \ @@ -174,7 +239,7 @@ fn simple_constant() { #[test] fn multiple_constants_push() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.CONSTANT_1=21 \ const.CONSTANT_2=44 \ begin \ @@ -192,7 +257,7 @@ fn multiple_constants_push() { #[test] fn constant_numeric_expression() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.TEST_CONSTANT=11-2+4*(12-(10+1))+9+8//4*2 \ begin \ push.TEST_CONSTANT \ @@ -210,7 +275,7 @@ fn constant_numeric_expression() { #[test] fn constant_alphanumeric_expression() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.TEST_CONSTANT_1=(18-1+10)*6-((13+7)*2) \ const.TEST_CONSTANT_2=11-2+4*(12-(10+1))+9 const.TEST_CONSTANT_3=(TEST_CONSTANT_1-(TEST_CONSTANT_2+10))//5+3 @@ -230,7 +295,7 @@ fn constant_alphanumeric_expression() { #[test] fn constant_field_division() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.TEST_CONSTANT=(17//4)/4*(1//2)+2 \ begin \ push.TEST_CONSTANT \ @@ -248,7 +313,7 @@ fn constant_field_division() { #[test] fn constant_err_const_not_initialized() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.TEST_CONSTANT=5+A \ begin \ push.TEST_CONSTANT \ @@ -262,7 +327,7 @@ fn constant_err_const_not_initialized() { #[test] fn constant_err_div_by_zero() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.TEST_CONSTANT=5/0 \ begin \ push.TEST_CONSTANT \ @@ -286,7 +351,7 @@ fn constant_err_div_by_zero() { #[test] fn constants_must_be_uppercase() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.constant_1=12 \ begin \ push.constant_1 \ @@ -300,7 +365,7 @@ fn constants_must_be_uppercase() { #[test] fn duplicate_constant_name() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.CONSTANT=12 \ const.CONSTANT=14 \ begin \ @@ -315,7 +380,7 @@ fn duplicate_constant_name() { #[test] fn constant_must_be_valid_felt() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.CONSTANT=1122INVALID \ begin \ push.CONSTANT \ @@ -330,7 +395,7 @@ fn constant_must_be_valid_felt() { #[test] fn constant_must_be_within_valid_felt_range() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "const.CONSTANT=18446744073709551615 \ begin \ push.CONSTANT \ @@ -346,7 +411,7 @@ fn constant_must_be_within_valid_felt_range() { #[test] fn constants_defined_in_global_scope() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = " begin \ const.CONSTANT=12 @@ -361,7 +426,7 @@ fn constants_defined_in_global_scope() { #[test] fn constant_not_found() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = " begin \ push.CONSTANT \ @@ -375,7 +440,7 @@ fn constant_not_found() { #[test] fn mem_operations_with_constants() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); // Define constant values const PROC_LOC_STORE_PTR: u64 = 0; @@ -495,7 +560,7 @@ fn const_conversion_failed_to_u16() { end " ); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let result = assembler.compile(source); assert!(result.is_err()); let err = result.err().unwrap(); @@ -518,7 +583,7 @@ fn const_conversion_failed_to_u32() { end " ); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let result = assembler.compile(source); assert!(result.is_err()); let err = result.err().unwrap(); @@ -542,7 +607,7 @@ fn assert_with_code() { end " .to_string(); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let program = assembler.compile(source).unwrap(); let expected = "\ @@ -564,7 +629,7 @@ fn assertz_with_code() { end " .to_string(); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let program = assembler.compile(source).unwrap(); let expected = "\ @@ -586,7 +651,7 @@ fn assert_eq_with_code() { end " .to_string(); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let program = assembler.compile(source).unwrap(); let expected = "\ @@ -608,7 +673,7 @@ fn assert_eqw_with_code() { end " .to_string(); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let program = assembler.compile(source).unwrap(); let expected = "\ @@ -634,7 +699,7 @@ fn u32assert_with_code() { end " .to_string(); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let program = assembler.compile(source).unwrap(); let expected = "\ @@ -656,7 +721,7 @@ fn u32assert2_with_code() { end " .to_string(); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let program = assembler.compile(source).unwrap(); let expected = "\ @@ -678,7 +743,7 @@ fn u32assertw_with_code() { end " .to_string(); - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let program = assembler.compile(source).unwrap(); let expected = "\ @@ -697,7 +762,7 @@ fn u32assertw_with_code() { #[test] fn nested_control_blocks() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); // if with else let source = "begin \ @@ -738,7 +803,7 @@ fn nested_control_blocks() { #[test] fn program_with_one_procedure() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "proc.foo push.3 push.7 mul end begin push.2 push.3 add exec.foo end"; let program = assembler.compile(source).unwrap(); let expected = "begin span push(2) push(3) add push(3) push(7) mul end end"; @@ -747,7 +812,7 @@ fn program_with_one_procedure() { #[test] fn program_with_one_empty_procedure() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "proc.foo end begin exec.foo end"; let program = assembler.compile(source).unwrap(); let expected = "begin span noop end end"; @@ -756,7 +821,7 @@ fn program_with_one_empty_procedure() { #[test] fn program_with_nested_procedure() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "\ proc.foo push.3 push.7 mul end \ proc.bar push.5 exec.foo add end \ @@ -771,7 +836,7 @@ fn program_with_nested_procedure() { #[test] fn program_with_proc_locals() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "\ proc.foo.1 \ loc_store.0 \ @@ -801,7 +866,7 @@ fn program_with_proc_locals() { #[test] fn program_with_exported_procedure() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "export.foo push.3 push.7 mul end begin push.2 push.3 add exec.foo end"; assert!(assembler.compile(source).is_err()); } @@ -811,7 +876,7 @@ fn program_with_exported_procedure() { #[test] fn program_with_incorrect_mast_root_length() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin call.0x1234 end"; let result = assembler.compile(source); let err = result.err().unwrap(); @@ -821,7 +886,7 @@ fn program_with_incorrect_mast_root_length() { #[test] fn program_with_invalid_mast_root_chars() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin call.0xc2545da99d3a1f3f38d957c7893c44d78998d8ea8b11aba7e22c8c2b2a21xyzb end"; let result = assembler.compile(source); @@ -833,7 +898,7 @@ fn program_with_invalid_mast_root_chars() { #[test] fn program_with_invalid_rpo_digest_call() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin call.0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff end"; let result = assembler.compile(source); @@ -845,7 +910,7 @@ fn program_with_invalid_rpo_digest_call() { #[test] fn program_with_phantom_mast_call() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin call.0xc2545da99d3a1f3f38d957c7893c44d78998d8ea8b11aba7e22c8c2b2a213dae end"; @@ -887,7 +952,7 @@ fn program_with_one_import_and_hex_call() { let modules = vec![Module { path, ast }]; let library = DummyLibrary::new(namespace, modules); - let assembler = super::Assembler::default().with_library(&library).unwrap(); + let assembler = Assembler::default().with_library(&library).unwrap(); let source = format!( r#" use.{NAMESPACE}::{MODULE} @@ -947,7 +1012,7 @@ fn program_with_two_imported_procs_with_same_mast_root() { let modules = vec![Module { path, ast }]; let library = DummyLibrary::new(namespace, modules); - let assembler = super::Assembler::default().with_library(&library).unwrap(); + let assembler = Assembler::default().with_library(&library).unwrap(); let source = format!( r#" use.{NAMESPACE}::{MODULE} @@ -1020,7 +1085,7 @@ fn program_with_reexported_proc_in_same_library() { ast: ref_ast, }, ]; - let assembler = super::Assembler::default() + let assembler = Assembler::default() .with_library(&DummyLibrary::new(namespace, modules)) .unwrap(); let source = format!( @@ -1090,7 +1155,7 @@ fn program_with_reexported_proc_in_another_library() { }]; let dummy_library_1 = DummyLibrary::new(namespace, modules); let dummy_library_2 = DummyLibrary::new(ref_namespace, ref_modules); - let assembler = super::Assembler::default() + let assembler = Assembler::default() .with_libraries([&dummy_library_1, &dummy_library_2].into_iter()) .unwrap(); let source = format!( @@ -1116,7 +1181,7 @@ fn program_with_reexported_proc_in_another_library() { // when the re-exported proc is part of a different library and the library is not passed to // the assembler it should fail - let assembler = super::Assembler::default().with_library(&dummy_library_1).unwrap(); + let assembler = Assembler::default().with_library(&dummy_library_1).unwrap(); let source = format!( r#" use.{NAMESPACE}::{MODULE} @@ -1153,7 +1218,7 @@ fn module_alias() { let modules = vec![Module { path, ast }]; let library = DummyLibrary::new(namespace, modules); - let assembler = super::Assembler::default().with_library(&library).unwrap(); + let assembler = Assembler::default().with_library(&library).unwrap(); let source = " use.dummy::math::u64->bigint @@ -1217,7 +1282,7 @@ fn module_alias() { #[test] fn program_with_import_errors() { // --- non-existent import ------------------------------------------------ - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "\ use.std::math::u512 begin \ @@ -1227,7 +1292,7 @@ fn program_with_import_errors() { assert!(assembler.compile(source).is_err()); // --- non-existent procedure in import ----------------------------------- - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "\ use.std::math::u256 begin \ @@ -1245,7 +1310,7 @@ fn program_with_import_errors() { #[test] fn comment_simple() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin # simple comment \n push.1 push.2 add end"; let program = assembler.compile(source).unwrap(); let expected = "begin span pad incr push(2) add end end"; @@ -1254,7 +1319,7 @@ fn comment_simple() { #[test] fn comment_in_nested_control_blocks() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); // if with else let source = "begin \ @@ -1294,7 +1359,7 @@ fn comment_in_nested_control_blocks() { #[test] fn comment_before_program() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = " # starting comment \n begin push.1 push.2 add end"; let program = assembler.compile(source).unwrap(); let expected = "begin span pad incr push(2) add end end"; @@ -1303,7 +1368,7 @@ fn comment_before_program() { #[test] fn comment_after_program() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin push.1 push.2 add end # closing comment"; let program = assembler.compile(source).unwrap(); let expected = "begin span pad incr push(2) add end end"; @@ -1315,7 +1380,7 @@ fn comment_after_program() { #[test] fn invalid_program() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = ""; let program = assembler.compile(source); assert!(program.is_err()); @@ -1394,7 +1459,7 @@ fn invalid_proc() { #[test] fn invalid_if_else() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); // --- unmatched if --------------------------------------------------------------------------- let source = "begin push.1 add if.true mul"; @@ -1436,7 +1501,7 @@ fn invalid_if_else() { #[test] fn invalid_repeat() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); // unmatched repeat let source = "begin push.1 add repeat.10 mul"; @@ -1460,7 +1525,7 @@ fn invalid_repeat() { #[test] fn invalid_while() { - let assembler = super::Assembler::default(); + let assembler = Assembler::default(); let source = "begin push.1 add while mul end end"; let program = assembler.compile(source); From 1efc2c0d54d5db3ec2f64378f17747c631141c13 Mon Sep 17 00:00:00 2001 From: frisitano Date: Tue, 26 Sep 2023 18:07:02 +0800 Subject: [PATCH 112/120] feat: introduce Host object --- core/src/operations/decorators/advice.rs | 22 +- miden/README.md | 18 +- miden/benches/program_execution.rs | 4 +- miden/src/cli/debug/executor.rs | 5 +- miden/src/cli/prove.rs | 6 +- miden/src/cli/run.rs | 6 +- miden/src/examples/fibonacci.rs | 6 +- miden/src/examples/mod.rs | 21 +- miden/src/lib.rs | 6 +- miden/src/repl/mod.rs | 6 +- miden/src/tools/mod.rs | 34 +- processor/README.md | 8 +- processor/src/advice/mod.rs | 333 -------- processor/src/chiplets/tests.rs | 7 +- processor/src/debug.rs | 7 +- processor/src/decoder/mod.rs | 10 +- processor/src/decoder/tests.rs | 18 +- processor/src/decorators/adv_map_injectors.rs | 180 ---- .../src/decorators/adv_stack_injectors/mod.rs | 265 ------ .../src/decorators/adv_stack_injectors/smt.rs | 589 ------------- processor/src/decorators/mod.rs | 141 --- processor/src/decorators/tests.rs | 365 -------- processor/src/host/advice/extractors.rs | 106 +++ .../advice/injectors/adv_map_injectors.rs | 190 +++++ .../advice/injectors/adv_stack_injectors.rs | 306 +++++++ .../{advice => host/advice/injectors}/dsa.rs | 2 +- .../injectors/merkle_store_injectors.rs | 23 + processor/src/host/advice/injectors/mod.rs | 5 + processor/src/host/advice/injectors/smt.rs | 600 +++++++++++++ processor/src/{ => host}/advice/inputs.rs | 0 processor/src/host/advice/mod.rs | 800 ++++++++++++++++++ processor/src/{ => host}/advice/providers.rs | 80 +- processor/src/{ => host}/advice/source.rs | 0 processor/src/host/debug.rs | 52 ++ processor/src/host/mod.rs | 239 ++++++ processor/src/lib.rs | 153 +++- processor/src/operations/crypto_ops.rs | 33 +- processor/src/operations/ext2_ops.rs | 6 +- processor/src/operations/field_ops.rs | 6 +- processor/src/operations/fri_ops.rs | 6 +- processor/src/operations/io_ops.rs | 33 +- processor/src/operations/mod.rs | 37 +- processor/src/operations/stack_ops.rs | 6 +- processor/src/operations/sys_ops.rs | 6 +- processor/src/operations/u32_ops.rs | 6 +- processor/src/system/tests.rs | 6 +- processor/src/trace/mod.rs | 20 +- processor/src/trace/tests/mod.rs | 9 +- prover/README.md | 4 +- prover/src/lib.rs | 18 +- stdlib/tests/collections/mmr.rs | 3 +- stdlib/tests/collections/smt.rs | 4 +- stdlib/tests/crypto/stark/mod.rs | 5 +- stdlib/tests/mem/mod.rs | 29 +- test-utils/src/lib.rs | 42 +- 55 files changed, 2697 insertions(+), 2195 deletions(-) delete mode 100644 processor/src/advice/mod.rs delete mode 100644 processor/src/decorators/adv_map_injectors.rs delete mode 100644 processor/src/decorators/adv_stack_injectors/mod.rs delete mode 100644 processor/src/decorators/adv_stack_injectors/smt.rs delete mode 100644 processor/src/decorators/mod.rs delete mode 100644 processor/src/decorators/tests.rs create mode 100644 processor/src/host/advice/extractors.rs create mode 100644 processor/src/host/advice/injectors/adv_map_injectors.rs create mode 100644 processor/src/host/advice/injectors/adv_stack_injectors.rs rename processor/src/{advice => host/advice/injectors}/dsa.rs (97%) create mode 100644 processor/src/host/advice/injectors/merkle_store_injectors.rs create mode 100644 processor/src/host/advice/injectors/mod.rs create mode 100644 processor/src/host/advice/injectors/smt.rs rename processor/src/{ => host}/advice/inputs.rs (100%) create mode 100644 processor/src/host/advice/mod.rs rename processor/src/{ => host}/advice/providers.rs (88%) rename processor/src/{ => host}/advice/source.rs (100%) create mode 100644 processor/src/host/debug.rs create mode 100644 processor/src/host/mod.rs diff --git a/core/src/operations/decorators/advice.rs b/core/src/operations/decorators/advice.rs index 2f2bda5b11..0a8011d4e5 100644 --- a/core/src/operations/decorators/advice.rs +++ b/core/src/operations/decorators/advice.rs @@ -11,8 +11,8 @@ use core::fmt; /// These actions can affect all 3 components of the advice provider: Merkle store, advice stack, /// and advice map. /// -/// All actions, except for `MerkleNodeMerge` and `Ext2Inv`, can be invoked directly from Miden -/// assembly via dedicated instructions. +/// All actions, except for `MerkleNodeMerge`, `Ext2Inv` and `UpdateMerkleNode` can be invoked +/// directly from Miden assembly via dedicated instructions. #[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum AdviceInjector { // MERKLE STORE INJECTORS @@ -48,6 +48,21 @@ pub enum AdviceInjector { /// Merkle store: {TREE_ROOT<-NODE} MerkleNodeToStack, + /// Updates the node of a Merkle tree specified by the values at the top of the operand stack. + /// Returns the path from the updated node to the new root of the tree to the caller. + /// + /// Inputs: + /// Operand stack: [OLD_NODE, depth, index, OLD_ROOT, NEW_NODE, ...] + /// Advice: [...] + /// Merkle store: {...} + /// + /// Outputs: + /// Operand stack: [OLD_NODE, depth, index, OLD_ROOT, NEW_NODE, ...] + /// Advice stack: [...] + /// Merkle store: {path, ...} + /// Return: [path] + UpdateMerkleNode, + /// Pushes a list of field elements onto the advice stack. The list is looked up in the advice /// map using the specified word from the operand stack as the key. If `include_len` is set to /// true, the number of elements in the value is also pushed onto the advice stack. @@ -270,6 +285,9 @@ impl fmt::Display for AdviceInjector { match self { Self::MerkleNodeMerge => write!(f, "merkle_node_merge"), Self::MerkleNodeToStack => write!(f, "merkle_node_to_stack"), + Self::UpdateMerkleNode => { + write!(f, "update_merkle_node") + } Self::MapValueToStack { include_len, key_offset, diff --git a/miden/README.md b/miden/README.md index 4d7ac47db9..639d6204ff 100644 --- a/miden/README.md +++ b/miden/README.md @@ -41,7 +41,7 @@ The `execute_iter()` function returns a `VmStateIterator` which can be used to i For example: ```rust -use miden::{Assembler, execute, execute_iter, MemAdviceProvider, StackInputs}; +use miden::{Assembler, execute, execute_iter, MemAdviceProvider, DefaultHost, StackInputs}; use processor::ExecutionOptions; // instantiate the assembler @@ -54,16 +54,16 @@ let program = assembler.compile("begin push.3 push.5 add end").unwrap(); let stack_inputs = StackInputs::default(); // instantiate an empty advice provider -let mut advice_provider = MemAdviceProvider::default(); +let mut host = DefaultHost::default(); // instantiate default execution options let exec_options = ExecutionOptions::default(); // execute the program with no inputs -let trace = execute(&program, stack_inputs.clone(), &mut advice_provider, exec_options).unwrap(); +let trace = execute(&program, stack_inputs.clone(), &mut host, exec_options).unwrap(); // now, execute the same program in debug mode and iterate over VM states -for vm_state in execute_iter(&program, stack_inputs, advice_provider) { +for vm_state in execute_iter(&program, stack_inputs, host) { match vm_state { Ok(vm_state) => println!("{:?}", vm_state), Err(_) => println!("something went terribly wrong!"), @@ -87,7 +87,7 @@ If the program is executed successfully, the function returns a tuple with 2 ele #### Proof generation example Here is a simple example of executing a program which pushes two numbers onto the stack and computes their sum: ```rust -use miden::{Assembler, MemAdviceProvider, ProvingOptions, prove, StackInputs}; +use miden::{Assembler, DefaultHost, ProvingOptions, prove, StackInputs}; // instantiate the assembler let assembler = Assembler::default(); @@ -99,7 +99,7 @@ let program = assembler.compile("begin push.3 push.5 add end").unwrap(); let (outputs, proof) = prove( &program, StackInputs::default(), // we won't provide any inputs - MemAdviceProvider::default(), // we won't provide advice inputs + DefaultHost::default(), // we won't provide advice inputs ProvingOptions::default(), // we'll be using default options ) .unwrap(); @@ -159,7 +159,7 @@ add // stack state: 3 2 ``` Notice that except for the first 2 operations which initialize the stack, the sequence of `swap dup.1 add` operations repeats over and over. In fact, we can repeat these operations an arbitrary number of times to compute an arbitrary Fibonacci number. In Rust, it would look like this (this is actually a simplified version of the example in [fibonacci.rs](src/examples/src/fibonacci.rs)): ```rust -use miden::{Assembler, MemAdviceProvider, ProvingOptions, StackInputs}; +use miden::{Assembler, DefaultHost, ProvingOptions, StackInputs}; // set the number of terms to compute let n = 50; @@ -177,7 +177,7 @@ let source = format!( let program = Assembler::default().compile(&source).unwrap(); // initialize an empty advice provider -let advice_provider = MemAdviceProvider::default(); +let host = DefaultHost::default(); // initialize the stack with values 0 and 1 let stack_inputs = StackInputs::try_from_values([0, 1]).unwrap(); @@ -186,7 +186,7 @@ let stack_inputs = StackInputs::try_from_values([0, 1]).unwrap(); let (outputs, proof) = miden::prove( &program, stack_inputs, - advice_provider, + host, ProvingOptions::default(), // use default proving options ) .unwrap(); diff --git a/miden/benches/program_execution.rs b/miden/benches/program_execution.rs index 51ba1f01b8..d465b70f85 100644 --- a/miden/benches/program_execution.rs +++ b/miden/benches/program_execution.rs @@ -1,5 +1,5 @@ use criterion::{criterion_group, criterion_main, Criterion}; -use miden::{execute, Assembler, MemAdviceProvider, StackInputs}; +use miden::{execute, Assembler, DefaultHost, StackInputs}; use processor::ExecutionOptions; use std::time::Duration; use stdlib::StdLibrary; @@ -23,7 +23,7 @@ fn program_execution(c: &mut Criterion) { execute( &program, StackInputs::default(), - MemAdviceProvider::default(), + DefaultHost::default(), ExecutionOptions::default(), ) }); diff --git a/miden/src/cli/debug/executor.rs b/miden/src/cli/debug/executor.rs index 4aec1c2ad5..80dd021d5a 100644 --- a/miden/src/cli/debug/executor.rs +++ b/miden/src/cli/debug/executor.rs @@ -1,7 +1,7 @@ use super::DebugCommand; use miden::{ math::{Felt, StarkField}, - MemAdviceProvider, Program, StackInputs, VmState, VmStateIterator, + DefaultHost, MemAdviceProvider, Program, StackInputs, VmState, VmStateIterator, }; /// Holds debugger state and iterator used for debugging. @@ -22,7 +22,8 @@ impl DebugExecutor { stack_inputs: StackInputs, advice_provider: MemAdviceProvider, ) -> Result { - let mut vm_state_iter = processor::execute_iter(&program, stack_inputs, advice_provider); + let mut vm_state_iter = + processor::execute_iter(&program, stack_inputs, DefaultHost::new(advice_provider)); let vm_state = vm_state_iter .next() .ok_or(format!( diff --git a/miden/src/cli/prove.rs b/miden/src/cli/prove.rs index 0318e2b48b..a6e0da9b32 100644 --- a/miden/src/cli/prove.rs +++ b/miden/src/cli/prove.rs @@ -1,7 +1,7 @@ use super::data::{Debug, InputFile, Libraries, OutputFile, ProgramFile, ProofFile}; use clap::Parser; use miden::ProvingOptions; -use processor::{ExecutionOptions, ExecutionOptionsError}; +use processor::{DefaultHost, ExecutionOptions, ExecutionOptionsError}; use std::{io::Write, path::PathBuf, time::Instant}; // TODO check if clap is supporting automatic generation of list values of hash function @@ -86,13 +86,13 @@ impl ProveCmd { // fetch the stack and program inputs from the arguments let stack_inputs = input_data.parse_stack_inputs()?; - let advice_provider = input_data.parse_advice_provider()?; + let host = DefaultHost::new(input_data.parse_advice_provider()?); let proving_options = self.get_proof_options().map_err(|err| format!("{err}"))?; // execute program and generate proof let (stack_outputs, proof) = - prover::prove(&program, stack_inputs, advice_provider, proving_options) + prover::prove(&program, stack_inputs, host, proving_options) .map_err(|err| format!("Failed to prove program - {:?}", err))?; println!( diff --git a/miden/src/cli/run.rs b/miden/src/cli/run.rs index ab170aa228..443265b8b4 100644 --- a/miden/src/cli/run.rs +++ b/miden/src/cli/run.rs @@ -1,6 +1,6 @@ use super::data::{Debug, InputFile, Libraries, OutputFile, ProgramFile}; use clap::Parser; -use processor::ExecutionOptions; +use processor::{DefaultHost, ExecutionOptions}; use std::{path::PathBuf, time::Instant}; #[derive(Debug, Clone, Parser)] @@ -56,14 +56,14 @@ impl RunCmd { // fetch the stack and program inputs from the arguments let stack_inputs = input_data.parse_stack_inputs()?; - let advice_provider = input_data.parse_advice_provider()?; + let host = DefaultHost::new(input_data.parse_advice_provider()?); let program_hash: [u8; 32] = program.hash().into(); print!("Executing program with hash {}... ", hex::encode(program_hash)); let now = Instant::now(); // execute program and generate outputs - let trace = processor::execute(&program, stack_inputs, advice_provider, execution_options) + let trace = processor::execute(&program, stack_inputs, host, execution_options) .map_err(|err| format!("Failed to generate execution trace = {:?}", err))?; println!("done ({} ms)", now.elapsed().as_millis()); diff --git a/miden/src/examples/fibonacci.rs b/miden/src/examples/fibonacci.rs index a8ca87aa9a..4f10c37413 100644 --- a/miden/src/examples/fibonacci.rs +++ b/miden/src/examples/fibonacci.rs @@ -1,13 +1,13 @@ use super::{Example, ONE, ZERO}; use miden::{ math::{Felt, StarkField}, - Assembler, MemAdviceProvider, Program, StackInputs, + Assembler, DefaultHost, MemAdviceProvider, Program, StackInputs, }; // EXAMPLE BUILDER // ================================================================================================ -pub fn get_example(n: usize) -> Example { +pub fn get_example(n: usize) -> Example> { // generate the program and expected results let program = generate_fibonacci_program(n); let expected_result = vec![compute_fibonacci(n).as_int()]; @@ -19,7 +19,7 @@ pub fn get_example(n: usize) -> Example { Example { program, stack_inputs: StackInputs::try_from_values([0, 1]).unwrap(), - advice_provider: MemAdviceProvider::default(), + host: DefaultHost::default(), expected_result, num_outputs: 1, } diff --git a/miden/src/examples/mod.rs b/miden/src/examples/mod.rs index d6878e1bfb..df1a234184 100644 --- a/miden/src/examples/mod.rs +++ b/miden/src/examples/mod.rs @@ -1,5 +1,5 @@ use clap::Parser; -use miden::{AdviceProvider, ExecutionProof, Program, ProgramInfo, ProvingOptions, StackInputs}; +use miden::{ExecutionProof, Host, Program, ProgramInfo, ProvingOptions, StackInputs}; use processor::{ExecutionOptions, ExecutionOptionsError, ONE, ZERO}; use std::io::Write; use std::time::Instant; @@ -9,13 +9,13 @@ pub mod fibonacci; // EXAMPLE // ================================================================================================ -pub struct Example
      +pub struct Example where - A: AdviceProvider, + H: Host, { pub program: Program, pub stack_inputs: StackInputs, - pub advice_provider: A, + pub host: H, pub num_outputs: usize, pub expected_result: Vec, } @@ -87,7 +87,7 @@ impl ExampleOptions { let Example { program, stack_inputs, - advice_provider, + host, num_outputs, expected_result, .. @@ -97,7 +97,7 @@ impl ExampleOptions { // execute the program and generate the proof of execution let now = Instant::now(); let (stack_outputs, proof) = - miden::prove(&program, stack_inputs.clone(), advice_provider, proof_options).unwrap(); + miden::prove(&program, stack_inputs.clone(), host, proof_options).unwrap(); println!("--------------------------------"); println!( @@ -137,21 +137,20 @@ impl ExampleOptions { // ================================================================================================ #[cfg(test)] -pub fn test_example(example: Example, fail: bool) +pub fn test_example(example: Example, fail: bool) where - A: AdviceProvider, + H: Host, { let Example { program, stack_inputs, - advice_provider, + host, num_outputs, expected_result, } = example; let (mut outputs, proof) = - miden::prove(&program, stack_inputs.clone(), advice_provider, ProvingOptions::default()) - .unwrap(); + miden::prove(&program, stack_inputs.clone(), host, ProvingOptions::default()).unwrap(); assert_eq!( expected_result, diff --git a/miden/src/lib.rs b/miden/src/lib.rs index 237a188c87..c6158eb773 100644 --- a/miden/src/lib.rs +++ b/miden/src/lib.rs @@ -6,9 +6,9 @@ pub use assembly::{Assembler, AssemblyError, ParsingError}; pub use processor::{ - crypto, execute, execute_iter, utils, AdviceInputs, AdviceProvider, AsmOpInfo, ExecutionError, - ExecutionTrace, Kernel, MemAdviceProvider, Operation, ProgramInfo, StackInputs, VmState, - VmStateIterator, ZERO, + crypto, execute, execute_iter, utils, AdviceInputs, AdviceProvider, AsmOpInfo, DefaultHost, + ExecutionError, ExecutionTrace, Host, Kernel, MemAdviceProvider, Operation, ProgramInfo, + StackInputs, VmState, VmStateIterator, ZERO, }; pub use prover::{ math, prove, Digest, ExecutionProof, FieldExtension, HashFunction, InputError, Program, diff --git a/miden/src/repl/mod.rs b/miden/src/repl/mod.rs index f210065cf5..e51495aa68 100644 --- a/miden/src/repl/mod.rs +++ b/miden/src/repl/mod.rs @@ -1,7 +1,7 @@ use super::ProgramError; use miden::{ math::{Felt, StarkField}, - MemAdviceProvider, StackInputs, Word, + DefaultHost, StackInputs, Word, }; use rustyline::{error::ReadlineError, DefaultEditor}; @@ -267,9 +267,9 @@ fn execute(program: String) -> Result<(Vec<(u64, Word)>, Vec), ProgramErro .map_err(ProgramError::AssemblyError)?; let stack_inputs = StackInputs::default(); - let advice_provider = MemAdviceProvider::default(); + let host = DefaultHost::default(); - let state_iter = processor::execute_iter(&program, stack_inputs, advice_provider); + let state_iter = processor::execute_iter(&program, stack_inputs, host); let (system, _, stack, chiplets, err) = state_iter.into_parts(); if let Some(err) = err { return Err(ProgramError::ExecutionError(err)); diff --git a/miden/src/tools/mod.rs b/miden/src/tools/mod.rs index b4ee0f87c0..23bc7a9f93 100644 --- a/miden/src/tools/mod.rs +++ b/miden/src/tools/mod.rs @@ -1,7 +1,7 @@ use super::{cli::InputFile, ProgramError}; use clap::Parser; use core::fmt; -use miden::{utils::collections::Vec, AdviceProvider, Assembler, Operation, StackInputs}; +use miden::{utils::collections::Vec, Assembler, DefaultHost, Host, Operation, StackInputs}; use processor::AsmOpInfo; use std::{fs, path::PathBuf}; use stdlib::StdLibrary; @@ -32,11 +32,10 @@ impl Analyze { // fetch the stack and program inputs from the arguments let stack_inputs = input_data.parse_stack_inputs()?; - let advice_provider = input_data.parse_advice_provider()?; + let host = DefaultHost::new(input_data.parse_advice_provider()?); - let execution_details: ExecutionDetails = - analyze(program.as_str(), stack_inputs, advice_provider) - .expect("Could not retrieve execution details"); + let execution_details: ExecutionDetails = analyze(program.as_str(), stack_inputs, host) + .expect("Could not retrieve execution details"); println!("{}", execution_details); @@ -145,13 +144,13 @@ impl fmt::Display for ExecutionDetails { } /// Returns program analysis of a given program. -pub fn analyze( +pub fn analyze( program: &str, stack_inputs: StackInputs, - advice_provider: A, + host: H, ) -> Result where - A: AdviceProvider, + H: Host, { let program = Assembler::default() .with_debug_mode(true) @@ -159,7 +158,7 @@ where .map_err(ProgramError::AssemblyError)? .compile(program) .map_err(ProgramError::AssemblyError)?; - let vm_state_iterator = processor::execute_iter(&program, stack_inputs, advice_provider); + let vm_state_iterator = processor::execute_iter(&program, stack_inputs, host); let mut execution_details = ExecutionDetails::default(); for state in vm_state_iterator { @@ -234,15 +233,16 @@ impl AsmOpStats { mod tests { use super::{AsmOpStats, ExecutionDetails, StackInputs}; use miden::MemAdviceProvider; + use processor::DefaultHost; #[test] fn analyze_test() { let source = "proc.foo.1 loc_store.0 end begin mem_storew.1 dropw push.17 push.1 movdn.2 exec.foo end"; let stack_inputs = StackInputs::default(); - let advice_provider = MemAdviceProvider::default(); - let execution_details = super::analyze(source, stack_inputs, advice_provider) - .expect("analyze_test: Unexpected Error"); + let host = DefaultHost::default(); + let execution_details = + super::analyze(source, stack_inputs, host).expect("analyze_test: Unexpected Error"); let expected_details = ExecutionDetails { total_vm_cycles: 23, total_noops: 2, @@ -250,7 +250,7 @@ mod tests { AsmOpStats::new("dropw".to_string(), 1, 4), AsmOpStats::new("loc_store".to_string(), 1, 4), AsmOpStats::new("mem_storew".to_string(), 1, 3), - AsmOpStats::new("movdn2".to_string(), 1, 1), + AsmOpStats::new("movdn.2".to_string(), 1, 1), AsmOpStats::new("push".to_string(), 2, 3), ], }; @@ -262,8 +262,8 @@ mod tests { let source = "begin div end"; let stack_inputs = vec![1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let stack_inputs = StackInputs::try_from_values(stack_inputs).unwrap(); - let advice_provider = MemAdviceProvider::default(); - let execution_details = super::analyze(source, stack_inputs, advice_provider); + let host = DefaultHost::default(); + let execution_details = super::analyze(source, stack_inputs, host); let expected_error = "Execution Error: DivideByZero(1)"; assert_eq!(execution_details.err().unwrap().to_string(), expected_error); } @@ -272,8 +272,8 @@ mod tests { fn analyze_test_assembly_error() { let source = "proc.foo.1 loc_store.0 end mem_storew.1 dropw push.17 exec.foo end"; let stack_inputs = StackInputs::default(); - let advice_provider = MemAdviceProvider::default(); - let execution_details = super::analyze(source, stack_inputs, advice_provider); + let host = DefaultHost::default(); + let execution_details = super::analyze(source, stack_inputs, host); let expected_error = "Assembly Error: ParsingError(\"unexpected token: expected 'begin' but was 'mem_storew.1'\")"; assert_eq!(execution_details.err().unwrap().to_string(), expected_error); } diff --git a/processor/README.md b/processor/README.md index 643c7e71a5..5c34d42505 100644 --- a/processor/README.md +++ b/processor/README.md @@ -15,7 +15,7 @@ The `execute_iter()` function returns a `VmStateIterator` which can be used to i For example: ```Rust use miden_assembly::Assembler; -use miden_processor::{execute, execute_iter, ExecutionOptions, MemAdviceProvider, StackInputs, }; +use miden_processor::{execute, execute_iter, ExecutionOptions, DefaultHost, StackInputs, }; // instantiate the assembler let assembler = Assembler::default(); @@ -27,16 +27,16 @@ let program = assembler.compile("begin push.3 push.5 add end").unwrap(); let stack_inputs = StackInputs::default(); // instantiate an empty advice provider -let mut advice_provider = MemAdviceProvider::default(); +let mut host = DefaultHost::default(); // instantiate default execution options let exec_options = ExecutionOptions::default(); // execute the program with no inputs -let trace = execute(&program, stack_inputs.clone(), &mut advice_provider, exec_options).unwrap(); +let trace = execute(&program, stack_inputs.clone(), &mut host, exec_options).unwrap(); // now, execute the same program in debug mode and iterate over VM states -for vm_state in execute_iter(&program, stack_inputs, advice_provider, exec_options) { +for vm_state in execute_iter(&program, stack_inputs, host, exec_options) { match vm_state { Ok(vm_state) => println!("{:?}", vm_state), Err(_) => println!("something went terribly wrong!"), diff --git a/processor/src/advice/mod.rs b/processor/src/advice/mod.rs deleted file mode 100644 index d847b10611..0000000000 --- a/processor/src/advice/mod.rs +++ /dev/null @@ -1,333 +0,0 @@ -use super::{ExecutionError, Felt, InputError, StarkField, Word}; -use core::borrow::Borrow; -use vm_core::{ - crypto::{ - hash::RpoDigest, - merkle::{InnerNodeInfo, MerklePath, MerkleStore, NodeIndex, StoreNode}, - }, - utils::{ - collections::{BTreeMap, KvMap, RecordingMap, Vec}, - IntoBytes, - }, - SignatureKind, -}; - -mod inputs; -pub use inputs::AdviceInputs; - -mod providers; -pub use providers::{MemAdviceProvider, RecAdviceProvider}; - -mod source; -pub use source::AdviceSource; - -mod dsa; - -// ADVICE PROVIDER -// ================================================================================================ - -/// Defines behavior of an advice provider. -/// -/// An advice provider is a component through which the VM processor can interact with the host -/// environment. The processor can request nondeterministic inputs from the advice provider (i.e., -/// result of a computation performed outside of the VM), as well as insert new data into the -/// advice provider. -/// -/// An advice provider consists of the following components: -/// 1. Advice stack, which is a LIFO data structure. The processor can move the elements from the -/// advice stack onto the operand stack, as well as push new elements onto the advice stack. -/// 2. Advice map, which is a key-value map where keys are words (4 field elements) and values are -/// vectors of field elements. The processor can push the values from the map onto the advice -/// stack, as well as insert new values into the map. -/// 3. Merkle store, which contains structured data reducible to Merkle paths. The VM can request -/// Merkle paths from the store, as well as mutate it by updating or merging nodes contained in -/// the store. -pub trait AdviceProvider { - // ACCESSORS - // -------------------------------------------------------------------------------------------- - - /// Creates a "by reference" advice provider for this instance. - /// - /// The returned adapter also implements [AdviceProvider] and will simply mutably borrow this - /// instance. - fn by_ref(&mut self) -> &mut Self { - // this trait follows the same model as - // [io::Read](https://doc.rust-lang.org/std/io/trait.Read.html#method.by_ref). - // - // this approach allows the flexibility to take an advice provider either as owned or by - // mutable reference - both equally compatible with the trait requirements as we implement - // `AdviceProvider` for mutable references of any type that also implements advice - // provider. - self - } - - // ADVICE STACK - // -------------------------------------------------------------------------------------------- - - /// Pops an element from the advice stack and returns it. - /// - /// # Errors - /// Returns an error if the advice stack is empty. - fn pop_stack(&mut self) -> Result; - - /// Pops a word (4 elements) from the advice stack and returns it. - /// - /// Note: a word is popped off the stack element-by-element. For example, a `[d, c, b, a, ...]` - /// stack (i.e., `d` is at the top of the stack) will yield `[d, c, b, a]`. - /// - /// # Errors - /// Returns an error if the advice stack does not contain a full word. - fn pop_stack_word(&mut self) -> Result; - - /// Pops a double word (8 elements) from the advice stack and returns them. - /// - /// Note: words are popped off the stack element-by-element. For example, a - /// `[h, g, f, e, d, c, b, a, ...]` stack (i.e., `h` is at the top of the stack) will yield - /// two words: `[h, g, f,e ], [d, c, b, a]`. - /// - /// # Errors - /// Returns an error if the advice stack does not contain two words. - fn pop_stack_dword(&mut self) -> Result<[Word; 2], ExecutionError>; - - /// Pushes the value(s) specified by the source onto the advice stack. - /// - /// # Errors - /// Returns an error if the value specified by the advice source cannot be obtained. - fn push_stack(&mut self, source: AdviceSource) -> Result<(), ExecutionError>; - - // ADVICE MAP - // -------------------------------------------------------------------------------------------- - - /// Returns a reference to the value(s) associated with the specified key in the advice map. - fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]>; - - /// Inserts the provided value into the advice map under the specified key. - /// - /// The values in the advice map can be moved onto the advice stack by invoking - /// [AdviceProvider::push_stack()] method. - /// - /// If the specified key is already present in the advice map, the values under the key - /// are replaced with the specified values. - fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError>; - - /// Returns a signature on a message using a public key. - fn get_signature( - &self, - kind: SignatureKind, - pub_key: Word, - msg: Word, - ) -> Result, ExecutionError>; - - // MERKLE STORE - // -------------------------------------------------------------------------------------------- - - /// Returns a node at the specified depth and index in a Merkle tree with the given root. - /// - /// # Errors - /// Returns an error if: - /// - A Merkle tree for the specified root cannot be found in this advice provider. - /// - The specified depth is either zero or greater than the depth of the Merkle tree - /// identified by the specified root. - /// - Value of the node at the specified depth and index is not known to this advice provider. - fn get_tree_node(&self, root: Word, depth: &Felt, index: &Felt) - -> Result; - - /// Returns a path to a node at the specified depth and index in a Merkle tree with the - /// specified root. - /// - /// # Errors - /// Returns an error if: - /// - A Merkle tree for the specified root cannot be found in this advice provider. - /// - The specified depth is either zero or greater than the depth of the Merkle tree - /// identified by the specified root. - /// - Path to the node at the specified depth and index is not known to this advice provider. - fn get_merkle_path( - &self, - root: Word, - depth: &Felt, - index: &Felt, - ) -> Result; - - /// Reconstructs a path from the root until a leaf or empty node and returns its depth. - /// - /// For more information, check [MerkleStore::get_leaf_depth]. - /// - /// # Errors - /// Will return an error if: - /// - The provided `tree_depth` doesn't fit `u8`. - /// - The conditions of [MerkleStore::get_leaf_depth] aren't met. - fn get_leaf_depth( - &self, - root: Word, - tree_depth: &Felt, - index: &Felt, - ) -> Result; - - /// Returns node value and index of a leaf node in the subtree of the specified root, if and - /// only if this is the only leaf in the entire subtree. Otherwise, None is returned. - /// - /// The root itself is assumed to be located at the specified index in a tree with the provided - /// depth. - /// - /// # Errors - /// Returns an error if a three for the specified root does not exist in the advice provider. - fn find_lone_leaf( - &self, - root: Word, - root_index: NodeIndex, - tree_depth: u8, - ) -> Result, ExecutionError>; - - /// Updates a node at the specified depth and index in a Merkle tree with the specified root; - /// returns the Merkle path from the updated node to the new root, together with the new root. - /// - /// The tree is cloned prior to the update. Thus, the advice provider retains the original and - /// the updated tree. - /// - /// # Errors - /// Returns an error if: - /// - A Merkle tree for the specified root cannot be found in this advice provider. - /// - The specified depth is either zero or greater than the depth of the Merkle tree - /// identified by the specified root. - /// - Path to the leaf at the specified index in the specified Merkle tree is not known to this - /// advice provider. - fn update_merkle_node( - &mut self, - root: Word, - depth: &Felt, - index: &Felt, - value: Word, - ) -> Result<(MerklePath, Word), ExecutionError>; - - /// Creates a new Merkle tree in the advice provider by combining Merkle trees with the - /// specified roots. The root of the new tree is defined as `hash(left_root, right_root)`. - /// - /// After the operation, both the original trees and the new tree remains in the advice - /// provider (i.e., the input trees are not removed). - /// - /// # Errors - /// Returns an error if a Merkle tree for either of the specified roots cannot be found in this - /// advice provider. - fn merge_roots(&mut self, lhs: Word, rhs: Word) -> Result; - - /// Returns a subset of this Merkle store such that the returned Merkle store contains all - /// nodes which are descendants of the specified roots. - /// - /// The roots for which no descendants exist in this Merkle store are ignored. - fn get_store_subset(&self, roots: I) -> MerkleStore - where - I: Iterator, - R: Borrow; - - // CONTEXT MANAGEMENT - // -------------------------------------------------------------------------------------------- - - /// Increments the clock cycle. - /// - /// This is used to keep the state of the VM in sync with the state of the advice provider, and - /// should be incrementally updated when called. - /// - /// TODO: keeping track of the clock cycle is used primarily for attaching clock cycle to error - /// messages generated by the advice provider; consider refactoring. - fn advance_clock(&mut self); -} - -impl<'a, T> AdviceProvider for &'a mut T -where - T: AdviceProvider, -{ - fn pop_stack(&mut self) -> Result { - T::pop_stack(self) - } - - fn pop_stack_word(&mut self) -> Result { - T::pop_stack_word(self) - } - - fn pop_stack_dword(&mut self) -> Result<[Word; 2], ExecutionError> { - T::pop_stack_dword(self) - } - - fn push_stack(&mut self, source: AdviceSource) -> Result<(), ExecutionError> { - T::push_stack(self, source) - } - - fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError> { - T::insert_into_map(self, key, values) - } - - fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { - T::get_mapped_values(self, key) - } - - fn get_tree_node( - &self, - root: Word, - depth: &Felt, - index: &Felt, - ) -> Result { - T::get_tree_node(self, root, depth, index) - } - - fn get_merkle_path( - &self, - root: Word, - depth: &Felt, - index: &Felt, - ) -> Result { - T::get_merkle_path(self, root, depth, index) - } - - fn get_leaf_depth( - &self, - root: Word, - tree_depth: &Felt, - index: &Felt, - ) -> Result { - T::get_leaf_depth(self, root, tree_depth, index) - } - - fn find_lone_leaf( - &self, - root: Word, - root_index: NodeIndex, - tree_depth: u8, - ) -> Result, ExecutionError> { - T::find_lone_leaf(self, root, root_index, tree_depth) - } - - fn update_merkle_node( - &mut self, - root: Word, - depth: &Felt, - index: &Felt, - value: Word, - ) -> Result<(MerklePath, Word), ExecutionError> { - T::update_merkle_node(self, root, depth, index, value) - } - - fn merge_roots(&mut self, lhs: Word, rhs: Word) -> Result { - T::merge_roots(self, lhs, rhs) - } - - fn get_store_subset(&self, roots: I) -> MerkleStore - where - I: Iterator, - R: Borrow, - { - T::get_store_subset(self, roots) - } - - fn advance_clock(&mut self) { - T::advance_clock(self) - } - - fn get_signature( - &self, - kind: SignatureKind, - pub_key: Word, - msg: Word, - ) -> Result, ExecutionError> { - T::get_signature(self, kind, pub_key, msg) - } -} diff --git a/processor/src/chiplets/tests.rs b/processor/src/chiplets/tests.rs index 79aa5cb20e..8816cba2bb 100644 --- a/processor/src/chiplets/tests.rs +++ b/processor/src/chiplets/tests.rs @@ -1,5 +1,5 @@ use crate::{ - utils::get_trace_len, CodeBlock, ExecutionOptions, ExecutionTrace, Kernel, MemAdviceProvider, + utils::get_trace_len, CodeBlock, DefaultHost, ExecutionOptions, ExecutionTrace, Kernel, Operation, Process, StackInputs, Vec, }; use miden_air::trace::{ @@ -111,9 +111,8 @@ fn build_trace( kernel: Kernel, ) -> (ChipletsTrace, usize) { let stack_inputs = StackInputs::try_from_values(stack_inputs.iter().copied()).unwrap(); - let advice_provider = MemAdviceProvider::default(); - let mut process = - Process::new(kernel, stack_inputs, advice_provider, ExecutionOptions::default()); + let host = DefaultHost::default(); + let mut process = Process::new(kernel, stack_inputs, host, ExecutionOptions::default()); let program = CodeBlock::new_span(operations); process.execute_code_block(&program, &CodeBlockTable::default()).unwrap(); diff --git a/processor/src/debug.rs b/processor/src/debug.rs index c7bbd7a496..d248cc75a5 100644 --- a/processor/src/debug.rs +++ b/processor/src/debug.rs @@ -1,6 +1,5 @@ use crate::{ - advice::AdviceProvider, Chiplets, Decoder, ExecutionError, Felt, Process, Stack, StarkField, - System, Vec, + Chiplets, Decoder, ExecutionError, Felt, Host, Process, Stack, StarkField, System, Vec, }; use core::fmt; use vm_core::{ @@ -59,9 +58,9 @@ pub struct VmStateIterator { } impl VmStateIterator { - pub(super) fn new(process: Process, result: Result) -> Self + pub(super) fn new(process: Process, result: Result) -> Self where - A: AdviceProvider, + H: Host, { let (system, decoder, stack, _, chiplets, _) = process.into_parts(); Self { diff --git a/processor/src/decoder/mod.rs b/processor/src/decoder/mod.rs index c060ba3256..fcd423c50c 100644 --- a/processor/src/decoder/mod.rs +++ b/processor/src/decoder/mod.rs @@ -1,7 +1,7 @@ use super::{ - AdviceProvider, Call, ColMatrix, Dyn, ExecutionError, Felt, FieldElement, Join, Loop, OpBatch, - Operation, Process, Span, Split, StarkField, Vec, Word, EMPTY_WORD, MIN_TRACE_LEN, ONE, - OP_BATCH_SIZE, ZERO, + Call, ColMatrix, Dyn, ExecutionError, Felt, FieldElement, Host, Join, Loop, OpBatch, Operation, + Process, Span, Split, StarkField, Vec, Word, EMPTY_WORD, MIN_TRACE_LEN, ONE, OP_BATCH_SIZE, + ZERO, }; use miden_air::trace::{ chiplets::hasher::DIGEST_LEN, @@ -38,9 +38,9 @@ const HASH_CYCLE_LEN: Felt = Felt::new(miden_air::trace::chiplets::hasher::HASH_ // DECODER PROCESS EXTENSION // ================================================================================================ -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // JOIN BLOCK // -------------------------------------------------------------------------------------------- diff --git a/processor/src/decoder/tests.rs b/processor/src/decoder/tests.rs index d574eb9cbf..cc1d8ded05 100644 --- a/processor/src/decoder/tests.rs +++ b/processor/src/decoder/tests.rs @@ -1,11 +1,12 @@ use super::{ super::{ - utils::get_trace_len, ExecutionOptions, ExecutionTrace, Felt, Kernel, MemAdviceProvider, - Operation, Process, StackInputs, Word, + utils::get_trace_len, ExecutionOptions, ExecutionTrace, Felt, Kernel, Operation, Process, + StackInputs, Word, }, build_op_group, AuxTraceHints, BlockHashTableRow, BlockStackTableRow, BlockTableUpdate, ExecutionContextInfo, OpGroupTableRow, OpGroupTableUpdate, }; +use crate::DefaultHost; use miden_air::trace::{ decoder::{ ADDR_COL_IDX, GROUP_COUNT_COL_IDX, HASHER_STATE_RANGE, IN_SPAN_COL_IDX, NUM_HASHER_COLUMNS, @@ -1659,9 +1660,9 @@ fn set_user_op_helpers_many() { fn build_trace(stack_inputs: &[u64], program: &CodeBlock) -> (DecoderTrace, AuxTraceHints, usize) { let stack_inputs = StackInputs::try_from_values(stack_inputs.iter().copied()).unwrap(); - let advice_provider = MemAdviceProvider::default(); + let host = DefaultHost::default(); let mut process = - Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); + Process::new(Kernel::default(), stack_inputs, host, ExecutionOptions::default()); process.execute_code_block(program, &CodeBlockTable::default()).unwrap(); let (trace, aux_hints, _) = ExecutionTrace::test_finalize_trace(process); @@ -1683,9 +1684,9 @@ fn build_dyn_trace( fn_block: CodeBlock, ) -> (DecoderTrace, AuxTraceHints, usize) { let stack_inputs = StackInputs::try_from_values(stack_inputs.iter().copied()).unwrap(); - let advice_provider = MemAdviceProvider::default(); + let host = DefaultHost::default(); let mut process = - Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); + Process::new(Kernel::default(), stack_inputs, host, ExecutionOptions::default()); // build code block table let mut cb_table = CodeBlockTable::default(); @@ -1715,10 +1716,9 @@ fn build_call_trace( Some(ref proc) => Kernel::new(&[proc.hash()]), None => Kernel::default(), }; - let advice_provider = MemAdviceProvider::default(); + let host = DefaultHost::default(); let stack_inputs = crate::StackInputs::default(); - let mut process = - Process::new(kernel, stack_inputs, advice_provider, ExecutionOptions::default()); + let mut process = Process::new(kernel, stack_inputs, host, ExecutionOptions::default()); // build code block table let mut cb_table = CodeBlockTable::default(); diff --git a/processor/src/decorators/adv_map_injectors.rs b/processor/src/decorators/adv_map_injectors.rs deleted file mode 100644 index cf0e0d9021..0000000000 --- a/processor/src/decorators/adv_map_injectors.rs +++ /dev/null @@ -1,180 +0,0 @@ -use crate::AdviceSource; - -use super::{AdviceProvider, ExecutionError, Process}; -use vm_core::{ - crypto::hash::{Rpo256, RpoDigest}, - utils::collections::Vec, - Felt, SignatureKind, StarkField, EMPTY_WORD, WORD_SIZE, -}; - -// ADVICE INJECTORS -// ================================================================================================ - -impl Process -where - A: AdviceProvider, -{ - /// Reads words from memory at the specified range and inserts them into the advice map under - /// the key `KEY` located at the top of the stack. - /// - /// Inputs: - /// Operand stack: [KEY, start_addr, end_addr, ...] - /// Advice map: {...} - /// - /// Outputs: - /// Operand stack: [KEY, start_addr, end_addr, ...] - /// Advice map: {KEY: values} - /// - /// Where `values` are the elements located in memory[start_addr..end_addr]. - /// - /// # Errors - /// Returns an error: - /// - `start_addr` is greater than or equal to 2^32. - /// - `end_addr` is greater than or equal to 2^32. - /// - `start_addr` > `end_addr`. - pub(super) fn insert_mem_values_into_adv_map(&mut self) -> Result<(), ExecutionError> { - let (start_addr, end_addr) = self.get_mem_addr_range(4, 5)?; - let ctx = self.system.ctx(); - - let mut values = Vec::with_capacity(((end_addr - start_addr) as usize) * WORD_SIZE); - for addr in start_addr..end_addr { - let mem_value = self.chiplets.get_mem_value(ctx, addr).unwrap_or(EMPTY_WORD); - values.extend_from_slice(&mem_value); - } - - let key = self.stack.get_word(0); - self.advice_provider.insert_into_map(key, values)?; - - Ok(()) - } - - /// Reads two word from the operand stack and inserts them into the advice map under the key - /// defined by the hash of these words. - /// - /// Inputs: - /// Operand stack: [B, A, ...] - /// Advice map: {...} - /// - /// Outputs: - /// Operand stack: [B, A, ...] - /// Advice map: {KEY: [a0, a1, a2, a3, b0, b1, b2, b3]} - /// - /// Where KEY is computed as hash(A || B, domain), where domain is provided via the immediate - /// value. - pub(super) fn insert_hdword_into_adv_map( - &mut self, - domain: Felt, - ) -> Result<(), ExecutionError> { - // get the top two words from the stack and hash them to compute the key value - let word0 = self.stack.get_word(0); - let word1 = self.stack.get_word(1); - let key = Rpo256::merge_in_domain(&[word1.into(), word0.into()], domain); - - // build a vector of values from the two word and insert it into the advice map under the - // computed key - let mut values = Vec::with_capacity(2 * WORD_SIZE); - values.extend_from_slice(&word1); - values.extend_from_slice(&word0); - self.advice_provider.insert_into_map(key.into(), values) - } - - /// Reads three words from the operand stack and inserts the top two words into the advice map - /// under the key defined by applying an RPO permutation to all three words. - /// - /// Inputs: - /// Operand stack: [B, A, C, ...] - /// Advice map: {...} - /// - /// Outputs: - /// Operand stack: [B, A, C, ...] - /// Advice map: {KEY: [a0, a1, a2, a3, b0, b1, b2, b3]} - /// - /// Where KEY is computed by extracting the digest elements from hperm([C, A, B]). For example, - /// if C is [0, d, 0, 0], KEY will be set as hash(A || B, d). - pub(super) fn insert_hperm_into_adv_map(&mut self) -> Result<(), ExecutionError> { - // read the state from the stack - let mut state = [ - self.stack.get(11), - self.stack.get(10), - self.stack.get(9), - self.stack.get(8), - self.stack.get(7), - self.stack.get(6), - self.stack.get(5), - self.stack.get(4), - self.stack.get(3), - self.stack.get(2), - self.stack.get(1), - self.stack.get(0), - ]; - - // get the values to be inserted into the advice map from the state - let values = state[Rpo256::RATE_RANGE].to_vec(); - - // apply the permutation to the state and extract the key from it - Rpo256::apply_permutation(&mut state); - let key = RpoDigest::new( - state[Rpo256::DIGEST_RANGE] - .try_into() - .expect("failed to extract digest from state"), - ); - - self.advice_provider.insert_into_map(key.into(), values) - } - - // HELPER METHODS - // -------------------------------------------------------------------------------------------- - - /// Reads (start_addr, end_addr) tuple from the specified elements of the operand stack ( - /// without modifying the state of the stack), and verifies that memory range is valid. - fn get_mem_addr_range( - &self, - start_idx: usize, - end_idx: usize, - ) -> Result<(u32, u32), ExecutionError> { - let start_addr = self.stack.get(start_idx).as_int(); - let end_addr = self.stack.get(end_idx).as_int(); - - if start_addr > u32::MAX as u64 { - return Err(ExecutionError::MemoryAddressOutOfBounds(start_addr)); - } - if end_addr > u32::MAX as u64 { - return Err(ExecutionError::MemoryAddressOutOfBounds(end_addr)); - } - - if start_addr > end_addr { - return Err(ExecutionError::InvalidMemoryRange { - start_addr, - end_addr, - }); - } - - Ok((start_addr as u32, end_addr as u32)) - } - - /// Pushes values onto the advice stack which are required for verification of a DSA in Miden VM. - /// - /// Inputs: - /// Operand stack: [PK, MSG, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [PK, MSG, ...] - /// Advice stack: [DATA] - /// - /// Where: - /// - PK is the digest of an expanded public. - /// - MSG is the digest of the message to be signed. - /// - DATA is the needed data for signature verification in the VM. - /// - /// The advice provider is expected to contain the private key associated to the public key PK. - pub(super) fn push_signature(&mut self, kind: SignatureKind) -> Result<(), ExecutionError> { - let pub_key = self.stack.get_word(0); - let msg = self.stack.get_word(1); - let result: Vec = self.advice_provider.get_signature(kind, pub_key, msg)?; - for r in result { - self.advice_provider.push_stack(AdviceSource::Value(r))?; - } - Ok(()) - } -} diff --git a/processor/src/decorators/adv_stack_injectors/mod.rs b/processor/src/decorators/adv_stack_injectors/mod.rs deleted file mode 100644 index 25689a3f52..0000000000 --- a/processor/src/decorators/adv_stack_injectors/mod.rs +++ /dev/null @@ -1,265 +0,0 @@ -use super::{super::Ext2InttError, AdviceProvider, AdviceSource, ExecutionError, Process}; -use vm_core::{ - utils::collections::Vec, Felt, FieldElement, QuadExtension, StarkField, Word, ONE, WORD_SIZE, - ZERO, -}; -use winter_prover::math::fft; - -mod smt; - -// TYPE ALIASES -// ================================================================================================ -type QuadFelt = QuadExtension; - -// ADVICE INJECTORS -// ================================================================================================ - -impl Process -where - A: AdviceProvider, -{ - /// Pushes a node of the Merkle tree specified by the values on the top of the operand stack - /// onto the advice stack. - /// - /// Inputs: - /// Operand stack: [depth, index, TREE_ROOT, ...] - /// Advice stack: [...] - /// Merkle store: {TREE_ROOT<-NODE} - /// - /// Outputs: - /// Operand stack: [depth, index, TREE_ROOT, ...] - /// Advice stack: [NODE, ...] - /// Merkle store: {TREE_ROOT<-NODE} - /// - /// # Errors - /// Returns an error if: - /// - Merkle tree for the specified root cannot be found in the advice provider. - /// - The specified depth is either zero or greater than the depth of the Merkle tree - /// identified by the specified root. - /// - Value of the node at the specified depth and index is not known to the advice provider. - pub(super) fn copy_merkle_node_to_adv_stack(&mut self) -> Result<(), ExecutionError> { - // read node depth, node index, and tree root from the stack - let depth = self.stack.get(0); - let index = self.stack.get(1); - let root = [self.stack.get(5), self.stack.get(4), self.stack.get(3), self.stack.get(2)]; - - // look up the node in the advice provider - let node = self.advice_provider.get_tree_node(root, &depth, &index)?; - - // push the node onto the advice stack with the first element pushed last so that it can - // be popped first (i.e. stack behavior for word) - self.advice_provider.push_stack(AdviceSource::Value(node[3]))?; - self.advice_provider.push_stack(AdviceSource::Value(node[2]))?; - self.advice_provider.push_stack(AdviceSource::Value(node[1]))?; - self.advice_provider.push_stack(AdviceSource::Value(node[0]))?; - - Ok(()) - } - - /// Pushes a list of field elements onto the advice stack. The list is looked up in the advice - /// map using the specified word from the operand stack as the key. If `include_len` is set to - /// true, the number of elements in the value is also pushed onto the advice stack. - /// - /// Inputs: - /// Operand stack: [..., KEY, ...] - /// Advice stack: [...] - /// Advice map: {KEY: values} - /// - /// Outputs: - /// Operand stack: [..., KEY, ...] - /// Advice stack: [values_len?, values, ...] - /// Advice map: {KEY: values} - /// - /// The `key_offset` value specifies the location of the `KEY` on the stack. For example, - /// offset value of 0 indicates that the top word on the stack should be used as the key, the - /// offset value of 4, indicates that the second word on the stack should be used as the key - /// etc. - /// - /// The valid values of `key_offset` are 0 through 12 (inclusive). - /// - /// # Errors - /// Returns an error if the required key was not found in the key-value map or if stack offset - /// is greater than 12. - pub(super) fn copy_map_value_to_adv_stack( - &mut self, - include_len: bool, - key_offset: usize, - ) -> Result<(), ExecutionError> { - if key_offset > 12 { - return Err(ExecutionError::InvalidStackWordOffset(key_offset)); - } - - let key = [ - self.stack.get(key_offset + 3), - self.stack.get(key_offset + 2), - self.stack.get(key_offset + 1), - self.stack.get(key_offset), - ]; - self.advice_provider.push_stack(AdviceSource::Map { key, include_len }) - } - - /// Pushes the result of [u64] division (both the quotient and the remainder) onto the advice - /// stack. - /// - /// Inputs: - /// Operand stack: [b1, b0, a1, a0, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [b1, b0, a1, a0, ...] - /// Advice stack: [q0, q1, r0, r1, ...] - /// - /// Where (a0, a1) and (b0, b1) are the 32-bit limbs of the dividend and the divisor - /// respectively (with a0 representing the 32 lest significant bits and a1 representing the - /// 32 most significant bits). Similarly, (q0, q1) and (r0, r1) represent the quotient and - /// the remainder respectively. - /// - /// # Errors - /// Returns an error if the divisor is ZERO. - pub(super) fn push_u64_div_result(&mut self) -> Result<(), ExecutionError> { - let divisor_hi = self.stack.get(0).as_int(); - let divisor_lo = self.stack.get(1).as_int(); - let divisor = (divisor_hi << 32) + divisor_lo; - - if divisor == 0 { - return Err(ExecutionError::DivideByZero(self.system.clk())); - } - - let dividend_hi = self.stack.get(2).as_int(); - let dividend_lo = self.stack.get(3).as_int(); - let dividend = (dividend_hi << 32) + dividend_lo; - - let quotient = dividend / divisor; - let remainder = dividend - quotient * divisor; - - let (q_hi, q_lo) = u64_to_u32_elements(quotient); - let (r_hi, r_lo) = u64_to_u32_elements(remainder); - - self.advice_provider.push_stack(AdviceSource::Value(r_hi))?; - self.advice_provider.push_stack(AdviceSource::Value(r_lo))?; - self.advice_provider.push_stack(AdviceSource::Value(q_hi))?; - self.advice_provider.push_stack(AdviceSource::Value(q_lo))?; - - Ok(()) - } - - /// Given an element in a quadratic extension field on the top of the stack (i.e., a0, b1), - /// computes its multiplicative inverse and push the result onto the advice stack. - /// - /// Inputs: - /// Operand stack: [a1, a0, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [a1, a0, ...] - /// Advice stack: [b0, b1...] - /// - /// Where (b0, b1) is the multiplicative inverse of the extension field element (a0, a1) at the - /// top of the stack. - /// - /// # Errors - /// Returns an error if the input is a zero element in the extension field. - pub(super) fn push_ext2_inv_result(&mut self) -> Result<(), ExecutionError> { - let coef0 = self.stack.get(1); - let coef1 = self.stack.get(0); - - let element = QuadFelt::new(coef0, coef1); - if element == QuadFelt::ZERO { - return Err(ExecutionError::DivideByZero(self.system.clk())); - } - let result = element.inv().to_base_elements(); - - self.advice_provider.push_stack(AdviceSource::Value(result[1]))?; - self.advice_provider.push_stack(AdviceSource::Value(result[0]))?; - - Ok(()) - } - - /// Given evaluations of a polynomial over some specified domain, interpolates the evaluations - /// into a polynomial in coefficient form and pushes the result into the advice stack. - /// - /// The interpolation is performed using the iNTT algorithm. The evaluations are expected to be - /// in the quadratic extension. - /// - /// Inputs: - /// Operand stack: [output_size, input_size, input_start_ptr, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [output_size, input_size, input_start_ptr, ...] - /// Advice stack: [coefficients...] - /// - /// - `input_size` is the number of evaluations (each evaluation is 2 base field elements). - /// Must be a power of 2 and greater 1. - /// - `output_size` is the number of coefficients in the interpolated polynomial (each - /// coefficient is 2 base field elements). Must be smaller than or equal to the number of - /// input evaluations. - /// - `input_start_ptr` is the memory address of the first evaluation. - /// - `coefficients` are the coefficients of the interpolated polynomial such that lowest - /// degree coefficients are located at the top of the advice stack. - /// - /// # Errors - /// Returns an error if: - /// - `input_size` less than or equal to 1, or is not a power of 2. - /// - `output_size` is 0 or is greater than the `input_size`. - /// - `input_ptr` is greater than 2^32. - /// - `input_ptr + input_size / 2` is greater than 2^32. - pub(super) fn push_ext2_intt_result(&mut self) -> Result<(), ExecutionError> { - let output_size = self.stack.get(0).as_int() as usize; - let input_size = self.stack.get(1).as_int() as usize; - let input_start_ptr = self.stack.get(2).as_int(); - - if input_size <= 1 { - return Err(Ext2InttError::DomainSizeTooSmall(input_size as u64).into()); - } - if !input_size.is_power_of_two() { - return Err(Ext2InttError::DomainSizeNotPowerOf2(input_size as u64).into()); - } - if input_start_ptr >= u32::MAX as u64 { - return Err(Ext2InttError::InputStartAddressTooBig(input_start_ptr).into()); - } - if input_size > u32::MAX as usize { - return Err(Ext2InttError::InputSizeTooBig(input_size as u64).into()); - } - - let input_end_ptr = input_start_ptr + (input_size / 2) as u64; - if input_end_ptr > u32::MAX as u64 { - return Err(Ext2InttError::InputEndAddressTooBig(input_end_ptr).into()); - } - - if output_size == 0 { - return Err(Ext2InttError::OutputSizeIsZero.into()); - } - if output_size > input_size { - return Err(Ext2InttError::OutputSizeTooBig(output_size, input_size).into()); - } - - let mut poly = Vec::with_capacity(input_size); - for addr in (input_start_ptr as u32)..(input_end_ptr as u32) { - let word = self - .get_memory_value(self.system.ctx(), addr) - .ok_or(Ext2InttError::UninitializedMemoryAddress(addr))?; - - poly.push(QuadFelt::new(word[0], word[1])); - poly.push(QuadFelt::new(word[2], word[3])); - } - - let twiddles = fft::get_inv_twiddles::(input_size); - fft::interpolate_poly::(&mut poly, &twiddles); - - for element in QuadFelt::slice_as_base_elements(&poly[..output_size]).iter().rev() { - self.advice_provider.push_stack(AdviceSource::Value(*element))?; - } - - Ok(()) - } -} - -// HELPER FUNCTIONS -// ================================================================================================ - -fn u64_to_u32_elements(value: u64) -> (Felt, Felt) { - let hi = Felt::new(value >> 32); - let lo = Felt::new((value as u32) as u64); - (hi, lo) -} diff --git a/processor/src/decorators/adv_stack_injectors/smt.rs b/processor/src/decorators/adv_stack_injectors/smt.rs deleted file mode 100644 index 9f39d081b7..0000000000 --- a/processor/src/decorators/adv_stack_injectors/smt.rs +++ /dev/null @@ -1,589 +0,0 @@ -use super::{ - AdviceProvider, AdviceSource, ExecutionError, Felt, Process, StarkField, Word, ONE, WORD_SIZE, - ZERO, -}; -use vm_core::{ - crypto::{ - hash::{Rpo256, RpoDigest}, - merkle::{EmptySubtreeRoots, NodeIndex, TieredSmt}, - }, - utils::collections::{btree_map::Entry, BTreeMap, Vec}, -}; - -// CONSTANTS -// ================================================================================================ - -/// Maximum depth of a Sparse Merkle Tree -const SMT_MAX_TREE_DEPTH: Felt = Felt::new(64); - -/// Lookup table for Sparse Merkle Tree depth normalization -const SMT_NORMALIZED_DEPTHS: [u8; 65] = [ - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -]; - -// SMT ADVICE INJECTORS -// ================================================================================================ - -impl Process -where - A: AdviceProvider, -{ - /// Pushes values onto the advice stack which are required for successful retrieval of a - /// value from a Sparse Merkle Tree data structure. - /// - /// The Sparse Merkle Tree is tiered, meaning it will have leaf depths in `{16, 32, 48, 64}`. - /// The depth flags define the tier on which the leaf is located. - /// - /// Inputs: - /// Operand stack: [KEY, ROOT, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [KEY, ROOT, ...] - /// Advice stack: [f0, f1, K, V, f2] - /// - /// Where: - /// - f0 is a boolean flag set to `1` if the depth is `16` or `48`. - /// - f1 is a boolean flag set to `1` if the depth is `16` or `32`. - /// - K is the key; will be zeroed if the tree don't contain a mapped value for the key. - /// - V is the value word; will be zeroed if the tree don't contain a mapped value for the key. - /// - f2 is a boolean flag set to `1` if the key is not zero. - /// - /// # Errors - /// Returns an error if the provided Merkle root doesn't exist on the advice provider. - /// - /// # Panics - /// Will panic as unimplemented if the target depth is `64`. - pub(in crate::decorators) fn push_smtget_inputs(&mut self) -> Result<(), ExecutionError> { - // fetch the arguments from the operand stack - let key = self.stack.get_word(0); - let root = self.stack.get_word(1); - - // get the node from the SMT for the specified key; this node can be either a leaf node, - // or a root of an empty subtree at the returned depth - let (node, depth, _) = self.get_smt_node(root, key)?; - - // set the node value; zeroed if empty sub-tree - let empty = EmptySubtreeRoots::empty_hashes(64); - if Word::from(empty[depth as usize]) == node { - // push zeroes for remaining key, value & empty remaining key flag - for _ in 0..9 { - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - } - } else { - // push a flag indicating that a remaining key exists - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - - // map is expected to contain `node |-> {K, V}` - self.advice_provider.push_stack(AdviceSource::Map { - key: node, - include_len: false, - })?; - } - - // set the flags - let is_16_or_32 = if depth == 16 || depth == 32 { ONE } else { ZERO }; - let is_16_or_48 = if depth == 16 || depth == 48 { ONE } else { ZERO }; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; - - Ok(()) - } - - /// Pushes onto the advice stack the value associated with the specified key in a Sparse - /// Merkle Tree defined by the specified root. - /// - /// If no value was previously associated with the specified key, [ZERO; 4] is pushed onto - /// the advice stack. - /// - /// Inputs: - /// Operand stack: [KEY, ROOT, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [KEY, ROOT, ...] - /// Advice stack: [VALUE, ...] - /// - /// # Errors - /// Returns an error if the provided Merkle root doesn't exist on the advice provider. - /// - /// # Panics - /// Will panic as unimplemented if the target depth is `64`. - pub(in crate::decorators) fn push_smtpeek_result(&mut self) -> Result<(), ExecutionError> { - // fetch the arguments from the operand stack - let key = self.stack.get_word(0); - let root = self.stack.get_word(1); - - // get the node from the SMT for the specified key; this node can be either a leaf node, - // or a root of an empty subtree at the returned depth - let (node, depth, _) = self.get_smt_node(root, key)?; - - let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; - if node == Word::from(empty) { - // if the node is a root of an empty subtree, then there is no value associated with - // the specified key - self.advice_provider.push_stack(AdviceSource::Word(TieredSmt::EMPTY_VALUE))?; - } else { - // get the key and value stored in the current leaf - let (leaf_key, leaf_value) = self.get_smt_upper_leaf_preimage(node)?; - - // if the leaf is for a different key, then there is no value associated with the - // specified key - if leaf_key == key { - self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; - } else { - self.advice_provider.push_stack(AdviceSource::Word(TieredSmt::EMPTY_VALUE))?; - } - } - - Ok(()) - } - - /// Pushes values onto the advice stack which are required for successful insertion of a - /// key-value pair into a Sparse Merkle Tree data structure. - /// - /// The Sparse Merkle Tree is tiered, meaning it will have leaf depths in `{16, 32, 48, 64}`. - /// - /// Inputs: - /// Operand stack: [VALUE, KEY, ROOT, ...] - /// Advice stack: [...] - /// - /// Outputs: - /// Operand stack: [OLD_VALUE, NEW_ROOT, ...] - /// Advice stack: see comments for specialized handlers below. - /// - /// Where: - /// - ROOT and NEW_ROOT are the roots of the TSMT before and after the insert respectively. - /// - VALUE is the value to be inserted. - /// - OLD_VALUE is the value previously associated with the specified KEY. - /// - /// # Errors - /// Returns an error if: - /// - The Merkle store does not contain a node with the specified root. - /// - The Merkle store does not contain all nodes needed to validate the path between the root - /// and the relevant TSMT nodes. - /// - The advice map does not contain required data about TSMT leaves to be modified. - /// - /// # Panics - /// Will panic as unimplemented if the target depth is `64`. - pub(in crate::decorators) fn push_smtset_inputs(&mut self) -> Result<(), ExecutionError> { - // get the key, value, and tree root from the stack - let value = self.stack.get_word(0); - let key = self.stack.get_word(1); - let root = self.stack.get_word(2); - - // get the node from the SMT for the specified key; this node can be either a leaf node, - // or a root of an empty subtree at the returned depth - let (node, depth, index) = self.get_smt_node(root, key)?; - - // if the value to be inserted is an empty word, we need to process it as a delete - if value == TieredSmt::EMPTY_VALUE { - return self.handle_smt_delete(root, node, depth, index, key); - } - - // figure out what kind of insert we are doing; possible options are: - // - if the node is a root of an empty subtree, this is a simple insert. - // - if the node is a leaf, this could be either an update (for the same key), or a - // complex insert (i.e., the existing leaf needs to be moved to a lower tier). - let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; - if node == Word::from(empty) { - self.handle_smt_simple_insert(root, depth, index)?; - } else { - // get the key and value stored in the current leaf - let (leaf_key, leaf_value) = self.get_smt_upper_leaf_preimage(node)?; - - // if the key for the value to be inserted is the same as the leaf's key, we are - // dealing with a simple update; otherwise, we are dealing with a complex insert - if leaf_key == key { - self.handle_smt_update(depth, leaf_value)?; - } else { - self.handle_smt_complex_insert(depth, key, leaf_key, leaf_value)?; - } - } - - Ok(()) - } - - // TSMT UPDATE HELPER METHODS - // -------------------------------------------------------------------------------------------- - - /// Returns first leaf or an empty tree node for the provided key in the Sparse Merkle tree - /// with the specified root. - /// - /// Also returns the depth and index of the returned node at this depth. - fn get_smt_node(&self, root: Word, key: Word) -> Result<(Word, u8, Felt), ExecutionError> { - // determine the depth of the first leaf or an empty tree node - let index = &key[3]; - let depth = self.advice_provider.get_leaf_depth(root, &SMT_MAX_TREE_DEPTH, index)?; - debug_assert!(depth < 65); - - // map the depth value to its tier; this rounds up depth to 16, 32, 48, or 64 - let depth = SMT_NORMALIZED_DEPTHS[depth as usize]; - if depth == 64 { - unimplemented!("handling of depth=64 tier hasn't been implemented yet"); - } - - // get the value of the node at this index/depth - let index = index.as_int() >> (64 - depth); - let index = Felt::new(index); - let node = self.advice_provider.get_tree_node(root, &Felt::from(depth), &index)?; - - Ok((node, depth, index)) - } - - /// Retrieves a key-value pair for the specified leaf node from the advice map. - /// - /// # Errors - /// Returns an error if the value under the specified node does not exist or does not consist - /// of exactly 8 elements. - fn get_smt_upper_leaf_preimage(&self, node: Word) -> Result<(Word, Word), ExecutionError> { - let node_bytes = RpoDigest::from(node).as_bytes(); - let kv = self - .advice_provider - .get_mapped_values(&node_bytes) - .ok_or(ExecutionError::AdviceMapKeyNotFound(node))?; - - if kv.len() != WORD_SIZE * 2 { - return Err(ExecutionError::AdviceMapValueInvalidLength(node, WORD_SIZE * 2, kv.len())); - } - - let key = [kv[0], kv[1], kv[2], kv[3]]; - let val = [kv[4], kv[5], kv[6], kv[7]]; - Ok((key, val)) - } - - /// Prepares the advice stack for a TSMT update operation. Specifically, the advice stack will - /// be arranged as follows: - /// - /// - [ZERO (padding), d0, d1, ONE (is_update), OLD_VALUE] - /// - /// Where: - /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. - /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. - /// - OLD_VALUE is the current value in the leaf to be updated. - fn handle_smt_update(&mut self, depth: u8, old_value: Word) -> Result<(), ExecutionError> { - // put the old value onto the advice stack - self.advice_provider.push_stack(AdviceSource::Word(old_value))?; - - // set is_update flag to ONE - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - - // set depth flags based on leaf's depth - let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; - - // pad the advice stack with an extra value to make it consistent with other cases when - // we expect 4 flag values on the top of the advice stack - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - - Ok(()) - } - - /// Prepares the advice stack for a TSMT simple insert operation (i.e., when we are replacing - /// an empty node). Specifically, the advice stack will be arranged as follows: - /// - /// - Simple insert at depth 16: [d0, d1, ONE (is_simple_insert), ZERO (is_update)] - /// - Simple insert at depth 32 or 48: [d0, d1, ONE (is_simple_insert), ZERO (is_update), P_NODE] - /// - /// Where: - /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. - /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. - /// - P_NODE is an internal node located at the tier above the insert tier. - fn handle_smt_simple_insert( - &mut self, - root: Word, - depth: u8, - index: Felt, - ) -> Result<(), ExecutionError> { - // put additional data onto the advice stack as needed - match depth { - 16 => (), // nothing to do; all the required data is already in the VM - 32 | 48 => { - // for depth 32 and 48, we need to provide the internal node located on the tier - // above the insert tier - let p_index = Felt::from(index.as_int() >> 16); - let p_depth = Felt::from(depth - 16); - let p_node = self.advice_provider.get_tree_node(root, &p_depth, &p_index)?; - self.advice_provider.push_stack(AdviceSource::Word(p_node))?; - } - 64 => unimplemented!("insertions at depth 64 are not yet implemented"), - _ => unreachable!("invalid depth {depth}"), - } - - // push is_update and is_simple_insert flags onto the advice stack - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - - // set depth flags based on node's depth - let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; - - Ok(()) - } - - /// Prepares the advice stack for a TSMT complex insert operation (i.e., when a leaf node needs - /// to be replaced with a subtree of nodes at a lower tier). Specifically, the advice stack - /// will be arranged as follows: - /// - /// - [d0, d1, ZERO (is_simple_insert), ZERO (is_update), E_KEY, E_VALUE] - /// - /// Where: - /// - d0 and d1 are boolean flags a combination of which determines the source and the target - /// tiers as follows: - /// - (0, 0): depth 16 -> 32 - /// - (0, 1): depth 16 -> 48 - /// - (1, 0): depth 32 -> 48 - /// - (1, 1): depth 16, 32, or 48 -> 64 - /// - E_KEY and E_VALUE are the key-value pair for a leaf which is to be replaced by a subtree. - fn handle_smt_complex_insert( - &mut self, - depth: u8, - key: Word, - leaf_key: Word, - leaf_value: Word, - ) -> Result<(), ExecutionError> { - // push the key and value onto the advice stack - self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; - self.advice_provider.push_stack(AdviceSource::Word(leaf_key))?; - - // push is_update and is_simple_insert flags onto the advice stack - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - - // determine the combination of the source and target tiers for the insert - // and populate the depth flags accordingly - let common_prefix = get_common_prefix(&key, &leaf_key); - let target_depth = SMT_NORMALIZED_DEPTHS[common_prefix as usize + 1]; - match target_depth { - 32 if depth == 16 => { - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - } - 48 if depth == 16 => { - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - } - 48 if depth == 32 => { - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - } - 64 => unimplemented!("insertions at depth 64 are not yet implemented"), - _ => unreachable!("invalid source/target tier combination: {depth} -> {target_depth}"), - } - - Ok(()) - } - - /// Prepares the advice stack for a TSMT deletion operation. Specifically, the advice stack - /// will be arranged as follows (depending on the type of the node which occupies the location - /// at which the node for the specified key should be present): - /// - /// - Root of empty subtree: [d0, d1, ZERO (is_leaf), ONE (key_not_set)] - /// - Leaf for another key: [d0, d1, ONE (is_leaf), ONE (key_not_set), KEY, VALUE] - /// - Leaf for the provided key: [ZERO, ZERO, ZERO, ZERO (key_not_set), NEW_ROOT, OLD_VALUE] - /// - /// Where: - /// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. - /// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. - /// - KEY and VALUE is the key-value pair of a leaf node occupying the location of the node - /// for the specified key. Note that KEY may be the same as the specified key or different - /// from the specified key if the location is occupied by a different key-value pair. - /// - NEW_ROOT is the new root of the TSMT post deletion. - /// - OLD_VALUE is the value which is to be replaced with [ZERO; 4]. - fn handle_smt_delete( - &mut self, - root: Word, - node: Word, - depth: u8, - index: Felt, - key: Word, - ) -> Result<(), ExecutionError> { - let empty = EmptySubtreeRoots::empty_hashes(TieredSmt::MAX_DEPTH)[depth as usize]; - - if node == Word::from(empty) { - // if the node to be replaced is already an empty node, we set key_not_set = ONE, - // and is_leaf = ZERO - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - - // set depth flags based on node's depth - let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; - } else { - // if the node is not a root of an empty subtree, it must be a leaf; thus we can get - // the key and the value stored in the leaf. - let (leaf_key, leaf_value) = self.get_smt_upper_leaf_preimage(node)?; - - if leaf_key != key { - // if the node to be replaced is a leaf for different key, we push that key-value - // pair onto the advice stack and set key_not_set = ONE and is_leaf = ONE - - self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; - self.advice_provider.push_stack(AdviceSource::Word(leaf_key))?; - - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - self.advice_provider.push_stack(AdviceSource::Value(ONE))?; - - // set depth flags based on node's depth - let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; - self.advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; - } else { - // if the key which we want to set to [ZERO; 4] does have an associated value, - // we update the tree in the advice provider to get the new root, then push the root - // and the old value onto the advice stack, key_not_set = ZERO, and also push 3 - // ZERO values for padding - let new_root = match self.find_lone_sibling(root, depth, &index)? { - Some((sibling, new_index)) => { - // if the node to be deleted has a lone sibling, we need to move it to a - // higher tier. - - // first, we compute the value of the new node on the higher tier - let (leaf_key, leaf_val) = self.get_smt_upper_leaf_preimage(*sibling)?; - let new_node = Rpo256::merge_in_domain( - &[leaf_key.into(), leaf_val.into()], - new_index.depth().into(), - ); - - // then we insert the node and its pre-image into the advice provider - let mut elements = leaf_key.to_vec(); - elements.extend_from_slice(&leaf_val); - self.advice_provider.insert_into_map(new_node.into(), elements)?; - - // and finally we update the tree in the advice provider - let (_, new_root) = self.advice_provider.update_merkle_node( - root, - &new_index.depth().into(), - &new_index.value().into(), - new_node.into(), - )?; - new_root - } - None => { - // if the node does not have a lone sibling, we just replace it with an - // empty node - let (_, new_root) = self.advice_provider.update_merkle_node( - root, - &Felt::from(depth), - &index, - empty.into(), - )?; - new_root - } - }; - - self.advice_provider.push_stack(AdviceSource::Word(leaf_value))?; - self.advice_provider.push_stack(AdviceSource::Word(new_root))?; - - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - self.advice_provider.push_stack(AdviceSource::Value(ZERO))?; - } - } - - Ok(()) - } - - /// Returns info about a lone sibling of a leaf specified by depth and index parameters in the - /// Tiered Sparse Merkle tree defined by the specified root. If no lone siblings exist for the - /// specified parameters, None is returned. - /// - /// A lone sibling is defined as a leaf which has a common root with the specified leaf at a - /// higher tier such that the subtree starting at this root contains only these two leaves. - /// - /// In addition to the leaf node itself, this also returns the index of the common root at a - /// higher tier. - fn find_lone_sibling( - &self, - root: Word, - depth: u8, - index: &Felt, - ) -> Result, ExecutionError> { - debug_assert!(matches!(depth, 16 | 32 | 48)); - - // if the leaf is on the first tier (depth=16), we don't care about lone siblings as they - // cannot be moved to a higher tier. - if depth == TieredSmt::TIER_SIZE { - return Ok(None); - } - - let empty = &EmptySubtreeRoots::empty_hashes(TieredSmt::MAX_DEPTH)[..=depth as usize]; - - // get the path to the leaf node - let path: Vec<_> = self.advice_provider.get_merkle_path(root, &depth.into(), index)?.into(); - - // traverse the path from the leaf up to the root, keeping track of all non-empty nodes; - // here we ignore the top 16 depths because lone siblings cannot be moved to a higher tier - // from tier at depth 16. - let mut non_empty_nodes = BTreeMap::new(); - for (depth, sibling) in (TieredSmt::TIER_SIZE..=depth).rev().zip(path.iter()) { - // map the depth of each node to the tier it would "round up" to. For example, 17 maps - // to tier 1, 32 also maps to tier 1, but 33 maps to tier 2. - let tier = (depth - 1) / TieredSmt::TIER_SIZE; - - // if the node is non-empty, insert it into the map, but if a node for the same tier - // is already in the map, stop traversing the tree. we do this because if two nodes in - // a given tier are non-empty a lone sibling cannot exist at this tier or any higher - // tier. to indicate the the tier cannot contain a lone sibling, we set the value in - // the map to None. - if sibling != &empty[depth as usize] { - match non_empty_nodes.entry(tier) { - Entry::Vacant(entry) => { - entry.insert(Some((depth, *sibling))); - } - Entry::Occupied(mut entry) => { - entry.insert(None); - break; - } - } - } - } - - // take the deepest non-empty node and check if its subtree contains just a single leaf - if let Some((_, Some((node_depth, node)))) = non_empty_nodes.pop_last() { - let mut node_index = NodeIndex::new(depth, index.as_int()).expect("invalid node index"); - node_index.move_up_to(node_depth); - let node_index = node_index.sibling(); - - if let Some((mut leaf_index, leaf)) = self.advice_provider.find_lone_leaf( - node.into(), - node_index, - TieredSmt::MAX_DEPTH, - )? { - // if the node's subtree does contain a single leaf, figure out to which depth - // we can move it up to. we do this by taking the next tier down from the tier - // which contained at least one non-empty node on the path from the original leaf - // up to the root. if there were no non-empty nodes on this path, we default to - // the first tier (i.e., depth 16). - let target_tier = non_empty_nodes.keys().last().map(|&t| t + 1).unwrap_or(1); - leaf_index.move_up_to(target_tier * TieredSmt::TIER_SIZE); - - return Ok(Some((leaf.into(), leaf_index))); - } - } - - Ok(None) - } -} - -// HELPER FUNCTIONS -// ================================================================================================ - -fn get_common_prefix(key1: &Word, key2: &Word) -> u8 { - let k1 = key1[3].as_int(); - let k2 = key2[3].as_int(); - (k1 ^ k2).leading_zeros() as u8 -} - -fn get_depth_flags(depth: u8) -> (Felt, Felt) { - let is_16_or_32 = if depth == 16 || depth == 32 { ONE } else { ZERO }; - let is_16_or_48 = if depth == 16 || depth == 48 { ONE } else { ZERO }; - (is_16_or_32, is_16_or_48) -} diff --git a/processor/src/decorators/mod.rs b/processor/src/decorators/mod.rs deleted file mode 100644 index ab4ed119f2..0000000000 --- a/processor/src/decorators/mod.rs +++ /dev/null @@ -1,141 +0,0 @@ -use super::{ - AdviceInjector, AdviceProvider, AdviceSource, Decorator, ExecutionError, Felt, Process, Vec, -}; -use vm_core::DebugOptions; - -mod adv_map_injectors; -mod adv_stack_injectors; - -#[cfg(test)] -mod tests; - -// DECORATORS -// ================================================================================================ - -impl Process -where - A: AdviceProvider, -{ - /// Executes the specified decorator - pub(super) fn execute_decorator( - &mut self, - decorator: &Decorator, - ) -> Result<(), ExecutionError> { - match decorator { - Decorator::Advice(injector) => self.dec_advice(injector)?, - Decorator::AsmOp(assembly_op) => { - if self.decoder.in_debug_mode() { - self.decoder.append_asmop(self.system.clk(), assembly_op.clone()); - } - } - Decorator::Debug(options) => self.dec_debug(options)?, - } - Ok(()) - } - - // ADVICE INJECTION - // -------------------------------------------------------------------------------------------- - - /// Process the specified advice injector. - fn dec_advice(&mut self, injector: &AdviceInjector) -> Result<(), ExecutionError> { - match injector { - AdviceInjector::MerkleNodeMerge => self.merge_merkle_nodes(), - AdviceInjector::MerkleNodeToStack => self.copy_merkle_node_to_adv_stack(), - AdviceInjector::MapValueToStack { - include_len, - key_offset, - } => self.copy_map_value_to_adv_stack(*include_len, *key_offset), - AdviceInjector::DivU64 => self.push_u64_div_result(), - AdviceInjector::Ext2Inv => self.push_ext2_inv_result(), - AdviceInjector::Ext2Intt => self.push_ext2_intt_result(), - AdviceInjector::SmtGet => self.push_smtget_inputs(), - AdviceInjector::SmtSet => self.push_smtset_inputs(), - AdviceInjector::SmtPeek => self.push_smtpeek_result(), - AdviceInjector::MemToMap => self.insert_mem_values_into_adv_map(), - AdviceInjector::HdwordToMap { domain } => self.insert_hdword_into_adv_map(*domain), - AdviceInjector::HpermToMap => self.insert_hperm_into_adv_map(), - AdviceInjector::SigToStack { kind: sign_kind } => self.push_signature(*sign_kind), - } - } - - // INJECTOR HELPERS - // -------------------------------------------------------------------------------------------- - - /// Creates a new Merkle tree in the advice provider by combining Merkle trees with the - /// specified roots. The root of the new tree is defined as `Hash(LEFT_ROOT, RIGHT_ROOT)`. - /// - /// Inputs: - /// Operand stack: [RIGHT_ROOT, LEFT_ROOT, ...] - /// Merkle store: {RIGHT_ROOT, LEFT_ROOT} - /// - /// Outputs: - /// Operand stack: [RIGHT_ROOT, LEFT_ROOT, ...] - /// Merkle store: {RIGHT_ROOT, LEFT_ROOT, hash(LEFT_ROOT, RIGHT_ROOT)} - /// - /// After the operation, both the original trees and the new tree remains in the advice - /// provider (i.e., the input trees are not removed). - /// - /// # Errors - /// Return an error if a Merkle tree for either of the specified roots cannot be found in this - /// advice provider. - fn merge_merkle_nodes(&mut self) -> Result<(), ExecutionError> { - // fetch the arguments from the stack - let lhs = self.stack.get_word(1); - let rhs = self.stack.get_word(0); - - // perform the merge - self.advice_provider.merge_roots(lhs, rhs)?; - - Ok(()) - } - - // DEBUG - // -------------------------------------------------------------------------------------------- - - /// Prints the info about the VM state specified by the provided options to stdout. - fn dec_debug(&self, options: &DebugOptions) -> Result<(), ExecutionError> { - let clk = self.system.clk(); - match options { - DebugOptions::StackAll => { - let stack = self.stack.get_state_at(clk); - let n = stack.len(); - print_vm_stack(clk, stack, n); - } - DebugOptions::StackTop(n) => { - let stack = self.stack.get_state_at(clk); - print_vm_stack(clk, stack, *n as usize); - } - } - Ok(()) - } -} - -// HELPER FUNCTIONS -// ================================================================================================ - -#[cfg(feature = "std")] -fn print_vm_stack(clk: u32, stack: Vec, n: usize) { - // determine how many items to print out - let num_items = core::cmp::min(stack.len(), n); - - // print all items except for the last one - println!("Stack state before step {clk}:"); - for (i, element) in stack.iter().take(num_items - 1).enumerate() { - println!("├── {i:>2}: {element}"); - } - - // print the last item, and in case the stack has more items, print the total number of - // un-printed items - let i = num_items - 1; - if num_items == stack.len() { - println!("└── {i:>2}: {}", stack[i]); - } else { - println!("├── {i:>2}: {}", stack[i]); - println!("└── ({} more items)", stack.len() - num_items); - } -} - -#[cfg(not(feature = "std"))] -fn print_vm_stack(_clk: u32, _stack: Vec, _n: usize) { - // in no_std environments, this is a NOOP -} diff --git a/processor/src/decorators/tests.rs b/processor/src/decorators/tests.rs deleted file mode 100644 index ad5098c1cf..0000000000 --- a/processor/src/decorators/tests.rs +++ /dev/null @@ -1,365 +0,0 @@ -use super::{ - super::{AdviceInputs, ExecutionOptions, Felt, Kernel, Operation, StarkField}, - Process, -}; -use crate::{MemAdviceProvider, StackInputs, Word}; -use test_utils::rand::seeded_word; -use vm_core::{ - crypto::{ - hash::{Rpo256, RpoDigest}, - merkle::{EmptySubtreeRoots, MerkleStore, MerkleTree, NodeIndex, TieredSmt}, - }, - utils::collections::Vec, - utils::IntoBytes, - AdviceInjector, Decorator, EMPTY_WORD, ONE, ZERO, -}; - -#[test] -fn push_merkle_node() { - let leaves = [init_leaf(1), init_leaf(2), init_leaf(3), init_leaf(4)]; - let tree = MerkleTree::new(leaves.to_vec()).unwrap(); - let store = MerkleStore::from(&tree); - let stack_inputs = [ - tree.root()[0].as_int(), - tree.root()[1].as_int(), - tree.root()[2].as_int(), - tree.root()[3].as_int(), - 1, - tree.depth() as u64, - ]; - - let stack_inputs = StackInputs::try_from_values(stack_inputs).unwrap(); - let advice_inputs = AdviceInputs::default().with_merkle_store(store); - let advice_provider = MemAdviceProvider::from(advice_inputs); - let mut process = - Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); - process.execute_op(Operation::Noop).unwrap(); - - // push the node onto the advice stack - process - .execute_decorator(&Decorator::Advice(AdviceInjector::MerkleNodeToStack)) - .unwrap(); - - // pop the node from the advice stack and push it onto the operand stack - process.execute_op(Operation::AdvPop).unwrap(); - process.execute_op(Operation::AdvPop).unwrap(); - process.execute_op(Operation::AdvPop).unwrap(); - process.execute_op(Operation::AdvPop).unwrap(); - - let expected_stack = build_expected(&[ - leaves[1][3], - leaves[1][2], - leaves[1][1], - leaves[1][0], - Felt::new(2), - ONE, - tree.root()[3], - tree.root()[2], - tree.root()[1], - tree.root()[0], - ]); - assert_eq!(expected_stack, process.stack.trace_state()); -} - -// SMTGET TESTS -// ================================================================================================ - -#[test] -fn push_smtget() { - // setup the test - let empty = EmptySubtreeRoots::empty_hashes(64); - let initial_root = RpoDigest::from(empty[0]); - let mut seed = 0xfb; - let key = seeded_word(&mut seed); - let value = seeded_word(&mut seed); - - // check leaves on empty trees - for depth in [16_u8, 32, 48] { - // compute node value - let depth_element = Felt::from(depth); - let store = MerkleStore::new(); - let node = Rpo256::merge_in_domain(&[key.into(), value.into()], depth_element); - - // expect absent value with constant depth 16 - let expected = [ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ONE, ONE]; - assert_case_smtget(key, value, node, initial_root, store, &expected); - } - - // check leaves inserted on all tiers - for depth in [16, 32, 48] { - // set depth flags - let is_16_or_32 = (depth == 16 || depth == 32).then_some(ONE).unwrap_or(ZERO); - let is_16_or_48 = (depth == 16 || depth == 48).then_some(ONE).unwrap_or(ZERO); - - // compute node value - let index = key[3].as_int() >> 64 - depth; - let index = NodeIndex::new(depth, index).unwrap(); - let depth_element = Felt::from(depth); - let node = Rpo256::merge_in_domain(&[key.into(), value.into()], depth_element); - - // set tier node value and expect the value from the injector - let mut store = MerkleStore::new(); - let root = store.set_node(initial_root, index, node).unwrap().root; - let expected = [ - ONE, - value[3], - value[2], - value[1], - value[0], - key[3], - key[2], - key[1], - key[0], - is_16_or_32, - is_16_or_48, - ]; - assert_case_smtget(key, value, node, root, store, &expected); - } - - // check absent siblings of non-empty trees - for depth in [16, 32, 48] { - // set depth flags - let is_16_or_32 = (depth == 16 || depth == 32).then_some(ONE).unwrap_or(ZERO); - let is_16_or_48 = (depth == 16 || depth == 48).then_some(ONE).unwrap_or(ZERO); - - // compute the index of the absent node - let index = key[3].as_int() >> 64 - depth; - let index = NodeIndex::new(depth, index).unwrap(); - - // compute the sibling index of the target with its remaining key and node - let sibling = index.sibling(); - let mut sibling_key = key; - sibling_key[3] = Felt::new(sibling.value() >> depth.min(63)); - let sibling_node = - Rpo256::merge_in_domain(&[sibling_key.into(), value.into()], depth.into()); - - // run the text, expecting absent target node - let mut store = MerkleStore::new(); - let root = store.set_node(initial_root, sibling, sibling_node).unwrap().root; - let expected = - [ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, ZERO, is_16_or_32, is_16_or_48]; - assert_case_smtget(key, value, sibling_node, root, store, &expected); - } -} - -// SMTPEEK TESTS -// ================================================================================================ - -#[test] -fn inject_smtpeek() { - let mut smt = TieredSmt::default(); - - // insert a single value into the tree (the node will be at depth 16) - let raw_a = 0b_00000000_11111111_00011111_11111111_10010110_10010011_11100000_00000000_u64; - let key_a = build_key(raw_a); - let val_a = [Felt::new(3), Felt::new(5), Felt::new(7), Felt::new(9)]; - smt.insert(key_a.into(), val_a); - - // peeking key_a should return val_a (in stack order) - let process = prepare_smt_peek(key_a, &smt); - let mut expected = val_a; - expected.reverse(); - assert_eq!(build_expected(&expected), process.stack.trace_state()); - - // peeking another key should return empty word - let raw_b = 0b_11111111_11111111_00011111_11111111_10010110_10010011_11100000_00000000_u64; - let key_b = build_key(raw_b); - let process = prepare_smt_peek(key_b, &smt); - assert_eq!(build_expected(&EMPTY_WORD), process.stack.trace_state()); - - // peeking another key with the same 16-bit prefix as key_a should return empty word - let raw_c = 0b_00000000_11111111_10011111_11111111_10010110_10010011_11100000_00000000_u64; - let key_c = build_key(raw_c); - let process = prepare_smt_peek(key_c, &smt); - assert_eq!(build_expected(&EMPTY_WORD), process.stack.trace_state()); -} - -fn prepare_smt_peek(key: Word, smt: &TieredSmt) -> Process { - let root: Word = smt.root().into(); - let store = MerkleStore::from(smt); - - let adv_map = smt - .upper_leaves() - .map(|(node, key, value)| { - let mut elements = key.as_elements().to_vec(); - elements.extend(&value); - (node.as_bytes(), elements) - }) - .collect::>(); - let advice_inputs = AdviceInputs::default().with_merkle_store(store).with_map(adv_map); - - let stack_inputs = build_stack_inputs(key, root, EMPTY_WORD); - let mut process = build_process(stack_inputs, advice_inputs); - - process.execute_op(Operation::Noop).unwrap(); - process.execute_decorator(&Decorator::Advice(AdviceInjector::SmtPeek)).unwrap(); - - move_adv_to_stack(&mut process, 4); - - process -} - -// SMTSET TESTS -// ================================================================================================ - -#[test] -fn inject_smtset() { - let mut smt = TieredSmt::default(); - - // --- insert into empty tree --------------------------------------------- - - let raw_a = 0b_01101001_01101100_00011111_11111111_10010110_10010011_11100000_00000000_u64; - let key_a = build_key(raw_a); - let val_a = [Felt::new(3), Felt::new(5), Felt::new(7), Felt::new(9)]; - - // this is a simple insertion at depth 16, and thus the flags should look as follows: - let is_update = ZERO; - let is_simple_insert = ONE; - let is_16_or_32 = ONE; - let is_16_or_48 = ONE; - let expected_stack = [is_update, is_simple_insert, is_16_or_32, is_16_or_48]; - let process = prepare_smt_set(key_a, val_a, &smt, expected_stack.len(), Vec::new()); - assert_eq!(build_expected(&expected_stack), process.stack.trace_state()); - - // --- update same key with different value ------------------------------- - - // insert val_a into the tree so that val_b overwrites it - smt.insert(key_a.into(), val_a); - let val_b = [ONE, ONE, ZERO, ZERO]; - - // this is a simple update, and thus the flags should look as follows: - let is_update = ONE; - let is_16_or_32 = ONE; - let is_16_or_48 = ONE; - - // also, the old value should be present in the advice stack: - let expected_stack = [ - val_a[3], - val_a[2], - val_a[1], - val_a[0], - is_update, - is_16_or_32, - is_16_or_48, - ZERO, - ]; - let adv_map = vec![build_adv_map_entry(key_a, val_a, 16)]; - let process = prepare_smt_set(key_a, val_b, &smt, expected_stack.len(), adv_map); - assert_eq!(build_expected(&expected_stack), process.stack.trace_state()); -} - -fn prepare_smt_set( - key: Word, - value: Word, - smt: &TieredSmt, - adv_stack_depth: usize, - adv_map: Vec<([u8; 32], Vec)>, -) -> Process { - let root: Word = smt.root().into(); - let store = MerkleStore::from(smt); - - let stack_inputs = build_stack_inputs(value, key, root); - let advice_inputs = AdviceInputs::default().with_merkle_store(store).with_map(adv_map); - let mut process = build_process(stack_inputs, advice_inputs); - - process.execute_op(Operation::Noop).unwrap(); - process.execute_decorator(&Decorator::Advice(AdviceInjector::SmtSet)).unwrap(); - - move_adv_to_stack(&mut process, adv_stack_depth); - - process -} - -// HELPER FUNCTIONS -// ================================================================================================ - -fn init_leaf(value: u64) -> Word { - [Felt::new(value), ZERO, ZERO, ZERO] -} - -fn build_expected(values: &[Felt]) -> [Felt; 16] { - let mut expected = [ZERO; 16]; - for (&value, result) in values.iter().zip(expected.iter_mut()) { - *result = value - } - expected -} - -fn assert_case_smtget( - key: Word, - value: Word, - node: RpoDigest, - root: RpoDigest, - store: MerkleStore, - expected_stack: &[Felt], -) { - // build the process - let stack_inputs = build_stack_inputs(key, root.into(), Word::default()); - let mapped = key.into_iter().chain(value.into_iter()).collect(); - let advice_inputs = AdviceInputs::default() - .with_merkle_store(store) - .with_map([(node.into_bytes(), mapped)]); - let advice_provider = MemAdviceProvider::from(advice_inputs); - let mut process = - Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); - - // call the injector and clear the stack - process.execute_op(Operation::Noop).unwrap(); - process.execute_decorator(&Decorator::Advice(AdviceInjector::SmtGet)).unwrap(); - - // replace operand stack contents with the data on the advice stack - move_adv_to_stack(&mut process, expected_stack.len()); - - assert_eq!(build_expected(expected_stack), process.stack.trace_state()); -} - -fn build_process( - stack_inputs: StackInputs, - adv_inputs: AdviceInputs, -) -> Process { - let advice_provider = MemAdviceProvider::from(adv_inputs); - Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()) -} - -fn build_stack_inputs(w0: Word, w1: Word, w2: Word) -> StackInputs { - StackInputs::try_from_values([ - w2[0].as_int(), - w2[1].as_int(), - w2[2].as_int(), - w2[3].as_int(), - w1[0].as_int(), - w1[1].as_int(), - w1[2].as_int(), - w1[3].as_int(), - w0[0].as_int(), - w0[1].as_int(), - w0[2].as_int(), - w0[3].as_int(), - ]) - .unwrap() -} - -fn build_key(prefix: u64) -> Word { - [ONE, ONE, ONE, Felt::new(prefix)] -} - -/// Removes all items from the operand stack and pushes the specified number of values from -/// the advice tack onto it. -fn move_adv_to_stack(process: &mut Process, adv_stack_depth: usize) { - let stack_depth = process.stack.depth(); - for _ in 0..stack_depth { - process.execute_op(Operation::Drop).unwrap(); - } - - for _ in 0..adv_stack_depth { - process.execute_op(Operation::AdvPop).unwrap(); - } -} - -fn build_adv_map_entry(key: Word, val: Word, depth: u8) -> ([u8; 32], Vec) { - let node = Rpo256::merge_in_domain(&[key.into(), val.into()], Felt::from(depth)); - let mut elements = Vec::new(); - elements.extend_from_slice(&key); - elements.extend_from_slice(&val); - (node.into(), elements) -} diff --git a/processor/src/host/advice/extractors.rs b/processor/src/host/advice/extractors.rs new file mode 100644 index 0000000000..a7e8e7b871 --- /dev/null +++ b/processor/src/host/advice/extractors.rs @@ -0,0 +1,106 @@ +use core::fmt; + +// ADVICE EXTRACTORS +// ================================================================================================ + +/// Defines a set of actions which can be initiated from the VM to extract data from the advice +/// provider. These actions can only modify the advice stack. +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum AdviceExtractor { + /// Pops an element from the advice stack and returns it. + /// + /// # Errors + /// Returns an error if the advice stack is empty. + /// + /// Inputs: + /// Operand stack: [...] + /// Advice stack: [value, ...] + /// Advice map: {...} + /// Merkle store: {...} + /// + /// Outputs: + /// Operand stack: [...] + /// Advice stack: [...] + /// Advice map: {...} + /// Merkle store: {...} + /// Return: [value] + PopStack, + + /// Pops a word (4 elements) from the advice stack and returns it. + /// + /// Note: a word is popped off the stack element-by-element. For example, a `[d, c, b, a, ...]` + /// stack (i.e., `d` is at the top of the stack) will yield `[d, c, b, a]`. + /// + /// # Errors + /// Returns an error if the advice stack does not contain a full word. + /// + /// Inputs: + /// Operand stack: [...] + /// Advice stack: [d, c, b, a, ...] + /// Advice map: {...} + /// Merkle store: {...} + /// + /// Outputs: + /// Operand stack: [...] + /// Advice stack: [...] + /// Advice map: {...} + /// Merkle store: {...} + /// Return: [a, b, c, d] + PopStackWord, + + /// Pops a double word (8 elements) from the advice stack and returns them. + /// + /// Note: words are popped off the stack element-by-element. For example, a + /// `[h, g, f, e, d, c, b, a, ...]` stack (i.e., `h` is at the top of the stack) will yield + /// two words: `[h, g, f,e ], [d, c, b, a]`. + /// + /// # Errors + /// Returns an error if the advice stack does not contain two words. + /// + /// Inputs: + /// Operand stack: [...] + /// Advice stack: [h, g, f, e, d, c, b, a, ...] + /// Advice map: {...} + /// Merkle store: {...} + /// + /// Outputs: + /// Operand stack: [...] + /// Advice stack: [...] + /// Advice map: {...} + /// Merkle store: {...} + /// Return: [a, b, c, d, e, f, g, h] + PopStackDWord, + + /// Extracts a Merkle path for the node specified by the values at the top of the operand stack + /// and returns it to the caller. + /// + /// # Errors + /// Returns an error if the Merkle store does not contain the specified Merkle path. + /// + /// Inputs: + /// Operand stack: [WORD, depth, index, ROOT, ...] + /// Advice stack: [...] + /// Advice map: {...} + /// Merkle store: {path, ...} + /// + /// Outputs: + /// Operand stack: [WORD, depth, index, ROOT, ...] + /// Advice stack: [...] + /// Advice map: {...} + /// Merkle store: {path, ...} + /// Return: [path] + GetMerklePath, +} + +impl fmt::Display for AdviceExtractor { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::PopStack => write!(f, "pop_stack"), + Self::PopStackWord => write!(f, "pop_stack_word"), + Self::PopStackDWord => write!(f, "pop_stack_dword"), + Self::GetMerklePath => { + write!(f, "get_merkle_path") + } + } + } +} diff --git a/processor/src/host/advice/injectors/adv_map_injectors.rs b/processor/src/host/advice/injectors/adv_map_injectors.rs new file mode 100644 index 0000000000..e5712e0ef3 --- /dev/null +++ b/processor/src/host/advice/injectors/adv_map_injectors.rs @@ -0,0 +1,190 @@ +use super::super::{AdviceProvider, ExecutionError, Felt, HostResponse, StarkField}; +use crate::ProcessState; +use vm_core::{ + crypto::hash::{Rpo256, RpoDigest}, + utils::collections::Vec, + EMPTY_WORD, WORD_SIZE, +}; + +// ADVICE MAP INJECTORS +// ================================================================================================ + +/// Reads words from memory at the specified range and inserts them into the advice map under +/// the key `KEY` located at the top of the stack. +/// +/// Inputs: +/// Operand stack: [KEY, start_addr, end_addr, ...] +/// Advice map: {...} +/// +/// Outputs: +/// Operand stack: [KEY, start_addr, end_addr, ...] +/// Advice map: {KEY: values} +/// +/// Where `values` are the elements located in memory[start_addr..end_addr]. +/// +/// # Errors +/// Returns an error: +/// - `start_addr` is greater than or equal to 2^32. +/// - `end_addr` is greater than or equal to 2^32. +/// - `start_addr` > `end_addr`. +pub(crate) fn insert_mem_values_into_adv_map( + advice_provider: &mut A, + process: &S, +) -> Result { + let (start_addr, end_addr) = get_mem_addr_range(process, 4, 5)?; + let ctx = process.ctx(); + + let mut values = Vec::with_capacity(((end_addr - start_addr) as usize) * WORD_SIZE); + for addr in start_addr..end_addr { + let mem_value = process.get_mem_value(ctx, addr).unwrap_or(EMPTY_WORD); + values.extend_from_slice(&mem_value); + } + + let key = process.get_stack_word(0); + advice_provider.insert_into_map(key, values)?; + + Ok(HostResponse::None) +} + +/// Reads two word from the operand stack and inserts them into the advice map under the key +/// defined by the hash of these words. +/// +/// Inputs: +/// Operand stack: [B, A, ...] +/// Advice map: {...} +/// +/// Outputs: +/// Operand stack: [B, A, ...] +/// Advice map: {KEY: [a0, a1, a2, a3, b0, b1, b2, b3]} +/// +/// Where KEY is computed as hash(A || B, domain), where domain is provided via the immediate +/// value. +pub(crate) fn insert_hdword_into_adv_map( + advice_provider: &mut A, + process: &S, + domain: Felt, +) -> Result { + // get the top two words from the stack and hash them to compute the key value + let word0 = process.get_stack_word(0); + let word1 = process.get_stack_word(1); + let key = Rpo256::merge_in_domain(&[word1.into(), word0.into()], domain); + + // build a vector of values from the two word and insert it into the advice map under the + // computed key + let mut values = Vec::with_capacity(2 * WORD_SIZE); + values.extend_from_slice(&word1); + values.extend_from_slice(&word0); + advice_provider.insert_into_map(key.into(), values)?; + + Ok(HostResponse::None) +} + +/// Reads three words from the operand stack and inserts the top two words into the advice map +/// under the key defined by applying an RPO permutation to all three words. +/// +/// Inputs: +/// Operand stack: [B, A, C, ...] +/// Advice map: {...} +/// +/// Outputs: +/// Operand stack: [B, A, C, ...] +/// Advice map: {KEY: [a0, a1, a2, a3, b0, b1, b2, b3]} +/// +/// Where KEY is computed by extracting the digest elements from hperm([C, A, B]). For example, +/// if C is [0, d, 0, 0], KEY will be set as hash(A || B, d). +pub(crate) fn insert_hperm_into_adv_map( + advice_provider: &mut A, + process: &S, +) -> Result { + // read the state from the stack + let mut state = [ + process.get_stack_item(11), + process.get_stack_item(10), + process.get_stack_item(9), + process.get_stack_item(8), + process.get_stack_item(7), + process.get_stack_item(6), + process.get_stack_item(5), + process.get_stack_item(4), + process.get_stack_item(3), + process.get_stack_item(2), + process.get_stack_item(1), + process.get_stack_item(0), + ]; + + // get the values to be inserted into the advice map from the state + let values = state[Rpo256::RATE_RANGE].to_vec(); + + // apply the permutation to the state and extract the key from it + Rpo256::apply_permutation(&mut state); + let key = RpoDigest::new( + state[Rpo256::DIGEST_RANGE] + .try_into() + .expect("failed to extract digest from state"), + ); + + advice_provider.insert_into_map(key.into(), values)?; + + Ok(HostResponse::None) +} + +/// Creates a new Merkle tree in the advice provider by combining Merkle trees with the +/// specified roots. The root of the new tree is defined as `Hash(LEFT_ROOT, RIGHT_ROOT)`. +/// +/// Inputs: +/// Operand stack: [RIGHT_ROOT, LEFT_ROOT, ...] +/// Merkle store: {RIGHT_ROOT, LEFT_ROOT} +/// +/// Outputs: +/// Operand stack: [RIGHT_ROOT, LEFT_ROOT, ...] +/// Merkle store: {RIGHT_ROOT, LEFT_ROOT, hash(LEFT_ROOT, RIGHT_ROOT)} +/// +/// After the operation, both the original trees and the new tree remains in the advice +/// provider (i.e., the input trees are not removed). +/// +/// # Errors +/// Return an error if a Merkle tree for either of the specified roots cannot be found in this +/// advice provider. +pub(crate) fn merge_merkle_nodes( + advice_provider: &mut A, + process: &S, +) -> Result { + // fetch the arguments from the stack + let lhs = process.get_stack_word(1); + let rhs = process.get_stack_word(0); + + // perform the merge + advice_provider.merge_roots(lhs, rhs)?; + + Ok(HostResponse::None) +} + +// HELPER METHODS +// -------------------------------------------------------------------------------------------- + +/// Reads (start_addr, end_addr) tuple from the specified elements of the operand stack ( +/// without modifying the state of the stack), and verifies that memory range is valid. +fn get_mem_addr_range( + process: &S, + start_idx: usize, + end_idx: usize, +) -> Result<(u32, u32), ExecutionError> { + let start_addr = process.get_stack_item(start_idx).as_int(); + let end_addr = process.get_stack_item(end_idx).as_int(); + + if start_addr > u32::MAX as u64 { + return Err(ExecutionError::MemoryAddressOutOfBounds(start_addr)); + } + if end_addr > u32::MAX as u64 { + return Err(ExecutionError::MemoryAddressOutOfBounds(end_addr)); + } + + if start_addr > end_addr { + return Err(ExecutionError::InvalidMemoryRange { + start_addr, + end_addr, + }); + } + + Ok((start_addr as u32, end_addr as u32)) +} diff --git a/processor/src/host/advice/injectors/adv_stack_injectors.rs b/processor/src/host/advice/injectors/adv_stack_injectors.rs new file mode 100644 index 0000000000..6804a71595 --- /dev/null +++ b/processor/src/host/advice/injectors/adv_stack_injectors.rs @@ -0,0 +1,306 @@ +use super::super::{AdviceSource, ExecutionError, Felt, HostResponse, StarkField}; +use crate::{AdviceProvider, Ext2InttError, FieldElement, ProcessState, Vec}; +use vm_core::{QuadExtension, SignatureKind}; +use winter_prover::math::fft; + +// TYPE ALIASES +// ================================================================================================ +type QuadFelt = QuadExtension; + +// ADVICE STACK INJECTORS +// ================================================================================================ + +/// Pushes a node of the Merkle tree specified by the values on the top of the operand stack +/// onto the advice stack. +/// +/// Inputs: +/// Operand stack: [depth, index, TREE_ROOT, ...] +/// Advice stack: [...] +/// Merkle store: {TREE_ROOT<-NODE} +/// +/// Outputs: +/// Operand stack: [depth, index, TREE_ROOT, ...] +/// Advice stack: [NODE, ...] +/// Merkle store: {TREE_ROOT<-NODE} +/// +/// # Errors +/// Returns an error if: +/// - Merkle tree for the specified root cannot be found in the advice provider. +/// - The specified depth is either zero or greater than the depth of the Merkle tree +/// identified by the specified root. +/// - Value of the node at the specified depth and index is not known to the advice provider. +pub(crate) fn copy_merkle_node_to_adv_stack( + advice_provider: &mut A, + process: &S, +) -> Result { + // read node depth, node index, and tree root from the stack + let depth = process.get_stack_item(0); + let index = process.get_stack_item(1); + let root = [ + process.get_stack_item(5), + process.get_stack_item(4), + process.get_stack_item(3), + process.get_stack_item(2), + ]; + + // look up the node in the advice provider + let node = advice_provider.get_tree_node(root, &depth, &index)?; + + // push the node onto the advice stack with the first element pushed last so that it can + // be popped first (i.e. stack behavior for word) + advice_provider.push_stack(AdviceSource::Value(node[3]))?; + advice_provider.push_stack(AdviceSource::Value(node[2]))?; + advice_provider.push_stack(AdviceSource::Value(node[1]))?; + advice_provider.push_stack(AdviceSource::Value(node[0]))?; + + Ok(HostResponse::None) +} + +/// Pushes a list of field elements onto the advice stack. The list is looked up in the advice +/// map using the specified word from the operand stack as the key. If `include_len` is set to +/// true, the number of elements in the value is also pushed onto the advice stack. +/// +/// Inputs: +/// Operand stack: [..., KEY, ...] +/// Advice stack: [...] +/// Advice map: {KEY: values} +/// +/// Outputs: +/// Operand stack: [..., KEY, ...] +/// Advice stack: [values_len?, values, ...] +/// Advice map: {KEY: values} +/// +/// The `key_offset` value specifies the location of the `KEY` on the stack. For example, +/// offset value of 0 indicates that the top word on the stack should be used as the key, the +/// offset value of 4, indicates that the second word on the stack should be used as the key +/// etc. +/// +/// The valid values of `key_offset` are 0 through 12 (inclusive). +/// +/// # Errors +/// Returns an error if the required key was not found in the key-value map or if stack offset +/// is greater than 12. +pub(crate) fn copy_map_value_to_adv_stack( + advice_provider: &mut A, + process: &S, + include_len: bool, + key_offset: usize, +) -> Result { + if key_offset > 12 { + return Err(ExecutionError::InvalidStackWordOffset(key_offset)); + } + + let key = [ + process.get_stack_item(key_offset + 3), + process.get_stack_item(key_offset + 2), + process.get_stack_item(key_offset + 1), + process.get_stack_item(key_offset), + ]; + advice_provider.push_stack(AdviceSource::Map { key, include_len })?; + + Ok(HostResponse::None) +} + +/// Pushes the result of [u64] division (both the quotient and the remainder) onto the advice +/// stack. +/// +/// Inputs: +/// Operand stack: [b1, b0, a1, a0, ...] +/// Advice stack: [...] +/// +/// Outputs: +/// Operand stack: [b1, b0, a1, a0, ...] +/// Advice stack: [q0, q1, r0, r1, ...] +/// +/// Where (a0, a1) and (b0, b1) are the 32-bit limbs of the dividend and the divisor +/// respectively (with a0 representing the 32 lest significant bits and a1 representing the +/// 32 most significant bits). Similarly, (q0, q1) and (r0, r1) represent the quotient and +/// the remainder respectively. +/// +/// # Errors +/// Returns an error if the divisor is ZERO. +pub(crate) fn push_u64_div_result( + advice_provider: &mut A, + process: &S, +) -> Result { + let divisor_hi = process.get_stack_item(0).as_int(); + let divisor_lo = process.get_stack_item(1).as_int(); + let divisor = (divisor_hi << 32) + divisor_lo; + + if divisor == 0 { + return Err(ExecutionError::DivideByZero(process.clk())); + } + + let dividend_hi = process.get_stack_item(2).as_int(); + let dividend_lo = process.get_stack_item(3).as_int(); + let dividend = (dividend_hi << 32) + dividend_lo; + + let quotient = dividend / divisor; + let remainder = dividend - quotient * divisor; + + let (q_hi, q_lo) = u64_to_u32_elements(quotient); + let (r_hi, r_lo) = u64_to_u32_elements(remainder); + + advice_provider.push_stack(AdviceSource::Value(r_hi))?; + advice_provider.push_stack(AdviceSource::Value(r_lo))?; + advice_provider.push_stack(AdviceSource::Value(q_hi))?; + advice_provider.push_stack(AdviceSource::Value(q_lo))?; + + Ok(HostResponse::None) +} + +/// Given an element in a quadratic extension field on the top of the stack (i.e., a0, b1), +/// computes its multiplicative inverse and push the result onto the advice stack. +/// +/// Inputs: +/// Operand stack: [a1, a0, ...] +/// Advice stack: [...] +/// +/// Outputs: +/// Operand stack: [a1, a0, ...] +/// Advice stack: [b0, b1...] +/// +/// Where (b0, b1) is the multiplicative inverse of the extension field element (a0, a1) at the +/// top of the stack. +/// +/// # Errors +/// Returns an error if the input is a zero element in the extension field. +pub(crate) fn push_ext2_inv_result( + advice_provider: &mut A, + process: &S, +) -> Result { + let coef0 = process.get_stack_item(1); + let coef1 = process.get_stack_item(0); + + let element = QuadFelt::new(coef0, coef1); + if element == QuadFelt::ZERO { + return Err(ExecutionError::DivideByZero(process.clk())); + } + let result = element.inv().to_base_elements(); + + advice_provider.push_stack(AdviceSource::Value(result[1]))?; + advice_provider.push_stack(AdviceSource::Value(result[0]))?; + + Ok(HostResponse::None) +} + +/// Given evaluations of a polynomial over some specified domain, interpolates the evaluations +/// into a polynomial in coefficient form and pushes the result into the advice stack. +/// +/// The interpolation is performed using the iNTT algorithm. The evaluations are expected to be +/// in the quadratic extension. +/// +/// Inputs: +/// Operand stack: [output_size, input_size, input_start_ptr, ...] +/// Advice stack: [...] +/// +/// Outputs: +/// Operand stack: [output_size, input_size, input_start_ptr, ...] +/// Advice stack: [coefficients...] +/// +/// - `input_size` is the number of evaluations (each evaluation is 2 base field elements). +/// Must be a power of 2 and greater 1. +/// - `output_size` is the number of coefficients in the interpolated polynomial (each +/// coefficient is 2 base field elements). Must be smaller than or equal to the number of +/// input evaluations. +/// - `input_start_ptr` is the memory address of the first evaluation. +/// - `coefficients` are the coefficients of the interpolated polynomial such that lowest +/// degree coefficients are located at the top of the advice stack. +/// +/// # Errors +/// Returns an error if: +/// - `input_size` less than or equal to 1, or is not a power of 2. +/// - `output_size` is 0 or is greater than the `input_size`. +/// - `input_ptr` is greater than 2^32. +/// - `input_ptr + input_size / 2` is greater than 2^32. +pub(crate) fn push_ext2_intt_result( + advice_provider: &mut A, + process: &S, +) -> Result { + let output_size = process.get_stack_item(0).as_int() as usize; + let input_size = process.get_stack_item(1).as_int() as usize; + let input_start_ptr = process.get_stack_item(2).as_int(); + + if input_size <= 1 { + return Err(Ext2InttError::DomainSizeTooSmall(input_size as u64).into()); + } + if !input_size.is_power_of_two() { + return Err(Ext2InttError::DomainSizeNotPowerOf2(input_size as u64).into()); + } + if input_start_ptr >= u32::MAX as u64 { + return Err(Ext2InttError::InputStartAddressTooBig(input_start_ptr).into()); + } + if input_size > u32::MAX as usize { + return Err(Ext2InttError::InputSizeTooBig(input_size as u64).into()); + } + + let input_end_ptr = input_start_ptr + (input_size / 2) as u64; + if input_end_ptr > u32::MAX as u64 { + return Err(Ext2InttError::InputEndAddressTooBig(input_end_ptr).into()); + } + + if output_size == 0 { + return Err(Ext2InttError::OutputSizeIsZero.into()); + } + if output_size > input_size { + return Err(Ext2InttError::OutputSizeTooBig(output_size, input_size).into()); + } + + let mut poly = Vec::with_capacity(input_size); + for addr in (input_start_ptr as u32)..(input_end_ptr as u32) { + let word = process + .get_mem_value(process.ctx(), addr) + .ok_or(Ext2InttError::UninitializedMemoryAddress(addr))?; + + poly.push(QuadFelt::new(word[0], word[1])); + poly.push(QuadFelt::new(word[2], word[3])); + } + + let twiddles = fft::get_inv_twiddles::(input_size); + fft::interpolate_poly::(&mut poly, &twiddles); + + for element in QuadFelt::slice_as_base_elements(&poly[..output_size]).iter().rev() { + advice_provider.push_stack(AdviceSource::Value(*element))?; + } + + Ok(HostResponse::None) +} + +/// Pushes values onto the advice stack which are required for verification of a DSA in Miden VM. +/// +/// Inputs: +/// Operand stack: [PK, MSG, ...] +/// Advice stack: [...] +/// +/// Outputs: +/// Operand stack: [PK, MSG, ...] +/// Advice stack: [DATA] +/// +/// Where: +/// - PK is the digest of an expanded public. +/// - MSG is the digest of the message to be signed. +/// - DATA is the needed data for signature verification in the VM. +/// +/// The advice provider is expected to contain the private key associated to the public key PK. +pub(crate) fn push_signature( + advice_provider: &mut A, + process: &S, + kind: SignatureKind, +) -> Result { + let pub_key = process.get_stack_word(0); + let msg = process.get_stack_word(1); + let result: Vec = advice_provider.get_signature(kind, pub_key, msg)?; + for r in result { + advice_provider.push_stack(AdviceSource::Value(r))?; + } + Ok(HostResponse::None) +} + +// HELPER FUNCTIONS +// ================================================================================================ + +fn u64_to_u32_elements(value: u64) -> (Felt, Felt) { + let hi = Felt::new(value >> 32); + let lo = Felt::new((value as u32) as u64); + (hi, lo) +} diff --git a/processor/src/advice/dsa.rs b/processor/src/host/advice/injectors/dsa.rs similarity index 97% rename from processor/src/advice/dsa.rs rename to processor/src/host/advice/injectors/dsa.rs index 7f3e6996e3..83376593a7 100644 --- a/processor/src/advice/dsa.rs +++ b/processor/src/host/advice/injectors/dsa.rs @@ -1,4 +1,4 @@ -use super::{ExecutionError, Felt, StarkField, Vec, Word}; +use super::super::{ExecutionError, Felt, StarkField, Vec, Word}; use vm_core::{ crypto::dsa::rpo_falcon512::{KeyPair, Polynomial}, utils::Deserializable, diff --git a/processor/src/host/advice/injectors/merkle_store_injectors.rs b/processor/src/host/advice/injectors/merkle_store_injectors.rs new file mode 100644 index 0000000000..565afbcd41 --- /dev/null +++ b/processor/src/host/advice/injectors/merkle_store_injectors.rs @@ -0,0 +1,23 @@ +use super::super::{AdviceProvider, ExecutionError, HostResponse, ProcessState}; + +pub(crate) fn update_operand_stack_merkle_node( + advice_provider: &mut A, + process: &S, +) -> Result { + let depth = process.get_stack_item(4); + let index = process.get_stack_item(5); + let old_root = [ + process.get_stack_item(9), + process.get_stack_item(8), + process.get_stack_item(7), + process.get_stack_item(6), + ]; + let new_node = [ + process.get_stack_item(13), + process.get_stack_item(12), + process.get_stack_item(11), + process.get_stack_item(10), + ]; + let (path, _) = advice_provider.update_merkle_node(old_root, &depth, &index, new_node)?; + Ok(HostResponse::MerklePath(path)) +} diff --git a/processor/src/host/advice/injectors/mod.rs b/processor/src/host/advice/injectors/mod.rs new file mode 100644 index 0000000000..79e38bd268 --- /dev/null +++ b/processor/src/host/advice/injectors/mod.rs @@ -0,0 +1,5 @@ +pub(super) mod adv_map_injectors; +pub(super) mod adv_stack_injectors; +pub(super) mod dsa; +pub(super) mod merkle_store_injectors; +pub(super) mod smt; diff --git a/processor/src/host/advice/injectors/smt.rs b/processor/src/host/advice/injectors/smt.rs new file mode 100644 index 0000000000..b82f5e9be1 --- /dev/null +++ b/processor/src/host/advice/injectors/smt.rs @@ -0,0 +1,600 @@ +use super::super::{AdviceSource, ExecutionError, Felt, HostResponse, StarkField, Word}; +use crate::{AdviceProvider, ProcessState}; +use vm_core::{ + crypto::{ + hash::{Rpo256, RpoDigest}, + merkle::{EmptySubtreeRoots, NodeIndex, TieredSmt}, + }, + utils::collections::{btree_map::Entry, BTreeMap, Vec}, + ONE, WORD_SIZE, ZERO, +}; + +// CONSTANTS +// ================================================================================================ + +/// Maximum depth of a Sparse Merkle Tree +const SMT_MAX_TREE_DEPTH: Felt = Felt::new(64); + +/// Lookup table for Sparse Merkle Tree depth normalization +const SMT_NORMALIZED_DEPTHS: [u8; 65] = [ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, +]; + +// SMT INJECTORS +// ================================================================================================ + +/// Pushes values onto the advice stack which are required for successful retrieval of a +/// value from a Sparse Merkle Tree data structure. +/// +/// The Sparse Merkle Tree is tiered, meaning it will have leaf depths in `{16, 32, 48, 64}`. +/// The depth flags define the tier on which the leaf is located. +/// +/// Inputs: +/// Operand stack: [KEY, ROOT, ...] +/// Advice stack: [...] +/// +/// Outputs: +/// Operand stack: [KEY, ROOT, ...] +/// Advice stack: [f0, f1, K, V, f2] +/// +/// Where: +/// - f0 is a boolean flag set to `1` if the depth is `16` or `48`. +/// - f1 is a boolean flag set to `1` if the depth is `16` or `32`. +/// - K is the key; will be zeroed if the tree don't contain a mapped value for the key. +/// - V is the value word; will be zeroed if the tree don't contain a mapped value for the key. +/// - f2 is a boolean flag set to `1` if the key is not zero. +/// +/// # Errors +/// Returns an error if the provided Merkle root doesn't exist on the advice provider. +/// +/// # Panics +/// Will panic as unimplemented if the target depth is `64`. +pub(crate) fn push_smtget_inputs( + advice_provider: &mut A, + process: &S, +) -> Result { + // fetch the arguments from the operand stack + let key = process.get_stack_word(0); + let root = process.get_stack_word(1); + + // get the node from the SMT for the specified key; this node can be either a leaf node, + // or a root of an empty subtree at the returned depth + let (node, depth, _) = get_smt_node(advice_provider, root, key)?; + + // set the node value; zeroed if empty sub-tree + let empty = EmptySubtreeRoots::empty_hashes(64); + if Word::from(empty[depth as usize]) == node { + // push zeroes for remaining key, value & empty remaining key flag + for _ in 0..9 { + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + } + } else { + // push a flag indicating that a remaining key exists + advice_provider.push_stack(AdviceSource::Value(ONE))?; + + // map is expected to contain `node |-> {K, V}` + advice_provider.push_stack(AdviceSource::Map { + key: node, + include_len: false, + })?; + } + + // set the flags + let is_16_or_32 = if depth == 16 || depth == 32 { ONE } else { ZERO }; + let is_16_or_48 = if depth == 16 || depth == 48 { ONE } else { ZERO }; + advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + + Ok(HostResponse::None) +} + +/// Pushes onto the advice stack the value associated with the specified key in a Sparse +/// Merkle Tree defined by the specified root. +/// +/// If no value was previously associated with the specified key, [ZERO; 4] is pushed onto +/// the advice stack. +/// +/// Inputs: +/// Operand stack: [KEY, ROOT, ...] +/// Advice stack: [...] +/// +/// Outputs: +/// Operand stack: [KEY, ROOT, ...] +/// Advice stack: [VALUE, ...] +/// +/// # Errors +/// Returns an error if the provided Merkle root doesn't exist on the advice provider. +/// +/// # Panics +/// Will panic as unimplemented if the target depth is `64`. +pub(crate) fn push_smtpeek_result( + advice_provider: &mut A, + process: &S, +) -> Result { + // fetch the arguments from the operand stack + let key = process.get_stack_word(0); + let root = process.get_stack_word(1); + + // get the node from the SMT for the specified key; this node can be either a leaf node, + // or a root of an empty subtree at the returned depth + let (node, depth, _) = get_smt_node(advice_provider, root, key)?; + + let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; + if node == Word::from(empty) { + // if the node is a root of an empty subtree, then there is no value associated with + // the specified key + advice_provider.push_stack(AdviceSource::Word(TieredSmt::EMPTY_VALUE))?; + } else { + // get the key and value stored in the current leaf + let (leaf_key, leaf_value) = get_smt_upper_leaf_preimage(advice_provider, node)?; + + // if the leaf is for a different key, then there is no value associated with the + // specified key + if leaf_key == key { + advice_provider.push_stack(AdviceSource::Word(leaf_value))?; + } else { + advice_provider.push_stack(AdviceSource::Word(TieredSmt::EMPTY_VALUE))?; + } + } + + Ok(HostResponse::None) +} + +/// Pushes values onto the advice stack which are required for successful insertion of a +/// key-value pair into a Sparse Merkle Tree data structure. +/// +/// The Sparse Merkle Tree is tiered, meaning it will have leaf depths in `{16, 32, 48, 64}`. +/// +/// Inputs: +/// Operand stack: [VALUE, KEY, ROOT, ...] +/// Advice stack: [...] +/// +/// Outputs: +/// Operand stack: [OLD_VALUE, NEW_ROOT, ...] +/// Advice stack: see comments for specialized handlers below. +/// +/// Where: +/// - ROOT and NEW_ROOT are the roots of the TSMT before and after the insert respectively. +/// - VALUE is the value to be inserted. +/// - OLD_VALUE is the value previously associated with the specified KEY. +/// +/// # Errors +/// Returns an error if: +/// - The Merkle store does not contain a node with the specified root. +/// - The Merkle store does not contain all nodes needed to validate the path between the root +/// and the relevant TSMT nodes. +/// - The advice map does not contain required data about TSMT leaves to be modified. +/// +/// # Panics +/// Will panic as unimplemented if the target depth is `64`. +pub(crate) fn push_smtset_inputs( + advice_provider: &mut A, + process: &S, +) -> Result { + // get the key, value, and tree root from the stack + let value = process.get_stack_word(0); + let key = process.get_stack_word(1); + let root = process.get_stack_word(2); + + // get the node from the SMT for the specified key; this node can be either a leaf node, + // or a root of an empty subtree at the returned depth + let (node, depth, index) = get_smt_node(advice_provider, root, key)?; + + // if the value to be inserted is an empty word, we need to process it as a delete + if value == TieredSmt::EMPTY_VALUE { + return handle_smt_delete(advice_provider, root, node, depth, index, key); + } + + // figure out what kind of insert we are doing; possible options are: + // - if the node is a root of an empty subtree, this is a simple insert. + // - if the node is a leaf, this could be either an update (for the same key), or a + // complex insert (i.e., the existing leaf needs to be moved to a lower tier). + let empty = EmptySubtreeRoots::empty_hashes(64)[depth as usize]; + if node == Word::from(empty) { + handle_smt_simple_insert(advice_provider, root, depth, index) + } else { + // get the key and value stored in the current leaf + let (leaf_key, leaf_value) = get_smt_upper_leaf_preimage(advice_provider, node)?; + + // if the key for the value to be inserted is the same as the leaf's key, we are + // dealing with a simple update; otherwise, we are dealing with a complex insert + if leaf_key == key { + handle_smt_update(advice_provider, depth, leaf_value) + } else { + handle_smt_complex_insert(advice_provider, depth, key, leaf_key, leaf_value) + } + } +} + +// TSMT UPDATE HELPER METHODS +// -------------------------------------------------------------------------------------------- + +/// Returns first leaf or an empty tree node for the provided key in the Sparse Merkle tree +/// with the specified root. +/// +/// Also returns the depth and index of the returned node at this depth. +fn get_smt_node( + advice_provider: &A, + root: Word, + key: Word, +) -> Result<(Word, u8, Felt), ExecutionError> { + // determine the depth of the first leaf or an empty tree node + let index = &key[3]; + let depth = advice_provider.get_leaf_depth(root, &SMT_MAX_TREE_DEPTH, index)?; + debug_assert!(depth < 65); + + // map the depth value to its tier; this rounds up depth to 16, 32, 48, or 64 + let depth = SMT_NORMALIZED_DEPTHS[depth as usize]; + if depth == 64 { + unimplemented!("handling of depth=64 tier hasn't been implemented yet"); + } + + // get the value of the node at this index/depth + let index = index.as_int() >> (64 - depth); + let index = Felt::new(index); + let node = advice_provider.get_tree_node(root, &Felt::from(depth), &index)?; + + Ok((node, depth, index)) +} + +/// Retrieves a key-value pair for the specified leaf node from the advice map. +/// +/// # Errors +/// Returns an error if the value under the specified node does not exist or does not consist +/// of exactly 8 elements. +fn get_smt_upper_leaf_preimage( + advice_provider: &A, + node: Word, +) -> Result<(Word, Word), ExecutionError> { + let node_bytes = RpoDigest::from(node).as_bytes(); + let kv = advice_provider + .get_mapped_values(&node_bytes) + .ok_or(ExecutionError::AdviceMapKeyNotFound(node))?; + + if kv.len() != WORD_SIZE * 2 { + return Err(ExecutionError::AdviceMapValueInvalidLength(node, WORD_SIZE * 2, kv.len())); + } + + let key = [kv[0], kv[1], kv[2], kv[3]]; + let val = [kv[4], kv[5], kv[6], kv[7]]; + Ok((key, val)) +} + +/// Prepares the advice stack for a TSMT update operation. Specifically, the advice stack will +/// be arranged as follows: +/// +/// - [ZERO (padding), d0, d1, ONE (is_update), OLD_VALUE] +/// +/// Where: +/// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. +/// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. +/// - OLD_VALUE is the current value in the leaf to be updated. +fn handle_smt_update( + advice_provider: &mut A, + depth: u8, + old_value: Word, +) -> Result { + // put the old value onto the advice stack + advice_provider.push_stack(AdviceSource::Word(old_value))?; + + // set is_update flag to ONE + advice_provider.push_stack(AdviceSource::Value(ONE))?; + + // set depth flags based on leaf's depth + let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); + advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + + // pad the advice stack with an extra value to make it consistent with other cases when + // we expect 4 flag values on the top of the advice stack + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + + Ok(HostResponse::None) +} + +/// Prepares the advice stack for a TSMT simple insert operation (i.e., when we are replacing +/// an empty node). Specifically, the advice stack will be arranged as follows: +/// +/// - Simple insert at depth 16: [d0, d1, ONE (is_simple_insert), ZERO (is_update)] +/// - Simple insert at depth 32 or 48: [d0, d1, ONE (is_simple_insert), ZERO (is_update), P_NODE] +/// +/// Where: +/// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. +/// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. +/// - P_NODE is an internal node located at the tier above the insert tier. +fn handle_smt_simple_insert( + advice_provider: &mut A, + root: Word, + depth: u8, + index: Felt, +) -> Result { + // put additional data onto the advice stack as needed + match depth { + 16 => (), // nothing to do; all the required data is already in the VM + 32 | 48 => { + // for depth 32 and 48, we need to provide the internal node located on the tier + // above the insert tier + let p_index = Felt::from(index.as_int() >> 16); + let p_depth = Felt::from(depth - 16); + let p_node = advice_provider.get_tree_node(root, &p_depth, &p_index)?; + advice_provider.push_stack(AdviceSource::Word(p_node))?; + } + 64 => unimplemented!("insertions at depth 64 are not yet implemented"), + _ => unreachable!("invalid depth {depth}"), + } + + // push is_update and is_simple_insert flags onto the advice stack + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + advice_provider.push_stack(AdviceSource::Value(ONE))?; + + // set depth flags based on node's depth + let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); + advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + + Ok(HostResponse::None) +} + +/// Prepares the advice stack for a TSMT complex insert operation (i.e., when a leaf node needs +/// to be replaced with a subtree of nodes at a lower tier). Specifically, the advice stack +/// will be arranged as follows: +/// +/// - [d0, d1, ZERO (is_simple_insert), ZERO (is_update), E_KEY, E_VALUE] +/// +/// Where: +/// - d0 and d1 are boolean flags a combination of which determines the source and the target +/// tiers as follows: +/// - (0, 0): depth 16 -> 32 +/// - (0, 1): depth 16 -> 48 +/// - (1, 0): depth 32 -> 48 +/// - (1, 1): depth 16, 32, or 48 -> 64 +/// - E_KEY and E_VALUE are the key-value pair for a leaf which is to be replaced by a subtree. +fn handle_smt_complex_insert( + advice_provider: &mut A, + depth: u8, + key: Word, + leaf_key: Word, + leaf_value: Word, +) -> Result { + // push the key and value onto the advice stack + advice_provider.push_stack(AdviceSource::Word(leaf_value))?; + advice_provider.push_stack(AdviceSource::Word(leaf_key))?; + + // push is_update and is_simple_insert flags onto the advice stack + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + + // determine the combination of the source and target tiers for the insert + // and populate the depth flags accordingly + let common_prefix = get_common_prefix(&key, &leaf_key); + let target_depth = SMT_NORMALIZED_DEPTHS[common_prefix as usize + 1]; + match target_depth { + 32 if depth == 16 => { + advice_provider.push_stack(AdviceSource::Value(ONE))?; + advice_provider.push_stack(AdviceSource::Value(ONE))?; + } + 48 if depth == 16 => { + advice_provider.push_stack(AdviceSource::Value(ONE))?; + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + } + 48 if depth == 32 => { + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + advice_provider.push_stack(AdviceSource::Value(ONE))?; + } + 64 => unimplemented!("insertions at depth 64 are not yet implemented"), + _ => unreachable!("invalid source/target tier combination: {depth} -> {target_depth}"), + } + + Ok(HostResponse::None) +} + +/// Prepares the advice stack for a TSMT deletion operation. Specifically, the advice stack +/// will be arranged as follows (depending on the type of the node which occupies the location +/// at which the node for the specified key should be present): +/// +/// - Root of empty subtree: [d0, d1, ZERO (is_leaf), ONE (key_not_set)] +/// - Leaf for another key: [d0, d1, ONE (is_leaf), ONE (key_not_set), KEY, VALUE] +/// - Leaf for the provided key: [ZERO, ZERO, ZERO, ZERO (key_not_set), NEW_ROOT, OLD_VALUE] +/// +/// Where: +/// - d0 is a boolean flag set to `1` if the depth is `16` or `48`. +/// - d1 is a boolean flag set to `1` if the depth is `16` or `32`. +/// - KEY and VALUE is the key-value pair of a leaf node occupying the location of the node +/// for the specified key. Note that KEY may be the same as the specified key or different +/// from the specified key if the location is occupied by a different key-value pair. +/// - NEW_ROOT is the new root of the TSMT post deletion. +/// - OLD_VALUE is the value which is to be replaced with [ZERO; 4]. +fn handle_smt_delete( + advice_provider: &mut A, + root: Word, + node: Word, + depth: u8, + index: Felt, + key: Word, +) -> Result { + let empty = EmptySubtreeRoots::empty_hashes(TieredSmt::MAX_DEPTH)[depth as usize]; + + if node == Word::from(empty) { + // if the node to be replaced is already an empty node, we set key_not_set = ONE, + // and is_leaf = ZERO + advice_provider.push_stack(AdviceSource::Value(ONE))?; + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + + // set depth flags based on node's depth + let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); + advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + + Ok(HostResponse::None) + } else { + // if the node is not a root of an empty subtree, it must be a leaf; thus we can get + // the key and the value stored in the leaf. + let (leaf_key, leaf_value) = get_smt_upper_leaf_preimage(advice_provider, node)?; + + if leaf_key != key { + // if the node to be replaced is a leaf for different key, we push that key-value + // pair onto the advice stack and set key_not_set = ONE and is_leaf = ONE + + advice_provider.push_stack(AdviceSource::Word(leaf_value))?; + advice_provider.push_stack(AdviceSource::Word(leaf_key))?; + + advice_provider.push_stack(AdviceSource::Value(ONE))?; + advice_provider.push_stack(AdviceSource::Value(ONE))?; + + // set depth flags based on node's depth + let (is_16_or_32, is_16_or_48) = get_depth_flags(depth); + advice_provider.push_stack(AdviceSource::Value(is_16_or_32))?; + advice_provider.push_stack(AdviceSource::Value(is_16_or_48))?; + } else { + // if the key which we want to set to [ZERO; 4] does have an associated value, + // we update the tree in the advice provider to get the new root, then push the root + // and the old value onto the advice stack, key_not_set = ZERO, and also push 3 + // ZERO values for padding + let new_root = match find_lone_sibling(advice_provider, root, depth, &index)? { + Some((sibling, new_index)) => { + // if the node to be deleted has a lone sibling, we need to move it to a + // higher tier. + + // first, we compute the value of the new node on the higher tier + let (leaf_key, leaf_val) = + get_smt_upper_leaf_preimage(advice_provider, *sibling)?; + let new_node = Rpo256::merge_in_domain( + &[leaf_key.into(), leaf_val.into()], + new_index.depth().into(), + ); + + // then we insert the node and its pre-image into the advice provider + let mut elements = leaf_key.to_vec(); + elements.extend_from_slice(&leaf_val); + advice_provider.insert_into_map(new_node.into(), elements)?; + + // and finally we update the tree in the advice provider + let (_, new_root) = advice_provider.update_merkle_node( + root, + &new_index.depth().into(), + &new_index.value().into(), + new_node.into(), + )?; + new_root + } + None => { + // if the node does not have a lone sibling, we just replace it with an + // empty node + let (_, new_root) = advice_provider.update_merkle_node( + root, + &Felt::from(depth), + &index, + empty.into(), + )?; + new_root + } + }; + + advice_provider.push_stack(AdviceSource::Word(leaf_value))?; + advice_provider.push_stack(AdviceSource::Word(new_root))?; + + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + advice_provider.push_stack(AdviceSource::Value(ZERO))?; + } + Ok(HostResponse::None) + } +} + +/// Returns info about a lone sibling of a leaf specified by depth and index parameters in the +/// Tiered Sparse Merkle tree defined by the specified root. If no lone siblings exist for the +/// specified parameters, None is returned. +/// +/// A lone sibling is defined as a leaf which has a common root with the specified leaf at a +/// higher tier such that the subtree starting at this root contains only these two leaves. +/// +/// In addition to the leaf node itself, this also returns the index of the common root at a +/// higher tier. +fn find_lone_sibling( + advice_provider: &A, + root: Word, + depth: u8, + index: &Felt, +) -> Result, ExecutionError> { + debug_assert!(matches!(depth, 16 | 32 | 48)); + + // if the leaf is on the first tier (depth=16), we don't care about lone siblings as they + // cannot be moved to a higher tier. + if depth == TieredSmt::TIER_SIZE { + return Ok(None); + } + + let empty = &EmptySubtreeRoots::empty_hashes(TieredSmt::MAX_DEPTH)[..=depth as usize]; + + // get the path to the leaf node + let path: Vec<_> = advice_provider.get_merkle_path(root, &depth.into(), index)?.into(); + + // traverse the path from the leaf up to the root, keeping track of all non-empty nodes; + // here we ignore the top 16 depths because lone siblings cannot be moved to a higher tier + // from tier at depth 16. + let mut non_empty_nodes = BTreeMap::new(); + for (depth, sibling) in (TieredSmt::TIER_SIZE..=depth).rev().zip(path.iter()) { + // map the depth of each node to the tier it would "round up" to. For example, 17 maps + // to tier 1, 32 also maps to tier 1, but 33 maps to tier 2. + let tier = (depth - 1) / TieredSmt::TIER_SIZE; + + // if the node is non-empty, insert it into the map, but if a node for the same tier + // is already in the map, stop traversing the tree. we do this because if two nodes in + // a given tier are non-empty a lone sibling cannot exist at this tier or any higher + // tier. to indicate the the tier cannot contain a lone sibling, we set the value in + // the map to None. + if sibling != &empty[depth as usize] { + match non_empty_nodes.entry(tier) { + Entry::Vacant(entry) => { + entry.insert(Some((depth, *sibling))); + } + Entry::Occupied(mut entry) => { + entry.insert(None); + break; + } + } + } + } + + // take the deepest non-empty node and check if its subtree contains just a single leaf + if let Some((_, Some((node_depth, node)))) = non_empty_nodes.pop_last() { + let mut node_index = NodeIndex::new(depth, index.as_int()).expect("invalid node index"); + node_index.move_up_to(node_depth); + let node_index = node_index.sibling(); + + if let Some((mut leaf_index, leaf)) = + advice_provider.find_lone_leaf(node.into(), node_index, TieredSmt::MAX_DEPTH)? + { + // if the node's subtree does contain a single leaf, figure out to which depth + // we can move it up to. we do this by taking the next tier down from the tier + // which contained at least one non-empty node on the path from the original leaf + // up to the root. if there were no non-empty nodes on this path, we default to + // the first tier (i.e., depth 16). + let target_tier = non_empty_nodes.keys().last().map(|&t| t + 1).unwrap_or(1); + leaf_index.move_up_to(target_tier * TieredSmt::TIER_SIZE); + + return Ok(Some((leaf.into(), leaf_index))); + } + } + + Ok(None) +} + +// HELPER FUNCTIONS +// ================================================================================================ + +fn get_common_prefix(key1: &Word, key2: &Word) -> u8 { + let k1 = key1[3].as_int(); + let k2 = key2[3].as_int(); + (k1 ^ k2).leading_zeros() as u8 +} + +fn get_depth_flags(depth: u8) -> (Felt, Felt) { + let is_16_or_32 = if depth == 16 || depth == 32 { ONE } else { ZERO }; + let is_16_or_48 = if depth == 16 || depth == 48 { ONE } else { ZERO }; + (is_16_or_32, is_16_or_48) +} diff --git a/processor/src/advice/inputs.rs b/processor/src/host/advice/inputs.rs similarity index 100% rename from processor/src/advice/inputs.rs rename to processor/src/host/advice/inputs.rs diff --git a/processor/src/host/advice/mod.rs b/processor/src/host/advice/mod.rs new file mode 100644 index 0000000000..f7bb0e2579 --- /dev/null +++ b/processor/src/host/advice/mod.rs @@ -0,0 +1,800 @@ +use super::HostResponse; +use crate::{ExecutionError, Felt, InputError, ProcessState, StarkField, Word}; +use core::borrow::Borrow; +use vm_core::{ + crypto::{ + hash::RpoDigest, + merkle::{InnerNodeInfo, MerklePath, MerkleStore, NodeIndex, StoreNode}, + }, + utils::{ + collections::{BTreeMap, KvMap, RecordingMap, Vec}, + IntoBytes, + }, + AdviceInjector, SignatureKind, +}; + +mod extractors; +pub use extractors::AdviceExtractor; + +mod inputs; +pub use inputs::AdviceInputs; + +mod injectors; + +mod providers; +pub use providers::{MemAdviceProvider, RecAdviceProvider}; + +mod source; +pub use source::AdviceSource; + +// ADVICE PROVIDER +// ================================================================================================ + +/// Defines behavior of an advice provider. +/// +/// An advice provider is a component through which the host can interact with the advice provider. +/// The host can request nondeterministic inputs from the advice provider (i.e., result of a +/// computation performed outside of the VM), as well as insert new data into the advice provider. +/// +/// An advice provider consists of the following components: +/// 1. Advice stack, which is a LIFO data structure. The processor can move the elements from the +/// advice stack onto the operand stack, as well as push new elements onto the advice stack. +/// 2. Advice map, which is a key-value map where keys are words (4 field elements) and values are +/// vectors of field elements. The processor can push the values from the map onto the advice +/// stack, as well as insert new values into the map. +/// 3. Merkle store, which contains structured data reducible to Merkle paths. The VM can request +/// Merkle paths from the store, as well as mutate it by updating or merging nodes contained in +/// the store. +pub trait AdviceProvider: Sized { + // ADVICE HANDLERS + // -------------------------------------------------------------------------------------------- + + /// Handles the specified advice injector request. + fn set_advice( + &mut self, + process: &S, + advice_injector: &AdviceInjector, + ) -> Result { + match advice_injector { + AdviceInjector::MerkleNodeMerge => self.merge_merkle_nodes(process), + AdviceInjector::MerkleNodeToStack => self.copy_merkle_node_to_adv_stack(process), + AdviceInjector::MapValueToStack { + include_len, + key_offset, + } => self.copy_map_value_to_adv_stack(process, *include_len, *key_offset), + AdviceInjector::UpdateMerkleNode => self.update_operand_stack_merkle_node(process), + AdviceInjector::DivU64 => self.push_u64_div_result(process), + AdviceInjector::Ext2Inv => self.push_ext2_inv_result(process), + AdviceInjector::Ext2Intt => self.push_ext2_intt_result(process), + AdviceInjector::SmtGet => self.push_smtget_inputs(process), + AdviceInjector::SmtSet => self.push_smtset_inputs(process), + AdviceInjector::SmtPeek => self.push_smtpeek_result(process), + AdviceInjector::MemToMap => self.insert_mem_values_into_adv_map(process), + AdviceInjector::HdwordToMap { domain } => { + self.insert_hdword_into_adv_map(process, *domain) + } + AdviceInjector::HpermToMap => self.insert_hperm_into_adv_map(process), + AdviceInjector::SigToStack { kind } => self.push_signature(process, *kind), + } + } + + /// Handles the specified advice extractor request. + fn get_advice( + &mut self, + process: &S, + advice_extractor: &AdviceExtractor, + ) -> Result { + match advice_extractor { + AdviceExtractor::PopStack => self.pop_stack(process).map(HostResponse::Element), + AdviceExtractor::PopStackDWord => { + self.pop_stack_dword(process).map(HostResponse::DoubleWord) + } + AdviceExtractor::PopStackWord => self.pop_stack_word(process).map(HostResponse::Word), + AdviceExtractor::GetMerklePath => self.get_operand_stack_merkle_path(process), + } + } + + // DEFAULT ADVICE MAP INJECTORS + // -------------------------------------------------------------------------------------------- + + /// Reads words from memory at the specified range and inserts them into the advice map under + /// the key `KEY` located at the top of the stack. + /// + /// Inputs: + /// Operand stack: [KEY, start_addr, end_addr, ...] + /// Advice map: {...} + /// + /// Outputs: + /// Operand stack: [KEY, start_addr, end_addr, ...] + /// Advice map: {KEY: values} + /// + /// Where `values` are the elements located in memory[start_addr..end_addr]. + /// + /// # Errors + /// Returns an error: + /// - `start_addr` is greater than or equal to 2^32. + /// - `end_addr` is greater than or equal to 2^32. + /// - `start_addr` > `end_addr`. + fn insert_mem_values_into_adv_map( + &mut self, + process: &S, + ) -> Result { + injectors::adv_map_injectors::insert_mem_values_into_adv_map(self, process) + } + + /// Reads two word from the operand stack and inserts them into the advice map under the key + /// defined by the hash of these words. + /// + /// Inputs: + /// Operand stack: [B, A, ...] + /// Advice map: {...} + /// + /// Outputs: + /// Operand stack: [B, A, ...] + /// Advice map: {KEY: [a0, a1, a2, a3, b0, b1, b2, b3]} + /// + /// Where KEY is computed as hash(A || B, domain), where domain is provided via the immediate + /// value. + fn insert_hdword_into_adv_map( + &mut self, + process: &S, + domain: Felt, + ) -> Result { + injectors::adv_map_injectors::insert_hdword_into_adv_map(self, process, domain) + } + + /// Reads three words from the operand stack and inserts the top two words into the advice map + /// under the key defined by applying an RPO permutation to all three words. + /// + /// Inputs: + /// Operand stack: [B, A, C, ...] + /// Advice map: {...} + /// + /// Outputs: + /// Operand stack: [B, A, C, ...] + /// Advice map: {KEY: [a0, a1, a2, a3, b0, b1, b2, b3]} + /// + /// Where KEY is computed by extracting the digest elements from hperm([C, A, B]). For example, + /// if C is [0, d, 0, 0], KEY will be set as hash(A || B, d). + fn insert_hperm_into_adv_map( + &mut self, + process: &S, + ) -> Result { + injectors::adv_map_injectors::insert_hperm_into_adv_map(self, process) + } + + /// Creates a new Merkle tree in the advice provider by combining Merkle trees with the + /// specified roots. The root of the new tree is defined as `Hash(LEFT_ROOT, RIGHT_ROOT)`. + /// + /// Inputs: + /// Operand stack: [RIGHT_ROOT, LEFT_ROOT, ...] + /// Merkle store: {RIGHT_ROOT, LEFT_ROOT} + /// + /// Outputs: + /// Operand stack: [RIGHT_ROOT, LEFT_ROOT, ...] + /// Merkle store: {RIGHT_ROOT, LEFT_ROOT, hash(LEFT_ROOT, RIGHT_ROOT)} + /// + /// After the operation, both the original trees and the new tree remains in the advice + /// provider (i.e., the input trees are not removed). + /// + /// # Errors + /// Return an error if a Merkle tree for either of the specified roots cannot be found in this + /// advice provider. + fn merge_merkle_nodes( + &mut self, + process: &S, + ) -> Result { + injectors::adv_map_injectors::merge_merkle_nodes(self, process) + } + + // DEFAULT ADVICE STACK INJECTORS + // -------------------------------------------------------------------------------------------- + + /// Pushes a node of the Merkle tree specified by the values on the top of the operand stack + /// onto the advice stack. + /// + /// Inputs: + /// Operand stack: [depth, index, TREE_ROOT, ...] + /// Advice stack: [...] + /// Merkle store: {TREE_ROOT<-NODE} + /// + /// Outputs: + /// Operand stack: [depth, index, TREE_ROOT, ...] + /// Advice stack: [NODE, ...] + /// Merkle store: {TREE_ROOT<-NODE} + /// + /// # Errors + /// Returns an error if: + /// - Merkle tree for the specified root cannot be found in the advice provider. + /// - The specified depth is either zero or greater than the depth of the Merkle tree + /// identified by the specified root. + /// - Value of the node at the specified depth and index is not known to the advice provider. + fn copy_merkle_node_to_adv_stack( + &mut self, + process: &S, + ) -> Result { + injectors::adv_stack_injectors::copy_merkle_node_to_adv_stack(self, process) + } + + /// Pushes a list of field elements onto the advice stack. The list is looked up in the advice + /// map using the specified word from the operand stack as the key. If `include_len` is set to + /// true, the number of elements in the value is also pushed onto the advice stack. + /// + /// Inputs: + /// Operand stack: [..., KEY, ...] + /// Advice stack: [...] + /// Advice map: {KEY: values} + /// + /// Outputs: + /// Operand stack: [..., KEY, ...] + /// Advice stack: [values_len?, values, ...] + /// Advice map: {KEY: values} + /// + /// The `key_offset` value specifies the location of the `KEY` on the stack. For example, + /// offset value of 0 indicates that the top word on the stack should be used as the key, the + /// offset value of 4, indicates that the second word on the stack should be used as the key + /// etc. + /// + /// The valid values of `key_offset` are 0 through 12 (inclusive). + /// + /// # Errors + /// Returns an error if the required key was not found in the key-value map or if stack offset + /// is greater than 12. + fn copy_map_value_to_adv_stack( + &mut self, + process: &S, + include_len: bool, + key_offset: usize, + ) -> Result { + injectors::adv_stack_injectors::copy_map_value_to_adv_stack( + self, + process, + include_len, + key_offset, + ) + } + + /// Pushes the result of [u64] division (both the quotient and the remainder) onto the advice + /// stack. + /// + /// Inputs: + /// Operand stack: [b1, b0, a1, a0, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [b1, b0, a1, a0, ...] + /// Advice stack: [q0, q1, r0, r1, ...] + /// + /// Where (a0, a1) and (b0, b1) are the 32-bit limbs of the dividend and the divisor + /// respectively (with a0 representing the 32 lest significant bits and a1 representing the + /// 32 most significant bits). Similarly, (q0, q1) and (r0, r1) represent the quotient and + /// the remainder respectively. + /// + /// # Errors + /// Returns an error if the divisor is ZERO. + fn push_u64_div_result( + &mut self, + process: &S, + ) -> Result { + injectors::adv_stack_injectors::push_u64_div_result(self, process) + } + + /// Given an element in a quadratic extension field on the top of the stack (i.e., a0, b1), + /// computes its multiplicative inverse and push the result onto the advice stack. + /// + /// Inputs: + /// Operand stack: [a1, a0, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [a1, a0, ...] + /// Advice stack: [b0, b1...] + /// + /// Where (b0, b1) is the multiplicative inverse of the extension field element (a0, a1) at the + /// top of the stack. + /// + /// # Errors + /// Returns an error if the input is a zero element in the extension field. + fn push_ext2_inv_result( + &mut self, + process: &S, + ) -> Result { + injectors::adv_stack_injectors::push_ext2_inv_result(self, process) + } + + /// Given evaluations of a polynomial over some specified domain, interpolates the evaluations + /// into a polynomial in coefficient form and pushes the result into the advice stack. + /// + /// The interpolation is performed using the iNTT algorithm. The evaluations are expected to be + /// in the quadratic extension. + /// + /// Inputs: + /// Operand stack: [output_size, input_size, input_start_ptr, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [output_size, input_size, input_start_ptr, ...] + /// Advice stack: [coefficients...] + /// + /// - `input_size` is the number of evaluations (each evaluation is 2 base field elements). + /// Must be a power of 2 and greater 1. + /// - `output_size` is the number of coefficients in the interpolated polynomial (each + /// coefficient is 2 base field elements). Must be smaller than or equal to the number of + /// input evaluations. + /// - `input_start_ptr` is the memory address of the first evaluation. + /// - `coefficients` are the coefficients of the interpolated polynomial such that lowest + /// degree coefficients are located at the top of the advice stack. + /// + /// # Errors + /// Returns an error if: + /// - `input_size` less than or equal to 1, or is not a power of 2. + /// - `output_size` is 0 or is greater than the `input_size`. + /// - `input_ptr` is greater than 2^32. + /// - `input_ptr + input_size / 2` is greater than 2^32. + fn push_ext2_intt_result( + &mut self, + process: &S, + ) -> Result { + injectors::adv_stack_injectors::push_ext2_intt_result(self, process) + } + + /// Pushes values onto the advice stack which are required for verification of a DSA in Miden VM. + /// + /// Inputs: + /// Operand stack: [PK, MSG, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [PK, MSG, ...] + /// Advice stack: [DATA] + /// + /// Where: + /// - PK is the digest of an expanded public. + /// - MSG is the digest of the message to be signed. + /// - DATA is the needed data for signature verification in the VM. + /// + /// The advice provider is expected to contain the private key associated to the public key PK. + fn push_signature( + &mut self, + process: &S, + kind: SignatureKind, + ) -> Result { + injectors::adv_stack_injectors::push_signature(self, process, kind) + } + + // DEFAULT MERKLE STORE INJECTORS + // -------------------------------------------------------------------------------------------- + + /// Updates the node of a Merkle tree specified by the values on the top of the operand stack. + /// Returns the path from the updated node to the new root of the tree to the caller. + /// + /// Inputs: + /// Operand stack: [OLD_NODE, depth, index, OLD_ROOT, NEW_NODE, ...] + /// Advice: [...] + /// Merkle store: {...} + /// + /// Outputs: + /// Operand stack: [OLD_NODE, depth, index, OLD_ROOT, NEW_NODE, ...] + /// Advice stack: [...] + /// Merkle store: {path, ...} + /// Return: [path] + fn update_operand_stack_merkle_node( + &mut self, + process: &S, + ) -> Result { + injectors::merkle_store_injectors::update_operand_stack_merkle_node(self, process) + } + + // DEFAULT MERKLE STORE EXTRACTORS + // -------------------------------------------------------------------------------------------- + + /// Extracts a Merkle path for the node specified by the values at the top of the operand stack + /// and returns it to the caller. + /// + /// # Errors + /// Returns an error if the Merkle store does not contain the specified Merkle path. + /// + /// Inputs: + /// Operand stack: [WORD, depth, index, ROOT, ...] + /// Advice stack: [...] + /// Advice map: {...} + /// Merkle store: {path, ...} + /// + /// Outputs: + /// Operand stack: [WORD, depth, index, ROOT, ...] + /// Advice stack: [...] + /// Advice map: {...} + /// Merkle store: {path, ...} + /// Return: [path] + fn get_operand_stack_merkle_path( + &mut self, + process: &S, + ) -> Result { + let depth = process.get_stack_item(4); + let index = process.get_stack_item(5); + let root = [ + process.get_stack_item(9), + process.get_stack_item(8), + process.get_stack_item(7), + process.get_stack_item(6), + ]; + self.get_merkle_path(root, &depth, &index).map(HostResponse::MerklePath) + } + + // DEFAULT SMT INJECTORS + // -------------------------------------------------------------------------------------------- + + /// Pushes values onto the advice stack which are required for successful retrieval of a + /// value from a Sparse Merkle Tree data structure. + /// + /// The Sparse Merkle Tree is tiered, meaning it will have leaf depths in `{16, 32, 48, 64}`. + /// The depth flags define the tier on which the leaf is located. + /// + /// Inputs: + /// Operand stack: [KEY, ROOT, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [KEY, ROOT, ...] + /// Advice stack: [f0, f1, K, V, f2] + /// + /// Where: + /// - f0 is a boolean flag set to `1` if the depth is `16` or `48`. + /// - f1 is a boolean flag set to `1` if the depth is `16` or `32`. + /// - K is the key; will be zeroed if the tree don't contain a mapped value for the key. + /// - V is the value word; will be zeroed if the tree don't contain a mapped value for the key. + /// - f2 is a boolean flag set to `1` if the key is not zero. + /// + /// # Errors + /// Returns an error if the provided Merkle root doesn't exist on the advice provider. + /// + /// # Panics + /// Will panic as unimplemented if the target depth is `64`. + fn push_smtget_inputs( + &mut self, + process: &S, + ) -> Result { + injectors::smt::push_smtget_inputs(self, process) + } + + /// Pushes onto the advice stack the value associated with the specified key in a Sparse + /// Merkle Tree defined by the specified root. + /// + /// If no value was previously associated with the specified key, [ZERO; 4] is pushed onto + /// the advice stack. + /// + /// Inputs: + /// Operand stack: [KEY, ROOT, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [KEY, ROOT, ...] + /// Advice stack: [VALUE, ...] + /// + /// # Errors + /// Returns an error if the provided Merkle root doesn't exist on the advice provider. + /// + /// # Panics + /// Will panic as unimplemented if the target depth is `64`. + fn push_smtpeek_result( + &mut self, + process: &S, + ) -> Result { + injectors::smt::push_smtpeek_result(self, process) + } + + /// Pushes values onto the advice stack which are required for successful insertion of a + /// key-value pair into a Sparse Merkle Tree data structure. + /// + /// The Sparse Merkle Tree is tiered, meaning it will have leaf depths in `{16, 32, 48, 64}`. + /// + /// Inputs: + /// Operand stack: [VALUE, KEY, ROOT, ...] + /// Advice stack: [...] + /// + /// Outputs: + /// Operand stack: [OLD_VALUE, NEW_ROOT, ...] + /// Advice stack: see comments for specialized handlers below. + /// + /// Where: + /// - ROOT and NEW_ROOT are the roots of the TSMT before and after the insert respectively. + /// - VALUE is the value to be inserted. + /// - OLD_VALUE is the value previously associated with the specified KEY. + /// + /// # Errors + /// Returns an error if: + /// - The Merkle store does not contain a node with the specified root. + /// - The Merkle store does not contain all nodes needed to validate the path between the root + /// and the relevant TSMT nodes. + /// - The advice map does not contain required data about TSMT leaves to be modified. + /// + /// # Panics + /// Will panic as unimplemented if the target depth is `64`. + fn push_smtset_inputs( + &mut self, + process: &S, + ) -> Result { + injectors::smt::push_smtset_inputs(self, process) + } + + // ACCESSORS + // -------------------------------------------------------------------------------------------- + + /// Creates a "by reference" advice provider for this instance. + /// + /// The returned adapter also implements [AdviceProvider] and will simply mutably borrow this + /// instance. + fn by_ref(&mut self) -> &mut Self { + // this trait follows the same model as + // [io::Read](https://doc.rust-lang.org/std/io/trait.Read.html#method.by_ref). + // + // this approach allows the flexibility to take an advice provider either as owned or by + // mutable reference - both equally compatible with the trait requirements as we implement + // `AdviceProvider` for mutable references of any type that also implements advice + // provider. + self + } + + // REQUIRED METHODS + // -------------------------------------------------------------------------------------------- + + // ADVICE STACK + // -------------------------------------------------------------------------------------------- + + /// Pops an element from the advice stack and returns it. + /// + /// # Errors + /// Returns an error if the advice stack is empty. + fn pop_stack(&mut self, process: &S) -> Result; + + /// Pops a word (4 elements) from the advice stack and returns it. + /// + /// Note: a word is popped off the stack element-by-element. For example, a `[d, c, b, a, ...]` + /// stack (i.e., `d` is at the top of the stack) will yield `[d, c, b, a]`. + /// + /// # Errors + /// Returns an error if the advice stack does not contain a full word. + fn pop_stack_word(&mut self, process: &S) -> Result; + + /// Pops a double word (8 elements) from the advice stack and returns them. + /// + /// Note: words are popped off the stack element-by-element. For example, a + /// `[h, g, f, e, d, c, b, a, ...]` stack (i.e., `h` is at the top of the stack) will yield + /// two words: `[h, g, f,e ], [d, c, b, a]`. + /// + /// # Errors + /// Returns an error if the advice stack does not contain two words. + fn pop_stack_dword( + &mut self, + process: &S, + ) -> Result<[Word; 2], ExecutionError>; + + /// Pushes the value(s) specified by the source onto the advice stack. + /// + /// # Errors + /// Returns an error if the value specified by the advice source cannot be obtained. + fn push_stack(&mut self, source: AdviceSource) -> Result<(), ExecutionError>; + + // ADVICE MAP + // -------------------------------------------------------------------------------------------- + + /// Returns a reference to the value(s) associated with the specified key in the advice map. + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]>; + + /// Inserts the provided value into the advice map under the specified key. + /// + /// The values in the advice map can be moved onto the advice stack by invoking + /// [AdviceProvider::push_stack()] method. + /// + /// If the specified key is already present in the advice map, the values under the key + /// are replaced with the specified values. + fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError>; + + /// Returns a signature on a message using a public key. + fn get_signature( + &self, + kind: SignatureKind, + pub_key: Word, + msg: Word, + ) -> Result, ExecutionError>; + + // MERKLE STORE + // -------------------------------------------------------------------------------------------- + + /// Returns a node at the specified depth and index in a Merkle tree with the given root. + /// + /// # Errors + /// Returns an error if: + /// - A Merkle tree for the specified root cannot be found in this advice provider. + /// - The specified depth is either zero or greater than the depth of the Merkle tree + /// identified by the specified root. + /// - Value of the node at the specified depth and index is not known to this advice provider. + fn get_tree_node(&self, root: Word, depth: &Felt, index: &Felt) + -> Result; + + /// Returns a path to a node at the specified depth and index in a Merkle tree with the + /// specified root. + /// + /// # Errors + /// Returns an error if: + /// - A Merkle tree for the specified root cannot be found in this advice provider. + /// - The specified depth is either zero or greater than the depth of the Merkle tree + /// identified by the specified root. + /// - Path to the node at the specified depth and index is not known to this advice provider. + fn get_merkle_path( + &self, + root: Word, + depth: &Felt, + index: &Felt, + ) -> Result; + + /// Reconstructs a path from the root until a leaf or empty node and returns its depth. + /// + /// For more information, check [MerkleStore::get_leaf_depth]. + /// + /// # Errors + /// Will return an error if: + /// - The provided `tree_depth` doesn't fit `u8`. + /// - The conditions of [MerkleStore::get_leaf_depth] aren't met. + fn get_leaf_depth( + &self, + root: Word, + tree_depth: &Felt, + index: &Felt, + ) -> Result; + + /// Returns node value and index of a leaf node in the subtree of the specified root, if and + /// only if this is the only leaf in the entire subtree. Otherwise, None is returned. + /// + /// The root itself is assumed to be located at the specified index in a tree with the provided + /// depth. + /// + /// # Errors + /// Returns an error if a three for the specified root does not exist in the advice provider. + fn find_lone_leaf( + &self, + root: Word, + root_index: NodeIndex, + tree_depth: u8, + ) -> Result, ExecutionError>; + + /// Updates a node at the specified depth and index in a Merkle tree with the specified root; + /// returns the Merkle path from the updated node to the new root, together with the new root. + /// + /// The tree is cloned prior to the update. Thus, the advice provider retains the original and + /// the updated tree. + /// + /// # Errors + /// Returns an error if: + /// - A Merkle tree for the specified root cannot be found in this advice provider. + /// - The specified depth is either zero or greater than the depth of the Merkle tree + /// identified by the specified root. + /// - Path to the leaf at the specified index in the specified Merkle tree is not known to this + /// advice provider. + fn update_merkle_node( + &mut self, + root: Word, + depth: &Felt, + index: &Felt, + value: Word, + ) -> Result<(MerklePath, Word), ExecutionError>; + + /// Creates a new Merkle tree in the advice provider by combining Merkle trees with the + /// specified roots. The root of the new tree is defined as `hash(left_root, right_root)`. + /// + /// After the operation, both the original trees and the new tree remains in the advice + /// provider (i.e., the input trees are not removed). + /// + /// # Errors + /// Returns an error if a Merkle tree for either of the specified roots cannot be found in this + /// advice provider. + fn merge_roots(&mut self, lhs: Word, rhs: Word) -> Result; + + /// Returns a subset of this Merkle store such that the returned Merkle store contains all + /// nodes which are descendants of the specified roots. + /// + /// The roots for which no descendants exist in this Merkle store are ignored. + fn get_store_subset(&self, roots: I) -> MerkleStore + where + I: Iterator, + R: Borrow; +} + +impl<'a, T> AdviceProvider for &'a mut T +where + T: AdviceProvider, +{ + fn pop_stack(&mut self, process: &S) -> Result { + T::pop_stack(self, process) + } + + fn pop_stack_word(&mut self, process: &S) -> Result { + T::pop_stack_word(self, process) + } + + fn pop_stack_dword( + &mut self, + process: &S, + ) -> Result<[Word; 2], ExecutionError> { + T::pop_stack_dword(self, process) + } + + fn push_stack(&mut self, source: AdviceSource) -> Result<(), ExecutionError> { + T::push_stack(self, source) + } + + fn insert_into_map(&mut self, key: Word, values: Vec) -> Result<(), ExecutionError> { + T::insert_into_map(self, key, values) + } + + fn get_signature( + &self, + kind: SignatureKind, + pub_key: Word, + msg: Word, + ) -> Result, ExecutionError> { + T::get_signature(self, kind, pub_key, msg) + } + + fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> { + T::get_mapped_values(self, key) + } + + fn get_tree_node( + &self, + root: Word, + depth: &Felt, + index: &Felt, + ) -> Result { + T::get_tree_node(self, root, depth, index) + } + + fn get_merkle_path( + &self, + root: Word, + depth: &Felt, + index: &Felt, + ) -> Result { + T::get_merkle_path(self, root, depth, index) + } + + fn get_leaf_depth( + &self, + root: Word, + tree_depth: &Felt, + index: &Felt, + ) -> Result { + T::get_leaf_depth(self, root, tree_depth, index) + } + + fn find_lone_leaf( + &self, + root: Word, + root_index: NodeIndex, + tree_depth: u8, + ) -> Result, ExecutionError> { + T::find_lone_leaf(self, root, root_index, tree_depth) + } + + fn update_merkle_node( + &mut self, + root: Word, + depth: &Felt, + index: &Felt, + value: Word, + ) -> Result<(MerklePath, Word), ExecutionError> { + T::update_merkle_node(self, root, depth, index, value) + } + + fn merge_roots(&mut self, lhs: Word, rhs: Word) -> Result { + T::merge_roots(self, lhs, rhs) + } + + fn get_store_subset(&self, roots: I) -> MerkleStore + where + I: Iterator, + R: Borrow, + { + T::get_store_subset(self, roots) + } +} diff --git a/processor/src/advice/providers.rs b/processor/src/host/advice/providers.rs similarity index 88% rename from processor/src/advice/providers.rs rename to processor/src/host/advice/providers.rs index 3b96f0a193..21ee51e373 100644 --- a/processor/src/advice/providers.rs +++ b/processor/src/host/advice/providers.rs @@ -1,8 +1,9 @@ use super::{ - dsa, AdviceInputs, AdviceProvider, AdviceSource, BTreeMap, ExecutionError, Felt, IntoBytes, - KvMap, MerklePath, MerkleStore, NodeIndex, RecordingMap, RpoDigest, StarkField, StoreNode, Vec, - Word, + injectors, AdviceInputs, AdviceProvider, AdviceSource, BTreeMap, ExecutionError, Felt, + IntoBytes, KvMap, MerklePath, MerkleStore, NodeIndex, RecordingMap, RpoDigest, StarkField, + StoreNode, Vec, Word, }; +use crate::ProcessState; use vm_core::SignatureKind; // TYPE ALIASES @@ -25,7 +26,6 @@ where M: KvMap<[u8; 32], Vec>, S: KvMap, { - step: u32, stack: Vec, map: M, store: MerkleStore, @@ -40,7 +40,6 @@ where let (mut stack, map, store) = inputs.into_parts(); stack.reverse(); Self { - step: 0, stack, map: map.into_iter().collect(), store: store.inner_nodes().collect(), @@ -56,13 +55,13 @@ where // ADVICE STACK // -------------------------------------------------------------------------------------------- - fn pop_stack(&mut self) -> Result { - self.stack.pop().ok_or(ExecutionError::AdviceStackReadFailed(self.step)) + fn pop_stack(&mut self, process: &P) -> Result { + self.stack.pop().ok_or(ExecutionError::AdviceStackReadFailed(process.clk())) } - fn pop_stack_word(&mut self) -> Result { + fn pop_stack_word(&mut self, process: &P) -> Result { if self.stack.len() < 4 { - return Err(ExecutionError::AdviceStackReadFailed(self.step)); + return Err(ExecutionError::AdviceStackReadFailed(process.clk())); } let idx = self.stack.len() - 4; @@ -74,9 +73,12 @@ where Ok(result) } - fn pop_stack_dword(&mut self) -> Result<[Word; 2], ExecutionError> { - let word0 = self.pop_stack_word()?; - let word1 = self.pop_stack_word()?; + fn pop_stack_dword( + &mut self, + process: &P, + ) -> Result<[Word; 2], ExecutionError> { + let word0 = self.pop_stack_word(process)?; + let word1 = self.pop_stack_word(process)?; Ok([word0, word1]) } @@ -117,7 +119,7 @@ where .ok_or(ExecutionError::AdviceMapKeyNotFound(pub_key))?; match kind { - SignatureKind::RpoFalcon512 => dsa::falcon_sign(pk_sk, msg), + SignatureKind::RpoFalcon512 => injectors::dsa::falcon_sign(pk_sk, msg), } } @@ -230,13 +232,6 @@ where { self.store.subset(roots).into_inner().into_iter().collect() } - - // CONTEXT MANAGEMENT - // -------------------------------------------------------------------------------------------- - - fn advance_clock(&mut self) { - self.step += 1; - } } // MEMORY ADVICE PROVIDER @@ -284,16 +279,16 @@ impl MemAdviceProvider { /// TODO: potentially do this via a macro. #[rustfmt::skip] impl AdviceProvider for MemAdviceProvider { - fn pop_stack(&mut self) -> Result { - self.provider.pop_stack() + fn pop_stack(&mut self, process: &S)-> Result { + self.provider.pop_stack(process) } - fn pop_stack_word(&mut self) -> Result { - self.provider.pop_stack_word() + fn pop_stack_word(&mut self, process: &S) -> Result { + self.provider.pop_stack_word(process) } - fn pop_stack_dword(&mut self) -> Result<[Word; 2], ExecutionError> { - self.provider.pop_stack_dword() + fn pop_stack_dword(&mut self, process: &S) -> Result<[Word; 2], ExecutionError> { + self.provider.pop_stack_dword(process) } fn push_stack(&mut self, source: AdviceSource) -> Result<(), ExecutionError> { @@ -343,9 +338,6 @@ impl AdviceProvider for MemAdviceProvider { self.provider.get_store_subset(roots) } - fn advance_clock(&mut self) { - self.provider.advance_clock() - } } impl MemAdviceProvider { @@ -354,12 +346,7 @@ impl MemAdviceProvider { /// Consumes the [MemAdviceProvider] and returns a (Vec, SimpleAdviceMap, MerkleStore), /// containing the stack, map, store respectively, of the advice provider. pub fn into_parts(self) -> (Vec, SimpleAdviceMap, MerkleStore) { - let BaseAdviceProvider { - step: _step, - stack, - map, - store, - } = self.provider; + let BaseAdviceProvider { stack, map, store } = self.provider; (stack, map, store) } } @@ -417,16 +404,16 @@ impl RecAdviceProvider { /// TODO: potentially do this via a macro. #[rustfmt::skip] impl AdviceProvider for RecAdviceProvider { - fn pop_stack(&mut self) -> Result { - self.provider.pop_stack() + fn pop_stack(&mut self, process: &S) -> Result { + self.provider.pop_stack(process) } - fn pop_stack_word(&mut self) -> Result { - self.provider.pop_stack_word() + fn pop_stack_word(&mut self, process: &S) -> Result { + self.provider.pop_stack_word(process) } - fn pop_stack_dword(&mut self) -> Result<[Word; 2], ExecutionError> { - self.provider.pop_stack_dword() + fn pop_stack_dword(&mut self, process: &S) -> Result<[Word; 2], ExecutionError> { + self.provider.pop_stack_dword(process) } fn push_stack(&mut self, source: AdviceSource) -> Result<(), ExecutionError> { @@ -475,10 +462,6 @@ impl AdviceProvider for RecAdviceProvider { R: core::borrow::Borrow { self.provider.get_store_subset(roots) } - - fn advance_clock(&mut self) { - self.provider.advance_clock() - } } impl RecAdviceProvider { @@ -499,12 +482,7 @@ impl RecAdviceProvider { provider, init_stack, } = self; - let BaseAdviceProvider { - step: _step, - stack, - map, - store, - } = provider; + let BaseAdviceProvider { stack, map, store } = provider; let (map, map_proof) = map.finalize(); let (store, store_proof) = store.into_inner().finalize(); diff --git a/processor/src/advice/source.rs b/processor/src/host/advice/source.rs similarity index 100% rename from processor/src/advice/source.rs rename to processor/src/host/advice/source.rs diff --git a/processor/src/host/debug.rs b/processor/src/host/debug.rs new file mode 100644 index 0000000000..0b90230ac3 --- /dev/null +++ b/processor/src/host/debug.rs @@ -0,0 +1,52 @@ +use super::{Felt, ProcessState}; +use crate::Vec; +use vm_core::DebugOptions; + +// DEBUG HANDLER +// ================================================================================================ + +/// Prints the info about the VM state specified by the provided options to stdout. +pub fn print_debug_info(process: &S, options: &DebugOptions) { + let clk = process.clk(); + match options { + DebugOptions::StackAll => { + let stack = process.get_stack_state(); + let n = stack.len(); + print_vm_stack(clk, stack, n); + } + DebugOptions::StackTop(n) => { + let stack = process.get_stack_state(); + print_vm_stack(clk, stack, *n as usize); + } + } +} + +// HELPER FUNCTIONS +// ================================================================================================ + +#[cfg(feature = "std")] +fn print_vm_stack(clk: u32, stack: Vec, n: usize) { + // determine how many items to print out + let num_items = core::cmp::min(stack.len(), n); + + // print all items except for the last one + println!("Stack state before step {clk}:"); + for (i, element) in stack.iter().take(num_items - 1).enumerate() { + println!("├── {i:>2}: {element}"); + } + + // print the last item, and in case the stack has more items, print the total number of + // un-printed items + let i = num_items - 1; + if num_items == stack.len() { + println!("└── {i:>2}: {}", stack[i]); + } else { + println!("├── {i:>2}: {}", stack[i]); + println!("└── ({} more items)", stack.len() - num_items); + } +} + +#[cfg(not(feature = "std"))] +fn print_vm_stack(_clk: u32, _stack: Vec, _n: usize) { + // in no_std environments, this is a NOOP +} diff --git a/processor/src/host/mod.rs b/processor/src/host/mod.rs new file mode 100644 index 0000000000..60571caf38 --- /dev/null +++ b/processor/src/host/mod.rs @@ -0,0 +1,239 @@ +use super::{ExecutionError, Felt, ProcessState}; +use crate::MemAdviceProvider; +use vm_core::{crypto::merkle::MerklePath, AdviceInjector, DebugOptions, Word}; + +pub(super) mod advice; +use advice::{AdviceExtractor, AdviceProvider}; + +mod debug; + +// HOST TRAIT +// ================================================================================================ + +/// Defines an interface by which the VM can make requests to the host. +/// +/// There are three variants of requests, these can get advice, set advice and invoke the +/// debug handler. The requests are specified by the [AdviceExtractor], [AdviceInjector] and +/// [DebugOptions] enums which target the `get_advice`, `set_advice` and `on_debug` methods +/// respectively. The host is responsible for handling the requests and returning the results to +/// the VM in the form of [HostResponse]. The host is provided with a reference to the current +/// state of the VM ([ProcessState]), which it can use to extract the data required to fulfill the +/// request. +pub trait Host { + // REQUIRED METHODS + // -------------------------------------------------------------------------------------------- + + /// Returns the requested advice, specified by [AdviceExtractor], from the host to the VM. + fn get_advice( + &mut self, + process: &S, + extractor: AdviceExtractor, + ) -> Result; + + /// Sets the requested advice, specified by [AdviceInjector], on the host. + fn set_advice( + &mut self, + process: &S, + injector: AdviceInjector, + ) -> Result; + + /// Creates a "by reference" host for this instance. + /// + /// The returned adapter also implements [Host] and will simply mutably borrow this + /// instance. + fn by_ref(&mut self) -> &mut Self { + // this trait follows the same model as + // [io::Read](https://doc.rust-lang.org/std/io/trait.Read.html#method.by_ref). + // + // this approach allows the flexibility to take a host either as owned or by mutable + // reference - both equally compatible with the trait requirements as we implement + // `Host` for mutable references of any type that also implements `Host`. + self + } + + // PROVIDED METHODS + // -------------------------------------------------------------------------------------------- + + /// Handles the debug request from the VM. + fn on_debug( + &mut self, + process: &S, + options: &DebugOptions, + ) -> Result { + debug::print_debug_info(process, options); + Ok(HostResponse::None) + } + + /// Pops an element from the advice stack and returns it. + /// + /// # Errors + /// Returns an error if the advice stack is empty. + fn pop_adv_stack(&mut self, process: &S) -> Result { + let response = self.get_advice(process, AdviceExtractor::PopStack)?; + Ok(response.into()) + } + + /// Pops a word (4 elements) from the advice stack and returns it. + /// + /// Note: a word is popped off the stack element-by-element. For example, a `[d, c, b, a, ...]` + /// stack (i.e., `d` is at the top of the stack) will yield `[d, c, b, a]`. + /// + /// # Errors + /// Returns an error if the advice stack does not contain a full word. + fn pop_adv_stack_word(&mut self, process: &S) -> Result { + let response = self.get_advice(process, AdviceExtractor::PopStackWord)?; + Ok(response.into()) + } + + /// Pops a double word (8 elements) from the advice stack and returns them. + /// + /// Note: words are popped off the stack element-by-element. For example, a + /// `[h, g, f, e, d, c, b, a, ...]` stack (i.e., `h` is at the top of the stack) will yield + /// two words: `[h, g, f,e ], [d, c, b, a]`. + /// + /// # Errors + /// Returns an error if the advice stack does not contain two words. + fn pop_adv_stack_dword( + &mut self, + process: &S, + ) -> Result<[Word; 2], ExecutionError> { + let response = self.get_advice(process, AdviceExtractor::PopStackDWord)?; + Ok(response.into()) + } + + /// Returns a path to a node at the specified depth and index in a Merkle tree with the + /// specified root. + /// + /// # Errors + /// Returns an error if: + /// - A Merkle tree for the specified root cannot be found in this advice provider. + /// - The specified depth is either zero or greater than the depth of the Merkle tree + /// identified by the specified root. + /// - Path to the node at the specified depth and index is not known to this advice provider. + fn get_adv_merkle_path( + &mut self, + process: &S, + ) -> Result { + let response = self.get_advice(process, AdviceExtractor::GetMerklePath)?; + Ok(response.into()) + } +} + +impl<'a, H> Host for &'a mut H +where + H: Host, +{ + fn get_advice( + &mut self, + process: &S, + extractor: AdviceExtractor, + ) -> Result { + H::get_advice(self, process, extractor) + } + + fn set_advice( + &mut self, + process: &S, + injector: AdviceInjector, + ) -> Result { + H::set_advice(self, process, injector) + } +} + +// HOST RESPONSE +// ================================================================================================ + +/// Response returned by the host upon successful execution of a [HostFunction]. +#[derive(Debug)] +pub enum HostResponse { + MerklePath(MerklePath), + DoubleWord([Word; 2]), + Word(Word), + Element(Felt), + None, +} + +impl From for MerklePath { + fn from(response: HostResponse) -> Self { + match response { + HostResponse::MerklePath(path) => path, + _ => panic!("expected MerklePath, but got {:?}", response), + } + } +} + +impl From for Word { + fn from(response: HostResponse) -> Self { + match response { + HostResponse::Word(word) => word, + _ => panic!("expected Word, but got {:?}", response), + } + } +} + +impl From for [Word; 2] { + fn from(response: HostResponse) -> Self { + match response { + HostResponse::DoubleWord(word) => word, + _ => panic!("expected DoubleWord, but got {:?}", response), + } + } +} + +impl From for Felt { + fn from(response: HostResponse) -> Self { + match response { + HostResponse::Element(element) => element, + _ => panic!("expected Element, but got {:?}", response), + } + } +} + +// DEFAULT HOST IMPLEMENTATION +// ================================================================================================ + +pub struct DefaultHost { + adv_provider: A, +} + +impl Default for DefaultHost { + fn default() -> Self { + Self { + adv_provider: MemAdviceProvider::default(), + } + } +} + +impl DefaultHost { + pub fn new(adv_provider: A) -> Self { + Self { adv_provider } + } + + #[cfg(any(test, feature = "internals"))] + pub fn advice_provider(&self) -> &A { + &self.adv_provider + } + + #[cfg(any(test, feature = "internals"))] + pub fn advice_provider_mut(&mut self) -> &mut A { + &mut self.adv_provider + } +} + +impl Host for DefaultHost { + fn get_advice( + &mut self, + process: &S, + extractor: AdviceExtractor, + ) -> Result { + self.adv_provider.get_advice(process, &extractor) + } + + fn set_advice( + &mut self, + process: &S, + injector: AdviceInjector, + ) -> Result { + self.adv_provider.set_advice(process, &injector) + } +} diff --git a/processor/src/lib.rs b/processor/src/lib.rs index 045594820d..0b3f9c2a20 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -4,28 +4,28 @@ #[macro_use] extern crate alloc; +use core::cell::RefCell; + use miden_air::trace::{ CHIPLETS_WIDTH, DECODER_TRACE_WIDTH, MIN_TRACE_LEN, RANGE_CHECK_TRACE_WIDTH, STACK_TRACE_WIDTH, SYS_TRACE_WIDTH, }; pub use miden_air::{ExecutionOptions, ExecutionOptionsError}; pub use vm_core::{ - chiplets::hasher::Digest, errors::InputError, utils::DeserializationError, AssemblyOp, Kernel, - Operation, Program, ProgramInfo, QuadExtension, StackInputs, StackOutputs, Word, EMPTY_WORD, - ONE, ZERO, + chiplets::hasher::Digest, errors::InputError, utils::DeserializationError, AdviceInjector, + AssemblyOp, Kernel, Operation, Program, ProgramInfo, QuadExtension, StackInputs, StackOutputs, + Word, EMPTY_WORD, ONE, ZERO, }; use vm_core::{ code_blocks::{ Call, CodeBlock, Dyn, Join, Loop, OpBatch, Span, Split, OP_BATCH_SIZE, OP_GROUP_SIZE, }, utils::collections::{BTreeMap, Vec}, - AdviceInjector, CodeBlockTable, Decorator, DecoratorIterator, Felt, FieldElement, - StackTopState, StarkField, + CodeBlockTable, Decorator, DecoratorIterator, Felt, FieldElement, StackTopState, StarkField, }; use winter_prover::ColMatrix; -mod decorators; mod operations; mod system; @@ -41,9 +41,10 @@ use stack::Stack; mod range; use range::RangeChecker; -mod advice; -pub use advice::{ - AdviceInputs, AdviceProvider, AdviceSource, MemAdviceProvider, RecAdviceProvider, +mod host; +pub use host::{ + advice::{AdviceInputs, AdviceProvider, AdviceSource, MemAdviceProvider, RecAdviceProvider}, + DefaultHost, Host, }; mod chiplets; @@ -112,17 +113,16 @@ pub struct ChipletsTrace { /// Returns an execution trace resulting from executing the provided program against the provided /// inputs. -pub fn execute( +pub fn execute( program: &Program, stack_inputs: StackInputs, - advice_provider: A, + host: H, options: ExecutionOptions, ) -> Result where - A: AdviceProvider, + H: Host, { - let mut process = - Process::new(program.kernel().clone(), stack_inputs, advice_provider, options); + let mut process = Process::new(program.kernel().clone(), stack_inputs, host, options); let stack_outputs = process.execute(program)?; let trace = ExecutionTrace::new(process, stack_outputs); assert_eq!(&program.hash(), trace.program_hash(), "inconsistent program hash"); @@ -131,15 +131,11 @@ where /// Returns an iterator which allows callers to step through the execution and inspect VM state at /// each execution step. -pub fn execute_iter( - program: &Program, - stack_inputs: StackInputs, - advice_provider: A, -) -> VmStateIterator +pub fn execute_iter(program: &Program, stack_inputs: StackInputs, host: H) -> VmStateIterator where - A: AdviceProvider, + H: Host, { - let mut process = Process::new_debug(program.kernel().clone(), stack_inputs, advice_provider); + let mut process = Process::new_debug(program.kernel().clone(), stack_inputs, host); let result = process.execute(program); if result.is_ok() { assert_eq!( @@ -155,22 +151,22 @@ where // ================================================================================================ #[cfg(not(any(test, feature = "internals")))] -struct Process +struct Process where - A: AdviceProvider, + H: Host, { system: System, decoder: Decoder, stack: Stack, range: RangeChecker, chiplets: Chiplets, - advice_provider: A, + host: RefCell, max_cycles: u32, } -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // CONSTRUCTORS // -------------------------------------------------------------------------------------------- @@ -178,21 +174,21 @@ where pub fn new( kernel: Kernel, stack_inputs: StackInputs, - advice_provider: A, + host: H, execution_options: ExecutionOptions, ) -> Self { - Self::initialize(kernel, stack_inputs, advice_provider, false, execution_options) + Self::initialize(kernel, stack_inputs, host, false, execution_options) } /// Creates a new process with provided inputs and debug options enabled. - pub fn new_debug(kernel: Kernel, stack_inputs: StackInputs, advice_provider: A) -> Self { - Self::initialize(kernel, stack_inputs, advice_provider, true, ExecutionOptions::default()) + pub fn new_debug(kernel: Kernel, stack_inputs: StackInputs, host: H) -> Self { + Self::initialize(kernel, stack_inputs, host, true, ExecutionOptions::default()) } fn initialize( kernel: Kernel, stack: StackInputs, - advice_provider: A, + host: H, in_debug_mode: bool, execution_options: ExecutionOptions, ) -> Self { @@ -202,7 +198,7 @@ where stack: Stack::new(&stack, execution_options.expected_cycles() as usize, in_debug_mode), range: RangeChecker::new(), chiplets: Chiplets::new(kernel), - advice_provider, + host: RefCell::new(host), max_cycles: execution_options.max_cycles(), } } @@ -485,6 +481,24 @@ where Ok(()) } + /// Executes the specified decorator + fn execute_decorator(&mut self, decorator: &Decorator) -> Result<(), ExecutionError> { + match decorator { + Decorator::Advice(injector) => { + self.host.borrow_mut().set_advice(self, *injector)?; + } + Decorator::Debug(options) => { + self.host.borrow_mut().on_debug(self, options)?; + } + Decorator::AsmOp(assembly_op) => { + if self.decoder.in_debug_mode() { + self.decoder.append_asmop(self.system.clk(), assembly_op.clone()); + } + } + } + Ok(()) + } + // PUBLIC ACCESSORS // -------------------------------------------------------------------------------------------- @@ -492,35 +506,92 @@ where self.chiplets.kernel() } - pub fn get_memory_value(&self, ctx: u32, addr: u32) -> Option { - self.chiplets.get_mem_value(ctx, addr) - } - - pub fn into_parts(self) -> (System, Decoder, Stack, RangeChecker, Chiplets, A) { + pub fn into_parts(self) -> (System, Decoder, Stack, RangeChecker, Chiplets, H) { ( self.system, self.decoder, self.stack, self.range, self.chiplets, - self.advice_provider, + self.host.into_inner(), ) } } +// PROCESS STATE +// ================================================================================================ + +/// A trait that defines a set of methods which allow access to the state of the process. +pub trait ProcessState { + /// Returns the current clock cycle of a process. + fn clk(&self) -> u32; + + /// Returns the current execution context ID. + fn ctx(&self) -> u32; + + /// Returns the value located at the specified position on the stack at the current clock cycle. + fn get_stack_item(&self, pos: usize) -> Felt; + + /// Returns a word located at the specified word index on the stack. + /// + /// Specifically, word 0 is defined by the first 4 elements of the stack, word 1 is defined + /// by the next 4 elements etc. Since the top of the stack contains 4 word, the highest valid + /// word index is 3. + /// + /// The words are created in reverse order. For example, for word 0 the top element of the + /// stack will be at the last position in the word. + /// + /// Creating a word does not change the state of the stack. + fn get_stack_word(&self, word_idx: usize) -> Word; + + /// Returns stack state at the current clock cycle. This includes the top 16 items of the + /// stack + overflow entries. + fn get_stack_state(&self) -> Vec; + + /// Returns a word located at the specified context/address, or None if the address hasn't + /// been accessed previously. + fn get_mem_value(&self, ctx: u32, addr: u32) -> Option; +} + +impl ProcessState for Process { + fn clk(&self) -> u32 { + self.system.clk() + } + + fn ctx(&self) -> u32 { + self.system.ctx() + } + + fn get_stack_item(&self, pos: usize) -> Felt { + self.stack.get(pos) + } + + fn get_stack_word(&self, word_idx: usize) -> Word { + self.stack.get_word(word_idx) + } + + fn get_stack_state(&self) -> Vec { + self.stack.get_state_at(self.system.clk()) + } + + fn get_mem_value(&self, ctx: u32, addr: u32) -> Option { + self.chiplets.get_mem_value(ctx, addr) + } +} + // INTERNALS // ================================================================================================ #[cfg(any(test, feature = "internals"))] -pub struct Process +pub struct Process where - A: AdviceProvider, + H: Host, { pub system: System, pub decoder: Decoder, pub stack: Stack, pub range: RangeChecker, pub chiplets: Chiplets, - pub advice_provider: A, + pub host: RefCell, pub max_cycles: u32, } diff --git a/processor/src/operations/crypto_ops.rs b/processor/src/operations/crypto_ops.rs index 5e312c821c..44461da6a8 100644 --- a/processor/src/operations/crypto_ops.rs +++ b/processor/src/operations/crypto_ops.rs @@ -1,12 +1,13 @@ -use super::{AdviceProvider, ExecutionError, Operation, Process}; -use vm_core::StarkField; +use super::{ExecutionError, Host, Operation, Process}; +use crate::crypto::MerklePath; +use vm_core::{AdviceInjector, StarkField}; // CRYPTOGRAPHIC OPERATIONS // ================================================================================================ -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // HASHING OPERATIONS // -------------------------------------------------------------------------------------------- @@ -69,14 +70,12 @@ where pub(super) fn op_mpverify(&mut self) -> Result<(), ExecutionError> { // read node value, depth, index and root value from the stack let node = [self.stack.get(3), self.stack.get(2), self.stack.get(1), self.stack.get(0)]; - let depth = self.stack.get(4); let index = self.stack.get(5); - let provided_root = - [self.stack.get(9), self.stack.get(8), self.stack.get(7), self.stack.get(6)]; + let root = [self.stack.get(9), self.stack.get(8), self.stack.get(7), self.stack.get(6)]; // get a Merkle path from the advice provider for the specified root and node index. // the path is expected to be of the specified depth. - let path = self.advice_provider.get_merkle_path(provided_root, &depth, &index)?; + let path = self.host.borrow_mut().get_adv_merkle_path(self)?; // use hasher to compute the Merkle root of the path let (addr, computed_root) = self.chiplets.build_merkle_root(node, &path, index); @@ -87,7 +86,7 @@ where // Asserting the computed root of the Merkle path from the advice provider is consistent with // the input root. - assert_eq!(provided_root, computed_root, "inconsistent Merkle tree root"); + assert_eq!(root, computed_root, "inconsistent Merkle tree root"); // The same state is copied over to the next clock cycle with no changes. self.stack.copy_state(0); @@ -140,8 +139,12 @@ where // get a Merkle path to it. the length of the returned path is expected to match the // specified depth. if the new node is the root of a tree, this instruction will append the // whole sub-tree to this node. - let (path, _) = - self.advice_provider.update_merkle_node(old_root, &depth, &index, new_node)?; + let path: MerklePath = self + .host + .borrow_mut() + .set_advice(self, AdviceInjector::UpdateMerkleNode)? + .into(); + assert_eq!(path.len(), depth.as_int() as usize); let merkle_tree_update = self.chiplets.update_merkle_root(old_node, new_node, &path, index); @@ -318,8 +321,8 @@ mod tests { assert_eq!(expected_stack, process.stack.trace_state()); // make sure both Merkle trees are still in the advice provider - assert!(process.advice_provider.has_merkle_root(tree.root())); - assert!(process.advice_provider.has_merkle_root(new_tree.root())); + assert!(process.host.borrow().advice_provider().has_merkle_root(tree.root())); + assert!(process.host.borrow().advice_provider().has_merkle_root(new_tree.root())); } #[test] @@ -376,7 +379,7 @@ mod tests { Process::new_dummy_with_inputs_and_decoder_helpers(stack_inputs, advice_inputs); // assert the expected root doesn't exist before the merge operation - assert!(!process.advice_provider.has_merkle_root(expected_root)); + assert!(!process.host.borrow().advice_provider().has_merkle_root(expected_root)); // update the previous root process.execute_op(Operation::MrUpdate).unwrap(); @@ -399,7 +402,7 @@ mod tests { assert_eq!(expected_stack, process.stack.trace_state()); // assert the expected root now exists in the advice provider - assert!(process.advice_provider.has_merkle_root(expected_root)); + assert!(process.host.borrow().advice_provider().has_merkle_root(expected_root)); } // HELPER FUNCTIONS diff --git a/processor/src/operations/ext2_ops.rs b/processor/src/operations/ext2_ops.rs index 44cbc6be72..6e10c4e40f 100644 --- a/processor/src/operations/ext2_ops.rs +++ b/processor/src/operations/ext2_ops.rs @@ -1,13 +1,13 @@ -use super::{AdviceProvider, ExecutionError, Felt, Process}; +use super::{ExecutionError, Felt, Host, Process}; // EXTENSION FIELD OPERATIONS // ================================================================================================ const TWO: Felt = Felt::new(2); -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // ARITHMETIC OPERATIONS // -------------------------------------------------------------------------------------------- diff --git a/processor/src/operations/field_ops.rs b/processor/src/operations/field_ops.rs index 806abd2068..6af21f0b06 100644 --- a/processor/src/operations/field_ops.rs +++ b/processor/src/operations/field_ops.rs @@ -1,12 +1,12 @@ -use super::{utils::assert_binary, AdviceProvider, ExecutionError, Felt, FieldElement, Process}; +use super::{utils::assert_binary, ExecutionError, Felt, FieldElement, Host, Process}; use vm_core::{Operation, StarkField, ONE, ZERO}; // FIELD OPERATIONS // ================================================================================================ -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // ARITHMETIC OPERATIONS // -------------------------------------------------------------------------------------------- diff --git a/processor/src/operations/fri_ops.rs b/processor/src/operations/fri_ops.rs index 4b99b28915..24fd85ec21 100644 --- a/processor/src/operations/fri_ops.rs +++ b/processor/src/operations/fri_ops.rs @@ -1,4 +1,4 @@ -use super::{super::QuadFelt, AdviceProvider, ExecutionError, Felt, Operation, Process}; +use super::{super::QuadFelt, ExecutionError, Felt, Host, Operation, Process}; use vm_core::{ExtensionOf, FieldElement, StarkField, ONE, ZERO}; // CONSTANTS @@ -19,9 +19,9 @@ const TAU3_INV: Felt = Felt::new(281474976710656); // tau^{-3} // FRI OPERATIONS // ================================================================================================ -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // FRI FOLDING OPERATION // -------------------------------------------------------------------------------------------- diff --git a/processor/src/operations/io_ops.rs b/processor/src/operations/io_ops.rs index c56ceb95c1..1a01e2f23b 100644 --- a/processor/src/operations/io_ops.rs +++ b/processor/src/operations/io_ops.rs @@ -1,13 +1,13 @@ +use super::{ExecutionError, Felt, Host, Operation, Process}; +use crate::Word; use vm_core::StarkField; -use super::{AdviceProvider, ExecutionError, Felt, Operation, Process}; - // INPUT / OUTPUT OPERATIONS // ================================================================================================ -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // CONSTANT INPUTS // -------------------------------------------------------------------------------------------- @@ -194,7 +194,7 @@ where let addr = Self::get_valid_address(self.stack.get(12))?; // pop two words from the advice stack - let words = self.advice_provider.pop_stack_dword()?; + let words = self.host.borrow_mut().pop_adv_stack_dword(self)?; // write the words memory self.chiplets.write_mem_double(ctx, addr, words); @@ -227,7 +227,7 @@ where /// # Errors /// Returns an error if the advice stack is empty. pub(super) fn op_advpop(&mut self) -> Result<(), ExecutionError> { - let value = self.advice_provider.pop_stack()?; + let value = self.host.borrow_mut().pop_adv_stack(self)?; self.stack.set(0, value); self.stack.shift_right(0); Ok(()) @@ -239,7 +239,7 @@ where /// # Errors /// Returns an error if the advice stack contains fewer than four elements. pub(super) fn op_advpopw(&mut self) -> Result<(), ExecutionError> { - let word = self.advice_provider.pop_stack_word()?; + let word: Word = self.host.borrow_mut().pop_adv_stack_word(self)?; self.stack.set(0, word[3]); self.stack.set(1, word[2]); @@ -272,8 +272,8 @@ where #[cfg(test)] mod tests { use super::{ - super::{Operation, STACK_TOP_SIZE}, - AdviceProvider, Felt, Process, + super::{super::AdviceProvider, Operation, STACK_TOP_SIZE}, + Felt, Host, Process, }; use crate::AdviceSource; use vm_core::{utils::ToElements, Word, ONE, ZERO}; @@ -513,7 +513,12 @@ mod tests { let word2_felts: Word = word2.to_elements().try_into().unwrap(); for element in word2_felts.iter().rev().chain(word1_felts.iter().rev()).copied() { // reverse the word order, since elements are pushed onto the advice stack. - process.advice_provider.push_stack(AdviceSource::Value(element)).unwrap(); + process + .host + .borrow_mut() + .advice_provider_mut() + .push_stack(AdviceSource::Value(element)) + .unwrap(); } // arrange the stack such that: @@ -580,9 +585,9 @@ mod tests { // HELPER METHODS // -------------------------------------------------------------------------------------------- - fn store_value(process: &mut Process, addr: u64, value: [Felt; 4]) + fn store_value(process: &mut Process, addr: u64, value: [Felt; 4]) where - A: AdviceProvider, + H: Host, { for &value in value.iter() { process.execute_op(Operation::Push(value)).unwrap(); @@ -592,9 +597,9 @@ mod tests { process.execute_op(Operation::MStoreW).unwrap(); } - fn store_element(process: &mut Process, addr: u64, value: Felt) + fn store_element(process: &mut Process, addr: u64, value: Felt) where - A: AdviceProvider, + H: Host, { process.execute_op(Operation::Push(value)).unwrap(); let addr = Felt::new(addr); diff --git a/processor/src/operations/mod.rs b/processor/src/operations/mod.rs index 09d91812df..e18179c288 100644 --- a/processor/src/operations/mod.rs +++ b/processor/src/operations/mod.rs @@ -1,4 +1,4 @@ -use super::{AdviceProvider, ExecutionError, Felt, FieldElement, Operation, Process, StarkField}; +use super::{ExecutionError, Felt, FieldElement, Host, Operation, Process, StarkField}; use vm_core::stack::STACK_TOP_SIZE; mod crypto_ops; @@ -17,9 +17,9 @@ use super::Kernel; // OPERATION DISPATCHER // ================================================================================================ -impl Process +impl Process where - A: AdviceProvider, + H: Host, { /// Executes the specified operation. pub(super) fn execute_op(&mut self, op: Operation) -> Result<(), ExecutionError> { @@ -160,7 +160,6 @@ where self.system.advance_clock(self.max_cycles)?; self.stack.advance_clock(); self.chiplets.advance_clock(); - self.advice_provider.advance_clock(); Ok(()) } @@ -172,20 +171,16 @@ where } #[cfg(test)] -impl Process { +impl Process> { // TEST METHODS // -------------------------------------------------------------------------------------------- /// Instantiates a new blank process for testing purposes. The stack in the process is /// initialized with the provided values. fn new_dummy(stack_inputs: super::StackInputs) -> Self { - let advice_provider = super::MemAdviceProvider::default(); - let mut process = Self::new( - Kernel::default(), - stack_inputs, - advice_provider, - super::ExecutionOptions::default(), - ); + let host = super::DefaultHost::default(); + let mut process = + Self::new(Kernel::default(), stack_inputs, host, super::ExecutionOptions::default()); process.execute_op(Operation::Noop).unwrap(); process } @@ -203,12 +198,9 @@ impl Process { .with_stack_values(advice_stack.iter().copied()) .unwrap(); let advice_provider = super::MemAdviceProvider::from(advice_inputs); - let mut process = Self::new( - Kernel::default(), - stack_inputs, - advice_provider, - super::ExecutionOptions::default(), - ); + let host = super::DefaultHost::new(advice_provider); + let mut process = + Self::new(Kernel::default(), stack_inputs, host, super::ExecutionOptions::default()); process.execute_op(Operation::Noop).unwrap(); process } @@ -236,12 +228,9 @@ impl Process { advice_inputs: super::AdviceInputs, ) -> Self { let advice_provider = super::MemAdviceProvider::from(advice_inputs); - let mut process = Self::new( - Kernel::default(), - stack_inputs, - advice_provider, - super::ExecutionOptions::default(), - ); + let host = super::DefaultHost::new(advice_provider); + let mut process = + Self::new(Kernel::default(), stack_inputs, host, super::ExecutionOptions::default()); process.decoder.add_dummy_trace_row(); process.execute_op(Operation::Noop).unwrap(); process diff --git a/processor/src/operations/stack_ops.rs b/processor/src/operations/stack_ops.rs index c341551ae5..14267c2cf5 100644 --- a/processor/src/operations/stack_ops.rs +++ b/processor/src/operations/stack_ops.rs @@ -1,9 +1,9 @@ -use super::{AdviceProvider, ExecutionError, Process, StarkField, STACK_TOP_SIZE}; +use super::{ExecutionError, Host, Process, StarkField, STACK_TOP_SIZE}; use crate::ZERO; -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // STACK MANIPULATION // -------------------------------------------------------------------------------------------- diff --git a/processor/src/operations/sys_ops.rs b/processor/src/operations/sys_ops.rs index 714bf64b2b..ba62fdb4c8 100644 --- a/processor/src/operations/sys_ops.rs +++ b/processor/src/operations/sys_ops.rs @@ -3,15 +3,15 @@ use super::{ system::{FMP_MAX, FMP_MIN}, ONE, }, - AdviceProvider, ExecutionError, Felt, Process, StarkField, + ExecutionError, Felt, Host, Process, StarkField, }; // SYSTEM OPERATIONS // ================================================================================================ -impl Process +impl Process where - A: AdviceProvider, + H: Host, { /// Pops a value off the stack and asserts that it is equal to ONE. /// diff --git a/processor/src/operations/u32_ops.rs b/processor/src/operations/u32_ops.rs index 923bc64c03..f59537e817 100644 --- a/processor/src/operations/u32_ops.rs +++ b/processor/src/operations/u32_ops.rs @@ -1,12 +1,12 @@ use super::{ super::utils::{split_element, split_u32_into_u16}, - AdviceProvider, ExecutionError, Felt, FieldElement, Operation, Process, StarkField, + ExecutionError, Felt, FieldElement, Host, Operation, Process, StarkField, }; use crate::ZERO; -impl Process +impl Process where - A: AdviceProvider, + H: Host, { // CASTING OPERATIONS // -------------------------------------------------------------------------------------------- diff --git a/processor/src/system/tests.rs b/processor/src/system/tests.rs index a6c4688d57..1b7fe9c1f5 100644 --- a/processor/src/system/tests.rs +++ b/processor/src/system/tests.rs @@ -1,16 +1,16 @@ #[cfg(test)] mod tests { - use crate::{ExecutionOptions, Kernel, MemAdviceProvider, Operation, Process, StackInputs}; + use crate::{DefaultHost, ExecutionOptions, Kernel, Operation, Process, StackInputs}; // Check that process returns an error if a maximum number of cycles is exceeded. #[test] fn cycles_num_exceeded() { let stack = StackInputs::default(); - let advice_provider = MemAdviceProvider::default(); + let host = DefaultHost::default(); let mut process = Process::new( Kernel::default(), stack, - advice_provider, + host, ExecutionOptions::new(Some(64), 64).unwrap(), ); for _ in 0..64 { diff --git a/processor/src/trace/mod.rs b/processor/src/trace/mod.rs index 466deddd91..88f9ee1236 100644 --- a/processor/src/trace/mod.rs +++ b/processor/src/trace/mod.rs @@ -2,8 +2,8 @@ use super::{ chiplets::AuxTraceBuilder as ChipletsAuxTraceBuilder, crypto::RpoRandomCoin, decoder::AuxTraceHints as DecoderAuxTraceHints, range::AuxTraceBuilder as RangeCheckerAuxTraceBuilder, - stack::AuxTraceBuilder as StackAuxTraceBuilder, AdviceProvider, ColMatrix, Digest, Felt, - FieldElement, Process, StackTopState, Vec, + stack::AuxTraceBuilder as StackAuxTraceBuilder, ColMatrix, Digest, Felt, FieldElement, Host, + Process, StackTopState, Vec, }; use miden_air::trace::{ decoder::{NUM_USER_OP_HELPERS, USER_OP_HELPERS_OFFSET}, @@ -72,9 +72,9 @@ impl ExecutionTrace { // CONSTRUCTOR // -------------------------------------------------------------------------------------------- /// Builds an execution trace for the provided process. - pub(super) fn new(process: Process, stack_outputs: StackOutputs) -> Self + pub(super) fn new(process: Process, stack_outputs: StackOutputs) -> Self where - A: AdviceProvider, + H: Host, { // use program hash to initialize random element generator; this generator will be used // to inject random values at the end of the trace; using program hash here is OK because @@ -176,11 +176,11 @@ impl ExecutionTrace { } #[cfg(test)] - pub fn test_finalize_trace( - process: Process, + pub fn test_finalize_trace( + process: Process, ) -> (Vec>, AuxTraceHints, TraceLenSummary) where - A: AdviceProvider, + H: Host, { let rng = RpoRandomCoin::new(&EMPTY_WORD); finalize_trace(process, rng) @@ -277,12 +277,12 @@ impl Trace for ExecutionTrace { /// - Inserting random values in the last row of all columns. This helps ensure that there /// are no repeating patterns in each column and each column contains a least two distinct /// values. This, in turn, ensures that polynomial degrees of all columns are stable. -fn finalize_trace( - process: Process, +fn finalize_trace( + process: Process, mut rng: RpoRandomCoin, ) -> (Vec>, AuxTraceHints, TraceLenSummary) where - A: AdviceProvider, + H: Host, { let (system, decoder, stack, mut range, chiplets, _) = process.into_parts(); diff --git a/processor/src/trace/tests/mod.rs b/processor/src/trace/tests/mod.rs index 1a81e9296b..1441783f56 100644 --- a/processor/src/trace/tests/mod.rs +++ b/processor/src/trace/tests/mod.rs @@ -2,7 +2,7 @@ use super::{ super::chiplets::init_state_from_words, ExecutionTrace, Felt, FieldElement, LookupTableRow, Process, Trace, Vec, NUM_RAND_ROWS, }; -use crate::{AdviceInputs, ExecutionOptions, MemAdviceProvider, StackInputs}; +use crate::{AdviceInputs, DefaultHost, ExecutionOptions, MemAdviceProvider, StackInputs}; use rand_utils::rand_array; use vm_core::{ code_blocks::CodeBlock, CodeBlockTable, Kernel, Operation, StackOutputs, Word, ONE, ZERO, @@ -19,9 +19,9 @@ mod stack; /// Builds a sample trace by executing the provided code block against the provided stack inputs. pub fn build_trace_from_block(program: &CodeBlock, stack_inputs: &[u64]) -> ExecutionTrace { let stack_inputs = StackInputs::try_from_values(stack_inputs.iter().copied()).unwrap(); - let advice_provider = MemAdviceProvider::default(); + let host = DefaultHost::default(); let mut process = - Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); + Process::new(Kernel::default(), stack_inputs, host, ExecutionOptions::default()); process.execute_code_block(program, &CodeBlockTable::default()).unwrap(); ExecutionTrace::new(process, StackOutputs::default()) } @@ -42,8 +42,9 @@ pub fn build_trace_from_ops_with_inputs( advice_inputs: AdviceInputs, ) -> ExecutionTrace { let advice_provider = MemAdviceProvider::from(advice_inputs); + let host = DefaultHost::new(advice_provider); let mut process = - Process::new(Kernel::default(), stack_inputs, advice_provider, ExecutionOptions::default()); + Process::new(Kernel::default(), stack_inputs, host, ExecutionOptions::default()); let program = CodeBlock::new_span(operations); process.execute_code_block(&program, &CodeBlockTable::default()).unwrap(); ExecutionTrace::new(process, StackOutputs::default()) diff --git a/prover/README.md b/prover/README.md index e26405a4d4..5444ad050e 100644 --- a/prover/README.md +++ b/prover/README.md @@ -18,7 +18,7 @@ If the program is executed successfully, the function returns a tuple with 2 ele Here is a simple example of executing a program which pushes two numbers onto the stack and computes their sum: ```Rust use miden_assembly::Assembler; -use miden_prover::{prove, ProvingOptions, StackInputs, MemAdviceProvider}; +use miden_prover::{prove, ProvingOptions, StackInputs, DefaultHost}; // instantiate the assembler let assembler = Assembler::default(); @@ -30,7 +30,7 @@ let program = assembler.compile("begin push.3 push.5 add end").unwrap(); let (outputs, proof) = prove( &program, StackInputs::default(), // we won't provide any stack inputs - MemAdviceProvider::default(), // we won't provide any advice values + DefaultHost::default(), // we won't provide any advice values &ProvingOptions::default(), // we'll be using default options ) .unwrap(); diff --git a/prover/src/lib.rs b/prover/src/lib.rs index 125a54b4a4..e773d8a4c0 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -26,8 +26,8 @@ mod gpu; pub use air::{DeserializationError, ExecutionProof, FieldExtension, HashFunction, ProvingOptions}; pub use processor::{ - crypto, math, utils, AdviceInputs, AdviceProvider, Digest, ExecutionError, InputError, - MemAdviceProvider, Program, StackInputs, StackOutputs, Word, + crypto, math, utils, AdviceInputs, Digest, ExecutionError, Host, InputError, MemAdviceProvider, + Program, StackInputs, StackOutputs, Word, }; pub use winter_prover::StarkProof; @@ -43,24 +43,20 @@ pub use winter_prover::StarkProof; /// /// # Errors /// Returns an error if program execution or STARK proof generation fails for any reason. -pub fn prove( +pub fn prove( program: &Program, stack_inputs: StackInputs, - advice_provider: A, + host: H, options: ProvingOptions, ) -> Result<(StackOutputs, ExecutionProof), ExecutionError> where - A: AdviceProvider, + H: Host, { // execute the program to create an execution trace #[cfg(feature = "std")] let now = Instant::now(); - let trace = processor::execute( - program, - stack_inputs.clone(), - advice_provider, - *options.execution_options(), - )?; + let trace = + processor::execute(program, stack_inputs.clone(), host, *options.execution_options())?; #[cfg(feature = "std")] let padding_percentage = (trace.trace_len_summary().padded_trace_len() - trace.trace_len_summary().trace_len()) diff --git a/stdlib/tests/collections/mmr.rs b/stdlib/tests/collections/mmr.rs index a3a1be6925..c56cc5b129 100644 --- a/stdlib/tests/collections/mmr.rs +++ b/stdlib/tests/collections/mmr.rs @@ -631,7 +631,8 @@ fn test_mmr_pack() { let process = build_test!(source).execute_process().unwrap(); - let advice_data = process.advice_provider.map().get(&hash_u8).unwrap(); + let host = process.host.borrow_mut(); + let advice_data = host.advice_provider().map().get(&hash_u8).unwrap(); assert_eq!(stack_to_ints(advice_data), stack_to_ints(&expect_data)); } diff --git a/stdlib/tests/collections/smt.rs b/stdlib/tests/collections/smt.rs index 60f21f2f05..366d6bbbd1 100644 --- a/stdlib/tests/collections/smt.rs +++ b/stdlib/tests/collections/smt.rs @@ -348,7 +348,7 @@ fn assert_insert( assert_eq!(stack, expected_output); // remove the initial key-value pairs from the advice map - let mut new_adv_map = process.advice_provider.map().clone(); + let mut new_adv_map = process.host.borrow().advice_provider().map().clone(); for (key, value) in adv_map.iter() { let init_value = new_adv_map.remove(key).unwrap(); assert_eq!(value, &init_value); @@ -639,7 +639,7 @@ fn assert_set( assert_eq!(stack, expected_output); // remove the initial key-value pairs from the advice map - let mut new_adv_map = process.advice_provider.map().clone(); + let mut new_adv_map = process.host.borrow().advice_provider().map().clone(); for (key, value) in adv_map.iter() { let init_value = new_adv_map.remove(key).unwrap(); assert_eq!(value, &init_value); diff --git a/stdlib/tests/crypto/stark/mod.rs b/stdlib/tests/crypto/stark/mod.rs index 811aea89be..179ed8e892 100644 --- a/stdlib/tests/crypto/stark/mod.rs +++ b/stdlib/tests/crypto/stark/mod.rs @@ -5,6 +5,7 @@ use verifier_recursive::{generate_advice_inputs, VerifierData}; use crate::build_test; use assembly::Assembler; use miden_air::{FieldExtension, HashFunction, PublicInputs}; +use processor::DefaultHost; use test_utils::{ prove, AdviceInputs, MemAdviceProvider, ProgramInfo, ProvingOptions, StackInputs, VerifierError, }; @@ -55,12 +56,12 @@ pub fn generate_recursive_verifier_data( let stack_inputs = StackInputs::try_from_values(stack_inputs).unwrap(); let advice_inputs = AdviceInputs::default(); let advice_provider = MemAdviceProvider::from(advice_inputs); + let host = DefaultHost::new(advice_provider); let options = ProvingOptions::new(43, 8, 12, FieldExtension::Quadratic, 4, 7, HashFunction::Rpo256); - let (stack_outputs, proof) = - prove(&program, stack_inputs.clone(), advice_provider, options).unwrap(); + let (stack_outputs, proof) = prove(&program, stack_inputs.clone(), host, options).unwrap(); let program_info = ProgramInfo::from(program); diff --git a/stdlib/tests/mem/mod.rs b/stdlib/tests/mem/mod.rs index b61aa4e915..24d5845273 100644 --- a/stdlib/tests/mem/mod.rs +++ b/stdlib/tests/mem/mod.rs @@ -1,6 +1,7 @@ +use processor::{DefaultHost, ProcessState}; use test_utils::{ - build_expected_hash, build_expected_perm, stack_to_ints, AdviceInputs, ExecutionOptions, - MemAdviceProvider, Process, StackInputs, ONE, ZERO, + build_expected_hash, build_expected_perm, stack_to_ints, ExecutionOptions, Process, + StackInputs, ONE, ZERO, }; #[test] @@ -30,22 +31,22 @@ fn test_memcopy() { let mut process = Process::new( program.kernel().clone(), StackInputs::default(), - MemAdviceProvider::from(AdviceInputs::default()), + DefaultHost::default(), ExecutionOptions::default(), ); process.execute(&program).unwrap(); - assert_eq!(process.get_memory_value(0, 1000), Some([ZERO, ZERO, ZERO, ONE]), "Address 1000"); - assert_eq!(process.get_memory_value(0, 1001), Some([ZERO, ZERO, ONE, ZERO]), "Address 1001"); - assert_eq!(process.get_memory_value(0, 1002), Some([ZERO, ZERO, ONE, ONE]), "Address 1002"); - assert_eq!(process.get_memory_value(0, 1003), Some([ZERO, ONE, ZERO, ZERO]), "Address 1003"); - assert_eq!(process.get_memory_value(0, 1004), Some([ZERO, ONE, ZERO, ONE]), "Address 1004"); - - assert_eq!(process.get_memory_value(0, 2000), Some([ZERO, ZERO, ZERO, ONE]), "Address 2000"); - assert_eq!(process.get_memory_value(0, 2001), Some([ZERO, ZERO, ONE, ZERO]), "Address 2001"); - assert_eq!(process.get_memory_value(0, 2002), Some([ZERO, ZERO, ONE, ONE]), "Address 2002"); - assert_eq!(process.get_memory_value(0, 2003), Some([ZERO, ONE, ZERO, ZERO]), "Address 2003"); - assert_eq!(process.get_memory_value(0, 2004), Some([ZERO, ONE, ZERO, ONE]), "Address 2004"); + assert_eq!(process.get_mem_value(0, 1000), Some([ZERO, ZERO, ZERO, ONE]), "Address 1000"); + assert_eq!(process.get_mem_value(0, 1001), Some([ZERO, ZERO, ONE, ZERO]), "Address 1001"); + assert_eq!(process.get_mem_value(0, 1002), Some([ZERO, ZERO, ONE, ONE]), "Address 1002"); + assert_eq!(process.get_mem_value(0, 1003), Some([ZERO, ONE, ZERO, ZERO]), "Address 1003"); + assert_eq!(process.get_mem_value(0, 1004), Some([ZERO, ONE, ZERO, ONE]), "Address 1004"); + + assert_eq!(process.get_mem_value(0, 2000), Some([ZERO, ZERO, ZERO, ONE]), "Address 2000"); + assert_eq!(process.get_mem_value(0, 2001), Some([ZERO, ZERO, ONE, ZERO]), "Address 2001"); + assert_eq!(process.get_mem_value(0, 2002), Some([ZERO, ZERO, ONE, ONE]), "Address 2002"); + assert_eq!(process.get_mem_value(0, 2003), Some([ZERO, ONE, ZERO, ZERO]), "Address 2003"); + assert_eq!(process.get_mem_value(0, 2004), Some([ZERO, ONE, ZERO, ONE]), "Address 2004"); } #[test] diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index 625786900f..255fc021a2 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -19,8 +19,8 @@ pub use vm_core::chiplets::hasher::{hash_elements, STATE_WIDTH}; pub use assembly::{Library, MaslLibrary}; pub use processor::{ - AdviceInputs, AdviceProvider, ExecutionError, ExecutionOptions, ExecutionTrace, Process, - StackInputs, VmStateIterator, + AdviceInputs, AdviceProvider, DefaultHost, ExecutionError, ExecutionOptions, ExecutionTrace, + Process, ProcessState, StackInputs, VmStateIterator, }; pub use prover::{prove, MemAdviceProvider, ProvingOptions}; pub use test_case::test_case; @@ -161,13 +161,13 @@ impl Test { ) { // compile the program let program = self.compile(); - let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); + let host = DefaultHost::new(MemAdviceProvider::from(self.advice_inputs.clone())); // execute the test let mut process = Process::new( program.kernel().clone(), self.stack_inputs.clone(), - advice_provider, + host, ExecutionOptions::default(), ); process.execute(&program).unwrap(); @@ -175,7 +175,7 @@ impl Test { // validate the memory state for data in expected_mem.chunks(WORD_SIZE) { // Main memory is zeroed by default, use zeros as a fallback when unwrap to make testing easier - let mem_state = process.get_memory_value(0, mem_start_addr).unwrap_or(EMPTY_WORD); + let mem_state = process.get_mem_value(0, mem_start_addr).unwrap_or(EMPTY_WORD); let mem_state = stack_to_ints(&mem_state); assert_eq!( @@ -226,24 +226,21 @@ impl Test { /// resulting execution trace or error. pub fn execute(&self) -> Result { let program = self.compile(); - let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); - processor::execute( - &program, - self.stack_inputs.clone(), - advice_provider, - ExecutionOptions::default(), - ) + let host = DefaultHost::new(MemAdviceProvider::from(self.advice_inputs.clone())); + processor::execute(&program, self.stack_inputs.clone(), host, ExecutionOptions::default()) } /// Compiles the test's source to a Program and executes it with the tests inputs. Returns the /// process once execution is finished. - pub fn execute_process(&self) -> Result, ExecutionError> { + pub fn execute_process( + &self, + ) -> Result>, ExecutionError> { let program = self.compile(); - let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); + let host = DefaultHost::new(MemAdviceProvider::from(self.advice_inputs.clone())); let mut process = Process::new( program.kernel().clone(), self.stack_inputs.clone(), - advice_provider, + host, ExecutionOptions::default(), ); process.execute(&program)?; @@ -256,14 +253,9 @@ impl Test { pub fn prove_and_verify(&self, pub_inputs: Vec, test_fail: bool) { let stack_inputs = StackInputs::try_from_values(pub_inputs).unwrap(); let program = self.compile(); - let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); - let (mut stack_outputs, proof) = prover::prove( - &program, - stack_inputs.clone(), - advice_provider, - ProvingOptions::default(), - ) - .unwrap(); + let host = DefaultHost::new(MemAdviceProvider::from(self.advice_inputs.clone())); + let (mut stack_outputs, proof) = + prover::prove(&program, stack_inputs.clone(), host, ProvingOptions::default()).unwrap(); let program_info = ProgramInfo::from(program); if test_fail { @@ -280,8 +272,8 @@ impl Test { /// state. pub fn execute_iter(&self) -> VmStateIterator { let program = self.compile(); - let advice_provider = MemAdviceProvider::from(self.advice_inputs.clone()); - processor::execute_iter(&program, self.stack_inputs.clone(), advice_provider) + let host = DefaultHost::new(MemAdviceProvider::from(self.advice_inputs.clone())); + processor::execute_iter(&program, self.stack_inputs.clone(), host) } /// Returns the last state of the stack after executing a test. From 40b60855fd47dcf4df74c7aea726ed972165c095 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 2 Oct 2023 19:34:26 -0700 Subject: [PATCH 113/120] feat: add graviton compilation target --- .github/workflows/ci.yml | 3 --- Makefile | 4 ++++ core/Cargo.toml | 3 ++- miden/Cargo.toml | 10 +++++----- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d715ce922..571e57a0a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,9 +95,6 @@ jobs: with: command: clippy args: --all -- -D clippy::all -D warnings - env: - # Seems necessary until https://github.com/rust-lang/rust/pull/115819 is merged. - CARGO_INCREMENTAL: 0 rustfmt: name: rustfmt diff --git a/Makefile b/Makefile index 664e129cc9..6ba366c124 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ FEATURES_INTERNALS=--features internals FEATURES_CONCURRENT_EXEC=--features concurrent,executable +FEATURES_GRAVITON_EXEC=--features concurrent,executable,sve FEATURES_METAL_EXEC=--features concurrent,executable,metal PROFILE_OPTIMIZED=--profile optimized PROFILE_TEST=--profile test-release @@ -13,5 +14,8 @@ exec: exec-metal: cargo build $(PROFILE_OPTIMIZED) $(FEATURES_METAL_EXEC) +exec-graviton: + RUSTFLAGS="-C target-cpu=native" cargo build $(PROFILE_OPTIMIZED) $(FEATURES_GRAVITON_EXEC) + test: cargo test $(PROFILE_TEST) $(FEATURES_INTERNALS) diff --git a/core/Cargo.toml b/core/Cargo.toml index cfa0117884..d7df0253b9 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -17,7 +17,8 @@ doctest = false [features] default = ["std"] -std = ["math/std", "winter-utils/std", "miden-crypto/std"] +std = ["miden-crypto/std", "math/std", "winter-utils/std"] +sve = ["miden-crypto/sve", "std"] [dependencies] math = { package = "winter-math", version = "0.6", default-features = false } diff --git a/miden/Cargo.toml b/miden/Cargo.toml index 487f2d17a9..ebed45f8b5 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -39,7 +39,7 @@ path = "tests/integration/main.rs" [features] concurrent = ["prover/concurrent", "std"] default = ["std"] -executable = ["env_logger", "hex/std", "std", "serde/std", "serde_derive", "serde_json/std", "clap", "rustyline"] +executable = ["dep:env_logger", "dep:hex", "hex?/std", "std", "dep:serde", "serde?/std", "dep:serde_derive", "dep:serde_json", "serde_json?/std", "dep:clap", "dep:rustyline"] std = ["assembly/std", "log/std", "processor/std", "prover/std", "verifier/std"] [dependencies] @@ -47,13 +47,13 @@ assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", clap = { version = "4.0", features = ["derive"], optional = true } env_logger = { version = "0.10", default-features = false, optional = true } hex = { version = "0.4", optional = true } -log = { version = "0.4", default-features = false } +log = { version = "0.4", default-features = false, optional = true } processor = { package = "miden-processor", path = "../processor", version = "0.7", default-features = false } prover = { package = "miden-prover", path = "../prover", version = "0.7", default-features = false } rustyline = { version = "12.0", default-features = false, optional = true } -serde = {version = "1.0.117", optional = true } -serde_derive = {version = "1.0.117", optional = true } -serde_json = {version = "1.0.59", optional = true } +serde = {version = "1.0", optional = true } +serde_derive = {version = "1.0", optional = true } +serde_json = {version = "1.0", optional = true } stdlib = { package = "miden-stdlib", path = "../stdlib", version = "0.6", default-features = false } verifier = { package = "miden-verifier", path = "../verifier", version = "0.7", default-features = false } From 418a8ad98de52d44d53b152e248ec8f80a2e2962 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Fri, 6 Oct 2023 09:52:17 -0700 Subject: [PATCH 114/120] chore: update dependency versions --- air/Cargo.toml | 4 ++-- assembly/Cargo.toml | 4 ++-- core/Cargo.toml | 2 +- miden/Cargo.toml | 6 +++--- processor/Cargo.toml | 5 ++--- processor/src/chiplets/bitwise/tests.rs | 2 +- processor/src/chiplets/hasher/tests.rs | 2 +- processor/src/decoder/tests.rs | 2 +- processor/src/operations/crypto_ops.rs | 2 +- processor/src/operations/ext2_ops.rs | 2 +- processor/src/operations/field_ops.rs | 2 +- processor/src/operations/fri_ops.rs | 2 +- processor/src/operations/u32_ops.rs | 2 +- processor/src/range/tests.rs | 2 +- processor/src/trace/decoder/tests.rs | 2 +- processor/src/trace/tests/chiplets/mod.rs | 2 +- processor/src/trace/tests/mod.rs | 2 +- processor/src/trace/tests/range.rs | 2 +- prover/Cargo.toml | 4 ++-- stdlib/Cargo.toml | 4 ++-- test-utils/Cargo.toml | 6 +++--- 21 files changed, 30 insertions(+), 31 deletions(-) diff --git a/air/Cargo.toml b/air/Cargo.toml index 864f98aaf6..ed72ddc74a 100644 --- a/air/Cargo.toml +++ b/air/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/0xPolygonMiden/miden-vm" categories = ["cryptography", "no-std"] keywords = ["air", "arithmetization", "crypto", "miden"] edition = "2021" -rust-version = "1.67" +rust-version = "1.73" [lib] bench = false @@ -33,5 +33,5 @@ winter-air = { package = "winter-air", version = "0.6", default-features = false [dev-dependencies] criterion = "0.5" -proptest = "1.1" +proptest = "1.3" rand-utils = { package = "winter-rand-utils", version = "0.6" } diff --git a/assembly/Cargo.toml b/assembly/Cargo.toml index 92a963a48c..fa1df8b0ae 100644 --- a/assembly/Cargo.toml +++ b/assembly/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/0xPolygonMiden/miden-vm" categories = ["compilers", "no-std"] keywords = ["assembler", "assembly", "language", "miden"] edition = "2021" -rust-version = "1.67" +rust-version = "1.73" [lib] bench = false @@ -20,5 +20,5 @@ default = ["std"] std = ["vm-core/std"] [dependencies] -num_enum = "0.6.1" +num_enum = "0.7" vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } diff --git a/core/Cargo.toml b/core/Cargo.toml index d7df0253b9..4477549756 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/0xPolygonMiden/miden-vm" categories = ["emulators", "no-std"] keywords = ["instruction-set", "miden", "program"] edition = "2021" -rust-version = "1.67" +rust-version = "1.73" [lib] bench = false diff --git a/miden/Cargo.toml b/miden/Cargo.toml index ebed45f8b5..47fa7ab034 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/0xPolygonMiden/miden-vm" categories = ["cryptography", "emulators", "no-std"] keywords = ["miden", "stark", "virtual-machine", "zkp"] edition = "2021" -rust-version = "1.67" +rust-version = "1.73" [[bin]] name = "miden" @@ -44,7 +44,7 @@ std = ["assembly/std", "log/std", "processor/std", "prover/std", "verifier/std"] [dependencies] assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } -clap = { version = "4.0", features = ["derive"], optional = true } +clap = { version = "4.4", features = ["derive"], optional = true } env_logger = { version = "0.10", default-features = false, optional = true } hex = { version = "0.4", optional = true } log = { version = "0.4", default-features = false, optional = true } @@ -60,7 +60,7 @@ verifier = { package = "miden-verifier", path = "../verifier", version = "0.7", [dev-dependencies] assert_cmd = "2.0" criterion = "0.5" -escargot = "0.5.7" +escargot = "0.5" num-bigint = "0.4" predicates = "3.0" test-utils = { package = "miden-test-utils", path = "../test-utils" } diff --git a/processor/Cargo.toml b/processor/Cargo.toml index 6f24a6ea0c..687346aa46 100644 --- a/processor/Cargo.toml +++ b/processor/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/0xPolygonMiden/miden-vm" categories = ["emulators", "no-std"] keywords = ["miden", "virtual-machine"] edition = "2021" -rust-version = "1.67" +rust-version = "1.73" [lib] bench = false @@ -22,7 +22,7 @@ internals = [] std = ["vm-core/std", "winter-prover/std", "log/std"] [dependencies] -log = "0.4.14" +log = "0.4" vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } miden-air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } winter-prover = { package = "winter-prover", version = "0.6", default-features = false } @@ -30,7 +30,6 @@ winter-prover = { package = "winter-prover", version = "0.6", default-features = [dev-dependencies] logtest = { version = "2.0", default-features = false } miden-assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } -rand-utils = { package = "winter-rand-utils", version = "0.6" } test-utils = { package = "miden-test-utils", path = "../test-utils" } winter-fri = { package = "winter-fri", version = "0.6" } winter-utils = { package = "winter-utils", version = "0.6" } diff --git a/processor/src/chiplets/bitwise/tests.rs b/processor/src/chiplets/bitwise/tests.rs index ba78afb7dc..c590359a67 100644 --- a/processor/src/chiplets/bitwise/tests.rs +++ b/processor/src/chiplets/bitwise/tests.rs @@ -4,7 +4,7 @@ use super::{ A_COL_RANGE, BITWISE_AND, BITWISE_AND_LABEL, BITWISE_XOR, BITWISE_XOR_LABEL, B_COL_IDX, B_COL_RANGE, OP_CYCLE_LEN, OUTPUT_COL_IDX, PREV_OUTPUT_COL_IDX, TRACE_WIDTH, }; -use rand_utils::rand_value; +use test_utils::rand::rand_value; use vm_core::ZERO; #[test] diff --git a/processor/src/chiplets/hasher/tests.rs b/processor/src/chiplets/hasher/tests.rs index 78368f3181..edff2b2a7d 100644 --- a/processor/src/chiplets/hasher/tests.rs +++ b/processor/src/chiplets/hasher/tests.rs @@ -11,7 +11,7 @@ use miden_air::trace::chiplets::hasher::{ MR_UPDATE_OLD_LABEL, NUM_ROUNDS, NUM_SELECTORS, RETURN_HASH_LABEL, RETURN_STATE_LABEL, STATE_COL_RANGE, }; -use rand_utils::rand_array; +use test_utils::rand::rand_array; use vm_core::{ chiplets::hasher, code_blocks::CodeBlock, diff --git a/processor/src/decoder/tests.rs b/processor/src/decoder/tests.rs index cc1d8ded05..2381ee3aa5 100644 --- a/processor/src/decoder/tests.rs +++ b/processor/src/decoder/tests.rs @@ -17,7 +17,7 @@ use miden_air::trace::{ CTX_COL_IDX, DECODER_TRACE_RANGE, DECODER_TRACE_WIDTH, FMP_COL_IDX, FN_HASH_RANGE, IN_SYSCALL_COL_IDX, SYS_TRACE_RANGE, SYS_TRACE_WIDTH, }; -use rand_utils::rand_value; +use test_utils::rand::rand_value; use vm_core::{ code_blocks::{CodeBlock, Span, OP_BATCH_SIZE}, utils::collections::Vec, diff --git a/processor/src/operations/crypto_ops.rs b/processor/src/operations/crypto_ops.rs index 44461da6a8..11f8adcec0 100644 --- a/processor/src/operations/crypto_ops.rs +++ b/processor/src/operations/crypto_ops.rs @@ -179,7 +179,7 @@ mod tests { Process, }; use crate::{AdviceInputs, StackInputs, Word, ZERO}; - use rand_utils::rand_vector; + use test_utils::rand::rand_vector; use vm_core::{ chiplets::hasher::{apply_permutation, STATE_WIDTH}, crypto::merkle::{MerkleStore, MerkleTree, NodeIndex}, diff --git a/processor/src/operations/ext2_ops.rs b/processor/src/operations/ext2_ops.rs index 6e10c4e40f..2af25f29ec 100644 --- a/processor/src/operations/ext2_ops.rs +++ b/processor/src/operations/ext2_ops.rs @@ -38,7 +38,7 @@ mod tests { Process, }; use crate::{StackInputs, ZERO}; - use rand_utils::rand_value; + use test_utils::rand::rand_value; use vm_core::QuadExtension; // ARITHMETIC OPERATIONS diff --git a/processor/src/operations/field_ops.rs b/processor/src/operations/field_ops.rs index 6af21f0b06..ef5810fa59 100644 --- a/processor/src/operations/field_ops.rs +++ b/processor/src/operations/field_ops.rs @@ -225,7 +225,7 @@ mod tests { Process, }; use crate::{AdviceInputs, StackInputs}; - use rand_utils::rand_value; + use test_utils::rand::rand_value; use vm_core::{ONE, ZERO}; // ARITHMETIC OPERATIONS diff --git a/processor/src/operations/fri_ops.rs b/processor/src/operations/fri_ops.rs index 24fd85ec21..c0beeafda4 100644 --- a/processor/src/operations/fri_ops.rs +++ b/processor/src/operations/fri_ops.rs @@ -243,7 +243,7 @@ mod tests { use super::{ ExtensionOf, Felt, FieldElement, Operation, Process, QuadFelt, StarkField, TWO, TWO_INV, }; - use rand_utils::{rand_array, rand_value, rand_vector}; + use test_utils::rand::{rand_array, rand_value, rand_vector}; use vm_core::{utils::collections::Vec, StackInputs}; use winter_prover::math::{fft, get_power_series_with_offset}; use winter_utils::transpose_slice; diff --git a/processor/src/operations/u32_ops.rs b/processor/src/operations/u32_ops.rs index f59537e817..6a9524d4f2 100644 --- a/processor/src/operations/u32_ops.rs +++ b/processor/src/operations/u32_ops.rs @@ -238,7 +238,7 @@ mod tests { }; use crate::{StackInputs, ZERO}; use miden_air::trace::{decoder::NUM_USER_OP_HELPERS, stack::STACK_TOP_SIZE}; - use rand_utils::rand_value; + use test_utils::rand::rand_value; // CASTING OPERATIONS // -------------------------------------------------------------------------------------------- diff --git a/processor/src/range/tests.rs b/processor/src/range/tests.rs index 1cdce79756..109734f6f9 100644 --- a/processor/src/range/tests.rs +++ b/processor/src/range/tests.rs @@ -1,6 +1,6 @@ use super::{BTreeMap, Felt, RangeChecker, Vec, ZERO}; use crate::{utils::get_trace_len, RangeCheckTrace}; -use rand_utils::rand_array; +use test_utils::rand::rand_array; use vm_core::{utils::ToElements, StarkField}; #[test] diff --git a/processor/src/trace/decoder/tests.rs b/processor/src/trace/decoder/tests.rs index 44ec59dd6e..71c806a1ef 100644 --- a/processor/src/trace/decoder/tests.rs +++ b/processor/src/trace/decoder/tests.rs @@ -11,7 +11,7 @@ use miden_air::trace::{ decoder::{P1_COL_IDX, P2_COL_IDX, P3_COL_IDX}, AUX_TRACE_RAND_ELEMENTS, }; -use rand_utils::rand_array; +use test_utils::rand::rand_array; use vm_core::{code_blocks::CodeBlock, FieldElement, Operation, ONE, ZERO}; // BLOCK STACK TABLE TESTS diff --git a/processor/src/trace/tests/chiplets/mod.rs b/processor/src/trace/tests/chiplets/mod.rs index 064f08a5bd..9637dfda70 100644 --- a/processor/src/trace/tests/chiplets/mod.rs +++ b/processor/src/trace/tests/chiplets/mod.rs @@ -7,7 +7,7 @@ use super::{ use miden_air::trace::{ chiplets::hasher::HASH_CYCLE_LEN, AUX_TRACE_RAND_ELEMENTS, CHIPLETS_AUX_TRACE_OFFSET, }; -use rand_utils::rand_value; +use test_utils::rand::rand_value; mod bitwise; mod hasher; diff --git a/processor/src/trace/tests/mod.rs b/processor/src/trace/tests/mod.rs index 1441783f56..8aeac004a9 100644 --- a/processor/src/trace/tests/mod.rs +++ b/processor/src/trace/tests/mod.rs @@ -3,7 +3,7 @@ use super::{ Process, Trace, Vec, NUM_RAND_ROWS, }; use crate::{AdviceInputs, DefaultHost, ExecutionOptions, MemAdviceProvider, StackInputs}; -use rand_utils::rand_array; +use test_utils::rand::rand_array; use vm_core::{ code_blocks::CodeBlock, CodeBlockTable, Kernel, Operation, StackOutputs, Word, ONE, ZERO, }; diff --git a/processor/src/trace/tests/range.rs b/processor/src/trace/tests/range.rs index c86855b772..249a816889 100644 --- a/processor/src/trace/tests/range.rs +++ b/processor/src/trace/tests/range.rs @@ -2,7 +2,7 @@ use super::{build_trace_from_ops, Felt, FieldElement, Trace, NUM_RAND_ROWS, ONE, use miden_air::trace::{ chiplets::hasher::HASH_CYCLE_LEN, range::B_RANGE_COL_IDX, AUX_TRACE_RAND_ELEMENTS, }; -use rand_utils::rand_array; +use test_utils::rand::rand_array; use vm_core::{ExtensionOf, Operation}; /// This test checks that range check lookups from stack operations are balanced by the range checks diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 0c7d97b924..ffa0ed02fc 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/0xPolygonMiden/miden-vm" categories = ["cryptography", "emulators", "no-std"] keywords = ["miden", "prover", "stark", "zkp"] edition = "2021" -rust-version = "1.67" +rust-version = "1.73" [features] concurrent = ["processor/concurrent", "std", "winter-prover/concurrent"] @@ -25,5 +25,5 @@ winter-prover = { package = "winter-prover", version = "0.6", default-features = [target.'cfg(all(target_arch = "aarch64", target_os = "macos"))'.dependencies] ministark-gpu = { version = "0.1", features = [ "winterfell" ], optional = true } -elsa = { version = "1.7", optional = true } +elsa = { version = "1.9", optional = true } pollster = { version = "0.3", optional = true } diff --git a/stdlib/Cargo.toml b/stdlib/Cargo.toml index 6ce166c368..b25adc7388 100644 --- a/stdlib/Cargo.toml +++ b/stdlib/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/0xPolygonMiden/miden-vm" categories = ["cryptography", "mathematics"] keywords = ["miden", "program", "stdlib"] edition = "2021" -rust-version = "1.67" +rust-version = "1.73" [lib] bench = false @@ -27,7 +27,7 @@ std = ["test-utils/std"] assembly = { package = "miden-assembly", default-features = false, path = "../assembly", version = "0.7" } [dev-dependencies] -blake3 = "1.4" +blake3 = "1.5" miden-air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } num-bigint = "0.4" processor = { package = "miden-processor", path = "../processor", version = "0.7", features = ["internals"], default-features = false } diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index e71f0c23b8..a7a816f055 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/0xPolygonMiden/miden-vm" categories = ["development-tools::testing", "no-std"] keywords = ["miden", "test", "virtual-machine"] edition = "2021" -rust-version = "1.67" +rust-version = "1.73" [features] default = ["std"] @@ -19,11 +19,11 @@ std = ["assembly/std", "processor/std", "prover/std", "verifier/std", "vm-core/s assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } processor = { package = "miden-processor", path = "../processor", version = "0.7", features = ["internals"], default-features = false } prover = { package = "miden-prover", path = "../prover", version = "0.7", default-features = false } -test-case = "3.0.0" +test-case = "3.2" verifier = { package = "miden-verifier", path = "../verifier", version = "0.7", default-features = false } vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } winter-prover = { package = "winter-prover", version = "0.6", default-features = false } [target.'cfg(not(target_family = "wasm"))'.dependencies] -proptest = { version = "1.1" } +proptest = { version = "1.3" } rand-utils = { package = "winter-rand-utils", version = "0.6" } From 6d8cb9677512ab2e313e1968d7f72bf1302577ce Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 9 Oct 2023 23:13:44 -0700 Subject: [PATCH 115/120] feat: add into_inner() method to DefaultHost --- processor/src/host/mod.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/processor/src/host/mod.rs b/processor/src/host/mod.rs index 60571caf38..d1bf11e0c5 100644 --- a/processor/src/host/mod.rs +++ b/processor/src/host/mod.rs @@ -192,6 +192,7 @@ impl From for Felt { // DEFAULT HOST IMPLEMENTATION // ================================================================================================ +/// TODO: add comments pub struct DefaultHost { adv_provider: A, } @@ -218,6 +219,10 @@ impl DefaultHost { pub fn advice_provider_mut(&mut self) -> &mut A { &mut self.adv_provider } + + pub fn into_inner(self) -> A { + self.adv_provider + } } impl Host for DefaultHost { From b5eb79a1ca05f967047bcc7097bf1f640830f7a7 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Mon, 9 Oct 2023 14:03:41 -0700 Subject: [PATCH 116/120] chore: set crypto dependency to crate version --- core/Cargo.toml | 2 +- miden/Cargo.toml | 1 + processor/Cargo.toml | 7 ++++--- prover/Cargo.toml | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 4477549756..1c85ae0277 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -22,7 +22,7 @@ sve = ["miden-crypto/sve", "std"] [dependencies] math = { package = "winter-math", version = "0.6", default-features = false } -miden-crypto = {git = "https://github.com/0xPolygonMiden/crypto", branch = "next", default-features = false } +miden-crypto = { package = "miden-crypto", version = "0.7", default-features = false } winter-crypto = { package = "winter-crypto", version = "0.6", default-features = false } winter-utils = { package = "winter-utils", version = "0.6", default-features = false } diff --git a/miden/Cargo.toml b/miden/Cargo.toml index 47fa7ab034..d96b3a8804 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -41,6 +41,7 @@ concurrent = ["prover/concurrent", "std"] default = ["std"] executable = ["dep:env_logger", "dep:hex", "hex?/std", "std", "dep:serde", "serde?/std", "dep:serde_derive", "dep:serde_json", "serde_json?/std", "dep:clap", "dep:rustyline"] std = ["assembly/std", "log/std", "processor/std", "prover/std", "verifier/std"] +sve = ["processor/sve", "prover/sve", "std"] [dependencies] assembly = { package = "miden-assembly", path = "../assembly", version = "0.7", default-features = false } diff --git a/processor/Cargo.toml b/processor/Cargo.toml index 687346aa46..2ea01e56fe 100644 --- a/processor/Cargo.toml +++ b/processor/Cargo.toml @@ -16,13 +16,14 @@ bench = false doctest = false [features] -concurrent = ["winter-prover/concurrent", "std"] +concurrent = ["std", "winter-prover/concurrent"] default = ["std"] internals = [] -std = ["vm-core/std", "winter-prover/std", "log/std"] +std = ["log/std", "vm-core/std", "winter-prover/std"] +sve = ["std", "vm-core/sve"] [dependencies] -log = "0.4" +log = { version = "0.4", default-features = false, optional = true } vm-core = { package = "miden-core", path = "../core", version = "0.7", default-features = false } miden-air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } winter-prover = { package = "winter-prover", version = "0.6", default-features = false } diff --git a/prover/Cargo.toml b/prover/Cargo.toml index ffa0ed02fc..84fa93f5fa 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -16,6 +16,7 @@ concurrent = ["processor/concurrent", "std", "winter-prover/concurrent"] default = ["std"] metal = ["dep:ministark-gpu", "dep:elsa", "dep:pollster", "concurrent", "std"] std = ["air/std", "processor/std", "log/std", "winter-prover/std"] +sve = ["processor/sve", "std"] [dependencies] air = { package = "miden-air", path = "../air", version = "0.7", default-features = false } From bf4dbdfd4eb9051b4fe6e0781aa0e23c9d120fd3 Mon Sep 17 00:00:00 2001 From: Andrey Khmuro Date: Mon, 9 Oct 2023 16:30:37 +0200 Subject: [PATCH 117/120] refactor: improve analyze tool --- miden/Cargo.toml | 2 +- miden/src/tools/mod.rs | 112 +++++++++++++++++++++++++++-------- processor/src/debug.rs | 26 +++++++- processor/src/lib.rs | 2 +- processor/src/trace/utils.rs | 18 +++++- 5 files changed, 129 insertions(+), 31 deletions(-) diff --git a/miden/Cargo.toml b/miden/Cargo.toml index 487f2d17a9..32253f4684 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -64,5 +64,5 @@ escargot = "0.5.7" num-bigint = "0.4" predicates = "3.0" test-utils = { package = "miden-test-utils", path = "../test-utils" } -vm-core = { package = "miden-core", path = "../core", version = "0.7" } winter-fri = { package = "winter-fri", version = "0.6" } +vm-core = { package = "miden-core", path = "../core", version = "0.7" } diff --git a/miden/src/tools/mod.rs b/miden/src/tools/mod.rs index 23bc7a9f93..9e9a766293 100644 --- a/miden/src/tools/mod.rs +++ b/miden/src/tools/mod.rs @@ -2,7 +2,7 @@ use super::{cli::InputFile, ProgramError}; use clap::Parser; use core::fmt; use miden::{utils::collections::Vec, Assembler, DefaultHost, Host, Operation, StackInputs}; -use processor::AsmOpInfo; +use processor::{AsmOpInfo, TraceLenSummary}; use std::{fs, path::PathBuf}; use stdlib::StdLibrary; @@ -36,6 +36,23 @@ impl Analyze { let execution_details: ExecutionDetails = analyze(program.as_str(), stack_inputs, host) .expect("Could not retrieve execution details"); + let program_name = self + .assembly_file + .file_name() + .expect("provided file path is incorrect") + .to_str() + .unwrap(); + + println!("============================================================"); + print!("Analyzed {} program", program_name); + if let Some(input_path) = &self.input_file { + let input_name = input_path + .file_name() + .expect("provided input path is incorrect") + .to_str() + .unwrap(); + println!(" with {}", input_name); + } println!("{}", execution_details); @@ -49,20 +66,15 @@ impl Analyze { /// Contains details of executing a program, used for program analysis. #[derive(Debug, Default, Eq, PartialEq)] pub struct ExecutionDetails { - /// Number of VM cycles it took to execute the entire program. - total_vm_cycles: u32, /// Number of noops executed as part of a program. total_noops: usize, /// Statistics about individual assembly operations executed by the VM, see [AsmOpStats]. asm_op_stats: Vec, + /// Information about VM components trace lengths. + trace_len_summary: TraceLenSummary, } impl ExecutionDetails { - /// Returns total vm cycles to execute a program - pub fn total_vm_cycles(&self) -> u32 { - self.total_vm_cycles - } - /// Returns total noops executed as part of a program pub fn total_noops(&self) -> usize { self.total_noops @@ -74,6 +86,11 @@ impl ExecutionDetails { &self.asm_op_stats } + /// Returns [TraceLenSummary] that contains the data about lengths of the trace parts. + pub fn trace_len_summary(&self) -> TraceLenSummary { + self.trace_len_summary + } + // STATE MUTATORS // -------------------------------------------------------------------------------------------- @@ -82,11 +99,6 @@ impl ExecutionDetails { self.total_noops += 1; } - /// Sets the total vm cycles to the provided value - pub fn set_total_vm_cycles(&mut self, total_vm_cycles: u32) { - self.total_vm_cycles = total_vm_cycles; - } - /// Records a new occurrence of asmop in the sorted asmop stats vector of this program info. /// If the asmop is already in the list, increments its frequency by one. /// If the asmop is not already in the list, add it at the appropriate index to keep the @@ -115,30 +127,76 @@ impl ExecutionDetails { } } } + + /// Sets the information about lengths of the trace parts. + pub fn set_trace_len_summary(&mut self, extended_cycles_info: &TraceLenSummary) { + self.trace_len_summary = *extended_cycles_info; + } } impl fmt::Display for ExecutionDetails { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let total_vm_cycles = self.total_vm_cycles(); + // calculate the percentage of padded rows + let padding_percentage = (self.trace_len_summary().padded_trace_len() + - self.trace_len_summary().trace_len()) + * 100 + / self.trace_len_summary().padded_trace_len(); + + writeln!( + f, + "\nVM cycles: {} extended to {} steps ({}% padding). +├── Stack rows: {} +├── Range checker rows: {} +└── Chiplets rows: {} + ├── Hash chiplet rows: {} + ├── Bitwise chiplet rows: {} + ├── Memory chiplet rows: {} + └── Kernel ROM rows: {}\n", + self.trace_len_summary().trace_len(), + self.trace_len_summary().padded_trace_len(), + padding_percentage, + self.trace_len_summary().main_trace_len(), + self.trace_len_summary().range_trace_len(), + self.trace_len_summary().chiplets_trace_len().trace_len(), + self.trace_len_summary().chiplets_trace_len().hash_chiplet_len(), + self.trace_len_summary().chiplets_trace_len().bitwise_chiplet_len(), + self.trace_len_summary().chiplets_trace_len().memory_chiplet_len(), + self.trace_len_summary().chiplets_trace_len().kernel_rom_len(), + )?; let total_noops = self.total_noops(); let asm_op_stats = self.asm_op_stats(); - writeln!(f, "Total Number of VM Cycles: {}\n", total_vm_cycles)?; - writeln!(f, "Total Number of NOOPs executed: {}\n", total_noops)?; + + // calculate the total length of pading for the `AsmOp` column + let padding = + asm_op_stats.iter().try_fold(20, |max, value| Ok(value.op().len().max(max)))?; + writeln!( f, - "{0: <20} | {1: <20} | {2: <20} | {3: <20}", - "AsmOp", "Frequency", "Total Cycles", "Avg Instruction Cycles" + "{0: (System, Decoder, Stack, Chiplets, Option) { (self.system, self.decoder, self.stack, self.chiplets, self.error) } + + pub fn trace_len_summary(&self) -> &TraceLenSummary { + &self.trace_len_summary + } + + /// Returns an instance of [TraceLenSummary] based on provided data. + fn build_trace_len_summary( + system: &System, + range: &mut RangeChecker, + chiplets: &Chiplets, + ) -> TraceLenSummary { + let clk = system.clk(); + let range_table_len = range.get_number_range_checker_rows(); + chiplets.append_range_checks(range); + + TraceLenSummary::new(clk as usize, range_table_len, ChipletsLengths::new(chiplets)) + } } impl Iterator for VmStateIterator { diff --git a/processor/src/lib.rs b/processor/src/lib.rs index 0b3f9c2a20..45dc1fed8e 100644 --- a/processor/src/lib.rs +++ b/processor/src/lib.rs @@ -51,8 +51,8 @@ mod chiplets; use chiplets::Chiplets; mod trace; -pub use trace::ExecutionTrace; use trace::TraceFragment; +pub use trace::{ChipletsLengths, ExecutionTrace, TraceLenSummary}; mod errors; pub use errors::{ExecutionError, Ext2InttError}; diff --git a/processor/src/trace/utils.rs b/processor/src/trace/utils.rs index db6abee587..705fa314ba 100644 --- a/processor/src/trace/utils.rs +++ b/processor/src/trace/utils.rs @@ -247,7 +247,7 @@ impl HintCycle for u64 { /// - `range_trace_len` contains the length of the range checker trace. /// - `chiplets_trace_len` contains the trace lengths of the all chiplets (hash, bitwise, memory, /// kernel ROM) -#[derive(Debug)] +#[derive(Debug, Default, Eq, PartialEq, Clone, Copy)] pub struct TraceLenSummary { main_trace_len: usize, range_trace_len: usize, @@ -297,7 +297,7 @@ impl TraceLenSummary { /// Contains trace lengths of all chilplets: hash, bitwise, memory and kernel ROM trace /// lengths. -#[derive(Clone, Copy, Debug)] +#[derive(Default, Clone, Copy, Debug, PartialEq, Eq)] pub struct ChipletsLengths { hash_chiplet_len: usize, bitwise_chiplet_len: usize, @@ -315,6 +315,20 @@ impl ChipletsLengths { } } + pub fn from_parts( + hash_len: usize, + bitwise_len: usize, + memory_len: usize, + kernel_len: usize, + ) -> Self { + ChipletsLengths { + hash_chiplet_len: hash_len, + bitwise_chiplet_len: bitwise_len, + memory_chiplet_len: memory_len, + kernel_rom_len: kernel_len, + } + } + /// Returns the length of the hash chiplet trace pub fn hash_chiplet_len(&self) -> usize { self.hash_chiplet_len From b58bf352115ebba9e87dd50eda292c65491338a7 Mon Sep 17 00:00:00 2001 From: Dominik1999 Date: Wed, 11 Oct 2023 14:56:14 +0200 Subject: [PATCH 118/120] feat: writing ProgramAst to files --- assembly/src/ast/mod.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/assembly/src/ast/mod.rs b/assembly/src/ast/mod.rs index f423d1b6f1..044d35d7c6 100644 --- a/assembly/src/ast/mod.rs +++ b/assembly/src/ast/mod.rs @@ -10,6 +10,8 @@ use super::{ MAX_LABEL_LEN, }; use core::{fmt, iter, str::from_utf8}; +#[cfg(feature = "std")] +use std::{fs, io, path::Path}; use vm_core::utils::bound_into_included_u64; pub use super::tokens::SourceLocation; @@ -336,6 +338,23 @@ impl ProgramAst { pub fn clear_imports(&mut self) { self.import_info = None; } + + // WRITE TO FILE + // -------------------------------------------------------------------------------------------- + #[cfg(feature = "std")] + /// Writes ProgramAst to provided file path + pub fn write_to_file

      (&self, dir_path: P) -> io::Result<()> + where + P: AsRef, + { + fs::create_dir_all(&dir_path)?; + let path = dir_path; + + let bytes = self.to_bytes(AstSerdeOptions { + serialize_imports: true, + }); + fs::write(path, bytes) + } } impl fmt::Display for ProgramAst { From 1be3caa5218cfdd2aa64a2aa931ebb28fdb91408 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Tue, 10 Oct 2023 23:58:55 -0700 Subject: [PATCH 119/120] docs: update readmes and docs for v0.7 release --- README.md | 59 ++++++++++++------- docs/src/SUMMARY.md | 1 + docs/src/assets/intro/vm_components.png | Bin 82931 -> 63435 bytes docs/src/intro/main.md | 2 +- docs/src/intro/overview.md | 11 ++-- docs/src/intro/performance.md | 55 +++++++++++------ docs/src/intro/usage.md | 15 ++++- docs/src/tools/main.md | 2 +- docs/src/user_docs/assembly/io_operations.md | 1 + docs/src/user_docs/stdlib/crypto/dsa.md | 15 +++++ miden/Cargo.toml | 3 +- miden/README.md | 58 +++++++++++------- processor/README.md | 12 ++-- prover/Cargo.toml | 2 +- prover/README.md | 8 ++- 15 files changed, 161 insertions(+), 83 deletions(-) create mode 100644 docs/src/user_docs/stdlib/crypto/dsa.md diff --git a/README.md b/README.md index 5b726873a3..a5df44b8ba 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Miden VM is a fully-featured virtual machine. Despite being optimized for zero-k * **Cryptographic operations.** Miden assembly provides built-in instructions for computing hashes and verifying Merkle paths. These instructions use the Rescue Prime Optimized hash function (which is the native hash function of the VM). * **External libraries.** Miden VM supports compiling programs against pre-defined libraries. The VM ships with one such library: Miden `stdlib` which adds support for such things as 64-bit unsigned integers. Developers can build other similar libraries to extend the VM's functionality in ways which fit their use cases. * **Nondeterminism**. Unlike traditional virtual machines, Miden VM supports nondeterministic programming. This means a prover may do additional work outside of the VM and then provide execution *hints* to the VM. These hints can be used to dramatically speed up certain types of computations, as well as to supply secret inputs to the VM. -* **Custom advice providers.** Miden VM can be instantiated with user-defined advice providers. These advice providers are used to supply external data to the VM during execution/proof generation (via nondeterministic inputs) and can connect the VM to arbitrary data sources (e.g., a database or RPC calls). +* **Customizable hosts.** Miden VM can be instantiated with user-defined hosts. These hosts are used to supply external data to the VM during execution/proof generation (via nondeterministic inputs) and can connect the VM to arbitrary data sources (e.g., a database or RPC calls). #### Planned features In the coming months we plan to finalize the design of the VM and implement support for the following features: @@ -78,16 +78,16 @@ A few general notes on performance: * Both proof generation and proof verification times are greatly influenced by the hash function used in the STARK protocol. In the benchmarks below, we use BLAKE3, which is a really fast hash function. ### Single-core prover performance -When executed on a single CPU core, the current version of Miden VM operates at around 10 - 15 KHz. In the benchmarks below, the VM executes a [Fibonacci calculator](miden/README.md#fibonacci-calculator) program on Apple M1 Pro CPU in a single thread. The generated proofs have a target security level of 96 bits. +When executed on a single CPU core, the current version of Miden VM operates at around 20 - 25 KHz. In the benchmarks below, the VM executes a [Fibonacci calculator](miden/README.md#fibonacci-calculator) program on Apple M1 Pro CPU in a single thread. The generated proofs have a target security level of 96 bits. | VM cycles | Execution time | Proving time | RAM consumed | Proof size | | :-------------: | :------------: | :----------: | :-----------: | :--------: | -| 210 | 1 ms | 80 ms | 20 MB | 47 KB | -| 212 | 2 ms | 260 ms | 52 MB | 57 KB | -| 214 | 8 ms | 0.9 sec | 240 MB | 66 KB | -| 216 | 28 ms | 4.6 sec | 950 MB | 77 KB | -| 218 | 85 ms | 15.5 sec | 3.7 GB | 89 KB | -| 220 | 310 ms | 67 sec | 14 GB | 100 KB | +| 210 | 1 ms | 60 ms | 20 MB | 46 KB | +| 212 | 2 ms | 180 ms | 52 MB | 56 KB | +| 214 | 8 ms | 680 ms | 240 MB | 65 KB | +| 216 | 28 ms | 2.7 sec | 950 MB | 75 KB | +| 218 | 81 ms | 11.4 sec | 3.7 GB | 87 KB | +| 220 | 310 ms | 47.5 sec | 14 GB | 100 KB | As can be seen from the above, proving time roughly doubles with every doubling in the number of cycles, but proof size grows much slower. @@ -95,24 +95,41 @@ We can also generate proofs at a higher security level. The cost of doing so is | VM cycles | Execution time | Proving time | RAM consumed | Proof size | | :-------------: | :------------: | :----------: | :-----------: | :--------: | -| 210 | 1 ms | 300 ms | 30 MB | 61 KB | -| 212 | 2 ms | 590 ms | 106 MB | 78 KB | -| 214 | 8 ms | 1.7 sec | 500 MB | 91 KB | -| 216 | 28 ms | 6.7 sec | 2.0 GB | 106 KB | -| 218 | 85 ms | 27.5 sec | 8.0 GB | 122 KB | -| 220 | 310 ms | 126 sec | 24.0 GB | 138 KB | +| 210 | 1 ms | 120 ms | 30 MB | 61 KB | +| 212 | 2 ms | 460 ms | 106 MB | 77 KB | +| 214 | 8 ms | 1.4 sec | 500 MB | 90 KB | +| 216 | 27 ms | 4.9 sec | 2.0 GB | 103 KB | +| 218 | 81 ms | 20.1 sec | 8.0 GB | 121 KB | +| 220 | 310 ms | 90.3 sec | 20.0 GB | 138 KB | ### Multi-core prover performance -STARK proof generation is massively parallelizable. Thus, by taking advantage of multiple CPU cores we can dramatically reduce proof generation time. For example, when executed on an 8-core CPU (Apple M1 Pro), the current version of Miden VM operates at around 100 KHz. And when executed on a 64-core CPU (Amazon Graviton 3), the VM operates at around 250 KHz. +STARK proof generation is massively parallelizable. Thus, by taking advantage of multiple CPU cores we can dramatically reduce proof generation time. For example, when executed on an 8-core CPU (Apple M1 Pro), the current version of Miden VM operates at around 140 KHz. And when executed on a 64-core CPU (Amazon Graviton 3), the VM operates at around 250 KHz. In the benchmarks below, the VM executes the same Fibonacci calculator program for 220 cycles at 96-bit target security level: -| Machine | Execution time | Proving time | Execution % | -| ------------------------------ | :------------: | :----------: | :---------: | -| Apple M1 Pro (8 threads) | 310 ms | 9.8 sec | 3.1% | -| Apple M2 Max (16 threads) | 290 ms | 7.7 sec | 3.6% | -| AMD Ryzen 9 5950X (16 threads) | 270 ms | 10.7 sec | 2.6% | -| Amazon Graviton 3 (64 threads) | 330 ms | 3.7 sec | 9.0% | +| Machine | Execution time | Proving time | Execution % | Implied Frequency | +| ------------------------------ | :------------: | :----------: | :---------: | :---------------: | +| Apple M1 Pro (16 threads) | 310 ms | 7.0 sec | 4.2% | 140 KHz | +| Apple M2 Max (16 threads) | 280 ms | 5.8 sec | 4.5% | 170 KHz | +| AMD Ryzen 9 5950X (16 threads) | 270 ms | 10.0 sec | 2.6% | 100 KHz | +| Amazon Graviton 3 (64 threads) | 330 ms | 3.6 sec | 8.5% | 265 KHz | + +### Recursive proofs +Proofs in the above benchmarks are generated using BLAKE3 hash function. While this hash function is very fast, it is not very efficient to execute in Miden VM. Thus, proofs generated using BLAKE3 are not well-suited for recursive proof verification. To support efficient recursive proofs, we need to use an arithmetization-friendly hash function. Miden VM natively supports Rescue Prime Optimized (RPO), which is one such hash function. One of the downsides of arithmetization-friendly hash functions is that they are considerably slower than regular hash functions. + +In the benchmarks below we execute the same Fibonacci calculator program for 220 cycles at 96-bit target security level using RPO hash function instead of BLAKE3: + +| Machine | Execution time | Proving time | Proving time (HW) | +| ------------------------------ | :------------: | :----------: | :---------------: | +| Apple M1 Pro (16 threads) | 310 ms | 94.3 sec | 42.0 sec | +| Apple M2 Max (16 threads) | 280 ms | 75.1 sec | 20.9 sec | +| AMD Ryzen 9 5950X (16 threads) | 270 ms | 59.3 sec | | +| Amazon Graviton 3 (64 threads) | 330 ms | 21.7 sec | 14.9 sec | + +In the above, proof generation on some platforms can be hardware-accelerated. Specifically: + +* On Apple M1/M2 platforms the built-in GPU is used for a part of proof generation process. +* On the Graviton platform, SVE vector extension is used to accelerate RPO computations. ## References Proofs of execution generated by Miden VM are based on STARKs. A STARK is a novel proof-of-computation scheme that allows you to create an efficiently verifiable proof that a computation was executed correctly. The scheme was developed by Eli Ben-Sasson, Michael Riabzev et al. at Technion - Israel Institute of Technology. STARKs do not require an initial trusted setup, and rely on very few cryptographic assumptions. diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 7b162b78a1..b344da23ee 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -20,6 +20,7 @@ - [Debugging](./user_docs/assembly/debugging.md) - [Miden Standard Library](./user_docs/stdlib/main.md) - [std::collections](./user_docs/stdlib/collections.md) + - [std::crypto::dsa](./user_docs/stdlib/crypto/dsa.md) - [std::crypto::fri](./user_docs/stdlib/crypto/fri.md) - [std::crypto::hashes](./user_docs/stdlib/crypto/hashes.md) - [std::math::u64](./user_docs/stdlib/math/u64.md) diff --git a/docs/src/assets/intro/vm_components.png b/docs/src/assets/intro/vm_components.png index 8572b458396ab92d5144f533a860b39a82dabbee..109cb8d7e8375a594bebc8019d6a1fefe9bd43bf 100644 GIT binary patch literal 63435 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 | 1 ms | 80 ms | 20 MB | 47 KB | -| 212 | 2 ms | 260 ms | 52 MB | 57 KB | -| 214 | 8 ms | 0.9 sec | 240 MB | 66 KB | -| 216 | 28 ms | 4.6 sec | 950 MB | 77 KB | -| 218 | 85 ms | 15.5 sec | 3.7 GB | 89 KB | -| 220 | 310 ms | 67 sec | 14 GB | 100 KB | +| 210 | 1 ms | 60 ms | 20 MB | 46 KB | +| 212 | 2 ms | 180 ms | 52 MB | 56 KB | +| 214 | 8 ms | 680 ms | 240 MB | 65 KB | +| 216 | 28 ms | 2.7 sec | 950 MB | 75 KB | +| 218 | 81 ms | 11.4 sec | 3.7 GB | 87 KB | +| 220 | 310 ms | 47.5 sec | 14 GB | 100 KB | As can be seen from the above, proving time roughly doubles with every doubling in the number of cycles, but proof size grows much slower. @@ -30,21 +30,38 @@ We can also generate proofs at a higher security level. The cost of doing so is | VM cycles | Execution time | Proving time | RAM consumed | Proof size | | :-------------: | :------------: | :----------: | :-----------: | :--------: | -| 210 | 1 ms | 300 ms | 30 MB | 61 KB | -| 212 | 2 ms | 590 ms | 106 MB | 78 KB | -| 214 | 8 ms | 1.7 sec | 500 MB | 91 KB | -| 216 | 28 ms | 6.7 sec | 2.0 GB | 106 KB | -| 218 | 85 ms | 27.5 sec | 8.0 GB | 122 KB | -| 220 | 310 ms | 126 sec | 24.0 GB | 138 KB | +| 210 | 1 ms | 120 ms | 30 MB | 61 KB | +| 212 | 2 ms | 460 ms | 106 MB | 77 KB | +| 214 | 8 ms | 1.4 sec | 500 MB | 90 KB | +| 216 | 27 ms | 4.9 sec | 2.0 GB | 103 KB | +| 218 | 81 ms | 20.1 sec | 8.0 GB | 121 KB | +| 220 | 310 ms | 90.3 sec | 20.0 GB | 138 KB | ## Multi-core prover performance STARK proof generation is massively parallelizable. Thus, by taking advantage of multiple CPU cores we can dramatically reduce proof generation time. For example, when executed on an 8-core CPU (Apple M1 Pro), the current version of Miden VM operates at around 100 KHz. And when executed on a 64-core CPU (Amazon Graviton 3), the VM operates at around 250 KHz. In the benchmarks below, the VM executes the same Fibonacci calculator program for 220 cycles at 96-bit target security level: -| Machine | Execution time | Proving time | Execution % | -| ------------------------------ | :------------: | :----------: | :---------: | -| Apple M1 Pro (8 threads) | 310 ms | 9.8 sec | 3.1% | -| Apple M2 Max (16 threads) | 290 ms | 7.7 sec | 3.6% | -| AMD Ryzen 9 5950X (16 threads) | 270 ms | 10.7 sec | 2.6% | -| Amazon Graviton 3 (64 threads) | 330 ms | 3.7 sec | 9.0% | +| Machine | Execution time | Proving time | Execution % | Implied Frequency | +| ------------------------------ | :------------: | :----------: | :---------: | :---------------: | +| Apple M1 Pro (16 threads) | 310 ms | 7.0 sec | 4.2% | 140 KHz | +| Apple M2 Max (16 threads) | 280 ms | 5.8 sec | 4.5% | 170 KHz | +| AMD Ryzen 9 5950X (16 threads) | 270 ms | 10.0 sec | 2.6% | 100 KHz | +| Amazon Graviton 3 (64 threads) | 330 ms | 3.6 sec | 8.5% | 265 KHz | + +### Recursive proofs +Proofs in the above benchmarks are generated using BLAKE3 hash function. While this hash function is very fast, it is not very efficient to execute in Miden VM. Thus, proofs generated using BLAKE3 are not well-suited for recursive proof verification. To support efficient recursive proofs, we need to use an arithmetization-friendly hash function. Miden VM natively supports Rescue Prime Optimized (RPO), which is one such hash function. One of the downsides of arithmetization-friendly hash functions is that they are considerably slower than regular hash functions. + +In the benchmarks below we execute the same Fibonacci calculator program for 220 cycles at 96-bit target security level using RPO hash function instead of BLAKE3: + +| Machine | Execution time | Proving time | Proving time (HW) | +| ------------------------------ | :------------: | :----------: | :---------------: | +| Apple M1 Pro (16 threads) | 310 ms | 94.3 sec | 42.0 sec | +| Apple M2 Max (16 threads) | 280 ms | 75.1 sec | 20.9 sec | +| AMD Ryzen 9 5950X (16 threads) | 270 ms | 59.3 sec | | +| Amazon Graviton 3 (64 threads) | 330 ms | 21.7 sec | 14.9 sec | + +In the above, proof generation on some platforms can be hardware-accelerated. Specifically: + +* On Apple M1/M2 platforms the built-in GPU is used for a part of proof generation process. +* On the Graviton platform, SVE vector extension is used to accelerate RPO computations. diff --git a/docs/src/intro/usage.md b/docs/src/intro/usage.md index 29185daa54..cfba00ade8 100644 --- a/docs/src/intro/usage.md +++ b/docs/src/intro/usage.md @@ -33,14 +33,23 @@ In this case, the `miden` executable will be placed in the `./target/release` di Internally, Miden VM uses [rayon](https://github.com/rayon-rs/rayon) for parallel computations. To control the number of threads used to generate a STARK proof, you can use `RAYON_NUM_THREADS` environment variable. ### GPU acceleration -Miden VM proof generation can be accelerated via GPUs. Currently, GPU acceleration is enabled only on Apple silicon hardware (via Metal). To compile Miden VM with Metal acceleration enabled, you can run the following command: +Miden VM proof generation can be accelerated via GPUs. Currently, GPU acceleration is enabled only on Apple silicon hardware (via [Metal](https://en.wikipedia.org/wiki/Metal_(API))). To compile Miden VM with Metal acceleration enabled, you can run the following command: ``` make exec-metal ``` -Similar to `make exec` command, this will place the resulting `miden` executable into the `./target/optimized directory`. +Similar to `make exec` command, this will place the resulting `miden` executable into the `./target/optimized` directory. -Currently, GPU acceleration is applicable only to recursive proofs which can be generated using `-r` flag. +Currently, GPU acceleration is applicable only to recursive proofs which can be generated using the `-r` flag. + +### SIMD acceleration +Miden VM execution and proof generation can be accelerated via vectorized instructions. Currently, SIMD acceleration can be enabled only on platforms supporting [SVE](https://en.wikipedia.org/wiki/AArch64#Scalable_Vector_Extension_(SVE)) instructions (e.g., Graviton 3). To compile Miden VM with SVE acceleration enabled, you can run the following command: +``` +make exec-graviton +``` +This will place the resulting `miden` executable into the `./target/optimized` directory. + +Similar to Metal acceleration, SVE acceleration is currently applicable only to recursive proofs which can be generated using the `-r` flag. ### Running Miden VM Once the executable has been compiled, you can run Miden VM like so: diff --git a/docs/src/tools/main.md b/docs/src/tools/main.md index 12859cffa0..4a98268e8e 100644 --- a/docs/src/tools/main.md +++ b/docs/src/tools/main.md @@ -2,7 +2,7 @@ The following tools are available for interacting with Miden VM: -* Via the [miden-vm](https://crates.io/crates/miden) crate (or within the Miden VM repo): +* Via the [miden-vm](https://crates.io/crates/miden-vm) crate (or within the Miden VM repo): * [CLI](../intro/usage.md#cli-interface) * [Debugger](./debugger.md) * [REPL](./repl.md) diff --git a/docs/src/user_docs/assembly/io_operations.md b/docs/src/user_docs/assembly/io_operations.md index 501c58f0da..f6f267e7b2 100644 --- a/docs/src/user_docs/assembly/io_operations.md +++ b/docs/src/user_docs/assembly/io_operations.md @@ -53,6 +53,7 @@ Advice injectors fall into two categories: (1) injectors which push new data ont | adv.push_mtnode | [d, i, R, ... ] | [d, i, R, ... ] | Pushes a node of a Merkle tree with root $R$ at depth $d$ and index $i$ from Merkle store onto the advice stack. | | adv.push_u64div | [b1, b0, a1, a0, ...] | [b1, b0, a1, a0, ...] | Pushes the result of `u64` division $a / b$ onto the advice stack. Both $a$ and $b$ are represented using 32-bit limbs. The result consists of both the quotient and the remainder. | | adv.push_ext2intt | [osize, isize, iptr, ... ] | [osize, isize, iptr, ... ] | Given evaluations of a polynomial over some specified domain, interpolates the evaluations into a polynomial in coefficient form and pushes the result into the advice stack. | +| adv.push_sig.*kind* | [K, M, ...] | [K, M, ...] | Pushes values onto the advice stack which are required for verification of a DSA with scheme specified by *kind* against the public key commitment $K$ and message $M$. | | adv.smt_get | [K, R, ... ] | [K, R, ... ] | Pushes values onto the advice stack which are required for successful retrieval of a value under the key $K$ from a Sparse Merkle Tree with root $R$. | | adv.smt_set | [V, K, R, ...] | [V, K, R, ...] | Pushes values onto the advice stack which are required for successful insertion of a key-value pair $(K, V)$ into a Sparse Merkle Tree with root $R$. | | adv.smt_peek | [K, R, ... ] | [K, R, ... ] | Pushes value onto the advice stack which is associated with key $K$ in a Sparse Merkle Tree with root $R$. | diff --git a/docs/src/user_docs/stdlib/crypto/dsa.md b/docs/src/user_docs/stdlib/crypto/dsa.md new file mode 100644 index 0000000000..f4c31b7185 --- /dev/null +++ b/docs/src/user_docs/stdlib/crypto/dsa.md @@ -0,0 +1,15 @@ +# Digital signatures +Namespace `std::crypto::dsa` contains a set of digital signature schemes supported by default in the Miden VM. Currently, these schemes are: + +* `RPO Falcon512`: a variant of the [Falcon](https://falcon-sign.info/) signature scheme. + +## RPO Falcon512 + +Module `std::crypto::dsa::rpo_falcon512` contains procedures for verifying `RPO Falcon512` signatures. These signatures differ from the standard Falcon signatures in that instead of using `SHAKE256` hash function in the *hash-to-point* algorithm we use `RPO256`. This makes the signature more efficient to verify in the Miden VM. + +The module exposes the following procedures: + +| Procedure | Description | +| ----------- | ------------- | +| verify | Verifies a signature against a public key and a message. The procedure gets as inputs the hash of the public key and the hash of the message via the operand stack. The signature is expected to be provided via the advice provider.

      The signature is valid if and only if the procedure returns.

      Inputs: `[PK, MSG, ...]`
      Outputs: `[...]`

      Where `PK` is the hash of the public key and `MSG` is the hash of the message. Both hashes are expected to be computed using `RPO` hash function.

      The procedure relies on the `adv.push_sig` [decorator](../../assembly/io_operations.md#nondeterministic-inputs) to retrieve the signature from the host. The default host implementation assumes that the private-public key pair is loaded into the advice provider, and uses it to generate the signature. However, for production grade implementations, this functionality should be overridden to ensure more secure handling of private keys.| + diff --git a/miden/Cargo.toml b/miden/Cargo.toml index dc277ad5c3..d86607e05a 100644 --- a/miden/Cargo.toml +++ b/miden/Cargo.toml @@ -40,6 +40,7 @@ path = "tests/integration/main.rs" concurrent = ["prover/concurrent", "std"] default = ["std"] executable = ["dep:env_logger", "dep:hex", "hex?/std", "std", "dep:serde", "serde?/std", "dep:serde_derive", "dep:serde_json", "serde_json?/std", "dep:clap", "dep:rustyline"] +metal = ["prover/metal", "std"] std = ["assembly/std", "log/std", "processor/std", "prover/std", "verifier/std"] sve = ["processor/sve", "prover/sve", "std"] @@ -65,5 +66,5 @@ escargot = "0.5" num-bigint = "0.4" predicates = "3.0" test-utils = { package = "miden-test-utils", path = "../test-utils" } -winter-fri = { package = "winter-fri", version = "0.6" } vm-core = { package = "miden-core", path = "../core", version = "0.7" } +winter-fri = { package = "winter-fri", version = "0.6" } diff --git a/miden/README.md b/miden/README.md index 639d6204ff..3e452ba032 100644 --- a/miden/README.md +++ b/miden/README.md @@ -1,11 +1,11 @@ # Miden VM -This crate aggregates all components of Miden VM in a single place. Specifically, it re-exports functionality from [processor](../processor/), [prover](../prover/), and [verifier](../verifier/) crates. Additionally, when compiled as an executable, this crate can be used via a [CLI interface](#cli-interface) to execute Miden VM programs and to verify correctness of their execution. +This crate aggregates all components of the Miden VM in a single place. Specifically, it re-exports functionality from [processor](../processor/), [prover](../prover/), and [verifier](../verifier/) crates. Additionally, when compiled as an executable, this crate can be used via a [CLI interface](#cli-interface) to execute Miden VM programs and to verify correctness of their execution. ## Basic concepts An in-depth description of Miden VM is available in the full Miden VM [documentation](https://0xpolygonmiden.github.io/miden-vm/). In this section we cover only the basics to make the included examples easier to understand. ### Writing programs -Our goal is to make Miden VM an easy compilation target for high-level blockchain-centric languages such as Solidity, Move, Sway, and others. We believe it is important to let people write programs in the languages of their choice. However, compilers to help with this have not been developed yet. Thus, for now, the primary way to write programs for Miden VM is to use [Miden assembly](../assembly). +Our goal is to make Miden VM an easy compilation target for high-level languages such as Rust, Move, Sway, and others. We believe it is important to let people write programs in the languages of their choice. However, compilers to help with this have not been developed yet. Thus, for now, the primary way to write programs for Miden VM is to use [Miden assembly](../assembly). Miden assembler compiles assembly source code in a [program MAST](https://0xpolygonmiden.github.io/miden-vm/design/programs.html), which is represented by a `Program` struct. It is possible to construct a `Program` struct manually, but we don't recommend this approach because it is tedious, error-prone, and requires an in-depth understanding of VM internals. All examples throughout these docs use assembly syntax. @@ -16,32 +16,33 @@ All Miden programs can be reduced to a single 32-byte value, called program hash Currently, there are 3 ways to get values onto the stack: 1. You can use `push` instruction to push values onto the stack. These values become a part of the program itself, and, therefore, cannot be changed between program executions. You can think of them as constants. -2. The stack can be initialized to some set of values at the beginning of the program. These inputs are public and must be shared with the verifier for them to verify a proof of the correct execution of a Miden program. The number of elements at the top of the stack which can receive an initial value is limited to 16. +2. The stack can be initialized to some set of values at the beginning of the program. These inputs are public and must be shared with the verifier for them to verify a proof of the correct execution of a Miden program. While it is possible to initialize the stack with a large number of values, we recommend keeping the number of initial values at 16 or fewer as each initial value beyond 16 increases verifier complexity. 3. The program may request nondeterministic advice inputs from the prover. These inputs are secret inputs. This means that the prover does not need to share them with the verifier. There are three types of advice inputs: (1) a single advice stack which can contain any number of elements; (2) a key-mapped element lists which can be pushed onto the advice stack; (3) a Merkle store, which is used to provide nondeterministic inputs for instructions which work with Merkle trees. There are no restrictions on the number of advice inputs a program can request. -The stack is provided to Miden VM via `StackInputs` struct. These are public inputs of the execution, and should also be provided to the verifier. The secret inputs of the program are provided via `AdviceProvider` instances. There is one in-memory advice provider that can be commonly used for operations that won't require persistence: `MemAdviceProvider`. +The stack is provided to Miden VM via `StackInputs` struct. These are public inputs of the execution, and should also be provided to the verifier. The secret inputs for the program are provided via the `Host` interface. The default implementation of the host relies on in-memory advice provider (`MemAdviceProvider`) that can be commonly used for operations that won't require persistence. -Values remaining on the stack after a program is executed can be returned as stack outputs. You can specify exactly how many values (from the top of the stack) should be returned. Currently, the maximum number of outputs is limited to 16. +Values remaining on the stack after a program is executed can be returned as stack outputs. You can specify exactly how many values (from the top of the stack) should be returned. Similar to stack inputs, a large number of values can be returned via the stack, however, we recommend keeping this number to under 16 not to overburden the verifier. -Having only 16 elements to describe public inputs and outputs of a program may seem limiting, however, just 4 elements are sufficient to represent a root of a Merkle tree or a sequential hash of elements. Both of these can be expanded into an arbitrary number of values by supplying the actual values non-deterministically via the advice provider. +Having a small number elements to describe public inputs and outputs of a program may seem limiting, however, just 4 elements are sufficient to represent a root of a Merkle tree or a sequential hash of elements. Both of these can be expanded into an arbitrary number of values by supplying the actual values non-deterministically via the host interface. ## Usage Miden crate exposes several functions which can be used to execute programs, generate proofs of their correct execution, and verify the generated proofs. How to do this is explained below, but you can also take a look at working examples [here](examples) and find instructions for running them via CLI [here](#fibonacci-example). ### Executing programs -To execute a program on Miden VM, you can use either `execute()` or `execute_iter()` functions. Both of these functions take the same arguments: +To execute a program on Miden VM, you can use either `execute()` or `execute_iter()` functions. The `execute()` function takes the following arguments: * `program: &Program` - a reference to a Miden program to be executed. * `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. -* `advice_provider: AdviceProvider` - an instance of an advice provider that yields secret, non-deterministic inputs to the prover. +* `host: Host` - an instance of a `Host` which can be used to supply non-deterministic inputs to the VM and receive messages from the VM. +* `options: ExecutionOptions` - a set of options for executing the specified program (e.g., max allowed number of cycles). -The `execute()` function returns a `Result` which will contain the execution trace of the program if the execution was successful, or an error, if the execution failed. You can inspect the trace to get the final state of the VM out of it, but generally, this trace is intended to be used internally by the prover during proof generation process. +The function returns a `Result` which will contain the execution trace of the program if the execution was successful, or an error, if the execution failed. Internally, the VM then passes this execution trace to the prover to generate a proof of a correct execution of the program. -The `execute_iter()` function returns a `VmStateIterator` which can be used to iterate over the cycles of the executed program for debug purposes. In fact, when we execute a program using this function, a lot of the debug information is retained and we can get a precise picture of the VM's state at any cycle. Moreover, if the execution results in an error, the `VmStateIterator` can still be used to inspect VM states right up to the cycle at which the error occurred. +The `execute_iter()` function takes similar arguments (but without the `options`) and returns a `VmStateIterator` . This iterator can be used to iterate over the cycles of the executed program for debug purposes. In fact, when we execute a program using this function, a lot of the debug information is retained and we can get a precise picture of the VM's state at any cycle. Moreover, if the execution results in an error, the `VmStateIterator` can still be used to inspect VM states right up to the cycle at which the error occurred. For example: ```rust -use miden::{Assembler, execute, execute_iter, MemAdviceProvider, DefaultHost, StackInputs}; +use miden::{Assembler, execute, execute_iter, DefaultHost, StackInputs}; use processor::ExecutionOptions; // instantiate the assembler @@ -53,7 +54,7 @@ let program = assembler.compile("begin push.3 push.5 add end").unwrap(); // use an empty list as initial stack let stack_inputs = StackInputs::default(); -// instantiate an empty advice provider +// instantiate a default host (with an empty advice provider) let mut host = DefaultHost::default(); // instantiate default execution options @@ -76,7 +77,7 @@ To execute a program on Miden VM and generate a proof that the program was execu * `program: &Program` - a reference to a Miden program to be executed. * `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. -* `advice_provider: AdviceProvider` - an instance of an advice provider that yields secret, non-deterministic inputs to the prover. +* `host: Host` - an instance of a `Host` which can be used to supply non-deterministic inputs to the VM and receive messages from the VM. * `options: ProvingOptions` - config parameters for proof generation. The default options target 96-bit security level. If the program is executed successfully, the function returns a tuple with 2 elements: @@ -99,7 +100,7 @@ let program = assembler.compile("begin push.3 push.5 add end").unwrap(); let (outputs, proof) = prove( &program, StackInputs::default(), // we won't provide any inputs - DefaultHost::default(), // we won't provide advice inputs + DefaultHost::default(), // we'll be using a default host ProvingOptions::default(), // we'll be using default options ) .unwrap(); @@ -176,7 +177,7 @@ let source = format!( ); let program = Assembler::default().compile(&source).unwrap(); -// initialize an empty advice provider +// initialize a default host (with an empty advice provider) let host = DefaultHost::default(); // initialize the stack with values 0 and 1 @@ -207,19 +208,30 @@ First, make sure you have Rust [installed](https://www.rust-lang.org/tools/insta Then, to compile Miden VM into a binary, run the following command: ```shell -cargo build --release --features executable +cargo build --profile optimized --features executable ``` -This will place `miden` executable in the `./target/release` directory. +This will place `miden` executable in the `./target/optimized` directory. By default, the executable will be compiled in the single-threaded mode. If you would like to enable multi-threaded proof generation, you can compile Miden VM using the following command: ```shell -cargo build --release --features "executable concurrent" +cargo build --profile optimized --features concurrent,executable +``` +We also provide a number of `make` commands to simplify building Miden VM for various targets: +```shell +# build an executable for a generic target (concurrent) +make exec + +# build an executable for Apple silicon (concurrent+metal) +make exec-metal + +# built an executable for the Graviton 3 target (concurrent+sve) +make exec-graviton ``` ### Running Miden VM Once the executable has been compiled, you can run Miden VM like so: ```shell -./target/release/miden [subcommand] [parameters] +./target/optimized/miden [subcommand] [parameters] ``` Currently, Miden VM can be executed with the following subcommands: * `run` - this will execute a Miden assembly program and output the result, but will not generate a proof of execution. @@ -231,17 +243,17 @@ Currently, Miden VM can be executed with the following subcommands: All of the above subcommands require various parameters to be provided. To get more detailed help on what is needed for a given subcommand, you can run the following: ```shell -./target/release/miden [subcommand] --help +./target/optimized/miden [subcommand] --help ``` For example: ```shell -./target/release/miden prove --help +./target/optimized/miden prove --help ``` ### Fibonacci example In the `miden/examples/fib` directory, we provide a very simple Fibonacci calculator example. This example computes the 1000th term of the Fibonacci sequence. You can execute this example on Miden VM like so: ```shell -./target/release/miden run -a miden/examples/fib/fib.masm -n 1 +./target/optimized/miden run -a miden/examples/fib/fib.masm -n 1 ``` This will run the example code to completion and will output the top element remaining on the stack. @@ -251,6 +263,8 @@ Miden VM can be compiled with the following features: * `std` - enabled by default and relies on the Rust standard library. * `concurrent` - implies `std` and also enables multi-threaded proof generation. * `executable` - required for building Miden VM binary as described above. Implies `std`. +* `sve` - enables [SVE](https://en.wikipedia.org/wiki/AArch64#Scalable_Vector_Extension_(SVE))-based acceleration of the RPO hash function on supported platforms (e.g., Graviton 3). +* `metal` - enables [Metal](https://en.wikipedia.org/wiki/Metal_(API))-based acceleration of proof generation (for recursive proofs) on supported platforms (e.g., Apple silicon). * `no_std` does not rely on the Rust standard library and enables compilation to WebAssembly. To compile with `no_std`, disable default features via `--no-default-features` flag. diff --git a/processor/README.md b/processor/README.md index 5c34d42505..d176d158e1 100644 --- a/processor/README.md +++ b/processor/README.md @@ -2,15 +2,16 @@ This crate contains an implementation of Miden VM processor. The purpose of the processor is to execute a program and to generate a program execution trace. This trace is then used by Miden VM to generate a proof of correct execution of the program. ## Usage -The processor exposes two functions which can be used to execute programs: `execute()` and `execute_iter()`. Both of these functions take the same arguments: +The processor exposes two functions which can be used to execute programs: `execute()` and `execute_iter()`. The `execute()` function takes the following arguments: * `program: &Program` - a reference to a Miden program to be executed. * `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. -* `advice_provider: AdviceProvider` - an instance of an advice provider that yields secret, non-deterministic inputs to the prover. +* `host: Host` - an instance of a `Host` which can be used to supply non-deterministic inputs to the VM and receive messages from the VM. +* `options: ExecutionOptions` - a set of options for executing the specified program (e.g., max allowed number of cycles). -The `execute()` function returns a `Result` which will contain the execution trace of the program if the execution was successful, or an error, if the execution failed. Internally, the VM then passes this execution trace to the prover to generate a proof of a correct execution of the program. +The function returns a `Result` which will contain the execution trace of the program if the execution was successful, or an error, if the execution failed. Internally, the VM then passes this execution trace to the prover to generate a proof of a correct execution of the program. -The `execute_iter()` function returns a `VmStateIterator` which can be used to iterate over the cycles of the executed program for debug purposes. In fact, when we execute a program using this function, a lot of the debug information is retained and we can get a precise picture of the VM's state at any cycle. Moreover, if the execution results in an error, the `VmStateIterator` can still be used to inspect VM states right up to the cycle at which the error occurred. +The `execute_iter()` function takes similar arguments (but without the `options`) and returns a `VmStateIterator` . This iterator can be used to iterate over the cycles of the executed program for debug purposes. In fact, when we execute a program using this function, a lot of the debug information is retained and we can get a precise picture of the VM's state at any cycle. Moreover, if the execution results in an error, the `VmStateIterator` can still be used to inspect VM states right up to the cycle at which the error occurred. For example: ```Rust @@ -26,7 +27,7 @@ let program = assembler.compile("begin push.3 push.5 add end").unwrap(); // use an empty list as initial stack let stack_inputs = StackInputs::default(); -// instantiate an empty advice provider +// instantiate a default host (with no advice inputs) let mut host = DefaultHost::default(); // instantiate default execution options @@ -61,6 +62,7 @@ A much more in-depth description of Miden VM design is available [here](https:// Miden processor can be compiled with the following features: * `std` - enabled by default and relies on the Rust standard library. +* `sve` - enables [SVE](https://en.wikipedia.org/wiki/AArch64#Scalable_Vector_Extension_(SVE))-based acceleration of the RPO hash function on supported platforms (e.g., Graviton 3). * `no_std` does not rely on the Rust standard library and enables compilation to WebAssembly. To compile with `no_std`, disable default features via `--no-default-features` flag. diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 84fa93f5fa..32ddd66462 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -25,6 +25,6 @@ processor = { package = "miden-processor", path = "../processor", version = "0.7 winter-prover = { package = "winter-prover", version = "0.6", default-features = false } [target.'cfg(all(target_arch = "aarch64", target_os = "macos"))'.dependencies] -ministark-gpu = { version = "0.1", features = [ "winterfell" ], optional = true } elsa = { version = "1.9", optional = true } +ministark-gpu = { version = "0.1", features = [ "winterfell" ], optional = true } pollster = { version = "0.3", optional = true } diff --git a/prover/README.md b/prover/README.md index 5444ad050e..f707bb5f63 100644 --- a/prover/README.md +++ b/prover/README.md @@ -6,7 +6,7 @@ This crate exposes a `prove()` function which can be used to execute Miden VM pr * `program: &Program` - a reference to a Miden program to be executed. * `stack_inputs: StackInputs` - a set of public inputs with which to execute the program. -* `advice_provider: AdviceProvider` - an instance of an advice provider that yields secret, non-deterministic inputs to the prover. +* `host: Host` - an instance of a `Host` which can be used to supply non-deterministic inputs to the VM and receive messages from the VM. * `options: &ProvingOptions` - config parameters for proof generation. The default options target 96-bit security level. If the program is executed successfully, the function returns a tuple with 2 elements: @@ -30,8 +30,8 @@ let program = assembler.compile("begin push.3 push.5 add end").unwrap(); let (outputs, proof) = prove( &program, StackInputs::default(), // we won't provide any stack inputs - DefaultHost::default(), // we won't provide any advice values - &ProvingOptions::default(), // we'll be using default options + DefaultHost::default(), // we'll be using a default host + &ProvingOptions::default(), // we'll be using default options ) .unwrap(); @@ -44,6 +44,8 @@ Miden prover can be compiled with the following features: * `std` - enabled by default and relies on the Rust standard library. * `concurrent` - implies `std` and also enables multi-threaded proof generation. +* `sve` - enables [SVE](https://en.wikipedia.org/wiki/AArch64#Scalable_Vector_Extension_(SVE))-based acceleration of the RPO hash function on supported platforms (e.g., Graviton 3). +* `metal` - enables [Metal](https://en.wikipedia.org/wiki/Metal_(API))-based acceleration of proof generation (for recursive proofs) on supported platforms (e.g., Apple silicon). * `no_std` does not rely on the Rust standard library and enables compilation to WebAssembly. To compile with `no_std`, disable default features via `--no-default-features` flag. From c63d9ccdb54ab65cd256c96515034d2df45aa188 Mon Sep 17 00:00:00 2001 From: Bobbin Threadbare Date: Wed, 11 Oct 2023 14:46:25 -0700 Subject: [PATCH 120/120] feat: add serialization of masb files to the CLI --- CHANGELOG.md | 7 ++++- assembly/src/assembler/mod.rs | 14 +++++++-- assembly/src/ast/mod.rs | 11 ++++--- miden/src/cli/compile.rs | 15 ++++++--- miden/src/cli/data.rs | 59 +++++++++++++++++++++++++++-------- miden/src/cli/debug/mod.rs | 3 +- miden/src/cli/prove.rs | 3 +- miden/src/cli/run.rs | 3 +- miden/src/lib.rs | 13 +++++--- 9 files changed, 96 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd3baa3b74..6c630e1e31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 0.7.0 (TBD) +## 0.7.0 (2023-10-11) #### Assembly - Added ability to attach doc comments to re-exported procedures (#994). @@ -12,6 +12,9 @@ - Added `debug` decorator (#1069). - Refactored `push` instruction so now it parses long hex string in little-endian (#1076). +#### CLI +- Implemented ability to output compiled `.masb` files to disk (#1102). + #### VM Internals - Simplified range checker and removed 1 main and 1 auxiliary trace column (#949). - Migrated range checker lookups to use LogUp and reduced the number of trace columns to 2 main and @@ -23,9 +26,11 @@ - Added `TraceLenSummary` struct which holds information about traces lengths to the `ExecutionTrace` (#1029). - Imposed the 2^32 limit for the memory addresses used in the memory chiplet (#1049). - Supported `PartialMerkleTree` as a secret input in `.input` file (#1072). +- [BREAKING] Refactored `AdviceProvider` interface into [Host] interface (#1082). #### Stdlib - Completed `std::collections::smt` module by implementing `insert` and `set` procedures (#1036, #1038, #1046). +- Added new module `std::crypto::dsa::rpo_falcon512` to support Falcon signature verification (#1000, #1094) ## 0.6.1 (2023-06-29) diff --git a/assembly/src/assembler/mod.rs b/assembly/src/assembler/mod.rs index 8dbd584fb0..af92112779 100644 --- a/assembly/src/assembler/mod.rs +++ b/assembly/src/assembler/mod.rs @@ -130,9 +130,19 @@ impl Assembler { let source = source.as_ref(); let program = ProgramAst::parse(source)?; + // compile the program and return + self.compile_ast(&program) + } + + /// Compiles the provided abstract syntax tree into a [Program]. The resulting program can be + /// executed on Miden VM. + /// + /// # Errors + /// Returns an error if the compilation of the specified program fails. + pub fn compile_ast(&self, program: &ProgramAst) -> Result { // compile the program - let mut context = AssemblyContext::for_program(Some(&program)); - let program_root = self.compile_in_context(&program, &mut context)?; + let mut context = AssemblyContext::for_program(Some(program)); + let program_root = self.compile_in_context(program, &mut context)?; // convert the context into a call block table for the program let cb_table = context.into_cb_table(&self.proc_cache.borrow())?; diff --git a/assembly/src/ast/mod.rs b/assembly/src/ast/mod.rs index 044d35d7c6..24e2d746b7 100644 --- a/assembly/src/ast/mod.rs +++ b/assembly/src/ast/mod.rs @@ -341,14 +341,17 @@ impl ProgramAst { // WRITE TO FILE // -------------------------------------------------------------------------------------------- - #[cfg(feature = "std")] + /// Writes ProgramAst to provided file path - pub fn write_to_file

      (&self, dir_path: P) -> io::Result<()> + #[cfg(feature = "std")] + pub fn write_to_file

      (&self, file_path: P) -> io::Result<()> where P: AsRef, { - fs::create_dir_all(&dir_path)?; - let path = dir_path; + let path = file_path.as_ref(); + if let Some(dir) = path.parent() { + fs::create_dir_all(dir)?; + } let bytes = self.to_bytes(AstSerdeOptions { serialize_imports: true, diff --git a/miden/src/cli/compile.rs b/miden/src/cli/compile.rs index 9eb5018b18..7b0de2e6ce 100644 --- a/miden/src/cli/compile.rs +++ b/miden/src/cli/compile.rs @@ -12,6 +12,9 @@ pub struct CompileCmd { /// Paths to .masl library files #[clap(short = 'l', long = "libraries", value_parser)] library_paths: Vec, + /// Path to output file + #[clap(short = 'o', long = "output", value_parser)] + output_file: Option, } impl CompileCmd { @@ -20,16 +23,20 @@ impl CompileCmd { println!("Compile program"); println!("============================================================"); + // load the program from file and parse it + let program = ProgramFile::read(&self.assembly_file)?; + // load libraries from files let libraries = Libraries::new(&self.library_paths)?; - // load program from file and compile - let program = ProgramFile::read(&self.assembly_file, &Debug::Off, libraries.libraries)?; + // compile the program + let compiled_program = program.compile(&Debug::Off, libraries.libraries)?; // report program hash to user - let program_hash: [u8; 32] = program.hash().into(); + let program_hash: [u8; 32] = compiled_program.hash().into(); println!("program hash is {}", hex::encode(program_hash)); - Ok(()) + // write the compiled file + program.write(self.output_file.clone()) } } diff --git a/miden/src/cli/data.rs b/miden/src/cli/data.rs index 17267b62ad..aef6b6b691 100644 --- a/miden/src/cli/data.rs +++ b/miden/src/cli/data.rs @@ -3,8 +3,8 @@ use miden::{ crypto::{MerkleStore, MerkleTree, NodeIndex, PartialMerkleTree, RpoDigest, SimpleSmt}, math::Felt, utils::{Deserializable, SliceReader}, - AdviceInputs, Assembler, Digest, ExecutionProof, MemAdviceProvider, Program, StackInputs, - StackOutputs, Word, + AdviceInputs, Assembler, Digest, ExecutionProof, MemAdviceProvider, Program, ProgramAst, + StackInputs, StackOutputs, Word, }; use serde_derive::{Deserialize, Serialize}; use std::{ @@ -69,7 +69,7 @@ pub enum MerkleData { pub struct InputFile { /// String representation of the initial operand stack, composed of chained field elements. pub operand_stack: Vec, - /// Opitonal string representation of the initial advice stack, composed of chained field + /// Optional string representation of the initial advice stack, composed of chained field /// elements. pub advice_stack: Option>, /// Optional map of 32 byte hex strings to vectors of u64s representing the initial advice map. @@ -371,21 +371,40 @@ impl OutputFile { // PROGRAM FILE // ================================================================================================ -pub struct ProgramFile; +pub struct ProgramFile { + ast: ProgramAst, + path: PathBuf, +} -/// Helper methods to interact with masm program file +/// Helper methods to interact with masm program file. impl ProgramFile { - pub fn read(path: &PathBuf, debug: &Debug, libraries: I) -> Result + /// Reads the masm file at the specified path and parses it into a [ProgramAst]. + pub fn read(path: &PathBuf) -> Result { + // read program file to string + println!("Reading program file `{}`", path.display()); + let source = fs::read_to_string(&path) + .map_err(|err| format!("Failed to open program file `{}` - {}", path.display(), err))?; + + // parse the program into an AST + print!("Parsing program... "); + let now = Instant::now(); + let ast = ProgramAst::parse(&source).map_err(|err| { + format!("Failed to parse program file `{}` - {}", path.display(), err) + })?; + println!("done ({} ms)", now.elapsed().as_millis()); + + Ok(Self { + ast, + path: path.clone(), + }) + } + + /// Compiles this program file into a [Program]. + pub fn compile(&self, debug: &Debug, libraries: I) -> Result where I: IntoIterator, L: Library, { - println!("Reading program file `{}`", path.display()); - - // read program file to string - let program_file = fs::read_to_string(&path) - .map_err(|err| format!("Failed to open program file `{}` - {}", path.display(), err))?; - print!("Compiling program... "); let now = Instant::now(); @@ -400,13 +419,27 @@ impl ProgramFile { .map_err(|err| format!("Failed to load libraries `{}`", err))?; let program = assembler - .compile(&program_file) + .compile_ast(&self.ast) .map_err(|err| format!("Failed to compile program - {}", err))?; println!("done ({} ms)", now.elapsed().as_millis()); Ok(program) } + + /// Writes this file into the specified path, if one is provided. If the path is not provided, + /// writes the file into the same directory as the source file, but with `.masb` extension. + pub fn write(&self, out_path: Option) -> Result<(), String> { + let out_path = out_path.unwrap_or_else(|| { + let mut out_file = self.path.clone(); + out_file.set_extension("masb"); + out_file + }); + + self.ast + .write_to_file(out_path) + .map_err(|err| format!("Failed to write the compiled file: {err}")) + } } // PROOF FILE diff --git a/miden/src/cli/debug/mod.rs b/miden/src/cli/debug/mod.rs index 96d5c0a676..bd683fde29 100644 --- a/miden/src/cli/debug/mod.rs +++ b/miden/src/cli/debug/mod.rs @@ -36,7 +36,8 @@ impl DebugCmd { let libraries = Libraries::new(&self.library_paths)?; // load program from file and compile - let program = ProgramFile::read(&self.assembly_file, &Debug::On, libraries.libraries)?; + let program = + ProgramFile::read(&self.assembly_file)?.compile(&Debug::On, libraries.libraries)?; let program_hash: [u8; 32] = program.hash().into(); println!("Debugging program with hash {}... ", hex::encode(program_hash)); diff --git a/miden/src/cli/prove.rs b/miden/src/cli/prove.rs index a6e0da9b32..eb9b7d8d33 100644 --- a/miden/src/cli/prove.rs +++ b/miden/src/cli/prove.rs @@ -75,7 +75,8 @@ impl ProveCmd { let libraries = Libraries::new(&self.library_paths)?; // load program from file and compile - let program = ProgramFile::read(&self.assembly_file, &Debug::Off, libraries.libraries)?; + let program = + ProgramFile::read(&self.assembly_file)?.compile(&Debug::Off, libraries.libraries)?; // load input data from file let input_data = InputFile::read(&self.input_file, &self.assembly_file)?; diff --git a/miden/src/cli/run.rs b/miden/src/cli/run.rs index 443265b8b4..f123093dd2 100644 --- a/miden/src/cli/run.rs +++ b/miden/src/cli/run.rs @@ -45,7 +45,8 @@ impl RunCmd { let libraries = Libraries::new(&self.library_paths)?; // load program from file and compile - let program = ProgramFile::read(&self.assembly_file, &Debug::Off, libraries.libraries)?; + let program = + ProgramFile::read(&self.assembly_file)?.compile(&Debug::Off, libraries.libraries)?; // load input data from file let input_data = InputFile::read(&self.input_file, &self.assembly_file)?; diff --git a/miden/src/lib.rs b/miden/src/lib.rs index c6158eb773..bb308090cf 100644 --- a/miden/src/lib.rs +++ b/miden/src/lib.rs @@ -4,14 +4,17 @@ // EXPORTS // ================================================================================================ -pub use assembly::{Assembler, AssemblyError, ParsingError}; +pub use assembly::{ + ast::{ModuleAst, ProgramAst}, + Assembler, AssemblyError, ParsingError, +}; pub use processor::{ crypto, execute, execute_iter, utils, AdviceInputs, AdviceProvider, AsmOpInfo, DefaultHost, - ExecutionError, ExecutionTrace, Host, Kernel, MemAdviceProvider, Operation, ProgramInfo, - StackInputs, VmState, VmStateIterator, ZERO, + ExecutionError, ExecutionTrace, Host, Kernel, MemAdviceProvider, Operation, Program, + ProgramInfo, StackInputs, VmState, VmStateIterator, ZERO, }; pub use prover::{ - math, prove, Digest, ExecutionProof, FieldExtension, HashFunction, InputError, Program, - ProvingOptions, StackOutputs, StarkProof, Word, + math, prove, Digest, ExecutionProof, FieldExtension, HashFunction, InputError, ProvingOptions, + StackOutputs, StarkProof, Word, }; pub use verifier::{verify, VerificationError};

      H)x2 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 diff --git a/docs/src/assets/design/vm_trace.zip b/docs/src/assets/design/vm_trace.zip index a9c0f7bf99e1d083325153f8af24a10dc7a7e12d..cdc820051c9823377060c545ae9be86d037e8440 100644 GIT binary patch delta 137197 zcmY(KWmH_jwyhg)tg$9IG%g8FaCdhP?jb;MhsND$B)Gdvu;A_<+=9D@pm{mxzWc^_ zdylIByGE^Adwz3P-ySf32S}i*fPe@F0RO%7p&QzO|N96h5>OBsmu6eE{ToC7hMOlk z01oj80RZ?n)vMTGK%Y>RkVy5mXsi+>j)L#$?#psE{f;dYv^>lKoJ&nlxZX!--`DsE zDB-@xmA!s7=Y#(ulQlD$KezV+4YZXX)K*U=(D@cU0^u{LDfB3Amr>#1s)*#}QDQ_P z2Y@zgbMZ;m>MhQoEtG+`{wDCnK@|fXObq1y%Y$RcULMB_WQ4v5t)% zZ#(v&f4&ocr3Q8p_+0Oh6d&adHA+bErlp+_~Y^Ro&Uc;*^@jY(zgX8<``1yJ}9I(4D zM_uMYJhleu&i0=sPDIKE3t|Y3EHy4NNRCJ03QsHw+SYk_=5?K9W6-$aro;XJwN639HkImw5@({hX9@4@#)1rXVUyIoHu;utcuU;j>ab z>iyvK*mp4>+%Yr!Hkqx_P1?9^qi6^JqTbm5HG9c=>Ws zN2YktxMc(Qp?xLLKhuVqjZh;ra9gg;i-f8T zkoqY^h2&Tu{?G_C+_-a|lxonb#%yoPd=@vCZ&)%7X9ywfFo#i~7IMFYEm(EIwv&$k ztPvIMARL1NDezGc${VRH6R-imn>h8H(IMwZ=%K|vlUjT1cRgZ}65<^h#(V*Wjr04( z$Z+cX1-cL8A3~V3#F++HmNBWN6Cdpk(t-x~5-)Wf>FPMDV5!#*r&i;;y|43m>|bRv z%VjB}%&XW1*(5(vzvh8XTr<#I`~x{e^=ZxfH)7oiLKIA7Kz7N@`MRP&-K)r#7DKmX z=*Z+HGcn?s2pB$W81r`q3xUlL5`Pd8TwI9N*}YN7PpHk@n-(?xCFpQEG3|uGZAFC3 zbPs1HCgRq&Ood15Evu>G&;qxj@f$aoSey5>f;2?+>f77Zw!Npp56t*r9+%qbu0RF$ z6kMEN8$F%V#$3`gWX35&(_a>fl27-wpr?peVGrr#RLjK|w*WyyPmRlR`Wn-KRvx6N zgl$pgd#=uDEHMxnf%8#ag3BFac5ow5G!Q$lPhgL~`u7*-NBH4twZiDa=)p-UFPmHr z;K=9I-Sc{#^WYUV7dmYHAfeToLA2b`^6joRine4fHLR~bZ^j3g{(*8K3R;W+=-B2p zPGV<_xiJU#oQ(nhD?oU_Ig7DFFThS6$Eo zU440ss*=2O2Jy8@-%&4a<^bQ%U`P-6bkl5_(0<)uaJ$v87E}6RY1hlzHy$^i;!m|? zBHW!Tm<};K=)7EcAT*~f5MQ(&T4U{I`pPSBh3C}sarRZ)IY*3`H~~3%g=S%;#}b2) zU}$(@&dcJBD#s{?wRiit9r^NCf;Fz`FhfYzWq>P1;f*fged>y2fav~NZuJIR5LfyH z9c5f`BlasP;3Sx`QcjgMQ$K}z(zZrhWnkL{Dug8>AGt18KDZe=98_KkU7$mRLCW%+ zl^w#cOL7$)_*dA^LTlqL2UM(!oAclqhH8{&V(y~`` zHZ&!_H0=l6qtR($Hhtn?l9AJ6zV|KU7wwGL6oz5sg=3vy

^J)-KDEo-L^;XY7Wv1;lmjiFM`NT}iFp{aDu+e6 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