From 1e3ef0e9d21d235ad6d8b2b1d357e8f153a8b022 Mon Sep 17 00:00:00 2001 From: Kevin Jue Date: Tue, 17 Sep 2024 16:04:31 -0700 Subject: [PATCH] perf: local bus (#1293) --- Cargo.lock | 76 +--- Cargo.toml | 8 +- crates/core/executor/Cargo.toml | 2 +- crates/core/executor/src/dependencies.rs | 290 +++++++++++++ crates/core/executor/src/events/alu.rs | 7 +- crates/core/executor/src/events/byte.rs | 35 +- crates/core/executor/src/events/cpu.rs | 4 +- crates/core/executor/src/events/memory.rs | 51 +++ crates/core/executor/src/events/mod.rs | 2 + .../executor/src/events/precompiles/ec.rs | 26 +- .../src/events/precompiles/edwards.rs | 8 +- .../src/events/precompiles/fptower.rs | 23 +- .../events/precompiles/keccak256_permute.rs | 8 +- .../executor/src/events/precompiles/mod.rs | 184 ++++++++ .../src/events/precompiles/sha256_compress.rs | 8 +- .../src/events/precompiles/sha256_extend.rs | 12 +- .../src/events/precompiles/uint256.rs | 8 +- crates/core/executor/src/events/syscall.rs | 23 + crates/core/executor/src/executor.rs | 151 +++++-- crates/core/executor/src/lib.rs | 2 + crates/core/executor/src/record.rs | 271 ++++-------- crates/core/executor/src/state.rs | 5 - crates/core/executor/src/syscalls/commit.rs | 3 +- crates/core/executor/src/syscalls/context.rs | 40 +- crates/core/executor/src/syscalls/deferred.rs | 10 +- crates/core/executor/src/syscalls/halt.rs | 10 +- crates/core/executor/src/syscalls/hint.rs | 12 +- crates/core/executor/src/syscalls/mod.rs | 8 +- .../src/syscalls/precompiles/edwards/add.rs | 14 +- .../precompiles/edwards/decompress.rs | 20 +- .../src/syscalls/precompiles/fptower/fp.rs | 76 ++-- .../precompiles/fptower/fp2_addsub.rs | 75 ++-- .../syscalls/precompiles/fptower/fp2_mul.rs | 55 ++- .../syscalls/precompiles/keccak256/permute.rs | 18 +- .../syscalls/precompiles/sha256/compress.rs | 19 +- .../src/syscalls/precompiles/sha256/extend.rs | 18 +- .../src/syscalls/precompiles/uint256.rs | 18 +- .../syscalls/precompiles/weierstrass/add.rs | 25 +- .../precompiles/weierstrass/decompress.rs | 20 +- .../precompiles/weierstrass/double.rs | 27 +- .../executor/src/syscalls/unconstrained.rs | 6 +- crates/core/executor/src/syscalls/verify.rs | 10 +- crates/core/executor/src/syscalls/write.rs | 10 +- crates/core/executor/src/utils.rs | 30 ++ crates/core/machine/src/air/memory.rs | 37 +- crates/core/machine/src/air/program.rs | 12 +- crates/core/machine/src/air/word.rs | 10 - crates/core/machine/src/alu/add_sub/mod.rs | 14 +- crates/core/machine/src/alu/bitwise/mod.rs | 16 +- crates/core/machine/src/alu/divrem/mod.rs | 174 +------- crates/core/machine/src/alu/divrem/utils.rs | 24 -- crates/core/machine/src/alu/lt/mod.rs | 44 +- crates/core/machine/src/alu/mul/mod.rs | 37 +- crates/core/machine/src/alu/sll/mod.rs | 27 +- crates/core/machine/src/alu/sr/mod.rs | 33 +- crates/core/machine/src/bytes/air.rs | 98 ++--- crates/core/machine/src/bytes/columns.rs | 15 +- crates/core/machine/src/bytes/mod.rs | 97 ++--- crates/core/machine/src/bytes/trace.rs | 24 +- crates/core/machine/src/cpu/air/branch.rs | 3 - crates/core/machine/src/cpu/air/ecall.rs | 7 +- crates/core/machine/src/cpu/air/memory.rs | 10 +- crates/core/machine/src/cpu/air/mod.rs | 20 +- crates/core/machine/src/cpu/air/register.rs | 10 +- .../core/machine/src/cpu/columns/channel.rs | 59 --- crates/core/machine/src/cpu/columns/mod.rs | 7 - crates/core/machine/src/cpu/trace.rs | 205 +-------- crates/core/machine/src/memory/global.rs | 74 ++-- crates/core/machine/src/memory/local.rs | 269 ++++++++++++ crates/core/machine/src/memory/mod.rs | 9 + crates/core/machine/src/memory/program.rs | 18 +- crates/core/machine/src/memory/trace.rs | 54 +-- crates/core/machine/src/operations/add.rs | 15 +- crates/core/machine/src/operations/add4.rs | 23 +- crates/core/machine/src/operations/add5.rs | 21 +- crates/core/machine/src/operations/and.rs | 14 +- .../machine/src/operations/field/field_den.rs | 46 +- .../operations/field/field_inner_product.rs | 45 +- .../machine/src/operations/field/field_op.rs | 82 +--- .../src/operations/field/field_sqrt.rs | 41 +- .../machine/src/operations/field/range.rs | 6 - .../src/operations/fixed_rotate_right.rs | 6 - .../src/operations/fixed_shift_right.rs | 6 - crates/core/machine/src/operations/lt.rs | 14 +- crates/core/machine/src/operations/not.rs | 14 +- crates/core/machine/src/operations/or.rs | 15 +- crates/core/machine/src/operations/xor.rs | 14 +- crates/core/machine/src/riscv/cost.rs | 19 +- crates/core/machine/src/riscv/mod.rs | 76 ++-- crates/core/machine/src/riscv/shape.rs | 20 +- crates/core/machine/src/syscall/chip.rs | 143 +++++++ crates/core/machine/src/syscall/mod.rs | 1 + .../machine/src/syscall/precompiles/README.md | 81 +--- .../src/syscall/precompiles/edwards/ed_add.rs | 138 ++---- .../precompiles/edwards/ed_decompress.rs | 95 ++-- .../src/syscall/precompiles/fptower/fp.rs | 64 +-- .../syscall/precompiles/fptower/fp2_addsub.rs | 68 +-- .../syscall/precompiles/fptower/fp2_mul.rs | 64 +-- .../src/syscall/precompiles/keccak256/air.rs | 13 +- .../syscall/precompiles/keccak256/columns.rs | 1 - .../syscall/precompiles/keccak256/trace.rs | 53 +-- .../precompiles/sha256/compress/air.rs | 99 +---- .../precompiles/sha256/compress/columns.rs | 1 - .../precompiles/sha256/compress/trace.rs | 88 ++-- .../syscall/precompiles/sha256/extend/air.rs | 35 +- .../precompiles/sha256/extend/columns.rs | 1 - .../syscall/precompiles/sha256/extend/mod.rs | 2 +- .../precompiles/sha256/extend/trace.rs | 81 ++-- .../src/syscall/precompiles/uint256/air.rs | 44 +- .../weierstrass/weierstrass_add.rs | 162 ++----- .../weierstrass/weierstrass_decompress.rs | 115 ++--- .../weierstrass/weierstrass_double.rs | 162 ++----- crates/core/machine/src/utils/prove.rs | 151 +++++-- crates/derive/src/lib.rs | 13 + crates/prover/src/lib.rs | 42 +- crates/prover/src/verify.rs | 4 +- crates/recursion/circuit-v2/Cargo.toml | 6 +- .../recursion/circuit-v2/src/constraints.rs | 2 +- .../circuit-v2/src/machine/compress.rs | 23 +- .../recursion/circuit-v2/src/machine/core.rs | 26 +- .../circuit-v2/src/machine/deferred.rs | 18 +- crates/recursion/circuit-v2/src/stark.rs | 108 ++++- .../recursion/circuit-v2/src/witness/mod.rs | 24 +- crates/recursion/core-v2/src/builder.rs | 28 +- crates/recursion/core-v2/src/machine.rs | 13 +- .../recursion/core-v2/src/runtime/record.rs | 12 +- crates/recursion/core/src/air/builder.rs | 76 ++-- .../recursion/core/src/air/multi_builder.rs | 10 +- .../recursion/core/src/air/public_values.rs | 3 +- crates/recursion/core/src/memory/air.rs | 56 +-- crates/recursion/core/src/stark/config.rs | 19 +- crates/recursion/core/src/stark/mod.rs | 8 +- crates/sdk/src/provers/cpu.rs | 3 +- crates/sdk/src/provers/mock.rs | 4 +- crates/stark/Cargo.toml | 4 +- crates/stark/src/air/builder.rs | 174 ++++---- crates/stark/src/air/machine.rs | 7 + crates/stark/src/bb31_poseidon2.rs | 27 +- crates/stark/src/chip.rs | 24 +- crates/stark/src/config.rs | 8 +- crates/stark/src/debug.rs | 20 +- crates/stark/src/folder.rs | 20 +- crates/stark/src/lookup/builder.rs | 43 +- crates/stark/src/lookup/debug.rs | 27 +- crates/stark/src/lookup/interaction.rs | 13 +- crates/stark/src/machine.rs | 134 ++++-- crates/stark/src/permutation.rs | 405 ++++++++++++------ crates/stark/src/prover.rs | 400 ++++++++++++++--- crates/stark/src/quotient.rs | 10 +- crates/stark/src/types.rs | 31 +- crates/stark/src/verifier.rs | 90 +++- examples/Cargo.lock | 61 +-- .../program/elf/riscv32im-succinct-zkvm-elf | Bin 119484 -> 119480 bytes .../program/elf/riscv32im-succinct-zkvm-elf | Bin 1258964 -> 1153004 bytes 154 files changed, 3942 insertions(+), 3328 deletions(-) create mode 100644 crates/core/executor/src/dependencies.rs create mode 100644 crates/core/executor/src/events/syscall.rs delete mode 100644 crates/core/machine/src/alu/divrem/utils.rs delete mode 100644 crates/core/machine/src/cpu/columns/channel.rs create mode 100644 crates/core/machine/src/memory/local.rs create mode 100644 crates/core/machine/src/syscall/chip.rs diff --git a/Cargo.lock b/Cargo.lock index 9418a175b0..c6657d2653 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4551,7 +4551,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.20", + "toml_edit 0.22.21", ] [[package]] @@ -6158,38 +6158,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "sp1-recursion-circuit" -version = "2.0.0" -dependencies = [ - "bincode", - "ff 0.13.0", - "itertools 0.13.0", - "p3-air", - "p3-baby-bear", - "p3-bn254-fr", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", - "p3-util", - "rand 0.8.5", - "serde", - "sp1-core-machine", - "sp1-recursion-compiler", - "sp1-recursion-core", - "sp1-recursion-derive", - "sp1-recursion-gnark-ffi", - "sp1-recursion-program", - "sp1-stark", - "zkhash", -] - [[package]] name = "sp1-recursion-circuit-v2" version = "2.0.0" @@ -6198,6 +6166,7 @@ dependencies = [ "ff 0.13.0", "hashbrown 0.14.5", "itertools 0.13.0", + "num-traits", "p3-air", "p3-baby-bear", "p3-bn254-fr", @@ -6217,12 +6186,10 @@ dependencies = [ "sp1-core-executor", "sp1-core-machine", "sp1-primitives", - "sp1-recursion-circuit", "sp1-recursion-compiler", "sp1-recursion-core-v2", "sp1-recursion-derive", "sp1-recursion-gnark-ffi", - "sp1-recursion-program", "sp1-stark", "stacker", "tracing", @@ -6382,36 +6349,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "sp1-recursion-program" -version = "2.0.0" -dependencies = [ - "itertools 0.13.0", - "p3-air", - "p3-baby-bear", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-maybe-rayon", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", - "p3-util", - "rand 0.8.5", - "serde", - "sp1-core-executor", - "sp1-core-machine", - "sp1-primitives", - "sp1-recursion-compiler", - "sp1-recursion-core", - "sp1-stark", - "stacker", - "tracing", -] - [[package]] name = "sp1-sdk" version = "2.0.0" @@ -6467,6 +6404,7 @@ dependencies = [ "getrandom 0.2.15", "hashbrown 0.14.5", "itertools 0.13.0", + "num-traits", "p3-air", "p3-baby-bear", "p3-challenger", @@ -6486,6 +6424,8 @@ dependencies = [ "sp1-derive", "sp1-primitives", "sp1-zkvm", + "strum", + "strum_macros", "sysinfo", "tracing", ] @@ -7059,7 +6999,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.20", + "toml_edit 0.22.21", ] [[package]] @@ -7084,9 +7024,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ "indexmap 2.5.0", "serde", diff --git a/Cargo.toml b/Cargo.toml index 263262febd..2f99c90924 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,6 @@ members = [ "crates/helper", "crates/primitives", "crates/prover", - "crates/recursion/circuit", "crates/recursion/circuit-v2", "crates/recursion/compiler", "crates/recursion/core", @@ -26,13 +25,16 @@ members = [ "crates/recursion/derive", "crates/recursion/gnark-cli", "crates/recursion/gnark-ffi", - "crates/recursion/program", "crates/sdk", "crates/cuda", "crates/stark", "crates/zkvm/*", ] -exclude = ["examples/target"] +exclude = [ + "examples/target", + "crates/recursion/program", + "crates/recursion/circuit", +] resolver = "2" [profile.release] diff --git a/crates/core/executor/Cargo.toml b/crates/core/executor/Cargo.toml index 0e48407583..2fb78d74a8 100644 --- a/crates/core/executor/Cargo.toml +++ b/crates/core/executor/Cargo.toml @@ -38,7 +38,7 @@ nohash-hasher = "0.2.0" thiserror = "1.0.63" tracing = "0.1.40" strum_macros = "0.26.4" -strum = "0.26.3" +strum = { version = "0.26.3", features = ["derive"] } log = "0.4.22" hex = "0.4.3" bytemuck = "1.16.3" diff --git a/crates/core/executor/src/dependencies.rs b/crates/core/executor/src/dependencies.rs new file mode 100644 index 0000000000..194d8d0eb2 --- /dev/null +++ b/crates/core/executor/src/dependencies.rs @@ -0,0 +1,290 @@ +use crate::{ + events::{create_alu_lookups, AluEvent, CpuEvent}, + utils::{get_msb, get_quotient_and_remainder, is_signed_operation}, + Executor, Opcode, +}; + +/// Emits the dependencies for division and remainder operations. +#[allow(clippy::too_many_lines)] +pub fn emit_divrem_dependencies(executor: &mut Executor, event: AluEvent) { + let (quotient, remainder) = get_quotient_and_remainder(event.b, event.c, event.opcode); + let c_msb = get_msb(event.c); + let rem_msb = get_msb(remainder); + let mut c_neg = 0; + let mut rem_neg = 0; + let is_signed_operation = is_signed_operation(event.opcode); + if is_signed_operation { + c_neg = c_msb; // same as abs_c_alu_event + rem_neg = rem_msb; // same as abs_rem_alu_event + } + + if c_neg == 1 { + executor.record.add_events.push(AluEvent { + lookup_id: event.sub_lookups[4], + shard: event.shard, + clk: event.clk, + opcode: Opcode::ADD, + a: 0, + b: event.c, + c: (event.c as i32).unsigned_abs(), + sub_lookups: create_alu_lookups(), + }); + } + if rem_neg == 1 { + executor.record.add_events.push(AluEvent { + lookup_id: event.sub_lookups[5], + shard: event.shard, + clk: event.clk, + opcode: Opcode::ADD, + a: 0, + b: remainder, + c: (remainder as i32).unsigned_abs(), + sub_lookups: create_alu_lookups(), + }); + } + + let c_times_quotient = { + if is_signed_operation { + (((quotient as i32) as i64) * ((event.c as i32) as i64)).to_le_bytes() + } else { + ((quotient as u64) * (event.c as u64)).to_le_bytes() + } + }; + let lower_word = u32::from_le_bytes(c_times_quotient[0..4].try_into().unwrap()); + let upper_word = u32::from_le_bytes(c_times_quotient[4..8].try_into().unwrap()); + + let lower_multiplication = AluEvent { + lookup_id: event.sub_lookups[0], + shard: event.shard, + clk: event.clk, + opcode: Opcode::MUL, + a: lower_word, + c: event.c, + b: quotient, + sub_lookups: create_alu_lookups(), + }; + executor.record.mul_events.push(lower_multiplication); + + let upper_multiplication = AluEvent { + lookup_id: event.sub_lookups[1], + shard: event.shard, + clk: event.clk, + opcode: { + if is_signed_operation { + Opcode::MULH + } else { + Opcode::MULHU + } + }, + a: upper_word, + c: event.c, + b: quotient, + sub_lookups: create_alu_lookups(), + }; + executor.record.mul_events.push(upper_multiplication); + + let lt_event = if is_signed_operation { + AluEvent { + lookup_id: event.sub_lookups[2], + shard: event.shard, + opcode: Opcode::SLTU, + a: 1, + b: (remainder as i32).unsigned_abs(), + c: u32::max(1, (event.c as i32).unsigned_abs()), + clk: event.clk, + sub_lookups: create_alu_lookups(), + } + } else { + AluEvent { + lookup_id: event.sub_lookups[3], + shard: event.shard, + opcode: Opcode::SLTU, + a: 1, + b: remainder, + c: u32::max(1, event.c), + clk: event.clk, + sub_lookups: create_alu_lookups(), + } + }; + + if event.c != 0 { + executor.record.lt_events.push(lt_event); + } +} + +/// Emit the dependencies for CPU events. +#[allow(clippy::too_many_lines)] +pub fn emit_cpu_dependencies(executor: &mut Executor, event: &CpuEvent) { + if matches!( + event.instruction.opcode, + Opcode::LB + | Opcode::LH + | Opcode::LW + | Opcode::LBU + | Opcode::LHU + | Opcode::SB + | Opcode::SH + | Opcode::SW + ) { + let memory_addr = event.b.wrapping_add(event.c); + // Add event to ALU check to check that addr == b + c + let add_event = AluEvent { + lookup_id: event.memory_add_lookup_id, + shard: event.shard, + clk: event.clk, + opcode: Opcode::ADD, + a: memory_addr, + b: event.b, + c: event.c, + sub_lookups: create_alu_lookups(), + }; + executor.record.add_events.push(add_event); + let addr_offset = (memory_addr % 4_u32) as u8; + let mem_value = event.memory_record.unwrap().value(); + + if matches!(event.instruction.opcode, Opcode::LB | Opcode::LH) { + let (unsigned_mem_val, most_sig_mem_value_byte, sign_value) = + match event.instruction.opcode { + Opcode::LB => { + let most_sig_mem_value_byte = mem_value.to_le_bytes()[addr_offset as usize]; + let sign_value = 256; + (most_sig_mem_value_byte as u32, most_sig_mem_value_byte, sign_value) + } + Opcode::LH => { + let sign_value = 65536; + let unsigned_mem_val = match (addr_offset >> 1) % 2 { + 0 => mem_value & 0x0000FFFF, + 1 => (mem_value & 0xFFFF0000) >> 16, + _ => unreachable!(), + }; + let most_sig_mem_value_byte = unsigned_mem_val.to_le_bytes()[1]; + (unsigned_mem_val, most_sig_mem_value_byte, sign_value) + } + _ => unreachable!(), + }; + + if most_sig_mem_value_byte >> 7 & 0x01 == 1 { + let sub_event = AluEvent { + lookup_id: event.memory_sub_lookup_id, + shard: event.shard, + clk: event.clk, + opcode: Opcode::SUB, + a: event.a, + b: unsigned_mem_val, + c: sign_value, + sub_lookups: create_alu_lookups(), + }; + executor.record.add_events.push(sub_event); + } + } + } + + if event.instruction.is_branch_instruction() { + let a_eq_b = event.a == event.b; + let use_signed_comparison = matches!(event.instruction.opcode, Opcode::BLT | Opcode::BGE); + let a_lt_b = if use_signed_comparison { + (event.a as i32) < (event.b as i32) + } else { + event.a < event.b + }; + let a_gt_b = if use_signed_comparison { + (event.a as i32) > (event.b as i32) + } else { + event.a > event.b + }; + + let alu_op_code = if use_signed_comparison { Opcode::SLT } else { Opcode::SLTU }; + // Add the ALU events for the comparisons + let lt_comp_event = AluEvent { + lookup_id: event.branch_lt_lookup_id, + shard: event.shard, + clk: event.clk, + opcode: alu_op_code, + a: a_lt_b as u32, + b: event.a, + c: event.b, + sub_lookups: create_alu_lookups(), + }; + let gt_comp_event = AluEvent { + lookup_id: event.branch_gt_lookup_id, + shard: event.shard, + clk: event.clk, + opcode: alu_op_code, + a: a_gt_b as u32, + b: event.b, + c: event.a, + sub_lookups: create_alu_lookups(), + }; + executor.record.lt_events.push(lt_comp_event); + executor.record.lt_events.push(gt_comp_event); + let branching = match event.instruction.opcode { + Opcode::BEQ => a_eq_b, + Opcode::BNE => !a_eq_b, + Opcode::BLT | Opcode::BLTU => a_lt_b, + Opcode::BGE | Opcode::BGEU => a_eq_b || a_gt_b, + _ => unreachable!(), + }; + if branching { + let next_pc = event.pc.wrapping_add(event.c); + let add_event = AluEvent { + lookup_id: event.branch_add_lookup_id, + shard: event.shard, + clk: event.clk, + opcode: Opcode::ADD, + a: next_pc, + b: event.pc, + c: event.c, + sub_lookups: create_alu_lookups(), + }; + executor.record.add_events.push(add_event); + } + } + + if event.instruction.is_jump_instruction() { + match event.instruction.opcode { + Opcode::JAL => { + let next_pc = event.pc.wrapping_add(event.b); + let add_event = AluEvent { + lookup_id: event.jump_jal_lookup_id, + shard: event.shard, + clk: event.clk, + opcode: Opcode::ADD, + a: next_pc, + b: event.pc, + c: event.b, + sub_lookups: create_alu_lookups(), + }; + executor.record.add_events.push(add_event); + } + Opcode::JALR => { + let next_pc = event.b.wrapping_add(event.c); + let add_event = AluEvent { + lookup_id: event.jump_jalr_lookup_id, + shard: event.shard, + clk: event.clk, + opcode: Opcode::ADD, + a: next_pc, + b: event.b, + c: event.c, + sub_lookups: create_alu_lookups(), + }; + executor.record.add_events.push(add_event); + } + _ => unreachable!(), + } + } + + if matches!(event.instruction.opcode, Opcode::AUIPC) { + let add_event = AluEvent { + lookup_id: event.auipc_lookup_id, + shard: event.shard, + clk: event.clk, + opcode: Opcode::ADD, + a: event.a, + b: event.pc, + c: event.b, + sub_lookups: create_alu_lookups(), + }; + executor.record.add_events.push(add_event); + } +} diff --git a/crates/core/executor/src/events/alu.rs b/crates/core/executor/src/events/alu.rs index b2ace9b673..4d72410a96 100644 --- a/crates/core/executor/src/events/alu.rs +++ b/crates/core/executor/src/events/alu.rs @@ -7,15 +7,13 @@ use super::{create_alu_lookups, LookupId}; /// Arithmetic Logic Unit (ALU) Event. /// /// This object encapsulated the information needed to prove an ALU operation. This includes its -/// shard, channel, opcode, operands, and other relevant information. +/// shard, opcode, operands, and other relevant information. #[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub struct AluEvent { /// The lookup identifer. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The opcode. @@ -33,11 +31,10 @@ pub struct AluEvent { impl AluEvent { /// Create a new [`AluEvent`]. #[must_use] - pub fn new(shard: u32, channel: u8, clk: u32, opcode: Opcode, a: u32, b: u32, c: u32) -> Self { + pub fn new(shard: u32, clk: u32, opcode: Opcode, a: u32, b: u32, c: u32) -> Self { Self { lookup_id: LookupId::default(), shard, - channel, clk, opcode, a, diff --git a/crates/core/executor/src/events/byte.rs b/crates/core/executor/src/events/byte.rs index 2f2f0f043d..4e5f254373 100644 --- a/crates/core/executor/src/events/byte.rs +++ b/crates/core/executor/src/events/byte.rs @@ -16,13 +16,11 @@ pub const NUM_BYTE_OPS: usize = 9; /// Byte Lookup Event. /// /// This object encapsulates the information needed to prove a byte lookup operation. This includes -/// the shard, channel, opcode, operands, and other relevant information. +/// the shard, opcode, operands, and other relevant information. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct ByteLookupEvent { /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The opcode. pub opcode: ByteOpcode, /// The first operand. @@ -55,10 +53,9 @@ pub trait ByteRecord { } /// Adds a `ByteLookupEvent` to verify `a` and `b` are indeed bytes to the shard. - fn add_u8_range_check(&mut self, shard: u32, channel: u8, a: u8, b: u8) { + fn add_u8_range_check(&mut self, shard: u32, a: u8, b: u8) { self.add_byte_lookup_event(ByteLookupEvent { shard, - channel, opcode: ByteOpcode::U8Range, a1: 0, a2: 0, @@ -68,10 +65,9 @@ pub trait ByteRecord { } /// Adds a `ByteLookupEvent` to verify `a` is indeed u16. - fn add_u16_range_check(&mut self, shard: u32, channel: u8, a: u16) { + fn add_u16_range_check(&mut self, shard: u32, a: u16) { self.add_byte_lookup_event(ByteLookupEvent { shard, - channel, opcode: ByteOpcode::U16Range, a1: a, a2: 0, @@ -81,43 +77,36 @@ pub trait ByteRecord { } /// Adds `ByteLookupEvent`s to verify that all the bytes in the input slice are indeed bytes. - fn add_u8_range_checks(&mut self, shard: u32, channel: u8, bytes: &[u8]) { + fn add_u8_range_checks(&mut self, shard: u32, bytes: &[u8]) { let mut index = 0; while index + 1 < bytes.len() { - self.add_u8_range_check(shard, channel, bytes[index], bytes[index + 1]); + self.add_u8_range_check(shard, bytes[index], bytes[index + 1]); index += 2; } if index < bytes.len() { // If the input slice's length is odd, we need to add a check for the last byte. - self.add_u8_range_check(shard, channel, bytes[index], 0); + self.add_u8_range_check(shard, bytes[index], 0); } } /// Adds `ByteLookupEvent`s to verify that all the field elements in the input slice are indeed /// bytes. - fn add_u8_range_checks_field( - &mut self, - shard: u32, - channel: u8, - field_values: &[F], - ) { + fn add_u8_range_checks_field(&mut self, shard: u32, field_values: &[F]) { self.add_u8_range_checks( shard, - channel, &field_values.iter().map(|x| x.as_canonical_u32() as u8).collect::>(), ); } /// Adds `ByteLookupEvent`s to verify that all the bytes in the input slice are indeed bytes. - fn add_u16_range_checks(&mut self, shard: u32, channel: u8, ls: &[u16]) { - ls.iter().for_each(|x| self.add_u16_range_check(shard, channel, *x)); + fn add_u16_range_checks(&mut self, shard: u32, ls: &[u16]) { + ls.iter().for_each(|x| self.add_u16_range_check(shard, *x)); } /// Adds a `ByteLookupEvent` to compute the bitwise OR of the two input values. - fn lookup_or(&mut self, shard: u32, channel: u8, b: u8, c: u8) { + fn lookup_or(&mut self, shard: u32, b: u8, c: u8) { self.add_byte_lookup_event(ByteLookupEvent { shard, - channel, opcode: ByteOpcode::OR, a1: (b | c) as u16, a2: 0, @@ -130,8 +119,8 @@ pub trait ByteRecord { impl ByteLookupEvent { /// Creates a new `ByteLookupEvent`. #[must_use] - pub fn new(shard: u32, channel: u8, opcode: ByteOpcode, a1: u16, a2: u8, b: u8, c: u8) -> Self { - Self { shard, channel, opcode, a1, a2, b, c } + pub fn new(shard: u32, opcode: ByteOpcode, a1: u16, a2: u8, b: u8, c: u8) -> Self { + Self { shard, opcode, a1, a2, b, c } } } diff --git a/crates/core/executor/src/events/cpu.rs b/crates/core/executor/src/events/cpu.rs index cf6d9b4dae..b2d775cf12 100644 --- a/crates/core/executor/src/events/cpu.rs +++ b/crates/core/executor/src/events/cpu.rs @@ -7,13 +7,11 @@ use super::{memory::MemoryRecordEnum, LookupId}; /// CPU Event. /// /// This object encapsulates the information needed to prove a CPU operation. This includes its -/// shard, channel, opcode, operands, and other relevant information. +/// shard, opcode, operands, and other relevant information. #[derive(Debug, Copy, Clone, Serialize, Deserialize)] pub struct CpuEvent { /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The program counter. diff --git a/crates/core/executor/src/events/memory.rs b/crates/core/executor/src/events/memory.rs index 588fb18e99..4372f21267 100644 --- a/crates/core/executor/src/events/memory.rs +++ b/crates/core/executor/src/events/memory.rs @@ -85,6 +85,42 @@ pub enum MemoryRecordEnum { Write(MemoryWriteRecord), } +impl MemoryRecordEnum { + /// Retrieve the current memory record. + #[must_use] + pub fn current_record(&self) -> MemoryRecord { + match self { + MemoryRecordEnum::Read(record) => MemoryRecord { + shard: record.shard, + timestamp: record.timestamp, + value: record.value, + }, + MemoryRecordEnum::Write(record) => MemoryRecord { + shard: record.shard, + timestamp: record.timestamp, + value: record.value, + }, + } + } + + /// Retrieve the previous memory record. + #[must_use] + pub fn previous_record(&self) -> MemoryRecord { + match self { + MemoryRecordEnum::Read(record) => MemoryRecord { + shard: record.prev_shard, + timestamp: record.prev_timestamp, + value: record.value, + }, + MemoryRecordEnum::Write(record) => MemoryRecord { + shard: record.prev_shard, + timestamp: record.prev_timestamp, + value: record.prev_value, + }, + } + } +} + /// Memory Initialize/Finalize Event. /// /// This object encapsulates the information needed to prove a memory initialize or finalize @@ -177,3 +213,18 @@ impl From for MemoryRecordEnum { MemoryRecordEnum::Write(write_record) } } + +/// Memory Local Event. +/// +/// This object encapsulates the information needed to prove a memory access operation within a +/// shard. This includes the address, initial memory access, and final memory access within a +/// shard. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MemoryLocalEvent { + /// The address. + pub addr: u32, + /// The initial memory access. + pub initial_mem_access: MemoryRecord, + /// The final memory access. + pub final_mem_access: MemoryRecord, +} diff --git a/crates/core/executor/src/events/mod.rs b/crates/core/executor/src/events/mod.rs index 9981e960af..da38bb83c2 100644 --- a/crates/core/executor/src/events/mod.rs +++ b/crates/core/executor/src/events/mod.rs @@ -5,6 +5,7 @@ mod byte; mod cpu; mod memory; mod precompiles; +mod syscall; mod utils; pub use alu::*; @@ -12,4 +13,5 @@ pub use byte::*; pub use cpu::*; pub use memory::*; pub use precompiles::*; +pub use syscall::*; pub use utils::*; diff --git a/crates/core/executor/src/events/precompiles/ec.rs b/crates/core/executor/src/events/precompiles/ec.rs index ff8fee9844..7b8f2305f2 100644 --- a/crates/core/executor/src/events/precompiles/ec.rs +++ b/crates/core/executor/src/events/precompiles/ec.rs @@ -11,7 +11,7 @@ use typenum::Unsigned; use crate::{ events::{ memory::{MemoryReadRecord, MemoryWriteRecord}, - LookupId, + LookupId, MemoryLocalEvent, }, syscalls::SyscallContext, }; @@ -19,13 +19,11 @@ use crate::{ /// Elliptic Curve Add Event. /// /// This event is emitted when an elliptic curve addition operation is performed. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct EllipticCurveAddEvent { pub(crate) lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the first point. @@ -40,19 +38,19 @@ pub struct EllipticCurveAddEvent { pub p_memory_records: Vec, /// The memory records for the second point. pub q_memory_records: Vec, + /// The local memory access records. + pub local_mem_access: Vec, } /// Elliptic Curve Double Event. /// /// This event is emitted when an elliptic curve doubling operation is performed. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct EllipticCurveDoubleEvent { /// The lookup identifer. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the point. @@ -61,19 +59,19 @@ pub struct EllipticCurveDoubleEvent { pub p: Vec, /// The memory records for the point. pub p_memory_records: Vec, + /// The local memory access records. + pub local_mem_access: Vec, } /// Elliptic Curve Point Decompress Event. /// /// This event is emitted when an elliptic curve point decompression operation is performed. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct EllipticCurveDecompressEvent { /// The lookup identifer. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the point. @@ -88,6 +86,8 @@ pub struct EllipticCurveDecompressEvent { pub x_memory_records: Vec, /// The memory records for the y coordinate. pub y_memory_records: Vec, + /// The local memory access records. + pub local_mem_access: Vec, } /// Create an elliptic curve add event. It takes two pointers to memory locations, reads the points @@ -130,7 +130,6 @@ pub fn create_ec_add_event( EllipticCurveAddEvent { lookup_id: rt.syscall_lookup_id, shard: rt.current_shard(), - channel: rt.current_channel(), clk: start_clk, p_ptr, p, @@ -138,6 +137,7 @@ pub fn create_ec_add_event( q, p_memory_records, q_memory_records, + local_mem_access: rt.postprocess(), } } @@ -171,11 +171,11 @@ pub fn create_ec_double_event( EllipticCurveDoubleEvent { lookup_id: rt.syscall_lookup_id, shard: rt.current_shard(), - channel: rt.current_channel(), clk: start_clk, p_ptr, p, p_memory_records, + local_mem_access: rt.postprocess(), } } @@ -219,7 +219,6 @@ pub fn create_ec_decompress_event( EllipticCurveDecompressEvent { lookup_id: rt.syscall_lookup_id, shard: rt.current_shard(), - channel: rt.current_channel(), clk: start_clk, ptr: slice_ptr, sign_bit: sign_bit != 0, @@ -227,5 +226,6 @@ pub fn create_ec_decompress_event( decompressed_y_bytes, x_memory_records, y_memory_records, + local_mem_access: rt.postprocess(), } } diff --git a/crates/core/executor/src/events/precompiles/edwards.rs b/crates/core/executor/src/events/precompiles/edwards.rs index 17daf6837e..3d795b891a 100644 --- a/crates/core/executor/src/events/precompiles/edwards.rs +++ b/crates/core/executor/src/events/precompiles/edwards.rs @@ -3,20 +3,18 @@ use sp1_curves::{edwards::WORDS_FIELD_ELEMENT, COMPRESSED_POINT_BYTES, NUM_BYTES use crate::events::{ memory::{MemoryReadRecord, MemoryWriteRecord}, - LookupId, + LookupId, MemoryLocalEvent, }; /// Edwards Decompress Event. /// /// This event is emitted when an edwards decompression operation is performed. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct EdDecompressEvent { /// The lookup identifer. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the point. @@ -31,4 +29,6 @@ pub struct EdDecompressEvent { pub x_memory_records: [MemoryWriteRecord; WORDS_FIELD_ELEMENT], /// The memory records for the y coordinate. pub y_memory_records: [MemoryReadRecord; WORDS_FIELD_ELEMENT], + /// The local memory access events. + pub local_mem_access: Vec, } diff --git a/crates/core/executor/src/events/precompiles/fptower.rs b/crates/core/executor/src/events/precompiles/fptower.rs index 1ae2afd005..e4f1c96d59 100644 --- a/crates/core/executor/src/events/precompiles/fptower.rs +++ b/crates/core/executor/src/events/precompiles/fptower.rs @@ -1,11 +1,12 @@ use serde::{Deserialize, Serialize}; -use crate::events::{LookupId, MemoryReadRecord, MemoryWriteRecord}; +use crate::events::{LookupId, MemoryLocalEvent, MemoryReadRecord, MemoryWriteRecord}; /// This is an arithmetic operation for emulating modular arithmetic. -#[derive(PartialEq, Copy, Clone, Debug, Serialize, Deserialize)] +#[derive(Default, PartialEq, Copy, Clone, Debug, Serialize, Deserialize)] pub enum FieldOperation { /// Addition. + #[default] Add, /// Multiplication. Mul, @@ -18,14 +19,12 @@ pub enum FieldOperation { /// Emulated Field Operation Events. /// /// This event is emitted when an emulated field operation is performed on the input operands. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct FpOpEvent { /// The lookup id. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the x operand. @@ -42,19 +41,19 @@ pub struct FpOpEvent { pub x_memory_records: Vec, /// The memory records for the y operand. pub y_memory_records: Vec, + /// The local memory access records. + pub local_mem_access: Vec, } /// Emulated Degree 2 Field Addition/Subtraction Events. /// /// This event is emitted when an emulated degree 2 field operation is performed on the input -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct Fp2AddSubEvent { /// The lookup id. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The operation to perform. @@ -71,17 +70,17 @@ pub struct Fp2AddSubEvent { pub x_memory_records: Vec, /// The memory records for the y operand. pub y_memory_records: Vec, + /// The local memory access records. + pub local_mem_access: Vec, } /// Emulated Degree 2 Field Multiplication Events. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct Fp2MulEvent { /// The lookup id. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the x operand. @@ -96,4 +95,6 @@ pub struct Fp2MulEvent { pub x_memory_records: Vec, /// The memory records for the y operand. pub y_memory_records: Vec, + /// The local memory access records. + pub local_mem_access: Vec, } diff --git a/crates/core/executor/src/events/precompiles/keccak256_permute.rs b/crates/core/executor/src/events/precompiles/keccak256_permute.rs index 19ad295034..ded58bbfed 100644 --- a/crates/core/executor/src/events/precompiles/keccak256_permute.rs +++ b/crates/core/executor/src/events/precompiles/keccak256_permute.rs @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; use crate::events::{ memory::{MemoryReadRecord, MemoryWriteRecord}, - LookupId, + LookupId, MemoryLocalEvent, }; pub(crate) const STATE_SIZE: usize = 25; @@ -10,14 +10,12 @@ pub(crate) const STATE_SIZE: usize = 25; /// Keccak-256 Permutation Event. /// /// This event is emitted when a keccak-256 permutation operation is performed. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct KeccakPermuteEvent { /// The lookup identifer. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pre-state as a list of u64 words. @@ -30,4 +28,6 @@ pub struct KeccakPermuteEvent { pub state_write_records: Vec, /// The address of the state. pub state_addr: u32, + /// The local memory access records. + pub local_mem_access: Vec, } diff --git a/crates/core/executor/src/events/precompiles/mod.rs b/crates/core/executor/src/events/precompiles/mod.rs index ded0f62cd2..8acfed9e60 100644 --- a/crates/core/executor/src/events/precompiles/mod.rs +++ b/crates/core/executor/src/events/precompiles/mod.rs @@ -9,7 +9,191 @@ mod uint256; pub use ec::*; pub use edwards::*; pub use fptower::*; +use hashbrown::HashMap; pub use keccak256_permute::*; +use serde::{Deserialize, Serialize}; pub use sha256_compress::*; pub use sha256_extend::*; +use strum::{EnumIter, IntoEnumIterator}; pub use uint256::*; + +use crate::syscalls::SyscallCode; + +use super::MemoryLocalEvent; + +#[derive(Clone, Debug, Serialize, Deserialize, EnumIter)] +/// Precompile event. There should be one variant for every precompile syscall. +pub enum PrecompileEvent { + /// Sha256 extend precompile event. + ShaExtend(ShaExtendEvent), + /// Sha256 compress precompile event. + ShaCompress(ShaCompressEvent), + /// Keccak256 permute precompile event. + KeccakPermute(KeccakPermuteEvent), + /// Edwards curve add precompile event. + EdAdd(EllipticCurveAddEvent), + /// Edwards curve decompress precompile event. + EdDecompress(EdDecompressEvent), + /// Secp256k1 curve add precompile event. + Secp256k1Add(EllipticCurveAddEvent), + /// Secp256k1 curve double precompile event. + Secp256k1Double(EllipticCurveDoubleEvent), + /// Secp256k1 curve decompress precompile event. + Secp256k1Decompress(EllipticCurveDecompressEvent), + /// K256 curve decompress precompile event. + K256Decompress(EllipticCurveDecompressEvent), + /// Bn254 curve add precompile event. + Bn254Add(EllipticCurveAddEvent), + /// Bn254 curve double precompile event. + Bn254Double(EllipticCurveDoubleEvent), + /// Bn254 base field operation precompile event. + Bn254Fp(FpOpEvent), + /// Bn254 quadratic field add/sub precompile event. + Bn254Fp2AddSub(Fp2AddSubEvent), + /// Bn254 quadratic field mul precompile event. + Bn254Fp2Mul(Fp2MulEvent), + /// Bls12-381 curve add precompile event. + Bls12381Add(EllipticCurveAddEvent), + /// Bls12-381 curve double precompile event. + Bls12381Double(EllipticCurveDoubleEvent), + /// Bls12-381 curve decompress precompile event. + Bls12381Decompress(EllipticCurveDecompressEvent), + /// Bls12-381 base field operation precompile event. + Bls12381Fp(FpOpEvent), + /// Bls12-381 quadratic field add/sub precompile event. + Bls12381Fp2AddSub(Fp2AddSubEvent), + /// Bls12-381 quadratic field mul precompile event. + Bls12381Fp2Mul(Fp2MulEvent), + /// Uint256 mul precompile event. + Uint256Mul(Uint256MulEvent), +} + +/// Trait to retrieve all the local memory events from a vec of precompile events. +pub trait PrecompileLocalMemory { + /// Get an iterator of all the local memory events. + fn get_local_mem_events(&self) -> impl IntoIterator; +} + +impl PrecompileLocalMemory for Vec { + fn get_local_mem_events(&self) -> impl IntoIterator { + let mut iterators = Vec::new(); + + for event in self.iter() { + match event { + PrecompileEvent::ShaExtend(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::ShaCompress(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::KeccakPermute(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::EdDecompress(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::Secp256k1Add(e) + | PrecompileEvent::EdAdd(e) + | PrecompileEvent::Bn254Add(e) + | PrecompileEvent::Bls12381Add(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::Secp256k1Double(e) + | PrecompileEvent::Bn254Double(e) + | PrecompileEvent::Bls12381Double(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::Secp256k1Decompress(e) + | PrecompileEvent::K256Decompress(e) + | PrecompileEvent::Bls12381Decompress(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::Uint256Mul(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::Bls12381Fp(e) | PrecompileEvent::Bn254Fp(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::Bls12381Fp2AddSub(e) | PrecompileEvent::Bn254Fp2AddSub(e) => { + iterators.push(e.local_mem_access.iter()); + } + PrecompileEvent::Bls12381Fp2Mul(e) | PrecompileEvent::Bn254Fp2Mul(e) => { + iterators.push(e.local_mem_access.iter()); + } + } + } + + iterators.into_iter().flatten() + } +} + +/// A record of all the precompile events. +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct PrecompileEvents { + events: HashMap>, +} + +impl Default for PrecompileEvents { + fn default() -> Self { + let mut events = HashMap::new(); + for syscall_code in SyscallCode::iter() { + if syscall_code.should_send() == 1 { + events.insert(syscall_code, Vec::new()); + } + } + + Self { events } + } +} + +impl PrecompileEvents { + pub(crate) fn append(&mut self, other: &mut PrecompileEvents) { + for (syscall, events) in other.events.iter_mut() { + if !events.is_empty() { + self.events.entry(*syscall).or_default().append(events); + } + } + } + + #[inline] + /// Add a precompile event for a given syscall code. + pub(crate) fn add_event(&mut self, syscall_code: SyscallCode, event: PrecompileEvent) { + assert!(syscall_code.should_send() == 1); + self.events.entry(syscall_code).or_default().push(event); + } + + #[inline] + /// Insert a vector of precompile events for a given syscall code. + pub(crate) fn insert(&mut self, syscall_code: SyscallCode, events: Vec) { + assert!(syscall_code.should_send() == 1); + self.events.insert(syscall_code, events); + } + + #[inline] + pub(crate) fn into_iter(self) -> impl Iterator)> { + self.events.into_iter() + } + + #[inline] + pub(crate) fn iter(&self) -> impl Iterator)> { + self.events.iter() + } + + #[inline] + /// Get all the precompile events for a given syscall code. + pub(crate) fn get_events(&self, syscall_code: SyscallCode) -> &Vec { + assert!(syscall_code.should_send() == 1); + &self.events[&syscall_code] + } + + /// Get all the local events from all the precompile events. + pub(crate) fn get_local_mem_events(&self) -> impl Iterator { + let mut iterators = Vec::new(); + + for (_, events) in self.events.iter() { + iterators.push(events.get_local_mem_events()); + } + + iterators.into_iter().flatten() + } +} diff --git a/crates/core/executor/src/events/precompiles/sha256_compress.rs b/crates/core/executor/src/events/precompiles/sha256_compress.rs index 4c3f42bf3d..5bf094611d 100644 --- a/crates/core/executor/src/events/precompiles/sha256_compress.rs +++ b/crates/core/executor/src/events/precompiles/sha256_compress.rs @@ -2,20 +2,18 @@ use serde::{Deserialize, Serialize}; use crate::events::{ memory::{MemoryReadRecord, MemoryWriteRecord}, - LookupId, + LookupId, MemoryLocalEvent, }; /// SHA-256 Compress Event. /// /// This event is emitted when a SHA-256 compress operation is performed. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct ShaCompressEvent { /// The lookup identifer. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the word. @@ -32,4 +30,6 @@ pub struct ShaCompressEvent { pub w_i_read_records: Vec, /// The memory records for the word. pub h_write_records: [MemoryWriteRecord; 8], + /// The local memory accesses. + pub local_mem_access: Vec, } diff --git a/crates/core/executor/src/events/precompiles/sha256_extend.rs b/crates/core/executor/src/events/precompiles/sha256_extend.rs index f63998362d..c6671cea9b 100644 --- a/crates/core/executor/src/events/precompiles/sha256_extend.rs +++ b/crates/core/executor/src/events/precompiles/sha256_extend.rs @@ -1,19 +1,19 @@ use serde::{Deserialize, Serialize}; -use crate::events::memory::{MemoryReadRecord, MemoryWriteRecord}; -use crate::events::LookupId; +use crate::events::{ + memory::{MemoryReadRecord, MemoryWriteRecord}, + LookupId, MemoryLocalEvent, +}; /// SHA-256 Extend Event. /// /// This event is emitted when a SHA-256 extend operation is performed. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct ShaExtendEvent { /// The lookup identifer. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the word. @@ -28,4 +28,6 @@ pub struct ShaExtendEvent { pub w_i_minus_7_reads: Vec, /// The memory writes of w[i]. pub w_i_writes: Vec, + /// The local memory accesses. + pub local_mem_access: Vec, } diff --git a/crates/core/executor/src/events/precompiles/uint256.rs b/crates/core/executor/src/events/precompiles/uint256.rs index bcd13e140b..4acbcfc3c6 100644 --- a/crates/core/executor/src/events/precompiles/uint256.rs +++ b/crates/core/executor/src/events/precompiles/uint256.rs @@ -2,20 +2,18 @@ use serde::{Deserialize, Serialize}; use crate::events::{ memory::{MemoryReadRecord, MemoryWriteRecord}, - LookupId, + LookupId, MemoryLocalEvent, }; /// Uint256 Mul Event. /// /// This event is emitted when a uint256 mul operation is performed. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Default, Debug, Clone, Serialize, Deserialize)] pub struct Uint256MulEvent { /// The lookup identifer. pub lookup_id: LookupId, /// The shard number. pub shard: u32, - /// The channel number. - pub channel: u8, /// The clock cycle. pub clk: u32, /// The pointer to the x value. @@ -34,4 +32,6 @@ pub struct Uint256MulEvent { pub y_memory_records: Vec, /// The memory records for the modulus. pub modulus_memory_records: Vec, + /// The local memory access records. + pub local_mem_access: Vec, } diff --git a/crates/core/executor/src/events/syscall.rs b/crates/core/executor/src/events/syscall.rs new file mode 100644 index 0000000000..62fbf86fa4 --- /dev/null +++ b/crates/core/executor/src/events/syscall.rs @@ -0,0 +1,23 @@ +use serde::{Deserialize, Serialize}; + +use super::LookupId; + +/// Syscall Event. +/// +/// This object encapsulated the information needed to prove a syscall invocation from the CPU table. +/// This includes its shard, clk, syscall id, arguments, other relevant information. +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +pub struct SyscallEvent { + /// The shard number. + pub shard: u32, + /// The clock cycle. + pub clk: u32, + /// The lookup id. + pub lookup_id: LookupId, + /// The syscall id. + pub syscall_id: u32, + /// The first argument. + pub arg1: u32, + /// The second operand. + pub arg2: u32, +} diff --git a/crates/core/executor/src/executor.rs b/crates/core/executor/src/executor.rs index eefb133195..014a0fd778 100644 --- a/crates/core/executor/src/executor.rs +++ b/crates/core/executor/src/executor.rs @@ -11,10 +11,11 @@ use thiserror::Error; use crate::{ context::SP1Context, + dependencies::{emit_cpu_dependencies, emit_divrem_dependencies}, events::{ create_alu_lookup_id, create_alu_lookups, AluEvent, CpuEvent, LookupId, - MemoryAccessPosition, MemoryInitializeFinalizeEvent, MemoryReadRecord, MemoryRecord, - MemoryWriteRecord, + MemoryAccessPosition, MemoryInitializeFinalizeEvent, MemoryLocalEvent, MemoryReadRecord, + MemoryRecord, MemoryWriteRecord, SyscallEvent, }, hook::{HookEnv, HookRegistry}, memory::{Entry, PagedMemory}, @@ -101,6 +102,9 @@ pub struct Executor<'a> { /// Memory addresses that were touched in this batch of shards. Used to minimize the size of /// checkpoints. pub memory_checkpoint: PagedMemory>, + + /// Local memory access events. + pub local_memory_access: HashMap, } /// The different modes the executor can run in. @@ -175,7 +179,7 @@ impl<'a> Executor<'a> { let program = Arc::new(program); // Create a default record with the program. - let record = ExecutionRecord { program: program.clone(), ..Default::default() }; + let record = ExecutionRecord::new(program.clone()); // If `TRACE_FILE`` is set, initialize the trace buffer. let trace_buf = if let Ok(trace_file) = std::env::var("TRACE_FILE") { @@ -217,6 +221,7 @@ impl<'a> Executor<'a> { opts, max_cycles: context.max_cycles, memory_checkpoint: PagedMemory::new_preallocated(), + local_memory_access: HashMap::new(), } } @@ -345,15 +350,14 @@ impl<'a> Executor<'a> { self.state.current_shard } - /// Get the current channel. - #[must_use] - #[inline] - pub fn channel(&self) -> u8 { - self.state.channel - } - /// Read a word from memory and create an access record. - pub fn mr(&mut self, addr: u32, shard: u32, timestamp: u32) -> MemoryReadRecord { + pub fn mr( + &mut self, + addr: u32, + shard: u32, + timestamp: u32, + local_memory_access: Option<&mut HashMap>, + ) -> MemoryReadRecord { // Get the memory record entry. let entry = self.state.memory.entry(addr); if self.executor_mode == ExecutorMode::Checkpoint || self.unconstrained { @@ -387,18 +391,49 @@ impl<'a> Executor<'a> { entry.insert(MemoryRecord { value: *value, shard: 0, timestamp: 0 }) } }; - let value = record.value; - let prev_shard = record.shard; - let prev_timestamp = record.timestamp; + + let prev_record = *record; record.shard = shard; record.timestamp = timestamp; + if !self.unconstrained { + let local_memory_access = if let Some(local_memory_access) = local_memory_access { + local_memory_access + } else { + &mut self.local_memory_access + }; + + local_memory_access + .entry(addr) + .and_modify(|e| { + e.final_mem_access = *record; + }) + .or_insert(MemoryLocalEvent { + addr, + initial_mem_access: prev_record, + final_mem_access: *record, + }); + } + // Construct the memory read record. - MemoryReadRecord::new(value, shard, timestamp, prev_shard, prev_timestamp) + MemoryReadRecord::new( + record.value, + record.shard, + record.timestamp, + prev_record.shard, + prev_record.timestamp, + ) } /// Write a word to memory and create an access record. - pub fn mw(&mut self, addr: u32, value: u32, shard: u32, timestamp: u32) -> MemoryWriteRecord { + pub fn mw( + &mut self, + addr: u32, + value: u32, + shard: u32, + timestamp: u32, + local_memory_access: Option<&mut HashMap>, + ) -> MemoryWriteRecord { // Get the memory record entry. let entry = self.state.memory.entry(addr); if self.executor_mode == ExecutorMode::Checkpoint || self.unconstrained { @@ -433,15 +468,40 @@ impl<'a> Executor<'a> { entry.insert(MemoryRecord { value: *value, shard: 0, timestamp: 0 }) } }; - let prev_value = record.value; - let prev_shard = record.shard; - let prev_timestamp = record.timestamp; + + let prev_record = *record; record.value = value; record.shard = shard; record.timestamp = timestamp; + if !self.unconstrained { + let local_memory_access = if let Some(local_memory_access) = local_memory_access { + local_memory_access + } else { + &mut self.local_memory_access + }; + + local_memory_access + .entry(addr) + .and_modify(|e| { + e.final_mem_access = *record; + }) + .or_insert(MemoryLocalEvent { + addr, + initial_mem_access: prev_record, + final_mem_access: *record, + }); + } + // Construct the memory write record. - MemoryWriteRecord::new(value, shard, timestamp, prev_value, prev_shard, prev_timestamp) + MemoryWriteRecord::new( + record.value, + record.shard, + record.timestamp, + prev_record.value, + prev_record.shard, + prev_record.timestamp, + ) } /// Read from memory, assuming that all addresses are aligned. @@ -450,7 +510,7 @@ impl<'a> Executor<'a> { assert_valid_memory_access!(addr, position); // Read the address from memory and create a memory read record. - let record = self.mr(addr, self.shard(), self.timestamp(&position)); + let record = self.mr(addr, self.shard(), self.timestamp(&position), None); // If we're not in unconstrained mode, record the access for the current cycle. if !self.unconstrained && self.executor_mode == ExecutorMode::Trace { @@ -475,7 +535,7 @@ impl<'a> Executor<'a> { assert_valid_memory_access!(addr, position); // Read the address from memory and create a memory read record. - let record = self.mw(addr, value, self.shard(), self.timestamp(&position)); + let record = self.mw(addr, value, self.shard(), self.timestamp(&position), None); // If we're not in unconstrained mode, record the access for the current cycle. if !self.unconstrained && self.executor_mode == ExecutorMode::Trace { @@ -522,7 +582,6 @@ impl<'a> Executor<'a> { fn emit_cpu( &mut self, shard: u32, - channel: u8, clk: u32, pc: u32, next_pc: u32, @@ -538,7 +597,6 @@ impl<'a> Executor<'a> { ) { let cpu_event = CpuEvent { shard, - channel, clk, pc, next_pc, @@ -565,6 +623,7 @@ impl<'a> Executor<'a> { }; self.record.cpu_events.push(cpu_event); + emit_cpu_dependencies(self, &cpu_event); } /// Emit an ALU event. @@ -573,7 +632,6 @@ impl<'a> Executor<'a> { lookup_id, shard: self.shard(), clk, - channel: self.channel(), opcode, a, b, @@ -604,11 +662,26 @@ impl<'a> Executor<'a> { } Opcode::DIVU | Opcode::REMU | Opcode::DIV | Opcode::REM => { self.record.divrem_events.push(event); + emit_divrem_dependencies(self, event); } _ => {} } } + fn emit_syscall( + &mut self, + clk: u32, + syscall_id: u32, + arg1: u32, + arg2: u32, + lookup_id: LookupId, + ) { + let syscall_event = + SyscallEvent { shard: self.shard(), clk, syscall_id, arg1, arg2, lookup_id }; + + self.record.syscall_events.push(syscall_event); + } + /// Fetch the destination register and input operand values for an ALU instruction. fn alu_rr(&mut self, instruction: &Instruction) -> (Register, u32, u32) { if !instruction.imm_c { @@ -942,6 +1015,9 @@ impl<'a> Executor<'a> { } let syscall_impl = self.get_syscall(syscall).cloned(); + if syscall.should_send() != 0 { + self.emit_syscall(clk, syscall.syscall_id(), b, c, syscall_lookup_id); + } let mut precompile_rt = SyscallContext::new(self); precompile_rt.syscall_lookup_id = syscall_lookup_id; let (precompile_next_pc, precompile_cycles, returned_exit_code) = @@ -949,7 +1025,7 @@ impl<'a> Executor<'a> { // Executing a syscall optionally returns a value to write to the t0 // register. If it returns None, we just keep the // syscall_id in t0. - let res = syscall_impl.execute(&mut precompile_rt, b, c); + let res = syscall_impl.execute(&mut precompile_rt, syscall, b, c); if let Some(val) = res { a = val; } else { @@ -1068,18 +1144,10 @@ impl<'a> Executor<'a> { // Update the clk to the next cycle. self.state.clk += 4; - let channel = self.channel(); - - // Update the channel to the next cycle. - if !self.unconstrained { - self.state.channel = (self.state.channel + 1) % NUM_BYTE_LOOKUP_CHANNELS; - } - // Emit the CPU event for this cycle. if self.executor_mode == ExecutorMode::Trace { self.emit_cpu( self.shard(), - channel, clk, pc, next_pc, @@ -1117,7 +1185,6 @@ impl<'a> Executor<'a> { if !self.unconstrained && self.max_syscall_cycles + self.state.clk >= self.shard_size { self.state.current_shard += 1; self.state.clk = 0; - self.state.channel = 0; self.bump_record(); } @@ -1141,6 +1208,11 @@ impl<'a> Executor<'a> { /// Bump the record. pub fn bump_record(&mut self) { + // Copy all of the existing local memory accesses to the record's local_memory_access vec. + for (_, event) in self.local_memory_access.drain() { + self.record.cpu_local_memory_access.push(event); + } + let removed_record = std::mem::replace(&mut self.record, ExecutionRecord::new(self.program.clone())); let public_values = removed_record.public_values; @@ -1204,7 +1276,6 @@ impl<'a> Executor<'a> { fn initialize(&mut self) { self.state.clk = 0; - self.state.channel = 0; tracing::debug!("loading memory image"); for (&addr, value) in &self.program.memory_image { @@ -1342,7 +1413,7 @@ impl<'a> Executor<'a> { } // SECTION: Set up all MemoryInitializeFinalizeEvents needed for memory argument. - let memory_finalize_events = &mut self.record.memory_finalize_events; + let memory_finalize_events = &mut self.record.global_memory_finalize_events; // We handle the addr = 0 case separately, as we constrain it to be 0 in the first row // of the memory finalize table so it must be first in the array of events. @@ -1355,7 +1426,7 @@ impl<'a> Executor<'a> { memory_finalize_events .push(MemoryInitializeFinalizeEvent::finalize_from_record(0, addr_0_final_record)); - let memory_initialize_events = &mut self.record.memory_initialize_events; + let memory_initialize_events = &mut self.record.global_memory_initialize_events; let addr_0_initialize_event = MemoryInitializeFinalizeEvent::initialize(0, 0, addr_0_record.is_some()); memory_initialize_events.push(addr_0_initialize_event); @@ -1419,10 +1490,6 @@ pub const fn align(addr: u32) -> u32 { addr - addr % 4 } -// TODO: FIX -/// The number of different byte lookup channels. -pub const NUM_BYTE_LOOKUP_CHANNELS: u8 = 16; - #[cfg(test)] mod tests { diff --git a/crates/core/executor/src/lib.rs b/crates/core/executor/src/lib.rs index a5c1941dbd..a4b6a06ced 100644 --- a/crates/core/executor/src/lib.rs +++ b/crates/core/executor/src/lib.rs @@ -20,6 +20,7 @@ #![warn(missing_docs)] mod context; +mod dependencies; mod disassembler; pub mod events; mod executor; @@ -53,3 +54,4 @@ pub use register::*; pub use report::*; pub use shape::*; pub use state::*; +pub use utils::*; diff --git a/crates/core/executor/src/record.rs b/crates/core/executor/src/record.rs index 4241e3074a..c747a557a5 100644 --- a/crates/core/executor/src/record.rs +++ b/crates/core/executor/src/record.rs @@ -5,20 +5,19 @@ use sp1_stark::{ air::{MachineAir, PublicValues}, MachineRecord, SP1CoreOpts, SplitOpts, }; -use std::sync::Arc; +use std::{mem::take, sync::Arc}; use serde::{Deserialize, Serialize}; use super::{program::Program, Opcode}; use crate::{ events::{ - add_sharded_byte_lookup_events, AluEvent, ByteLookupEvent, ByteRecord, CpuEvent, - EdDecompressEvent, EllipticCurveAddEvent, EllipticCurveDecompressEvent, - EllipticCurveDoubleEvent, Fp2AddSubEvent, Fp2MulEvent, FpOpEvent, KeccakPermuteEvent, - LookupId, MemoryInitializeFinalizeEvent, MemoryRecordEnum, ShaCompressEvent, - ShaExtendEvent, Uint256MulEvent, + add_sharded_byte_lookup_events, AluEvent, ByteLookupEvent, ByteRecord, CpuEvent, LookupId, + MemoryInitializeFinalizeEvent, MemoryLocalEvent, MemoryRecordEnum, PrecompileEvent, + PrecompileEvents, SyscallEvent, }, - shape::CoreShape, + syscalls::SyscallCode, + CoreShape, }; /// A record of the execution of a program. @@ -48,50 +47,16 @@ pub struct ExecutionRecord { pub lt_events: Vec, /// A trace of the byte lookups that are needed. pub byte_lookups: HashMap>, - /// A trace of the sha256 extend events. - pub sha_extend_events: Vec, - /// A trace of the sha256 compress events. - pub sha_compress_events: Vec, - /// A trace of the keccak256 permute events. - pub keccak_permute_events: Vec, - /// A trace of the edwards add events. - pub ed_add_events: Vec, - /// A trace of the edwards decompress events. - pub ed_decompress_events: Vec, - /// A trace of the secp256k1 add events. - pub secp256k1_add_events: Vec, - /// A trace of the secp256k1 double events. - pub secp256k1_double_events: Vec, - /// A trace of the bn254 add events. - pub bn254_add_events: Vec, - /// A trace of the bn254 double events. - pub bn254_double_events: Vec, - /// A trace of the k256 decompress events. - pub k256_decompress_events: Vec, - /// A trace of the bls12381 add events. - pub bls12381_add_events: Vec, - /// A trace of the bls12381 double events. - pub bls12381_double_events: Vec, - /// A trace of the uint256 mul events. - pub uint256_mul_events: Vec, - /// A trace of the memory initialize events. - pub memory_initialize_events: Vec, - /// A trace of the memory finalize events. - pub memory_finalize_events: Vec, - /// A trace of the bls12381 decompress events. - pub bls12381_decompress_events: Vec, - /// A trace of the bls12381 fp events. - pub bls12381_fp_events: Vec, - /// A trace of the bls12381 fp2 add/sub events. - pub bls12381_fp2_addsub_events: Vec, - /// A trace of the bls12381 fp2 mul events. - pub bls12381_fp2_mul_events: Vec, - /// A trace of the bn254 fp events. - pub bn254_fp_events: Vec, - /// A trace of the bn254 fp2 add/sub events. - pub bn254_fp2_addsub_events: Vec, - /// A trace of the bn254 fp2 mul events. - pub bn254_fp2_mul_events: Vec, + /// A trace of the precompile events. + pub precompile_events: PrecompileEvents, + /// A trace of the global memory initialize events. + pub global_memory_initialize_events: Vec, + /// A trace of the global memory finalize events. + pub global_memory_finalize_events: Vec, + /// A trace of all the shard's local memory events. + pub cpu_local_memory_access: Vec, + /// A trace of all the syscall events. + pub syscall_events: Vec, /// The public values. pub public_values: PublicValues, /// The nonce lookup. @@ -155,31 +120,13 @@ impl ExecutionRecord { /// included in every shard. #[must_use] pub fn defer(&mut self) -> ExecutionRecord { - ExecutionRecord { - keccak_permute_events: std::mem::take(&mut self.keccak_permute_events), - secp256k1_add_events: std::mem::take(&mut self.secp256k1_add_events), - secp256k1_double_events: std::mem::take(&mut self.secp256k1_double_events), - bn254_fp_events: std::mem::take(&mut self.bn254_fp_events), - bn254_fp2_addsub_events: std::mem::take(&mut self.bn254_fp2_addsub_events), - bn254_fp2_mul_events: std::mem::take(&mut self.bn254_fp2_mul_events), - bn254_add_events: std::mem::take(&mut self.bn254_add_events), - bn254_double_events: std::mem::take(&mut self.bn254_double_events), - bls12381_add_events: std::mem::take(&mut self.bls12381_add_events), - bls12381_double_events: std::mem::take(&mut self.bls12381_double_events), - sha_extend_events: std::mem::take(&mut self.sha_extend_events), - sha_compress_events: std::mem::take(&mut self.sha_compress_events), - ed_add_events: std::mem::take(&mut self.ed_add_events), - ed_decompress_events: std::mem::take(&mut self.ed_decompress_events), - k256_decompress_events: std::mem::take(&mut self.k256_decompress_events), - uint256_mul_events: std::mem::take(&mut self.uint256_mul_events), - bls12381_fp_events: std::mem::take(&mut self.bls12381_fp_events), - bls12381_fp2_addsub_events: std::mem::take(&mut self.bls12381_fp2_addsub_events), - bls12381_fp2_mul_events: std::mem::take(&mut self.bls12381_fp2_mul_events), - bls12381_decompress_events: std::mem::take(&mut self.bls12381_decompress_events), - memory_initialize_events: std::mem::take(&mut self.memory_initialize_events), - memory_finalize_events: std::mem::take(&mut self.memory_finalize_events), - ..Default::default() - } + let mut execution_record = ExecutionRecord::new(self.program.clone()); + execution_record.precompile_events = std::mem::take(&mut self.precompile_events); + execution_record.global_memory_initialize_events = + std::mem::take(&mut self.global_memory_initialize_events); + execution_record.global_memory_finalize_events = + std::mem::take(&mut self.global_memory_finalize_events); + execution_record } /// Splits the deferred [`ExecutionRecord`] into multiple [`ExecutionRecord`]s, each which @@ -187,67 +134,50 @@ impl ExecutionRecord { pub fn split(&mut self, last: bool, opts: SplitOpts) -> Vec { let mut shards = Vec::new(); - macro_rules! split_events { - ($self:ident, $events:ident, $shards:ident, $threshold:expr, $exact:expr) => { - let events = std::mem::take(&mut $self.$events); - let chunks = events.chunks_exact($threshold); - if !$exact { - $self.$events = chunks.remainder().to_vec(); - } else { - let remainder = chunks.remainder().to_vec(); - if !remainder.is_empty() { - $shards.push(ExecutionRecord { - $events: chunks.remainder().to_vec(), - program: self.program.clone(), - ..Default::default() - }); - } - } - let mut event_shards = chunks - .map(|chunk| ExecutionRecord { - $events: chunk.to_vec(), - program: self.program.clone(), - ..Default::default() - }) - .collect::>(); - $shards.append(&mut event_shards); + let precompile_events = take(&mut self.precompile_events); + + for (syscall_code, events) in precompile_events.into_iter() { + let threshold = match syscall_code { + SyscallCode::KECCAK_PERMUTE => opts.keccak, + SyscallCode::SHA_EXTEND => opts.sha_extend, + SyscallCode::SHA_COMPRESS => opts.sha_compress, + _ => opts.deferred, }; - } - split_events!(self, keccak_permute_events, shards, opts.keccak, last); - split_events!(self, secp256k1_add_events, shards, opts.deferred, last); - split_events!(self, secp256k1_double_events, shards, opts.deferred, last); - split_events!(self, bn254_add_events, shards, opts.deferred, last); - split_events!(self, bn254_double_events, shards, opts.deferred, last); - split_events!(self, bls12381_add_events, shards, opts.deferred, last); - split_events!(self, bls12381_double_events, shards, opts.deferred, last); - split_events!(self, sha_extend_events, shards, opts.sha_extend, last); - split_events!(self, sha_compress_events, shards, opts.sha_compress, last); - split_events!(self, ed_add_events, shards, opts.deferred, last); - split_events!(self, ed_decompress_events, shards, opts.deferred, last); - split_events!(self, k256_decompress_events, shards, opts.deferred, last); - split_events!(self, uint256_mul_events, shards, opts.deferred, last); - split_events!(self, bls12381_decompress_events, shards, opts.deferred, last); - split_events!(self, bls12381_fp_events, shards, opts.deferred, last); - split_events!(self, bls12381_fp2_addsub_events, shards, opts.deferred, last); - split_events!(self, bls12381_fp2_mul_events, shards, opts.deferred, last); - split_events!(self, bn254_fp_events, shards, opts.deferred, last); - split_events!(self, bn254_fp2_addsub_events, shards, opts.deferred, last); - split_events!(self, bn254_fp2_mul_events, shards, opts.deferred, last); + let chunks = events.chunks_exact(threshold); + if last { + let remainder = chunks.remainder().to_vec(); + if !remainder.is_empty() { + let mut execution_record = ExecutionRecord::new(self.program.clone()); + execution_record.precompile_events.insert(syscall_code, remainder); + shards.push(execution_record); + } + } else { + self.precompile_events.insert(syscall_code, chunks.remainder().to_vec()); + } + let mut event_shards = chunks + .map(|chunk| { + let mut execution_record = ExecutionRecord::new(self.program.clone()); + execution_record.precompile_events.insert(syscall_code, chunk.to_vec()); + execution_record + }) + .collect::>(); + shards.append(&mut event_shards); + } // _ = last_pct; if last { // shards.push(last_shard); - self.memory_initialize_events.sort_by_key(|event| event.addr); - self.memory_finalize_events.sort_by_key(|event| event.addr); + self.global_memory_initialize_events.sort_by_key(|event| event.addr); + self.global_memory_finalize_events.sort_by_key(|event| event.addr); let mut init_addr_bits = [0; 32]; let mut finalize_addr_bits = [0; 32]; for mem_chunks in self - .memory_initialize_events + .global_memory_initialize_events .chunks(opts.memory) - .zip_longest(self.memory_finalize_events.chunks(opts.memory)) + .zip_longest(self.global_memory_finalize_events.chunks(opts.memory)) { let (mem_init_chunk, mem_finalize_chunk) = match mem_chunks { EitherOrBoth::Both(mem_init_chunk, mem_finalize_chunk) => { @@ -256,9 +186,8 @@ impl ExecutionRecord { EitherOrBoth::Left(mem_init_chunk) => (mem_init_chunk, [].as_slice()), EitherOrBoth::Right(mem_finalize_chunk) => ([].as_slice(), mem_finalize_chunk), }; - let mut shard = ExecutionRecord::default(); - shard.program = self.program.clone(); - shard.memory_initialize_events.extend_from_slice(mem_init_chunk); + let mut shard = ExecutionRecord::new(self.program.clone()); + shard.global_memory_initialize_events.extend_from_slice(mem_init_chunk); shard.public_values.previous_init_addr_bits = init_addr_bits; if let Some(last_event) = mem_init_chunk.last() { let last_init_addr_bits = core::array::from_fn(|i| (last_event.addr >> i) & 1); @@ -266,7 +195,7 @@ impl ExecutionRecord { } shard.public_values.last_init_addr_bits = init_addr_bits; - shard.memory_finalize_events.extend_from_slice(mem_finalize_chunk); + shard.global_memory_finalize_events.extend_from_slice(mem_finalize_chunk); shard.public_values.previous_finalize_addr_bits = finalize_addr_bits; if let Some(last_event) = mem_finalize_chunk.last() { let last_finalize_addr_bits = @@ -299,6 +228,26 @@ impl ExecutionRecord { pub fn contains_cpu(&self) -> bool { !self.cpu_events.is_empty() } + + #[inline] + /// Add a precompile event to the execution record. + pub fn add_precompile_event(&mut self, syscall_code: SyscallCode, event: PrecompileEvent) { + self.precompile_events.add_event(syscall_code, event); + } + + /// Get all the precompile events for a syscall code. + #[inline] + #[must_use] + pub fn get_precompile_events(&self, syscall_code: SyscallCode) -> &Vec { + self.precompile_events.get_events(syscall_code) + } + + /// Get all the local memory events. + #[inline] + pub fn get_local_mem_events(&self) -> impl Iterator { + let precompile_local_mem_events = self.precompile_events.get_local_mem_events(); + precompile_local_mem_events.chain(self.cpu_local_memory_access.iter()) + } } /// A memory access record. @@ -328,34 +277,20 @@ impl MachineRecord for ExecutionRecord { stats.insert("shift_right_events".to_string(), self.shift_right_events.len()); stats.insert("divrem_events".to_string(), self.divrem_events.len()); stats.insert("lt_events".to_string(), self.lt_events.len()); - stats.insert("sha_extend_events".to_string(), self.sha_extend_events.len()); - stats.insert("sha_compress_events".to_string(), self.sha_compress_events.len()); - stats.insert("keccak_permute_events".to_string(), self.keccak_permute_events.len()); - stats.insert("ed_add_events".to_string(), self.ed_add_events.len()); - stats.insert("ed_decompress_events".to_string(), self.ed_decompress_events.len()); - stats.insert("secp256k1_add_events".to_string(), self.secp256k1_add_events.len()); - stats.insert("secp256k1_double_events".to_string(), self.secp256k1_double_events.len()); - stats.insert("bn254_add_events".to_string(), self.bn254_add_events.len()); - stats.insert("bn254_double_events".to_string(), self.bn254_double_events.len()); - stats.insert("k256_decompress_events".to_string(), self.k256_decompress_events.len()); - stats.insert("bls12381_add_events".to_string(), self.bls12381_add_events.len()); - stats.insert("bls12381_double_events".to_string(), self.bls12381_double_events.len()); - stats.insert("uint256_mul_events".to_string(), self.uint256_mul_events.len()); - stats.insert("bls12381_fp_event".to_string(), self.bls12381_fp_events.len()); + + for (syscall_code, events) in self.precompile_events.iter() { + stats.insert(format!("syscall {syscall_code:?}"), events.len()); + } + stats.insert( - "bls12381_fp2_addsub_events".to_string(), - self.bls12381_fp2_addsub_events.len(), + "global_memory_initialize_events".to_string(), + self.global_memory_initialize_events.len(), ); - stats.insert("bls12381_fp2_mul_events".to_string(), self.bls12381_fp2_mul_events.len()); - stats.insert("bn254_fp_events".to_string(), self.bn254_fp_events.len()); - stats.insert("bn254_fp2_addsub_events".to_string(), self.bn254_fp2_addsub_events.len()); - stats.insert("bn254_fp2_mul_events".to_string(), self.bn254_fp2_mul_events.len()); stats.insert( - "bls12381_decompress_events".to_string(), - self.bls12381_decompress_events.len(), + "global_memory_finalize_events".to_string(), + self.global_memory_finalize_events.len(), ); - stats.insert("memory_initialize_events".to_string(), self.memory_initialize_events.len()); - stats.insert("memory_finalize_events".to_string(), self.memory_finalize_events.len()); + stats.insert("local_memory_access_events".to_string(), self.cpu_local_memory_access.len()); if !self.cpu_events.is_empty() { let shard = self.cpu_events[0].shard; stats.insert( @@ -378,28 +313,9 @@ impl MachineRecord for ExecutionRecord { self.shift_right_events.append(&mut other.shift_right_events); self.divrem_events.append(&mut other.divrem_events); self.lt_events.append(&mut other.lt_events); - self.sha_extend_events.append(&mut other.sha_extend_events); - self.sha_compress_events.append(&mut other.sha_compress_events); - self.keccak_permute_events.append(&mut other.keccak_permute_events); - self.ed_add_events.append(&mut other.ed_add_events); - self.ed_decompress_events.append(&mut other.ed_decompress_events); - self.secp256k1_add_events.append(&mut other.secp256k1_add_events); - self.secp256k1_double_events.append(&mut other.secp256k1_double_events); - self.bn254_add_events.append(&mut other.bn254_add_events); - self.bn254_double_events.append(&mut other.bn254_double_events); - self.k256_decompress_events.append(&mut other.k256_decompress_events); - self.bls12381_add_events.append(&mut other.bls12381_add_events); - self.bls12381_double_events.append(&mut other.bls12381_double_events); - self.uint256_mul_events.append(&mut other.uint256_mul_events); - self.bls12381_fp_events.append(&mut other.bls12381_fp_events); - self.bls12381_fp2_addsub_events.append(&mut other.bls12381_fp2_addsub_events); - self.bls12381_fp2_mul_events.append(&mut other.bls12381_fp2_mul_events); - self.bn254_fp_events.append(&mut other.bn254_fp_events); - self.bn254_fp2_addsub_events.append(&mut other.bn254_fp2_addsub_events); - self.bn254_fp2_mul_events.append(&mut other.bn254_fp2_mul_events); - self.bls12381_decompress_events.append(&mut other.bls12381_decompress_events); - - self.bls12381_decompress_events.append(&mut other.bls12381_decompress_events); + self.syscall_events.append(&mut other.syscall_events); + + self.precompile_events.append(&mut other.precompile_events); if self.byte_lookups.is_empty() { self.byte_lookups = std::mem::take(&mut other.byte_lookups); @@ -407,8 +323,9 @@ impl MachineRecord for ExecutionRecord { self.add_sharded_byte_lookup_events(vec![&other.byte_lookups]); } - self.memory_initialize_events.append(&mut other.memory_initialize_events); - self.memory_finalize_events.append(&mut other.memory_finalize_events); + self.global_memory_initialize_events.append(&mut other.global_memory_initialize_events); + self.global_memory_finalize_events.append(&mut other.global_memory_finalize_events); + self.cpu_local_memory_access.append(&mut other.cpu_local_memory_access); } fn register_nonces(&mut self, _opts: &Self::Config) { diff --git a/crates/core/executor/src/state.rs b/crates/core/executor/src/state.rs index 614a6147d5..775bf72f4d 100644 --- a/crates/core/executor/src/state.rs +++ b/crates/core/executor/src/state.rs @@ -30,10 +30,6 @@ pub struct ExecutionState { /// executed in this shard. pub clk: u32, - /// The channel alternates between 0 and [`crate::bytes::NUM_BYTE_LOOKUP_CHANNELS`], - /// used to controll byte lookup multiplicity. - pub channel: u8, - /// The program counter. pub pc: u32, @@ -82,7 +78,6 @@ impl ExecutionState { // Start at shard 1 since shard 0 is reserved for memory initialization. current_shard: 1, clk: 0, - channel: 0, pc: pc_start, memory: PagedMemory::new_preallocated(), uninitialized_memory: HashMap::default(), diff --git a/crates/core/executor/src/syscalls/commit.rs b/crates/core/executor/src/syscalls/commit.rs index 89c462a3d4..2772fb6208 100644 --- a/crates/core/executor/src/syscalls/commit.rs +++ b/crates/core/executor/src/syscalls/commit.rs @@ -1,4 +1,4 @@ -use super::{Syscall, SyscallContext}; +use super::{Syscall, SyscallCode, SyscallContext}; pub(crate) struct CommitSyscall; @@ -7,6 +7,7 @@ impl Syscall for CommitSyscall { fn execute( &self, ctx: &mut SyscallContext, + _: SyscallCode, word_idx: u32, public_values_digest_word: u32, ) -> Option { diff --git a/crates/core/executor/src/syscalls/context.rs b/crates/core/executor/src/syscalls/context.rs index 60c93e478b..9db49c5cae 100644 --- a/crates/core/executor/src/syscalls/context.rs +++ b/crates/core/executor/src/syscalls/context.rs @@ -1,5 +1,7 @@ +use hashbrown::HashMap; + use crate::{ - events::{LookupId, MemoryReadRecord, MemoryWriteRecord}, + events::{LookupId, MemoryLocalEvent, MemoryReadRecord, MemoryWriteRecord}, record::ExecutionRecord, Executor, Register, }; @@ -20,6 +22,8 @@ pub struct SyscallContext<'a, 'b: 'a> { pub rt: &'a mut Executor<'b>, /// The syscall lookup id. pub syscall_lookup_id: LookupId, + /// The local memory access events for the syscall. + pub local_memory_access: HashMap, } impl<'a, 'b> SyscallContext<'a, 'b> { @@ -34,6 +38,7 @@ impl<'a, 'b> SyscallContext<'a, 'b> { exit_code: 0, rt: runtime, syscall_lookup_id: LookupId::default(), + local_memory_access: HashMap::new(), } } @@ -48,15 +53,10 @@ impl<'a, 'b> SyscallContext<'a, 'b> { self.rt.state.current_shard } - /// Get the current channel. - #[must_use] - pub fn current_channel(&self) -> u8 { - self.rt.state.channel - } - /// Read a word from memory. pub fn mr(&mut self, addr: u32) -> (MemoryReadRecord, u32) { - let record = self.rt.mr(addr, self.current_shard, self.clk); + let record = + self.rt.mr(addr, self.current_shard, self.clk, Some(&mut self.local_memory_access)); (record, record.value) } @@ -74,7 +74,7 @@ impl<'a, 'b> SyscallContext<'a, 'b> { /// Write a word to memory. pub fn mw(&mut self, addr: u32, value: u32) -> MemoryWriteRecord { - self.rt.mw(addr, value, self.current_shard, self.clk) + self.rt.mw(addr, value, self.current_shard, self.clk, Some(&mut self.local_memory_access)) } /// Write a slice of words to memory. @@ -87,6 +87,28 @@ impl<'a, 'b> SyscallContext<'a, 'b> { records } + /// Postprocess the syscall. Specifically will process the syscall's memory local events. + pub fn postprocess(&mut self) -> Vec { + let mut syscall_local_mem_events = Vec::new(); + + if !self.rt.unconstrained { + // Will need to transfer the existing memory local events in the executor to it's record, + // and return all the syscall memory local events. This is similar to what + // `bump_record` does. + for (addr, event) in self.local_memory_access.drain() { + let local_mem_access = self.rt.local_memory_access.remove(&addr); + + if let Some(local_mem_access) = local_mem_access { + self.rt.record.cpu_local_memory_access.push(local_mem_access); + } + + syscall_local_mem_events.push(event); + } + } + + syscall_local_mem_events + } + /// Get the current value of a register, but doesn't use a memory record. /// This is generally unconstrained, so you must be careful using it. #[must_use] diff --git a/crates/core/executor/src/syscalls/deferred.rs b/crates/core/executor/src/syscalls/deferred.rs index d8f5167f58..a1045f93d5 100644 --- a/crates/core/executor/src/syscalls/deferred.rs +++ b/crates/core/executor/src/syscalls/deferred.rs @@ -1,10 +1,16 @@ -use super::{Syscall, SyscallContext}; +use super::{Syscall, SyscallCode, SyscallContext}; pub(crate) struct CommitDeferredSyscall; impl Syscall for CommitDeferredSyscall { #[allow(clippy::mut_mut)] - fn execute(&self, ctx: &mut SyscallContext, word_idx: u32, word: u32) -> Option { + fn execute( + &self, + ctx: &mut SyscallContext, + _: SyscallCode, + word_idx: u32, + word: u32, + ) -> Option { let rt = &mut ctx.rt; rt.record.public_values.deferred_proofs_digest[word_idx as usize] = word; diff --git a/crates/core/executor/src/syscalls/halt.rs b/crates/core/executor/src/syscalls/halt.rs index 5488be00e3..e09690caad 100644 --- a/crates/core/executor/src/syscalls/halt.rs +++ b/crates/core/executor/src/syscalls/halt.rs @@ -1,9 +1,15 @@ -use super::{context::SyscallContext, Syscall}; +use super::{context::SyscallContext, Syscall, SyscallCode}; pub(crate) struct HaltSyscall; impl Syscall for HaltSyscall { - fn execute(&self, ctx: &mut SyscallContext, exit_code: u32, _: u32) -> Option { + fn execute( + &self, + ctx: &mut SyscallContext, + _: SyscallCode, + exit_code: u32, + _: u32, + ) -> Option { ctx.set_next_pc(0); ctx.set_exit_code(exit_code); None diff --git a/crates/core/executor/src/syscalls/hint.rs b/crates/core/executor/src/syscalls/hint.rs index 8f0b7f0b92..89b19a57f4 100644 --- a/crates/core/executor/src/syscalls/hint.rs +++ b/crates/core/executor/src/syscalls/hint.rs @@ -1,9 +1,15 @@ -use super::{Syscall, SyscallContext}; +use super::{Syscall, SyscallCode, SyscallContext}; pub(crate) struct HintLenSyscall; impl Syscall for HintLenSyscall { - fn execute(&self, ctx: &mut SyscallContext, _arg1: u32, _arg2: u32) -> Option { + fn execute( + &self, + ctx: &mut SyscallContext, + _: SyscallCode, + _arg1: u32, + _arg2: u32, + ) -> Option { if ctx.rt.state.input_stream_ptr >= ctx.rt.state.input_stream.len() { panic!( "failed reading stdin due to insufficient input data: input_stream_ptr={}, input_stream_len={}", @@ -18,7 +24,7 @@ impl Syscall for HintLenSyscall { pub(crate) struct HintReadSyscall; impl Syscall for HintReadSyscall { - fn execute(&self, ctx: &mut SyscallContext, ptr: u32, len: u32) -> Option { + fn execute(&self, ctx: &mut SyscallContext, _: SyscallCode, ptr: u32, len: u32) -> Option { if ctx.rt.state.input_stream_ptr >= ctx.rt.state.input_stream.len() { panic!( "failed reading stdin due to insufficient input data: input_stream_ptr={}, input_stream_len={}", diff --git a/crates/core/executor/src/syscalls/mod.rs b/crates/core/executor/src/syscalls/mod.rs index da24a3ab49..6633633102 100644 --- a/crates/core/executor/src/syscalls/mod.rs +++ b/crates/core/executor/src/syscalls/mod.rs @@ -57,7 +57,13 @@ pub trait Syscall: Send + Sync { /// X10 and X11, respectively. While not a hard requirement, the convention is that the return /// value is only for system calls such as `HALT`. Most precompiles use `arg1` and `arg2` to /// denote the addresses of the input data, and write the result to the memory at `arg1`. - fn execute(&self, ctx: &mut SyscallContext, arg1: u32, arg2: u32) -> Option; + fn execute( + &self, + ctx: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option; /// The number of extra cycles that the syscall takes to execute. /// diff --git a/crates/core/executor/src/syscalls/precompiles/edwards/add.rs b/crates/core/executor/src/syscalls/precompiles/edwards/add.rs index 3074392b64..a883848ece 100644 --- a/crates/core/executor/src/syscalls/precompiles/edwards/add.rs +++ b/crates/core/executor/src/syscalls/precompiles/edwards/add.rs @@ -3,8 +3,8 @@ use std::marker::PhantomData; use sp1_curves::{edwards::EdwardsParameters, EllipticCurve}; use crate::{ - events::create_ec_add_event, - syscalls::{Syscall, SyscallContext}, + events::{create_ec_add_event, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub(crate) struct EdwardsAddAssignSyscall { @@ -23,9 +23,15 @@ impl Syscall for EdwardsAddAssignSyscall Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let event = create_ec_add_event::(rt, arg1, arg2); - rt.record_mut().ed_add_events.push(event); + rt.record_mut().add_precompile_event(syscall_code, PrecompileEvent::EdAdd(event)); None } } diff --git a/crates/core/executor/src/syscalls/precompiles/edwards/decompress.rs b/crates/core/executor/src/syscalls/precompiles/edwards/decompress.rs index e4d90a87b0..90884a91bb 100644 --- a/crates/core/executor/src/syscalls/precompiles/edwards/decompress.rs +++ b/crates/core/executor/src/syscalls/precompiles/edwards/decompress.rs @@ -8,8 +8,8 @@ use sp1_curves::{ use sp1_primitives::consts::{bytes_to_words_le, words_to_bytes_le}; use crate::{ - events::{EdDecompressEvent, MemoryReadRecord, MemoryWriteRecord}, - syscalls::{Syscall, SyscallContext}, + events::{EdDecompressEvent, MemoryReadRecord, MemoryWriteRecord, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub(crate) struct EdwardsDecompressSyscall { @@ -24,7 +24,13 @@ impl EdwardsDecompressSyscall { } impl Syscall for EdwardsDecompressSyscall { - fn execute(&self, rt: &mut SyscallContext, arg1: u32, sign: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + sign: u32, + ) -> Option { let start_clk = rt.clk; let slice_ptr = arg1; assert!(slice_ptr % 4 == 0, "Pointer must be 4-byte aligned."); @@ -60,11 +66,9 @@ impl Syscall for EdwardsDecompressSyscall { let lookup_id = rt.syscall_lookup_id; let shard = rt.current_shard(); - let channel = rt.current_channel(); - rt.record_mut().ed_decompress_events.push(EdDecompressEvent { + let event = EdDecompressEvent { lookup_id, shard, - channel, clk: start_clk, ptr: slice_ptr, sign: sign_bool, @@ -72,7 +76,9 @@ impl Syscall for EdwardsDecompressSyscall { decompressed_x_bytes: decompressed_x_bytes.try_into().unwrap(), x_memory_records, y_memory_records, - }); + local_mem_access: rt.postprocess(), + }; + rt.record_mut().add_precompile_event(syscall_code, PrecompileEvent::EdDecompress(event)); None } diff --git a/crates/core/executor/src/syscalls/precompiles/fptower/fp.rs b/crates/core/executor/src/syscalls/precompiles/fptower/fp.rs index 703efa87a5..181030f090 100644 --- a/crates/core/executor/src/syscalls/precompiles/fptower/fp.rs +++ b/crates/core/executor/src/syscalls/precompiles/fptower/fp.rs @@ -7,8 +7,8 @@ use std::marker::PhantomData; use typenum::Unsigned; use crate::{ - events::{FieldOperation, FpOpEvent}, - syscalls::{Syscall, SyscallContext}, + events::{FieldOperation, FpOpEvent, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub struct FpOpSyscall

{ @@ -23,7 +23,13 @@ impl

FpOpSyscall

{ } impl Syscall for FpOpSyscall

{ - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let clk = rt.clk; let x_ptr = arg1; if x_ptr % 4 != 0 { @@ -57,37 +63,47 @@ impl Syscall for FpOpSyscall

{ let lookup_id = rt.syscall_lookup_id; let shard = rt.current_shard(); - let channel = rt.current_channel(); + let event = FpOpEvent { + lookup_id, + shard, + clk, + x_ptr, + x, + y_ptr, + y, + op: self.op, + x_memory_records, + y_memory_records, + local_mem_access: rt.postprocess(), + }; + + // Since all the Fp events are on the same table, we need to preserve the ordering of the + // events b/c of the nonce. In this table's trace_gen, the nonce is simply the row number. + // Group all of the events for a specific curve into the same syscall code key. + // TODO: FIX THIS. + match P::FIELD_TYPE { FieldType::Bn254 => { - rt.record_mut().bn254_fp_events.push(FpOpEvent { - lookup_id, - shard, - channel, - clk, - x_ptr, - x, - y_ptr, - y, - op: self.op, - x_memory_records, - y_memory_records, - }); + let syscall_code_key = match syscall_code { + SyscallCode::BN254_FP_ADD + | SyscallCode::BN254_FP_SUB + | SyscallCode::BN254_FP_MUL => SyscallCode::BN254_FP_ADD, + _ => unreachable!(), + }; + + rt.record_mut() + .add_precompile_event(syscall_code_key, PrecompileEvent::Bn254Fp(event)); } FieldType::Bls12381 => { - rt.record_mut().bls12381_fp_events.push(FpOpEvent { - lookup_id, - shard, - channel, - clk, - x_ptr, - x, - y_ptr, - y, - op: self.op, - x_memory_records, - y_memory_records, - }); + let syscall_code_key = match syscall_code { + SyscallCode::BLS12381_FP_ADD + | SyscallCode::BLS12381_FP_SUB + | SyscallCode::BLS12381_FP_MUL => SyscallCode::BLS12381_FP_ADD, + _ => unreachable!(), + }; + + rt.record_mut() + .add_precompile_event(syscall_code_key, PrecompileEvent::Bls12381Fp(event)); } } diff --git a/crates/core/executor/src/syscalls/precompiles/fptower/fp2_addsub.rs b/crates/core/executor/src/syscalls/precompiles/fptower/fp2_addsub.rs index 548566d61c..9263d466e5 100644 --- a/crates/core/executor/src/syscalls/precompiles/fptower/fp2_addsub.rs +++ b/crates/core/executor/src/syscalls/precompiles/fptower/fp2_addsub.rs @@ -7,8 +7,8 @@ use std::marker::PhantomData; use typenum::Unsigned; use crate::{ - events::{FieldOperation, Fp2AddSubEvent}, - syscalls::{Syscall, SyscallContext}, + events::{FieldOperation, Fp2AddSubEvent, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub struct Fp2AddSubSyscall

{ @@ -23,7 +23,13 @@ impl

Fp2AddSubSyscall

{ } impl Syscall for Fp2AddSubSyscall

{ - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let clk = rt.clk; let x_ptr = arg1; if x_ptr % 4 != 0 { @@ -65,38 +71,47 @@ impl Syscall for Fp2AddSubSyscall

{ let lookup_id = rt.syscall_lookup_id; let shard = rt.current_shard(); - let channel = rt.current_channel(); let op = self.op; + let event = Fp2AddSubEvent { + lookup_id, + shard, + clk, + op, + x_ptr, + x, + y_ptr, + y, + x_memory_records, + y_memory_records, + local_mem_access: rt.postprocess(), + }; match P::FIELD_TYPE { + // All the fp2 add and sub events for a given curve are coalesced to the curve's fp2 add operation. Only check for + // that operation. + // TODO: Fix this. FieldType::Bn254 => { - rt.record_mut().bn254_fp2_addsub_events.push(Fp2AddSubEvent { - lookup_id, - shard, - channel, - clk, - op, - x_ptr, - x, - y_ptr, - y, - x_memory_records, - y_memory_records, - }); + let syscall_code_key = match syscall_code { + SyscallCode::BN254_FP2_ADD | SyscallCode::BN254_FP2_SUB => { + SyscallCode::BN254_FP2_ADD + } + _ => unreachable!(), + }; + + rt.record_mut() + .add_precompile_event(syscall_code_key, PrecompileEvent::Bn254Fp2AddSub(event)); } FieldType::Bls12381 => { - rt.record_mut().bls12381_fp2_addsub_events.push(Fp2AddSubEvent { - lookup_id, - shard, - channel, - clk, - op, - x_ptr, - x, - y_ptr, - y, - x_memory_records, - y_memory_records, - }); + let syscall_code_key = match syscall_code { + SyscallCode::BLS12381_FP2_ADD | SyscallCode::BLS12381_FP2_SUB => { + SyscallCode::BLS12381_FP2_ADD + } + _ => unreachable!(), + }; + + rt.record_mut().add_precompile_event( + syscall_code_key, + PrecompileEvent::Bls12381Fp2AddSub(event), + ); } } None diff --git a/crates/core/executor/src/syscalls/precompiles/fptower/fp2_mul.rs b/crates/core/executor/src/syscalls/precompiles/fptower/fp2_mul.rs index 652bba0037..4bfae253ab 100644 --- a/crates/core/executor/src/syscalls/precompiles/fptower/fp2_mul.rs +++ b/crates/core/executor/src/syscalls/precompiles/fptower/fp2_mul.rs @@ -8,8 +8,8 @@ use sp1_curves::{ use typenum::Unsigned; use crate::{ - events::Fp2MulEvent, - syscalls::{Syscall, SyscallContext}, + events::{Fp2MulEvent, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub struct Fp2MulSyscall

{ @@ -23,7 +23,13 @@ impl

Fp2MulSyscall

{ } impl Syscall for Fp2MulSyscall

{ - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let clk = rt.clk; let x_ptr = arg1; if x_ptr % 4 != 0 { @@ -64,32 +70,25 @@ impl Syscall for Fp2MulSyscall

{ let lookup_id = rt.syscall_lookup_id; let shard = rt.current_shard(); - let channel = rt.current_channel(); + let event = Fp2MulEvent { + lookup_id, + shard, + clk, + x_ptr, + x, + y_ptr, + y, + x_memory_records, + y_memory_records, + local_mem_access: rt.postprocess(), + }; match P::FIELD_TYPE { - FieldType::Bn254 => rt.record_mut().bn254_fp2_mul_events.push(Fp2MulEvent { - lookup_id, - shard, - channel, - clk, - x_ptr, - x, - y_ptr, - y, - x_memory_records, - y_memory_records, - }), - FieldType::Bls12381 => rt.record_mut().bls12381_fp2_mul_events.push(Fp2MulEvent { - lookup_id, - shard, - channel, - clk, - x_ptr, - x, - y_ptr, - y, - x_memory_records, - y_memory_records, - }), + FieldType::Bn254 => rt + .record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Bn254Fp2Mul(event)), + FieldType::Bls12381 => rt + .record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Bls12381Fp2Mul(event)), }; None } diff --git a/crates/core/executor/src/syscalls/precompiles/keccak256/permute.rs b/crates/core/executor/src/syscalls/precompiles/keccak256/permute.rs index 70c64950dd..0b668e87a8 100644 --- a/crates/core/executor/src/syscalls/precompiles/keccak256/permute.rs +++ b/crates/core/executor/src/syscalls/precompiles/keccak256/permute.rs @@ -1,6 +1,6 @@ use crate::{ - events::KeccakPermuteEvent, - syscalls::{Syscall, SyscallContext}, + events::{KeccakPermuteEvent, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; use tiny_keccak::keccakf; @@ -17,7 +17,13 @@ impl Syscall for Keccak256PermuteSyscall { 1 } - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let start_clk = rt.clk; let state_ptr = arg1; if arg2 != 0 { @@ -58,19 +64,19 @@ impl Syscall for Keccak256PermuteSyscall { // Push the Keccak permute event. let shard = rt.current_shard(); - let channel = rt.current_channel(); let lookup_id = rt.syscall_lookup_id; - rt.record_mut().keccak_permute_events.push(KeccakPermuteEvent { + let event = PrecompileEvent::KeccakPermute(KeccakPermuteEvent { lookup_id, shard, - channel, clk: start_clk, pre_state: saved_state.as_slice().try_into().unwrap(), post_state: state.as_slice().try_into().unwrap(), state_read_records, state_write_records, state_addr: state_ptr, + local_mem_access: rt.postprocess(), }); + rt.record_mut().add_precompile_event(syscall_code, event); None } diff --git a/crates/core/executor/src/syscalls/precompiles/sha256/compress.rs b/crates/core/executor/src/syscalls/precompiles/sha256/compress.rs index 1c8317cfc9..4fad4ff42e 100644 --- a/crates/core/executor/src/syscalls/precompiles/sha256/compress.rs +++ b/crates/core/executor/src/syscalls/precompiles/sha256/compress.rs @@ -1,6 +1,6 @@ use crate::{ - events::ShaCompressEvent, - syscalls::{Syscall, SyscallContext}, + events::{PrecompileEvent, ShaCompressEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub const SHA_COMPRESS_K: [u32; 64] = [ @@ -21,8 +21,15 @@ impl Syscall for Sha256CompressSyscall { 1 } + #[allow(clippy::too_many_lines)] #[allow(clippy::many_single_char_names)] - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let w_ptr = arg1; let h_ptr = arg2; assert_ne!(w_ptr, h_ptr); @@ -88,11 +95,9 @@ impl Syscall for Sha256CompressSyscall { // Push the SHA extend event. let lookup_id = rt.syscall_lookup_id; let shard = rt.current_shard(); - let channel = rt.current_channel(); - rt.record_mut().sha_compress_events.push(ShaCompressEvent { + let event = PrecompileEvent::ShaCompress(ShaCompressEvent { lookup_id, shard, - channel, clk: start_clk, w_ptr, h_ptr, @@ -101,7 +106,9 @@ impl Syscall for Sha256CompressSyscall { h_read_records: h_read_records.try_into().unwrap(), w_i_read_records, h_write_records: h_write_records.try_into().unwrap(), + local_mem_access: rt.postprocess(), }); + rt.record_mut().add_precompile_event(syscall_code, event); None } diff --git a/crates/core/executor/src/syscalls/precompiles/sha256/extend.rs b/crates/core/executor/src/syscalls/precompiles/sha256/extend.rs index 842fc678b8..4b3fe7f479 100644 --- a/crates/core/executor/src/syscalls/precompiles/sha256/extend.rs +++ b/crates/core/executor/src/syscalls/precompiles/sha256/extend.rs @@ -1,6 +1,6 @@ use crate::{ - events::ShaExtendEvent, - syscalls::{Syscall, SyscallContext}, + events::{PrecompileEvent, ShaExtendEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub(crate) struct Sha256ExtendSyscall; @@ -10,7 +10,13 @@ impl Syscall for Sha256ExtendSyscall { 48 } - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let clk_init = rt.clk; let w_ptr = arg1; assert!(arg2 == 0, "arg2 must be 0"); @@ -57,11 +63,9 @@ impl Syscall for Sha256ExtendSyscall { // Push the SHA extend event. let lookup_id = rt.syscall_lookup_id; let shard = rt.current_shard(); - let channel = rt.current_channel(); - rt.record_mut().sha_extend_events.push(ShaExtendEvent { + let event = PrecompileEvent::ShaExtend(ShaExtendEvent { lookup_id, shard, - channel, clk: clk_init, w_ptr: w_ptr_init, w_i_minus_15_reads, @@ -69,7 +73,9 @@ impl Syscall for Sha256ExtendSyscall { w_i_minus_16_reads, w_i_minus_7_reads, w_i_writes, + local_mem_access: rt.postprocess(), }); + rt.record_mut().add_precompile_event(syscall_code, event); None } diff --git a/crates/core/executor/src/syscalls/precompiles/uint256.rs b/crates/core/executor/src/syscalls/precompiles/uint256.rs index 4592f999fc..32160992b2 100644 --- a/crates/core/executor/src/syscalls/precompiles/uint256.rs +++ b/crates/core/executor/src/syscalls/precompiles/uint256.rs @@ -4,14 +4,20 @@ use sp1_curves::edwards::WORDS_FIELD_ELEMENT; use sp1_primitives::consts::{bytes_to_words_le, words_to_bytes_le_vec, WORD_SIZE}; use crate::{ - events::Uint256MulEvent, - syscalls::{Syscall, SyscallContext}, + events::{PrecompileEvent, Uint256MulEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub(crate) struct Uint256MulSyscall; impl Syscall for Uint256MulSyscall { - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let clk = rt.clk; let x_ptr = arg1; @@ -60,11 +66,9 @@ impl Syscall for Uint256MulSyscall { let lookup_id = rt.syscall_lookup_id; let shard = rt.current_shard(); - let channel = rt.current_channel(); - rt.record_mut().uint256_mul_events.push(Uint256MulEvent { + let event = PrecompileEvent::Uint256Mul(Uint256MulEvent { lookup_id, shard, - channel, clk, x_ptr, x, @@ -74,7 +78,9 @@ impl Syscall for Uint256MulSyscall { x_memory_records, y_memory_records, modulus_memory_records, + local_mem_access: rt.postprocess(), }); + rt.record_mut().add_precompile_event(syscall_code, event); None } diff --git a/crates/core/executor/src/syscalls/precompiles/weierstrass/add.rs b/crates/core/executor/src/syscalls/precompiles/weierstrass/add.rs index 9d39ca325a..6243ad6ae5 100644 --- a/crates/core/executor/src/syscalls/precompiles/weierstrass/add.rs +++ b/crates/core/executor/src/syscalls/precompiles/weierstrass/add.rs @@ -3,8 +3,8 @@ use std::marker::PhantomData; use sp1_curves::{CurveType, EllipticCurve}; use crate::{ - events::create_ec_add_event, - syscalls::{Syscall, SyscallContext}, + events::{create_ec_add_event, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub(crate) struct WeierstrassAddAssignSyscall { @@ -19,12 +19,25 @@ impl WeierstrassAddAssignSyscall { } impl Syscall for WeierstrassAddAssignSyscall { - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let event = create_ec_add_event::(rt, arg1, arg2); match E::CURVE_TYPE { - CurveType::Secp256k1 => rt.record_mut().secp256k1_add_events.push(event), - CurveType::Bn254 => rt.record_mut().bn254_add_events.push(event), - CurveType::Bls12381 => rt.record_mut().bls12381_add_events.push(event), + CurveType::Secp256k1 => rt + .record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Secp256k1Add(event)), + CurveType::Bn254 => { + rt.record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Bn254Add(event)); + } + CurveType::Bls12381 => rt + .record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Bls12381Add(event)), _ => panic!("Unsupported curve"), } None diff --git a/crates/core/executor/src/syscalls/precompiles/weierstrass/decompress.rs b/crates/core/executor/src/syscalls/precompiles/weierstrass/decompress.rs index a2b476281e..7f5e506f3a 100644 --- a/crates/core/executor/src/syscalls/precompiles/weierstrass/decompress.rs +++ b/crates/core/executor/src/syscalls/precompiles/weierstrass/decompress.rs @@ -3,8 +3,8 @@ use std::marker::PhantomData; use sp1_curves::{CurveType, EllipticCurve}; use crate::{ - events::create_ec_decompress_event, - syscalls::{Syscall, SyscallContext}, + events::{create_ec_decompress_event, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub(crate) struct WeierstrassDecompressSyscall { @@ -19,11 +19,21 @@ impl WeierstrassDecompressSyscall { } impl Syscall for WeierstrassDecompressSyscall { - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let event = create_ec_decompress_event::(rt, arg1, arg2); match E::CURVE_TYPE { - CurveType::Secp256k1 => rt.record_mut().k256_decompress_events.push(event), - CurveType::Bls12381 => rt.record_mut().bls12381_decompress_events.push(event), + CurveType::Secp256k1 => rt + .record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Secp256k1Decompress(event)), + CurveType::Bls12381 => rt + .record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Bls12381Decompress(event)), _ => panic!("Unsupported curve"), } None diff --git a/crates/core/executor/src/syscalls/precompiles/weierstrass/double.rs b/crates/core/executor/src/syscalls/precompiles/weierstrass/double.rs index 507e78f05c..1e388b6bd4 100644 --- a/crates/core/executor/src/syscalls/precompiles/weierstrass/double.rs +++ b/crates/core/executor/src/syscalls/precompiles/weierstrass/double.rs @@ -3,8 +3,8 @@ use std::marker::PhantomData; use sp1_curves::{CurveType, EllipticCurve}; use crate::{ - events::create_ec_double_event, - syscalls::{Syscall, SyscallContext}, + events::{create_ec_double_event, PrecompileEvent}, + syscalls::{Syscall, SyscallCode, SyscallContext}, }; pub(crate) struct WeierstrassDoubleAssignSyscall { @@ -19,12 +19,27 @@ impl WeierstrassDoubleAssignSyscall { } impl Syscall for WeierstrassDoubleAssignSyscall { - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + rt: &mut SyscallContext, + syscall_code: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let event = create_ec_double_event::(rt, arg1, arg2); match E::CURVE_TYPE { - CurveType::Secp256k1 => rt.record_mut().secp256k1_double_events.push(event), - CurveType::Bn254 => rt.record_mut().bn254_double_events.push(event), - CurveType::Bls12381 => rt.record_mut().bls12381_double_events.push(event), + CurveType::Secp256k1 => { + rt.record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Secp256k1Double(event)); + } + CurveType::Bn254 => { + rt.record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Bn254Double(event)); + } + CurveType::Bls12381 => { + rt.record_mut() + .add_precompile_event(syscall_code, PrecompileEvent::Bls12381Double(event)); + } _ => panic!("Unsupported curve"), } None diff --git a/crates/core/executor/src/syscalls/unconstrained.rs b/crates/core/executor/src/syscalls/unconstrained.rs index 2a957c56d7..a84338eb0f 100644 --- a/crates/core/executor/src/syscalls/unconstrained.rs +++ b/crates/core/executor/src/syscalls/unconstrained.rs @@ -2,12 +2,12 @@ use hashbrown::HashMap; use crate::{state::ForkState, ExecutorMode}; -use super::{Syscall, SyscallContext}; +use super::{Syscall, SyscallCode, SyscallContext}; pub(crate) struct EnterUnconstrainedSyscall; impl Syscall for EnterUnconstrainedSyscall { - fn execute(&self, ctx: &mut SyscallContext, _: u32, _: u32) -> Option { + fn execute(&self, ctx: &mut SyscallContext, _: SyscallCode, _: u32, _: u32) -> Option { if ctx.rt.unconstrained { panic!("Unconstrained block is already active."); } @@ -29,7 +29,7 @@ impl Syscall for EnterUnconstrainedSyscall { pub(crate) struct ExitUnconstrainedSyscall; impl Syscall for ExitUnconstrainedSyscall { - fn execute(&self, ctx: &mut SyscallContext, _: u32, _: u32) -> Option { + fn execute(&self, ctx: &mut SyscallContext, _: SyscallCode, _: u32, _: u32) -> Option { // Reset the state of the runtime. if ctx.rt.unconstrained { ctx.rt.state.global_clk = ctx.rt.unconstrained_state.global_clk; diff --git a/crates/core/executor/src/syscalls/verify.rs b/crates/core/executor/src/syscalls/verify.rs index cf314b1ad8..0197199e51 100644 --- a/crates/core/executor/src/syscalls/verify.rs +++ b/crates/core/executor/src/syscalls/verify.rs @@ -1,10 +1,16 @@ -use super::{Syscall, SyscallContext}; +use super::{Syscall, SyscallCode, SyscallContext}; pub(crate) struct VerifySyscall; impl Syscall for VerifySyscall { #[allow(clippy::mut_mut)] - fn execute(&self, ctx: &mut SyscallContext, vkey_ptr: u32, pv_digest_ptr: u32) -> Option { + fn execute( + &self, + ctx: &mut SyscallContext, + _: SyscallCode, + vkey_ptr: u32, + pv_digest_ptr: u32, + ) -> Option { let rt = &mut ctx.rt; // vkey_ptr is a pointer to [u32; 8] which contains the verification key. diff --git a/crates/core/executor/src/syscalls/write.rs b/crates/core/executor/src/syscalls/write.rs index d40133903f..d0db44cae8 100644 --- a/crates/core/executor/src/syscalls/write.rs +++ b/crates/core/executor/src/syscalls/write.rs @@ -2,7 +2,7 @@ use sp1_primitives::consts::num_to_comma_separated; use crate::{Executor, Register}; -use super::{Syscall, SyscallContext}; +use super::{Syscall, SyscallCode, SyscallContext}; pub(crate) struct WriteSyscall; @@ -27,7 +27,13 @@ impl Syscall for WriteSyscall { /// /// Else, log a warning. #[allow(clippy::pedantic)] - fn execute(&self, ctx: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute( + &self, + ctx: &mut SyscallContext, + _: SyscallCode, + arg1: u32, + arg2: u32, + ) -> Option { let a2 = Register::X12; let rt = &mut ctx.rt; let fd = arg1; diff --git a/crates/core/executor/src/utils.rs b/crates/core/executor/src/utils.rs index 2b1448a893..ec4203aa50 100644 --- a/crates/core/executor/src/utils.rs +++ b/crates/core/executor/src/utils.rs @@ -3,6 +3,9 @@ use hashbrown::HashMap; use nohash_hasher::BuildNoHashHasher; use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use crate::Opcode; + +/// Serialize a `HashMap` as a `Vec<(u32, V)>`. pub fn serialize_hashmap_as_vec( map: &HashMap>, serializer: S, @@ -10,9 +13,36 @@ pub fn serialize_hashmap_as_vec( Serialize::serialize(&map.iter().collect::>(), serializer) } +/// Deserialize a `Vec<(u32, V)>` as a `HashMap`. pub fn deserialize_hashmap_as_vec<'de, V: Deserialize<'de>, D: Deserializer<'de>>( deserializer: D, ) -> Result>, D::Error> { let seq: Vec<(u32, V)> = Deserialize::deserialize(deserializer)?; Ok(seq.into_iter().collect()) } + +/// Returns `true` if the given `opcode` is a signed operation. +#[must_use] +pub fn is_signed_operation(opcode: Opcode) -> bool { + opcode == Opcode::DIV || opcode == Opcode::REM +} + +/// Calculate the correct `quotient` and `remainder` for the given `b` and `c` per RISC-V spec. +#[must_use] +pub fn get_quotient_and_remainder(b: u32, c: u32, opcode: Opcode) -> (u32, u32) { + if c == 0 { + // When c is 0, the quotient is 2^32 - 1 and the remainder is b regardless of whether we + // perform signed or unsigned division. + (u32::MAX, b) + } else if is_signed_operation(opcode) { + ((b as i32).wrapping_div(c as i32) as u32, (b as i32).wrapping_rem(c as i32) as u32) + } else { + (b.wrapping_div(c), b.wrapping_rem(c)) + } +} + +/// Calculate the most significant bit of the given 32-bit integer `a`, and returns it as a u8. +#[must_use] +pub const fn get_msb(a: u32) -> u8 { + ((a >> 31) & 1) as u8 +} diff --git a/crates/core/machine/src/air/memory.rs b/crates/core/machine/src/air/memory.rs index 8d0c9fb909..53d243f63b 100644 --- a/crates/core/machine/src/air/memory.rs +++ b/crates/core/machine/src/air/memory.rs @@ -4,7 +4,7 @@ use p3_air::AirBuilder; use p3_field::AbstractField; use sp1_core_executor::ByteOpcode; use sp1_stark::{ - air::{AirInteraction, BaseAirBuilder, ByteAirBuilder}, + air::{AirInteraction, BaseAirBuilder, ByteAirBuilder, InteractionScope}, InteractionKind, }; @@ -18,7 +18,6 @@ pub trait MemoryAirBuilder: BaseAirBuilder { fn eval_memory_access + Clone>( &mut self, shard: impl Into, - channel: impl Into, clk: impl Into, addr: impl Into, memory_access: &impl MemoryCols, @@ -26,20 +25,13 @@ pub trait MemoryAirBuilder: BaseAirBuilder { ) { let do_check: Self::Expr = do_check.into(); let shard: Self::Expr = shard.into(); - let channel: Self::Expr = channel.into(); let clk: Self::Expr = clk.into(); let mem_access = memory_access.access(); self.assert_bool(do_check.clone()); // Verify that the current memory access time is greater than the previous's. - self.eval_memory_access_timestamp( - mem_access, - do_check.clone(), - shard.clone(), - channel, - clk.clone(), - ); + self.eval_memory_access_timestamp(mem_access, do_check.clone(), shard.clone(), clk.clone()); // Add to the memory argument. let addr = addr.into(); @@ -57,21 +49,22 @@ pub trait MemoryAirBuilder: BaseAirBuilder { .collect(); // The previous values get sent with multiplicity = 1, for "read". - self.send(AirInteraction::new(prev_values, do_check.clone(), InteractionKind::Memory)); + self.send( + AirInteraction::new(prev_values, do_check.clone(), InteractionKind::Memory), + InteractionScope::Local, + ); // The current values get "received", i.e. multiplicity = -1 - self.receive(AirInteraction::new( - current_values, - do_check.clone(), - InteractionKind::Memory, - )); + self.receive( + AirInteraction::new(current_values, do_check.clone(), InteractionKind::Memory), + InteractionScope::Local, + ); } /// Constraints a memory read or write to a slice of `MemoryAccessCols`. fn eval_memory_access_slice + Copy>( &mut self, shard: impl Into + Copy, - channel: impl Into + Clone, clk: impl Into + Clone, initial_addr: impl Into + Clone, memory_access_slice: &[impl MemoryCols], @@ -80,7 +73,6 @@ pub trait MemoryAirBuilder: BaseAirBuilder { for (i, access_slice) in memory_access_slice.iter().enumerate() { self.eval_memory_access( shard, - channel.clone(), clk.clone(), initial_addr.clone().into() + Self::Expr::from_canonical_usize(i * 4), access_slice, @@ -100,7 +92,6 @@ pub trait MemoryAirBuilder: BaseAirBuilder { mem_access: &MemoryAccessCols + Clone>, do_check: impl Into, shard: impl Into + Clone, - channel: impl Into + Clone, clk: impl Into, ) { let do_check: Self::Expr = do_check.into(); @@ -138,8 +129,6 @@ pub trait MemoryAirBuilder: BaseAirBuilder { diff_minus_one, mem_access.diff_16bit_limb.clone(), mem_access.diff_8bit_limb.clone(), - shard.clone(), - channel.clone(), do_check, ); } @@ -155,8 +144,6 @@ pub trait MemoryAirBuilder: BaseAirBuilder { value: impl Into, limb_16: impl Into + Clone, limb_8: impl Into + Clone, - shard: impl Into + Clone, - channel: impl Into + Clone, do_check: impl Into + Clone, ) { // Verify that value = limb_16 + limb_8 * 2^16. @@ -172,8 +159,6 @@ pub trait MemoryAirBuilder: BaseAirBuilder { limb_16, Self::Expr::zero(), Self::Expr::zero(), - shard.clone(), - channel.clone(), do_check.clone(), ); @@ -182,8 +167,6 @@ pub trait MemoryAirBuilder: BaseAirBuilder { Self::Expr::zero(), Self::Expr::zero(), limb_8, - shard.clone(), - channel.clone(), do_check, ) } diff --git a/crates/core/machine/src/air/program.rs b/crates/core/machine/src/air/program.rs index d94f006d1b..4efaa97f3f 100644 --- a/crates/core/machine/src/air/program.rs +++ b/crates/core/machine/src/air/program.rs @@ -2,7 +2,7 @@ use std::iter::once; use p3_air::AirBuilder; use sp1_stark::{ - air::{AirInteraction, BaseAirBuilder}, + air::{AirInteraction, BaseAirBuilder, InteractionScope}, InteractionKind, }; @@ -26,7 +26,10 @@ pub trait ProgramAirBuilder: BaseAirBuilder { .chain(once(shard.into())) .collect(); - self.send(AirInteraction::new(values, multiplicity.into(), InteractionKind::Program)); + self.send( + AirInteraction::new(values, multiplicity.into(), InteractionKind::Program), + InteractionScope::Local, + ); } /// Receives an instruction. @@ -45,6 +48,9 @@ pub trait ProgramAirBuilder: BaseAirBuilder { .chain(once(shard.into())) .collect(); - self.receive(AirInteraction::new(values, multiplicity.into(), InteractionKind::Program)); + self.receive( + AirInteraction::new(values, multiplicity.into(), InteractionKind::Program), + InteractionScope::Local, + ); } } diff --git a/crates/core/machine/src/air/word.rs b/crates/core/machine/src/air/word.rs index d96a1c6d31..b4e68c67ac 100644 --- a/crates/core/machine/src/air/word.rs +++ b/crates/core/machine/src/air/word.rs @@ -55,8 +55,6 @@ pub trait WordAirBuilder: ByteAirBuilder { fn slice_range_check_u8( &mut self, input: &[impl Into + Clone], - shard: impl Into + Clone, - channel: impl Into + Clone, mult: impl Into + Clone, ) { let mut index = 0; @@ -66,8 +64,6 @@ pub trait WordAirBuilder: ByteAirBuilder { Self::Expr::zero(), input[index].clone(), input[index + 1].clone(), - shard.clone(), - channel.clone(), mult.clone(), ); index += 2; @@ -78,8 +74,6 @@ pub trait WordAirBuilder: ByteAirBuilder { Self::Expr::zero(), input[index].clone(), Self::Expr::zero(), - shard.clone(), - channel.clone(), mult.clone(), ); } @@ -89,8 +83,6 @@ pub trait WordAirBuilder: ByteAirBuilder { fn slice_range_check_u16( &mut self, input: &[impl Into + Copy], - shard: impl Into + Clone, - channel: impl Into + Clone, mult: impl Into + Clone, ) { input.iter().for_each(|limb| { @@ -99,8 +91,6 @@ pub trait WordAirBuilder: ByteAirBuilder { *limb, Self::Expr::zero(), Self::Expr::zero(), - shard.clone(), - channel.clone(), mult.clone(), ); }); diff --git a/crates/core/machine/src/alu/add_sub/mod.rs b/crates/core/machine/src/alu/add_sub/mod.rs index 8128a8a8b0..93d4752791 100644 --- a/crates/core/machine/src/alu/add_sub/mod.rs +++ b/crates/core/machine/src/alu/add_sub/mod.rs @@ -40,9 +40,6 @@ pub struct AddSubCols { /// The shard number, used for byte lookup table. pub shard: T, - /// The channel number, used for byte lookup table. - pub channel: T, - /// The nonce of the operation. pub nonce: T, @@ -162,14 +159,13 @@ impl AddSubChip { ) { let is_add = event.opcode == Opcode::ADD; cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.is_add = F::from_bool(is_add); cols.is_sub = F::from_bool(!is_add); let operand_1 = if is_add { event.b } else { event.a }; let operand_2 = event.c; - cols.add_operation.populate(blu, event.shard, event.channel, operand_1, operand_2); + cols.add_operation.populate(blu, event.shard, operand_1, operand_2); cols.operand_1 = Word::from(operand_1); cols.operand_2 = Word::from(operand_2); } @@ -202,8 +198,6 @@ where local.operand_1, local.operand_2, local.add_operation, - local.shard, - local.channel, local.is_add + local.is_sub, ); @@ -215,7 +209,6 @@ where local.operand_1, local.operand_2, local.shard, - local.channel, local.nonce, local.is_add, ); @@ -227,7 +220,6 @@ where local.add_operation.value, local.operand_2, local.shard, - local.channel, local.nonce, local.is_sub, ); @@ -253,7 +245,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.add_events = vec![AluEvent::new(0, 0, 0, Opcode::ADD, 14, 8, 6)]; + shard.add_events = vec![AluEvent::new(0, 0, Opcode::ADD, 14, 8, 6)]; let chip = AddSubChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -271,7 +263,6 @@ mod tests { let operand_2 = thread_rng().gen_range(0..u32::MAX); let result = operand_1.wrapping_add(operand_2); shard.add_events.push(AluEvent::new( - 0, i % 2, 0, Opcode::ADD, @@ -285,7 +276,6 @@ mod tests { let operand_2 = thread_rng().gen_range(0..u32::MAX); let result = operand_1.wrapping_sub(operand_2); shard.add_events.push(AluEvent::new( - 0, i % 2, 0, Opcode::SUB, diff --git a/crates/core/machine/src/alu/bitwise/mod.rs b/crates/core/machine/src/alu/bitwise/mod.rs index 463723ec12..17a1e17d9d 100644 --- a/crates/core/machine/src/alu/bitwise/mod.rs +++ b/crates/core/machine/src/alu/bitwise/mod.rs @@ -35,9 +35,6 @@ pub struct BitwiseCols { /// The shard number, used for byte lookup table. pub shard: T, - /// The channel number, used for byte lookup table. - pub channel: T, - /// The nonce of the operation. pub nonce: T, @@ -144,7 +141,6 @@ impl BitwiseChip { let c = event.c.to_le_bytes(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.a = Word::from(event.a); cols.b = Word::from(event.b); cols.c = Word::from(event.c); @@ -156,7 +152,6 @@ impl BitwiseChip { for ((b_a, b_b), b_c) in a.into_iter().zip(b).zip(c) { let byte_event = ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::from(event.opcode), a1: b_a as u16, a2: 0, @@ -197,7 +192,7 @@ where // Get a multiplicity of `1` only for a true row. let mult = local.is_xor + local.is_or + local.is_and; for ((a, b), c) in local.a.into_iter().zip(local.b).zip(local.c) { - builder.send_byte(opcode.clone(), a, b, c, local.shard, local.channel, mult.clone()); + builder.send_byte(opcode.clone(), a, b, c, mult.clone()); } // Get the cpu opcode, which corresponds to the opcode being sent in the CPU table. @@ -212,7 +207,6 @@ where local.b, local.c, local.shard, - local.channel, local.nonce, local.is_xor + local.is_or + local.is_and, ); @@ -239,7 +233,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.bitwise_events = vec![AluEvent::new(0, 0, 0, Opcode::XOR, 25, 10, 19)]; + shard.bitwise_events = vec![AluEvent::new(0, 0, Opcode::XOR, 25, 10, 19)]; let chip = BitwiseChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -253,9 +247,9 @@ mod tests { let mut shard = ExecutionRecord::default(); shard.bitwise_events = [ - AluEvent::new(0, 0, 0, Opcode::XOR, 25, 10, 19), - AluEvent::new(0, 1, 0, Opcode::OR, 27, 10, 19), - AluEvent::new(0, 0, 0, Opcode::AND, 2, 10, 19), + AluEvent::new(0, 0, Opcode::XOR, 25, 10, 19), + AluEvent::new(0, 0, Opcode::OR, 27, 10, 19), + AluEvent::new(0, 0, Opcode::AND, 2, 10, 19), ] .repeat(1000); let chip = BitwiseChip::default(); diff --git a/crates/core/machine/src/alu/divrem/mod.rs b/crates/core/machine/src/alu/divrem/mod.rs index 01eceb51df..96e5d97344 100644 --- a/crates/core/machine/src/alu/divrem/mod.rs +++ b/crates/core/machine/src/alu/divrem/mod.rs @@ -60,20 +60,18 @@ //! # b = 0 * quotient + b is satisfied by any quotient. //! assert quotient = 0xffffffff -mod utils; - use core::{ borrow::{Borrow, BorrowMut}, mem::size_of, }; -use hashbrown::HashMap; use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::{AbstractField, PrimeField}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ - events::{create_alu_lookups, AluEvent, ByteLookupEvent, ByteRecord}, - ByteOpcode, ExecutionRecord, Opcode, Program, + events::{ByteLookupEvent, ByteRecord}, + get_msb, get_quotient_and_remainder, is_signed_operation, ByteOpcode, ExecutionRecord, Opcode, + Program, }; use sp1_derive::AlignedBorrow; use sp1_primitives::consts::WORD_SIZE; @@ -81,7 +79,6 @@ use sp1_stark::{air::MachineAir, Word}; use crate::{ air::SP1CoreAirBuilder, - alu::divrem::utils::{get_msb, get_quotient_and_remainder, is_signed_operation}, operations::{IsEqualWordOperation, IsZeroWordOperation}, utils::pad_rows_fixed, }; @@ -106,9 +103,6 @@ pub struct DivRemCols { /// The shard number, used for byte lookup table. pub shard: T, - /// The channel number, used for byte lookup table. - pub channel: T, - /// The nonce of the operation. pub nonce: T, @@ -248,7 +242,6 @@ impl MachineAir for DivRemChip { cols.b = Word::from(event.b); cols.c = Word::from(event.c); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.is_real = F::one(); cols.is_divu = F::from_bool(event.opcode == Opcode::DIVU); cols.is_remu = F::from_bool(event.opcode == Opcode::REMU); @@ -301,7 +294,6 @@ impl MachineAir for DivRemChip { let most_significant_byte = word.to_le_bytes()[WORD_SIZE - 1]; blu_events.push(ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::MSB, a1: get_msb(*word) as u16, a2: 0, @@ -350,93 +342,14 @@ impl MachineAir for DivRemChip { } // Insert the necessary multiplication & LT events. - // - // This generate_trace for div must be executed _before_ calling generate_trace for - // mul and LT upon which div depends. This ordering is critical as mul and LT - // require all the mul and LT events be added before we can call generate_trace. { - // Insert the absolute value computation events. - { - let mut add_events: Vec = vec![]; - if cols.abs_c_alu_event == F::one() { - add_events.push(AluEvent { - lookup_id: event.sub_lookups[4], - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: Opcode::ADD, - a: 0, - b: event.c, - c: (event.c as i32).abs() as u32, - sub_lookups: create_alu_lookups(), - }) - } - if cols.abs_rem_alu_event == F::one() { - add_events.push(AluEvent { - lookup_id: event.sub_lookups[5], - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: Opcode::ADD, - a: 0, - b: remainder, - c: (remainder as i32).abs() as u32, - sub_lookups: create_alu_lookups(), - }) - } - let mut alu_events = HashMap::new(); - alu_events.insert(Opcode::ADD, add_events); - output.add_alu_events(alu_events); - } - - let mut lower_word = 0; - for i in 0..WORD_SIZE { - lower_word += (c_times_quotient[i] as u32) << (i * BYTE_SIZE); - } - - let mut upper_word = 0; - for i in 0..WORD_SIZE { - upper_word += (c_times_quotient[WORD_SIZE + i] as u32) << (i * BYTE_SIZE); - } - - let lower_multiplication = AluEvent { - lookup_id: event.sub_lookups[0], - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: Opcode::MUL, - a: lower_word, - c: event.c, - b: quotient, - sub_lookups: create_alu_lookups(), - }; cols.lower_nonce = F::from_canonical_u32( input.nonce_lookup.get(&event.sub_lookups[0]).copied().unwrap_or_default(), ); - output.add_mul_event(lower_multiplication); - - let upper_multiplication = AluEvent { - lookup_id: event.sub_lookups[1], - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: { - if is_signed_operation(event.opcode) { - Opcode::MULH - } else { - Opcode::MULHU - } - }, - a: upper_word, - c: event.c, - b: quotient, - sub_lookups: create_alu_lookups(), - }; cols.upper_nonce = F::from_canonical_u32( input.nonce_lookup.get(&event.sub_lookups[1]).copied().unwrap_or_default(), ); - output.add_mul_event(upper_multiplication); - let lt_event = if is_signed_operation(event.opcode) { + if is_signed_operation(event.opcode) { cols.abs_nonce = F::from_canonical_u32( input .nonce_lookup @@ -444,17 +357,6 @@ impl MachineAir for DivRemChip { .copied() .unwrap_or_default(), ); - AluEvent { - lookup_id: event.sub_lookups[2], - shard: event.shard, - channel: event.channel, - opcode: Opcode::SLTU, - a: 1, - b: (remainder as i32).abs() as u32, - c: u32::max(1, (event.c as i32).abs() as u32), - clk: event.clk, - sub_lookups: create_alu_lookups(), - } } else { cols.abs_nonce = F::from_canonical_u32( input @@ -463,33 +365,14 @@ impl MachineAir for DivRemChip { .copied() .unwrap_or_default(), ); - AluEvent { - lookup_id: event.sub_lookups[3], - shard: event.shard, - channel: event.channel, - opcode: Opcode::SLTU, - a: 1, - b: remainder, - c: u32::max(1, event.c), - clk: event.clk, - sub_lookups: create_alu_lookups(), - } }; - - if cols.remainder_check_multiplicity == F::one() { - output.add_lt_event(lt_event); - } } // Range check. { - output.add_u8_range_checks(event.shard, event.channel, "ient.to_le_bytes()); - output.add_u8_range_checks( - event.shard, - event.channel, - &remainder.to_le_bytes(), - ); - output.add_u8_range_checks(event.shard, event.channel, &c_times_quotient); + output.add_u8_range_checks(event.shard, "ient.to_le_bytes()); + output.add_u8_range_checks(event.shard, &remainder.to_le_bytes()); + output.add_u8_range_checks(event.shard, &c_times_quotient); } } @@ -599,7 +482,6 @@ where local.quotient, local.c, local.shard, - local.channel, local.lower_nonce, local.is_real, ); @@ -625,7 +507,6 @@ where local.quotient, local.c, local.shard, - local.channel, local.upper_nonce, local.is_real, ); @@ -780,7 +661,6 @@ where local.c, local.abs_c, local.shard, - local.channel, local.abs_c_alu_event_nonce, local.abs_c_alu_event, ); @@ -790,7 +670,6 @@ where local.remainder, local.abs_remainder, local.shard, - local.channel, local.abs_rem_alu_event_nonce, local.abs_rem_alu_event, ); @@ -837,7 +716,6 @@ where local.abs_remainder, local.max_abs_c_or_1, local.shard, - local.channel, local.abs_nonce, local.remainder_check_multiplicity, ); @@ -854,43 +732,20 @@ where for msb_pair in msb_pairs.iter() { let msb = msb_pair.0; let byte = msb_pair.1; - builder.send_byte( - opcode, - msb, - byte, - zero.clone(), - local.shard, - local.channel, - local.is_real, - ); + builder.send_byte(opcode, msb, byte, zero.clone(), local.is_real); } } // Range check all the bytes. { - builder.slice_range_check_u8( - &local.quotient.0, - local.shard, - local.channel, - local.is_real, - ); - builder.slice_range_check_u8( - &local.remainder.0, - local.shard, - local.channel, - local.is_real, - ); + builder.slice_range_check_u8(&local.quotient.0, local.is_real); + builder.slice_range_check_u8(&local.remainder.0, local.is_real); local.carry.iter().for_each(|carry| { builder.assert_bool(*carry); }); - builder.slice_range_check_u8( - &local.c_times_quotient, - local.shard, - local.channel, - local.is_real, - ); + builder.slice_range_check_u8(&local.c_times_quotient, local.is_real); } // Check that the flags are boolean. @@ -943,7 +798,6 @@ where local.b, local.c, local.shard, - local.channel, local.nonce, local.is_real, ); @@ -965,7 +819,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.divrem_events = vec![AluEvent::new(0, 0, 0, Opcode::DIVU, 2, 17, 3)]; + shard.divrem_events = vec![AluEvent::new(0, 0, Opcode::DIVU, 2, 17, 3)]; let chip = DivRemChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -1018,12 +872,12 @@ mod tests { (Opcode::REM, 0, 1 << 31, neg(1)), ]; for t in divrems.iter() { - divrem_events.push(AluEvent::new(0, 9, 0, t.0, t.1, t.2, t.3)); + divrem_events.push(AluEvent::new(0, 0, t.0, t.1, t.2, t.3)); } // Append more events until we have 1000 tests. for _ in 0..(1000 - divrems.len()) { - divrem_events.push(AluEvent::new(0, 0, 0, Opcode::DIVU, 1, 1, 1)); + divrem_events.push(AluEvent::new(0, 0, Opcode::DIVU, 1, 1, 1)); } let mut shard = ExecutionRecord::default(); diff --git a/crates/core/machine/src/alu/divrem/utils.rs b/crates/core/machine/src/alu/divrem/utils.rs deleted file mode 100644 index 5147d20f6c..0000000000 --- a/crates/core/machine/src/alu/divrem/utils.rs +++ /dev/null @@ -1,24 +0,0 @@ -use sp1_core_executor::Opcode; - -/// Returns `true` if the given `opcode` is a signed operation. -pub fn is_signed_operation(opcode: Opcode) -> bool { - opcode == Opcode::DIV || opcode == Opcode::REM -} - -/// Calculate the correct `quotient` and `remainder` for the given `b` and `c` per RISC-V spec. -pub fn get_quotient_and_remainder(b: u32, c: u32, opcode: Opcode) -> (u32, u32) { - if c == 0 { - // When c is 0, the quotient is 2^32 - 1 and the remainder is b regardless of whether we - // perform signed or unsigned division. - (u32::MAX, b) - } else if is_signed_operation(opcode) { - ((b as i32).wrapping_div(c as i32) as u32, (b as i32).wrapping_rem(c as i32) as u32) - } else { - ((b as u32).wrapping_div(c as u32) as u32, (b as u32).wrapping_rem(c as u32) as u32) - } -} - -/// Calculate the most significant bit of the given 32-bit integer `a`, and returns it as a u8. -pub const fn get_msb(a: u32) -> u8 { - ((a >> 31) & 1) as u8 -} diff --git a/crates/core/machine/src/alu/lt/mod.rs b/crates/core/machine/src/alu/lt/mod.rs index 0c6804bc15..e6d6b43dc0 100644 --- a/crates/core/machine/src/alu/lt/mod.rs +++ b/crates/core/machine/src/alu/lt/mod.rs @@ -35,9 +35,6 @@ pub struct LtCols { /// The shard number, used for byte lookup table. pub shard: T, - /// The channel number, used for byte lookup table. - pub channel: T, - /// The nonce of the operation. pub nonce: T, @@ -182,7 +179,6 @@ impl LtChip { let c = event.c.to_le_bytes(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.a = Word(a.map(F::from_canonical_u8)); cols.b = Word(b.map(F::from_canonical_u8)); cols.c = Word(c.map(F::from_canonical_u8)); @@ -196,7 +192,6 @@ impl LtChip { // Send the masked interaction. blu.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::AND, a1: masked_b as u16, a2: 0, @@ -205,7 +200,6 @@ impl LtChip { }); blu.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::AND, a1: masked_c as u16, a2: 0, @@ -255,7 +249,6 @@ impl LtChip { blu.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::LTU, a1: cols.sltu.as_canonical_u32() as u16, a2: 0, @@ -319,8 +312,6 @@ where local.b_masked, local.b[3], AB::F::from_canonical_u8(0x7f), - local.shard, - local.channel, is_real.clone(), ); builder.send_byte( @@ -328,8 +319,6 @@ where local.c_masked, local.c[3], AB::F::from_canonical_u8(0x7f), - local.shard, - local.channel, is_real.clone(), ); @@ -440,8 +429,6 @@ where local.sltu, b_comp_byte, c_comp_byte, - local.shard, - local.channel, is_real.clone(), ); @@ -464,7 +451,6 @@ where local.b, local.c, local.shard, - local.channel, local.nonce, is_real, ); @@ -485,7 +471,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.lt_events = vec![AluEvent::new(0, 1, 0, Opcode::SLT, 0, 3, 2)]; + shard.lt_events = vec![AluEvent::new(0, 0, Opcode::SLT, 0, 3, 2)]; let chip = LtChip::default(); let generate_trace = chip.generate_trace(&shard, &mut ExecutionRecord::default()); let trace: RowMajorMatrix = generate_trace; @@ -513,21 +499,21 @@ mod tests { const NEG_4: u32 = 0b11111111111111111111111111111100; shard.lt_events = vec![ // 0 == 3 < 2 - AluEvent::new(0, 0, 0, Opcode::SLT, 0, 3, 2), + AluEvent::new(0, 0, Opcode::SLT, 0, 3, 2), // 1 == 2 < 3 - AluEvent::new(0, 0, 1, Opcode::SLT, 1, 2, 3), + AluEvent::new(0, 1, Opcode::SLT, 1, 2, 3), // 0 == 5 < -3 - AluEvent::new(0, 0, 3, Opcode::SLT, 0, 5, NEG_3), + AluEvent::new(0, 3, Opcode::SLT, 0, 5, NEG_3), // 1 == -3 < 5 - AluEvent::new(0, 0, 2, Opcode::SLT, 1, NEG_3, 5), + AluEvent::new(0, 2, Opcode::SLT, 1, NEG_3, 5), // 0 == -3 < -4 - AluEvent::new(0, 0, 4, Opcode::SLT, 0, NEG_3, NEG_4), + AluEvent::new(0, 4, Opcode::SLT, 0, NEG_3, NEG_4), // 1 == -4 < -3 - AluEvent::new(0, 0, 4, Opcode::SLT, 1, NEG_4, NEG_3), + AluEvent::new(0, 4, Opcode::SLT, 1, NEG_4, NEG_3), // 0 == 3 < 3 - AluEvent::new(0, 0, 5, Opcode::SLT, 0, 3, 3), + AluEvent::new(0, 5, Opcode::SLT, 0, 3, 3), // 0 == -3 < -3 - AluEvent::new(0, 0, 5, Opcode::SLT, 0, NEG_3, NEG_3), + AluEvent::new(0, 5, Opcode::SLT, 0, NEG_3, NEG_3), ]; prove_babybear_template(&mut shard); @@ -540,17 +526,17 @@ mod tests { const LARGE: u32 = 0b11111111111111111111111111111101; shard.lt_events = vec![ // 0 == 3 < 2 - AluEvent::new(0, 0, 0, Opcode::SLTU, 0, 3, 2), + AluEvent::new(0, 0, Opcode::SLTU, 0, 3, 2), // 1 == 2 < 3 - AluEvent::new(0, 0, 1, Opcode::SLTU, 1, 2, 3), + AluEvent::new(0, 1, Opcode::SLTU, 1, 2, 3), // 0 == LARGE < 5 - AluEvent::new(0, 0, 2, Opcode::SLTU, 0, LARGE, 5), + AluEvent::new(0, 2, Opcode::SLTU, 0, LARGE, 5), // 1 == 5 < LARGE - AluEvent::new(0, 0, 3, Opcode::SLTU, 1, 5, LARGE), + AluEvent::new(0, 3, Opcode::SLTU, 1, 5, LARGE), // 0 == 0 < 0 - AluEvent::new(0, 0, 5, Opcode::SLTU, 0, 0, 0), + AluEvent::new(0, 5, Opcode::SLTU, 0, 0, 0), // 0 == LARGE < LARGE - AluEvent::new(0, 0, 5, Opcode::SLTU, 0, LARGE, LARGE), + AluEvent::new(0, 5, Opcode::SLTU, 0, LARGE, LARGE), ]; prove_babybear_template(&mut shard); diff --git a/crates/core/machine/src/alu/mul/mod.rs b/crates/core/machine/src/alu/mul/mod.rs index abde41848b..af1c9282fc 100644 --- a/crates/core/machine/src/alu/mul/mod.rs +++ b/crates/core/machine/src/alu/mul/mod.rs @@ -73,9 +73,6 @@ pub struct MulCols { /// The shard number, used for byte lookup table. pub shard: T, - /// The channel number, used for byte lookup table. - pub channel: T, - /// The nonce of the operation. pub nonce: T, @@ -194,7 +191,6 @@ impl MachineAir for MulChip { let most_significant_byte = word[WORD_SIZE - 1]; blu_events.push(ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::MSB, a1: get_msb(*word) as u16, a2: 0, @@ -238,20 +234,11 @@ impl MachineAir for MulChip { cols.is_mulhu = F::from_bool(event.opcode == Opcode::MULHU); cols.is_mulhsu = F::from_bool(event.opcode == Opcode::MULHSU); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); // Range check. { - record.add_u16_range_checks( - event.shard, - event.channel, - &carry.map(|x| x as u16), - ); - record.add_u8_range_checks( - event.shard, - event.channel, - &product.map(|x| x as u8), - ); + record.add_u16_range_checks(event.shard, &carry.map(|x| x as u16)); + record.add_u8_range_checks(event.shard, &product.map(|x| x as u8)); } row }) @@ -327,15 +314,7 @@ where for msb_pair in msb_pairs.iter() { let msb = msb_pair.0; let byte = msb_pair.1; - builder.send_byte( - opcode, - msb, - byte, - zero.clone(), - local.shard, - local.channel, - local.is_real, - ); + builder.send_byte(opcode, msb, byte, zero.clone(), local.is_real); } (local.b_msb, local.c_msb) }; @@ -447,9 +426,9 @@ where // Ensure that the carry is at most 2^16. This ensures that // product_before_carry_propagation - carry * base + last_carry never overflows or // underflows enough to "wrap" around to create a second solution. - builder.slice_range_check_u16(&local.carry, local.shard, local.channel, local.is_real); + builder.slice_range_check_u16(&local.carry, local.is_real); - builder.slice_range_check_u8(&local.product, local.shard, local.channel, local.is_real); + builder.slice_range_check_u8(&local.product, local.is_real); } // Receive the arguments. @@ -459,7 +438,6 @@ where local.b, local.c, local.shard, - local.channel, local.nonce, local.is_real, ); @@ -485,7 +463,6 @@ mod tests { let mut mul_events: Vec = Vec::new(); for _ in 0..10i32.pow(7) { mul_events.push(AluEvent::new( - 0, 0, 0, Opcode::MULHSU, @@ -561,12 +538,12 @@ mod tests { (Opcode::MULH, 0xffffffff, 0x00000001, 0xffffffff), ]; for t in mul_instructions.iter() { - mul_events.push(AluEvent::new(0, 0, 0, t.0, t.1, t.2, t.3)); + mul_events.push(AluEvent::new(0, 0, t.0, t.1, t.2, t.3)); } // Append more events until we have 1000 tests. for _ in 0..(1000 - mul_instructions.len()) { - mul_events.push(AluEvent::new(0, 0, 0, Opcode::MUL, 1, 1, 1)); + mul_events.push(AluEvent::new(0, 0, Opcode::MUL, 1, 1, 1)); } shard.mul_events = mul_events; diff --git a/crates/core/machine/src/alu/sll/mod.rs b/crates/core/machine/src/alu/sll/mod.rs index 78c2fd7612..a89e3f1545 100644 --- a/crates/core/machine/src/alu/sll/mod.rs +++ b/crates/core/machine/src/alu/sll/mod.rs @@ -68,9 +68,6 @@ pub struct ShiftLeftCols { /// The shard number, used for byte lookup table. pub shard: T, - /// The channel number, used for byte lookup table. - pub channel: T, - /// The nonce of the operation. pub nonce: T, @@ -203,7 +200,6 @@ impl ShiftLeft { let b = event.b.to_le_bytes(); let c = event.c.to_le_bytes(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.a = Word(a.map(F::from_canonical_u8)); cols.b = Word(b.map(F::from_canonical_u8)); cols.c = Word(c.map(F::from_canonical_u8)); @@ -242,8 +238,8 @@ impl ShiftLeft { // Range checks. { - blu.add_u8_range_checks(event.shard, event.channel, &bit_shift_result); - blu.add_u8_range_checks(event.shard, event.channel, &bit_shift_result_carry); + blu.add_u8_range_checks(event.shard, &bit_shift_result); + blu.add_u8_range_checks(event.shard, &bit_shift_result_carry); } // Sanity check. @@ -369,18 +365,8 @@ where // Range check. { - builder.slice_range_check_u8( - &local.bit_shift_result, - local.shard, - local.channel, - local.is_real, - ); - builder.slice_range_check_u8( - &local.bit_shift_result_carry, - local.shard, - local.channel, - local.is_real, - ); + builder.slice_range_check_u8(&local.bit_shift_result, local.is_real); + builder.slice_range_check_u8(&local.bit_shift_result_carry, local.is_real); } for shift in local.shift_by_n_bytes.iter() { @@ -401,7 +387,6 @@ where local.b, local.c, local.shard, - local.channel, local.nonce, local.is_real, ); @@ -422,7 +407,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.shift_left_events = vec![AluEvent::new(0, 0, 0, Opcode::SLL, 16, 8, 1)]; + shard.shift_left_events = vec![AluEvent::new(0, 0, Opcode::SLL, 16, 8, 1)]; let chip = ShiftLeft::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -457,7 +442,7 @@ mod tests { (Opcode::SLL, 0x00000000, 0x21212120, 0xffffffff), ]; for t in shift_instructions.iter() { - shift_events.push(AluEvent::new(0, 0, 0, t.0, t.1, t.2, t.3)); + shift_events.push(AluEvent::new(0, 0, t.0, t.1, t.2, t.3)); } // Append more events until we have 1000 tests. diff --git a/crates/core/machine/src/alu/sr/mod.rs b/crates/core/machine/src/alu/sr/mod.rs index a384bd34b2..9142138aee 100644 --- a/crates/core/machine/src/alu/sr/mod.rs +++ b/crates/core/machine/src/alu/sr/mod.rs @@ -88,9 +88,6 @@ pub struct ShiftRightCols { /// The shard number, used for byte lookup table. pub shard: T, - /// The channel number, used for byte lookup table. - pub channel: T, - /// The nonce of the operation. pub nonce: T, @@ -238,7 +235,6 @@ impl ShiftRightChip { // Initialize cols with basic operands and flags derived from the current event. { cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.a = Word::from(event.a); cols.b = Word::from(event.b); cols.c = Word::from(event.c); @@ -258,7 +254,6 @@ impl ShiftRightChip { let most_significant_byte = event.b.to_le_bytes()[WORD_SIZE - 1]; blu.add_byte_lookup_events(vec![ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::MSB, a1: ((most_significant_byte >> 7) & 1) as u16, a2: 0, @@ -308,7 +303,6 @@ impl ShiftRightChip { let byte_event = ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::ShrCarry, a1: shift as u16, a2: carry, @@ -330,10 +324,10 @@ impl ShiftRightChip { debug_assert_eq!(cols.a[i], cols.bit_shift_result[i].clone()); } // Range checks. - blu.add_u8_range_checks(event.shard, event.channel, &byte_shift_result); - blu.add_u8_range_checks(event.shard, event.channel, &bit_shift_result); - blu.add_u8_range_checks(event.shard, event.channel, &shr_carry_output_carry); - blu.add_u8_range_checks(event.shard, event.channel, &shr_carry_output_shifted_byte); + blu.add_u8_range_checks(event.shard, &byte_shift_result); + blu.add_u8_range_checks(event.shard, &bit_shift_result); + blu.add_u8_range_checks(event.shard, &shr_carry_output_carry); + blu.add_u8_range_checks(event.shard, &shr_carry_output_shifted_byte); } } } @@ -366,15 +360,7 @@ where let byte = local.b[WORD_SIZE - 1]; let opcode = AB::F::from_canonical_u32(ByteOpcode::MSB as u32); let msb = local.b_msb; - builder.send_byte( - opcode, - msb, - byte, - zero.clone(), - local.shard, - local.channel, - local.is_real, - ); + builder.send_byte(opcode, msb, byte, zero.clone(), local.is_real); } // Calculate the number of bits and bytes to shift by from c. @@ -473,8 +459,6 @@ where local.shr_carry_output_carry[i], local.byte_shift_result[i], num_bits_to_shift.clone(), - local.shard, - local.channel, local.is_real, ); } @@ -524,7 +508,7 @@ where ]; for long_word in long_words.iter() { - builder.slice_range_check_u8(long_word, local.shard, local.channel, local.is_real); + builder.slice_range_check_u8(long_word, local.is_real); } } @@ -544,7 +528,6 @@ where local.b, local.c, local.shard, - local.channel, local.nonce, local.is_real, ); @@ -564,7 +547,7 @@ mod tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.shift_right_events = vec![AluEvent::new(0, 0, 0, Opcode::SRL, 6, 12, 1)]; + shard.shift_right_events = vec![AluEvent::new(0, 0, Opcode::SRL, 6, 12, 1)]; let chip = ShiftRightChip::default(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); @@ -615,7 +598,7 @@ mod tests { ]; let mut shift_events: Vec = Vec::new(); for t in shifts.iter() { - shift_events.push(AluEvent::new(0, 0, 0, t.0, t.1, t.2, t.3)); + shift_events.push(AluEvent::new(0, 0, t.0, t.1, t.2, t.3)); } let mut shard = ExecutionRecord::default(); shard.shift_right_events = shift_events; diff --git a/crates/core/machine/src/bytes/air.rs b/crates/core/machine/src/bytes/air.rs index 210783a89e..3aa2bbe1fa 100644 --- a/crates/core/machine/src/bytes/air.rs +++ b/crates/core/machine/src/bytes/air.rs @@ -8,7 +8,7 @@ use sp1_stark::air::SP1AirBuilder; use super::{ columns::{ByteMultCols, BytePreprocessedCols, NUM_BYTE_MULT_COLS}, - ByteChip, NUM_BYTE_LOOKUP_CHANNELS, + ByteChip, }; impl BaseAir for ByteChip { @@ -28,66 +28,44 @@ impl Air for ByteChip { let local: &BytePreprocessedCols = (*prep).borrow(); // Send all the lookups for each operation. - for channel in 0..NUM_BYTE_LOOKUP_CHANNELS { - let channel_f = AB::F::from_canonical_u8(channel); - let channel = channel as usize; - for (i, opcode) in ByteOpcode::all().iter().enumerate() { - let field_op = opcode.as_field::(); - let mult = local_mult.mult_channels[channel].multiplicities[i]; - let shard = local_mult.shard; - match opcode { - ByteOpcode::AND => builder.receive_byte( - field_op, local.and, local.b, local.c, shard, channel_f, mult, - ), - ByteOpcode::OR => builder - .receive_byte(field_op, local.or, local.b, local.c, shard, channel_f, mult), - ByteOpcode::XOR => builder.receive_byte( - field_op, local.xor, local.b, local.c, shard, channel_f, mult, - ), - ByteOpcode::SLL => builder.receive_byte( - field_op, local.sll, local.b, local.c, shard, channel_f, mult, - ), - ByteOpcode::U8Range => builder.receive_byte( - field_op, - AB::F::zero(), - local.b, - local.c, - shard, - channel_f, - mult, - ), - ByteOpcode::ShrCarry => builder.receive_byte_pair( - field_op, - local.shr, - local.shr_carry, - local.b, - local.c, - shard, - channel_f, - mult, - ), - ByteOpcode::LTU => builder.receive_byte( - field_op, local.ltu, local.b, local.c, shard, channel_f, mult, - ), - ByteOpcode::MSB => builder.receive_byte( - field_op, - local.msb, - local.b, - AB::F::zero(), - shard, - channel_f, - mult, - ), - ByteOpcode::U16Range => builder.receive_byte( - field_op, - local.value_u16, - AB::F::zero(), - AB::F::zero(), - shard, - channel_f, - mult, - ), + for (i, opcode) in ByteOpcode::all().iter().enumerate() { + let field_op = opcode.as_field::(); + let mult = local_mult.multiplicities[i]; + match opcode { + ByteOpcode::AND => { + builder.receive_byte(field_op, local.and, local.b, local.c, mult) } + ByteOpcode::OR => builder.receive_byte(field_op, local.or, local.b, local.c, mult), + ByteOpcode::XOR => { + builder.receive_byte(field_op, local.xor, local.b, local.c, mult) + } + ByteOpcode::SLL => { + builder.receive_byte(field_op, local.sll, local.b, local.c, mult) + } + ByteOpcode::U8Range => { + builder.receive_byte(field_op, AB::F::zero(), local.b, local.c, mult) + } + ByteOpcode::ShrCarry => builder.receive_byte_pair( + field_op, + local.shr, + local.shr_carry, + local.b, + local.c, + mult, + ), + ByteOpcode::LTU => { + builder.receive_byte(field_op, local.ltu, local.b, local.c, mult) + } + ByteOpcode::MSB => { + builder.receive_byte(field_op, local.msb, local.b, AB::F::zero(), mult) + } + ByteOpcode::U16Range => builder.receive_byte( + field_op, + local.value_u16, + AB::F::zero(), + AB::F::zero(), + mult, + ), } } } diff --git a/crates/core/machine/src/bytes/columns.rs b/crates/core/machine/src/bytes/columns.rs index 7134331f63..49e3edab5b 100644 --- a/crates/core/machine/src/bytes/columns.rs +++ b/crates/core/machine/src/bytes/columns.rs @@ -1,7 +1,7 @@ use sp1_derive::AlignedBorrow; use std::mem::size_of; -use super::{NUM_BYTE_LOOKUP_CHANNELS, NUM_BYTE_OPS}; +use super::NUM_BYTE_OPS; /// The number of main trace columns for `ByteChip`. pub const NUM_BYTE_PREPROCESSED_COLS: usize = size_of::>(); @@ -44,22 +44,11 @@ pub struct BytePreprocessedCols { pub value_u16: T, } -/// For each byte operation in the preprocessed table, a corresponding ByteMultCols row tracks the -/// number of times the operation is used. -#[derive(Debug, Clone, Copy, AlignedBorrow)] -#[repr(C)] -pub struct MultiplicitiesCols { - pub multiplicities: [T; NUM_BYTE_OPS], -} - /// For each byte operation in the preprocessed table, a corresponding ByteMultCols row tracks the /// number of times the operation is used. #[derive(Debug, Clone, Copy, AlignedBorrow)] #[repr(C)] pub struct ByteMultCols { - /// Shard number is tracked so that the multiplicities do not overflow. - pub shard: T, - /// The multiplicites of each byte operation. - pub mult_channels: [MultiplicitiesCols; NUM_BYTE_LOOKUP_CHANNELS as usize], + pub multiplicities: [T; NUM_BYTE_OPS], } diff --git a/crates/core/machine/src/bytes/mod.rs b/crates/core/machine/src/bytes/mod.rs index 91e72bf7f2..aad2545e78 100644 --- a/crates/core/machine/src/bytes/mod.rs +++ b/crates/core/machine/src/bytes/mod.rs @@ -23,9 +23,6 @@ use crate::bytes::trace::NUM_ROWS; /// The number of different byte operations. pub const NUM_BYTE_OPS: usize = 9; -/// The number of different byte lookup channels. -pub const NUM_BYTE_LOOKUP_CHANNELS: u8 = 16; - /// A chip for computing byte operations. /// /// The chip contains a preprocessed table of all possible byte operations. Other chips can then @@ -59,55 +56,51 @@ impl ByteChip { // Iterate over all operations for results and updating the table map. let shard = 0; - for channel in 0..NUM_BYTE_LOOKUP_CHANNELS { - for opcode in opcodes.iter() { - match opcode { - ByteOpcode::AND => { - let and = b & c; - col.and = F::from_canonical_u8(and); - ByteLookupEvent::new(shard, channel, *opcode, and as u16, 0, b, c) - } - ByteOpcode::OR => { - let or = b | c; - col.or = F::from_canonical_u8(or); - ByteLookupEvent::new(shard, channel, *opcode, or as u16, 0, b, c) - } - ByteOpcode::XOR => { - let xor = b ^ c; - col.xor = F::from_canonical_u8(xor); - ByteLookupEvent::new(shard, channel, *opcode, xor as u16, 0, b, c) - } - ByteOpcode::SLL => { - let sll = b << (c & 7); - col.sll = F::from_canonical_u8(sll); - ByteLookupEvent::new(shard, channel, *opcode, sll as u16, 0, b, c) - } - ByteOpcode::U8Range => { - ByteLookupEvent::new(shard, channel, *opcode, 0, 0, b, c) - } - ByteOpcode::ShrCarry => { - let (res, carry) = shr_carry(b, c); - col.shr = F::from_canonical_u8(res); - col.shr_carry = F::from_canonical_u8(carry); - ByteLookupEvent::new(shard, channel, *opcode, res as u16, carry, b, c) - } - ByteOpcode::LTU => { - let ltu = b < c; - col.ltu = F::from_bool(ltu); - ByteLookupEvent::new(shard, channel, *opcode, ltu as u16, 0, b, c) - } - ByteOpcode::MSB => { - let msb = (b & 0b1000_0000) != 0; - col.msb = F::from_bool(msb); - ByteLookupEvent::new(shard, channel, *opcode, msb as u16, 0, b, 0) - } - ByteOpcode::U16Range => { - let v = ((b as u32) << 8) + c as u32; - col.value_u16 = F::from_canonical_u32(v); - ByteLookupEvent::new(shard, channel, *opcode, v as u16, 0, 0, 0) - } - }; - } + for opcode in opcodes.iter() { + match opcode { + ByteOpcode::AND => { + let and = b & c; + col.and = F::from_canonical_u8(and); + ByteLookupEvent::new(shard, *opcode, and as u16, 0, b, c) + } + ByteOpcode::OR => { + let or = b | c; + col.or = F::from_canonical_u8(or); + ByteLookupEvent::new(shard, *opcode, or as u16, 0, b, c) + } + ByteOpcode::XOR => { + let xor = b ^ c; + col.xor = F::from_canonical_u8(xor); + ByteLookupEvent::new(shard, *opcode, xor as u16, 0, b, c) + } + ByteOpcode::SLL => { + let sll = b << (c & 7); + col.sll = F::from_canonical_u8(sll); + ByteLookupEvent::new(shard, *opcode, sll as u16, 0, b, c) + } + ByteOpcode::U8Range => ByteLookupEvent::new(shard, *opcode, 0, 0, b, c), + ByteOpcode::ShrCarry => { + let (res, carry) = shr_carry(b, c); + col.shr = F::from_canonical_u8(res); + col.shr_carry = F::from_canonical_u8(carry); + ByteLookupEvent::new(shard, *opcode, res as u16, carry, b, c) + } + ByteOpcode::LTU => { + let ltu = b < c; + col.ltu = F::from_bool(ltu); + ByteLookupEvent::new(shard, *opcode, ltu as u16, 0, b, c) + } + ByteOpcode::MSB => { + let msb = (b & 0b1000_0000) != 0; + col.msb = F::from_bool(msb); + ByteLookupEvent::new(shard, *opcode, msb as u16, 0, b, 0) + } + ByteOpcode::U16Range => { + let v = ((b as u32) << 8) + c as u32; + col.value_u16 = F::from_canonical_u32(v); + ByteLookupEvent::new(shard, *opcode, v as u16, 0, 0, 0) + } + }; } } diff --git a/crates/core/machine/src/bytes/trace.rs b/crates/core/machine/src/bytes/trace.rs index 0ea612ca44..e370009792 100644 --- a/crates/core/machine/src/bytes/trace.rs +++ b/crates/core/machine/src/bytes/trace.rs @@ -1,6 +1,5 @@ use std::borrow::BorrowMut; -use hashbrown::HashMap; use p3_field::Field; use p3_matrix::dense::RowMajorMatrix; use sp1_core_executor::{ByteOpcode, ExecutionRecord, Program}; @@ -43,19 +42,18 @@ impl MachineAir for ByteChip { let mut trace = RowMajorMatrix::new(vec![F::zero(); NUM_BYTE_MULT_COLS * NUM_ROWS], NUM_BYTE_MULT_COLS); - let shard = input.public_values.execution_shard; - for (lookup, mult) in input.byte_lookups.get(&shard).unwrap_or(&HashMap::new()).iter() { - let row = if lookup.opcode != ByteOpcode::U16Range { - (((lookup.b as u16) << 8) + lookup.c as u16) as usize - } else { - lookup.a1 as usize - }; - let index = lookup.opcode as usize; - let channel = lookup.channel as usize; + for (_, blu) in input.byte_lookups.iter() { + for (lookup, mult) in blu.iter() { + let row = if lookup.opcode != ByteOpcode::U16Range { + (((lookup.b as u16) << 8) + lookup.c as u16) as usize + } else { + lookup.a1 as usize + }; + let index = lookup.opcode as usize; - let cols: &mut ByteMultCols = trace.row_mut(row).borrow_mut(); - cols.mult_channels[channel].multiplicities[index] += F::from_canonical_usize(*mult); - cols.shard = F::from_canonical_u32(shard); + let cols: &mut ByteMultCols = trace.row_mut(row).borrow_mut(); + cols.multiplicities[index] += F::from_canonical_usize(*mult); + } } trace diff --git a/crates/core/machine/src/cpu/air/branch.rs b/crates/core/machine/src/cpu/air/branch.rs index 1377d1a14e..d8c615682f 100644 --- a/crates/core/machine/src/cpu/air/branch.rs +++ b/crates/core/machine/src/cpu/air/branch.rs @@ -88,7 +88,6 @@ impl CpuChip { branch_cols.pc, local.op_c_val(), local.shard, - local.channel, branch_cols.next_pc_nonce, local.branching, ); @@ -186,7 +185,6 @@ impl CpuChip { local.op_a_val(), local.op_b_val(), local.shard, - local.channel, branch_cols.a_lt_b_nonce, is_branch_instruction.clone(), ); @@ -199,7 +197,6 @@ impl CpuChip { local.op_b_val(), local.op_a_val(), local.shard, - local.channel, branch_cols.a_gt_b_nonce, is_branch_instruction.clone(), ); diff --git a/crates/core/machine/src/cpu/air/ecall.rs b/crates/core/machine/src/cpu/air/ecall.rs index 8a88453a7a..9c05105bcc 100644 --- a/crates/core/machine/src/cpu/air/ecall.rs +++ b/crates/core/machine/src/cpu/air/ecall.rs @@ -2,7 +2,10 @@ use p3_air::AirBuilder; use p3_field::AbstractField; use sp1_core_executor::syscalls::SyscallCode; use sp1_stark::{ - air::{BaseAirBuilder, PublicValues, SP1AirBuilder, POSEIDON_NUM_WORDS, PV_DIGEST_NUM_WORDS}, + air::{ + BaseAirBuilder, InteractionScope, PublicValues, SP1AirBuilder, POSEIDON_NUM_WORDS, + PV_DIGEST_NUM_WORDS, + }, Word, }; @@ -50,13 +53,13 @@ impl CpuChip { builder.send_syscall( local.shard, - local.channel, local.clk, ecall_cols.syscall_nonce, syscall_id, local.op_b_val().reduce::(), local.op_c_val().reduce::(), local.ecall_mul_send_to_table, + InteractionScope::Local, ); // Compute whether this ecall is ENTER_UNCONSTRAINED. diff --git a/crates/core/machine/src/cpu/air/memory.rs b/crates/core/machine/src/cpu/air/memory.rs index 4ab7e1036e..efceb98f97 100644 --- a/crates/core/machine/src/cpu/air/memory.rs +++ b/crates/core/machine/src/cpu/air/memory.rs @@ -72,7 +72,6 @@ impl CpuChip { local.op_b_val(), local.op_c_val(), local.shard, - local.channel, memory_columns.addr_word_nonce, is_memory_instruction.clone(), ); @@ -86,12 +85,7 @@ impl CpuChip { ); // Check that each addr_word element is a byte. - builder.slice_range_check_u8( - &memory_columns.addr_word.0, - local.shard, - local.channel, - is_memory_instruction.clone(), - ); + builder.slice_range_check_u8(&memory_columns.addr_word.0, is_memory_instruction.clone()); // Evaluate the addr_offset column and offset flags. self.eval_offset_value_flags(builder, memory_columns, local); @@ -129,7 +123,6 @@ impl CpuChip { // value into the memory columns. builder.eval_memory_access( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::Memory as u32), memory_columns.addr_aligned, &memory_columns.memory_access, @@ -181,7 +174,6 @@ impl CpuChip { local.unsigned_mem_val, signed_value, local.shard, - local.channel, local.unsigned_mem_val_nonce, local.mem_value_is_neg_not_x0, ); diff --git a/crates/core/machine/src/cpu/air/mod.rs b/crates/core/machine/src/cpu/air/mod.rs index 880e76e36c..bc925b30ac 100644 --- a/crates/core/machine/src/cpu/air/mod.rs +++ b/crates/core/machine/src/cpu/air/mod.rs @@ -23,7 +23,7 @@ use crate::{ }; use sp1_core_executor::Opcode; -use super::columns::{eval_channel_selectors, OPCODE_SELECTORS_COL_MAP}; +use super::columns::OPCODE_SELECTORS_COL_MAP; impl Air for CpuChip where @@ -63,16 +63,6 @@ where self.eval_memory_load::(builder, local); self.eval_memory_store::(builder, local); - // Channel constraints. - eval_channel_selectors( - builder, - &local.channel_selectors, - &next.channel_selectors, - local.channel, - local.is_real, - next.is_real, - ); - // ALU instructions. builder.send_alu( local.instruction.opcode, @@ -80,7 +70,6 @@ where local.op_b_val(), local.op_c_val(), local.shard, - local.channel, local.nonce, is_alu_instruction, ); @@ -207,7 +196,6 @@ impl CpuChip { jump_columns.pc, local.op_b_val(), local.shard, - local.channel, jump_columns.jal_nonce, local.selectors.is_jal, ); @@ -219,7 +207,6 @@ impl CpuChip { local.op_b_val(), local.op_c_val(), local.shard, - local.channel, jump_columns.jalr_nonce, local.selectors.is_jalr, ); @@ -248,7 +235,6 @@ impl CpuChip { auipc_columns.pc, local.op_b_val(), local.shard, - local.channel, auipc_columns.auipc_nonce, local.selectors.is_auipc, ); @@ -276,8 +262,6 @@ impl CpuChip { local.shard, AB::Expr::zero(), AB::Expr::zero(), - local.shard, - local.channel, local.is_real, ); @@ -300,8 +284,6 @@ impl CpuChip { local.clk, local.clk_16bit_limb, local.clk_8bit_limb, - local.shard, - local.channel, local.is_real, ); } diff --git a/crates/core/machine/src/cpu/air/register.rs b/crates/core/machine/src/cpu/air/register.rs index 8ffa86248c..7be28c6099 100644 --- a/crates/core/machine/src/cpu/air/register.rs +++ b/crates/core/machine/src/cpu/air/register.rs @@ -27,7 +27,6 @@ impl CpuChip { // If they are not immediates, read `b` and `c` from memory. builder.eval_memory_access( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::B as u32), local.instruction.op_b[0], &local.op_b_access, @@ -36,7 +35,6 @@ impl CpuChip { builder.eval_memory_access( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::C as u32), local.instruction.op_c[0], &local.op_c_access, @@ -50,7 +48,6 @@ impl CpuChip { // we are performing a branch or a store. builder.eval_memory_access( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(MemoryAccessPosition::A as u32), local.instruction.op_a[0], &local.op_a_access, @@ -59,12 +56,7 @@ impl CpuChip { // Always range check the word value in `op_a`, as JUMP instructions may witness // an invalid word and write it to memory. - builder.slice_range_check_u8( - &local.op_a_access.access.value.0, - local.shard, - local.channel, - local.is_real, - ); + builder.slice_range_check_u8(&local.op_a_access.access.value.0, local.is_real); // If we are performing a branch or a store, then the value of `a` is the previous value. builder diff --git a/crates/core/machine/src/cpu/columns/channel.rs b/crates/core/machine/src/cpu/columns/channel.rs deleted file mode 100644 index 1f1d6ec535..0000000000 --- a/crates/core/machine/src/cpu/columns/channel.rs +++ /dev/null @@ -1,59 +0,0 @@ -use p3_air::AirBuilder; -use p3_field::{AbstractField, Field}; -use sp1_derive::AlignedBorrow; -use sp1_stark::air::SP1AirBuilder; - -use crate::bytes::NUM_BYTE_LOOKUP_CHANNELS; - -#[derive(AlignedBorrow, Default, Debug, Clone, Copy)] -#[repr(C)] -pub struct ChannelSelectorCols { - pub channel_selectors: [T; NUM_BYTE_LOOKUP_CHANNELS as usize], -} - -impl ChannelSelectorCols { - #[inline(always)] - pub fn populate(&mut self, channel: u8) { - self.channel_selectors = [F::zero(); NUM_BYTE_LOOKUP_CHANNELS as usize]; - self.channel_selectors[channel as usize] = F::one(); - } -} - -pub fn eval_channel_selectors( - builder: &mut AB, - local: &ChannelSelectorCols, - next: &ChannelSelectorCols, - channel: impl Into + Clone, - local_is_real: impl Into + Clone, - next_is_real: impl Into + Clone, -) { - // Constrain: - // - the value of the channel is given by the channel selectors. - // - all selectors are boolean and disjoint. - let mut sum = AB::Expr::zero(); - let mut reconstruct_channel = AB::Expr::zero(); - for (i, selector) in local.channel_selectors.into_iter().enumerate() { - // Constrain that the selector is boolean. - builder.assert_bool(selector); - // Accumulate the sum of the selectors. - sum += selector.into(); - // Accumulate the reconstructed channel. - reconstruct_channel += selector.into() * AB::Expr::from_canonical_u32(i as u32); - } - // Assert that the reconstructed channel is the same as the channel. - builder.assert_eq(reconstruct_channel, channel.clone()); - // For disjointness, assert the sum of the selectors is 1. - builder.when(local_is_real.clone()).assert_eq(sum, AB::Expr::one()); - - // Constrain the first row by asserting that the first selector on the first line is true. - builder.when_first_row().assert_one(local.channel_selectors[0]); - - // Constrain the transition by asserting that the selectors satisfy the recursion relation: - // selectors_next[(i + 1) % NUM_BYTE_LOOKUP_CHANNELS] = selectors[i] - for i in 0..NUM_BYTE_LOOKUP_CHANNELS as usize { - builder.when_transition().when(next_is_real.clone()).assert_eq( - local.channel_selectors[i], - next.channel_selectors[(i + 1) % NUM_BYTE_LOOKUP_CHANNELS as usize], - ); - } -} diff --git a/crates/core/machine/src/cpu/columns/mod.rs b/crates/core/machine/src/cpu/columns/mod.rs index 3f382677ee..7a32b03db5 100644 --- a/crates/core/machine/src/cpu/columns/mod.rs +++ b/crates/core/machine/src/cpu/columns/mod.rs @@ -1,6 +1,5 @@ mod auipc; mod branch; -mod channel; mod ecall; mod instruction; mod jump; @@ -10,7 +9,6 @@ mod opcode_specific; pub use auipc::*; pub use branch::*; -pub use channel::*; pub use ecall::*; pub use instruction::*; pub use jump::*; @@ -35,8 +33,6 @@ pub const CPU_COL_MAP: CpuCols = make_col_map(); pub struct CpuCols { /// The current shard. pub shard: T, - /// The channel value, used for byte lookup multiplicity. - pub channel: T, pub nonce: T, @@ -56,9 +52,6 @@ pub struct CpuCols { /// Columns related to the instruction. pub instruction: InstructionCols, - /// Columns related to the byte lookup channel. - pub channel_selectors: ChannelSelectorCols, - /// Selectors for the opcode. pub selectors: OpcodeSelectorCols, diff --git a/crates/core/machine/src/cpu/trace.rs b/crates/core/machine/src/cpu/trace.rs index 790c8368b2..ce0eba1cfe 100644 --- a/crates/core/machine/src/cpu/trace.rs +++ b/crates/core/machine/src/cpu/trace.rs @@ -1,10 +1,7 @@ use hashbrown::HashMap; use itertools::Itertools; use sp1_core_executor::{ - events::{ - create_alu_lookups, AluEvent, ByteLookupEvent, ByteRecord, CpuEvent, LookupId, - MemoryRecordEnum, - }, + events::{ByteLookupEvent, ByteRecord, CpuEvent, LookupId, MemoryRecordEnum}, syscalls::SyscallCode, ByteOpcode::{self, U16Range}, CoreShape, ExecutionRecord, Opcode, Program, @@ -74,28 +71,20 @@ impl MachineAir for CpuChip { // Generate the trace rows for each event. let chunk_size = std::cmp::max(input.cpu_events.len() / num_cpus::get(), 1); - let (alu_events, blu_events): (Vec<_>, Vec<_>) = input + let blu_events: Vec<_> = input .cpu_events .par_chunks(chunk_size) .map(|ops: &[CpuEvent]| { - let mut alu = HashMap::new(); // The blu map stores shard -> map(byte lookup event -> multiplicity). let mut blu: HashMap> = HashMap::new(); ops.iter().for_each(|op| { let mut row = [F::zero(); NUM_CPU_COLS]; let cols: &mut CpuCols = row.as_mut_slice().borrow_mut(); - let alu_events = self.event_to_row::(op, &HashMap::new(), cols, &mut blu); - alu_events.into_iter().for_each(|(key, value)| { - alu.entry(key).or_insert(Vec::default()).extend(value); - }); + self.event_to_row::(op, &HashMap::new(), cols, &mut blu); }); - (alu, blu) + blu }) - .unzip(); - - for alu_events_chunk in alu_events.into_iter() { - output.add_alu_events(alu_events_chunk); - } + .collect::>(); output.add_sharded_byte_lookup_events(blu_events.iter().collect_vec()); } @@ -113,9 +102,7 @@ impl CpuChip { nonce_lookup: &HashMap, cols: &mut CpuCols, blu_events: &mut impl ByteRecord, - ) -> HashMap> { - let mut new_alu_events = HashMap::new(); - + ) { // Populate shard and clk columns. self.populate_shard_clk(cols, event, blu_events); @@ -135,13 +122,13 @@ impl CpuChip { // Populate memory accesses for a, b, and c. if let Some(record) = event.a_record { - cols.op_a_access.populate(event.channel, record, blu_events); + cols.op_a_access.populate(record, blu_events); } if let Some(MemoryRecordEnum::Read(record)) = event.b_record { - cols.op_b_access.populate(event.channel, record, blu_events); + cols.op_b_access.populate(record, blu_events); } if let Some(MemoryRecordEnum::Read(record)) = event.c_record { - cols.op_c_access.populate(event.channel, record, blu_events); + cols.op_c_access.populate(record, blu_events); } // Populate range checks for a. @@ -155,7 +142,6 @@ impl CpuChip { .collect::>(); blu_events.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::U8Range, a1: 0, a2: 0, @@ -164,7 +150,6 @@ impl CpuChip { }); blu_events.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::U8Range, a1: 0, a2: 0, @@ -176,14 +161,14 @@ impl CpuChip { assert_eq!(event.memory_record.is_some(), event.memory.is_some()); let memory_columns = cols.opcode_specific_columns.memory_mut(); if let Some(record) = event.memory_record { - memory_columns.memory_access.populate(event.channel, record, blu_events) + memory_columns.memory_access.populate(record, blu_events) } // Populate memory, branch, jump, and auipc specific fields. - self.populate_memory(cols, event, &mut new_alu_events, blu_events, nonce_lookup); - self.populate_branch(cols, event, &mut new_alu_events, nonce_lookup); - self.populate_jump(cols, event, &mut new_alu_events, nonce_lookup); - self.populate_auipc(cols, event, &mut new_alu_events, nonce_lookup); + self.populate_memory(cols, event, blu_events, nonce_lookup); + self.populate_branch(cols, event, nonce_lookup); + self.populate_jump(cols, event, nonce_lookup); + self.populate_auipc(cols, event, nonce_lookup); let is_halt = self.populate_ecall(cols, event, nonce_lookup); cols.is_sequential_instr = F::from_bool( @@ -194,11 +179,9 @@ impl CpuChip { // Assert that the instruction is not a no-op. cols.is_real = F::one(); - - new_alu_events } - /// Populates the shard, channel, and clk related rows. + /// Populates the shard and clk related rows. fn populate_shard_clk( &self, cols: &mut CpuCols, @@ -206,7 +189,6 @@ impl CpuChip { blu_events: &mut impl ByteRecord, ) { cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); let clk_16bit_limb = (event.clk & 0xffff) as u16; @@ -214,11 +196,8 @@ impl CpuChip { cols.clk_16bit_limb = F::from_canonical_u16(clk_16bit_limb); cols.clk_8bit_limb = F::from_canonical_u8(clk_8bit_limb); - cols.channel_selectors.populate(event.channel); - blu_events.add_byte_lookup_event(ByteLookupEvent::new( event.shard, - event.channel, U16Range, event.shard as u16, 0, @@ -227,7 +206,6 @@ impl CpuChip { )); blu_events.add_byte_lookup_event(ByteLookupEvent::new( event.shard, - event.channel, U16Range, clk_16bit_limb, 0, @@ -236,7 +214,6 @@ impl CpuChip { )); blu_events.add_byte_lookup_event(ByteLookupEvent::new( event.shard, - event.channel, ByteOpcode::U8Range, 0, 0, @@ -250,7 +227,6 @@ impl CpuChip { &self, cols: &mut CpuCols, event: &CpuEvent, - new_alu_events: &mut HashMap>, blu_events: &mut impl ByteRecord, nonce_lookup: &HashMap, ) { @@ -281,23 +257,6 @@ impl CpuChip { let aligned_addr_ls_byte = (aligned_addr & 0x000000FF) as u8; let bits: [bool; 8] = array::from_fn(|i| aligned_addr_ls_byte & (1 << i) != 0); memory_columns.aa_least_sig_byte_decomp = array::from_fn(|i| F::from_bool(bits[i + 2])); - - // Add event to ALU check to check that addr == b + c - let add_event = AluEvent { - lookup_id: event.memory_add_lookup_id, - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: Opcode::ADD, - a: memory_addr, - b: event.b, - c: event.c, - sub_lookups: create_alu_lookups(), - }; - new_alu_events - .entry(Opcode::ADD) - .and_modify(|op_new_events| op_new_events.push(add_event)) - .or_insert(vec![add_event]); memory_columns.addr_word_nonce = F::from_canonical_u32( nonce_lookup.get(&event.memory_add_lookup_id).copied().unwrap_or_default(), ); @@ -336,15 +295,10 @@ impl CpuChip { // For the signed load instructions, we need to check if the loaded value is negative. if matches!(event.instruction.opcode, Opcode::LB | Opcode::LH) { - let most_sig_mem_value_byte: u8; - let sign_value: u32; - if matches!(event.instruction.opcode, Opcode::LB) { - sign_value = 256; - most_sig_mem_value_byte = cols.unsigned_mem_val.to_u32().to_le_bytes()[0]; + let most_sig_mem_value_byte = if matches!(event.instruction.opcode, Opcode::LB) { + cols.unsigned_mem_val.to_u32().to_le_bytes()[0] } else { - // LHU case - sign_value = 65536; - most_sig_mem_value_byte = cols.unsigned_mem_val.to_u32().to_le_bytes()[1]; + cols.unsigned_mem_val.to_u32().to_le_bytes()[1] }; for i in (0..8).rev() { @@ -354,25 +308,9 @@ impl CpuChip { if memory_columns.most_sig_byte_decomp[7] == F::one() { cols.mem_value_is_neg_not_x0 = F::from_bool(event.instruction.op_a != (X0 as u32)); - let sub_event = AluEvent { - lookup_id: event.memory_sub_lookup_id, - channel: event.channel, - shard: event.shard, - clk: event.clk, - opcode: Opcode::SUB, - a: event.a, - b: cols.unsigned_mem_val.to_u32(), - c: sign_value, - sub_lookups: create_alu_lookups(), - }; cols.unsigned_mem_val_nonce = F::from_canonical_u32( nonce_lookup.get(&event.memory_sub_lookup_id).copied().unwrap_or_default(), ); - - new_alu_events - .entry(Opcode::SUB) - .and_modify(|op_new_events| op_new_events.push(sub_event)) - .or_insert(vec![sub_event]); } } @@ -390,7 +328,6 @@ impl CpuChip { for byte_pair in addr_bytes.chunks_exact(2) { blu_events.add_byte_lookup_event(ByteLookupEvent { shard: event.shard, - channel: event.channel, opcode: ByteOpcode::U8Range, a1: 0, a2: 0, @@ -405,7 +342,6 @@ impl CpuChip { &self, cols: &mut CpuCols, event: &CpuEvent, - alu_events: &mut HashMap>, nonce_lookup: &HashMap, ) { if event.instruction.is_branch_instruction() { @@ -427,49 +363,14 @@ impl CpuChip { event.a > event.b }; - let alu_op_code = if use_signed_comparison { Opcode::SLT } else { Opcode::SLTU }; - - // Add the ALU events for the comparisons - let lt_comp_event = AluEvent { - lookup_id: event.branch_lt_lookup_id, - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: alu_op_code, - a: a_lt_b as u32, - b: event.a, - c: event.b, - sub_lookups: create_alu_lookups(), - }; branch_columns.a_lt_b_nonce = F::from_canonical_u32( nonce_lookup.get(&event.branch_lt_lookup_id).copied().unwrap_or_default(), ); - alu_events - .entry(alu_op_code) - .and_modify(|op_new_events| op_new_events.push(lt_comp_event)) - .or_insert(vec![lt_comp_event]); - - let gt_comp_event = AluEvent { - lookup_id: event.branch_gt_lookup_id, - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: alu_op_code, - a: a_gt_b as u32, - b: event.b, - c: event.a, - sub_lookups: create_alu_lookups(), - }; branch_columns.a_gt_b_nonce = F::from_canonical_u32( nonce_lookup.get(&event.branch_gt_lookup_id).copied().unwrap_or_default(), ); - alu_events - .entry(alu_op_code) - .and_modify(|op_new_events| op_new_events.push(gt_comp_event)) - .or_insert(vec![gt_comp_event]); - branch_columns.a_eq_b = F::from_bool(a_eq_b); branch_columns.a_lt_b = F::from_bool(a_lt_b); branch_columns.a_gt_b = F::from_bool(a_gt_b); @@ -490,26 +391,9 @@ impl CpuChip { if branching { cols.branching = F::one(); - - let add_event = AluEvent { - lookup_id: event.branch_add_lookup_id, - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: Opcode::ADD, - a: next_pc, - b: event.pc, - c: event.c, - sub_lookups: create_alu_lookups(), - }; branch_columns.next_pc_nonce = F::from_canonical_u32( nonce_lookup.get(&event.branch_add_lookup_id).copied().unwrap_or_default(), ); - - alu_events - .entry(Opcode::ADD) - .and_modify(|op_new_events| op_new_events.push(add_event)) - .or_insert(vec![add_event]); } else { cols.not_branching = F::one(); } @@ -521,7 +405,6 @@ impl CpuChip { &self, cols: &mut CpuCols, event: &CpuEvent, - alu_events: &mut HashMap>, nonce_lookup: &HashMap, ) { if event.instruction.is_jump_instruction() { @@ -535,52 +418,18 @@ impl CpuChip { jump_columns.pc_range_checker.populate(event.pc); jump_columns.next_pc = Word::from(next_pc); jump_columns.next_pc_range_checker.populate(next_pc); - - let add_event = AluEvent { - lookup_id: event.jump_jal_lookup_id, - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: Opcode::ADD, - a: next_pc, - b: event.pc, - c: event.b, - sub_lookups: create_alu_lookups(), - }; jump_columns.jal_nonce = F::from_canonical_u32( nonce_lookup.get(&event.jump_jal_lookup_id).copied().unwrap_or_default(), ); - - alu_events - .entry(Opcode::ADD) - .and_modify(|op_new_events| op_new_events.push(add_event)) - .or_insert(vec![add_event]); } Opcode::JALR => { let next_pc = event.b.wrapping_add(event.c); jump_columns.op_a_range_checker.populate(event.a); jump_columns.next_pc = Word::from(next_pc); jump_columns.next_pc_range_checker.populate(next_pc); - - let add_event = AluEvent { - lookup_id: event.jump_jalr_lookup_id, - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: Opcode::ADD, - a: next_pc, - b: event.b, - c: event.c, - sub_lookups: create_alu_lookups(), - }; jump_columns.jalr_nonce = F::from_canonical_u32( nonce_lookup.get(&event.jump_jalr_lookup_id).copied().unwrap_or_default(), ); - - alu_events - .entry(Opcode::ADD) - .and_modify(|op_new_events| op_new_events.push(add_event)) - .or_insert(vec![add_event]); } _ => unreachable!(), } @@ -592,7 +441,6 @@ impl CpuChip { &self, cols: &mut CpuCols, event: &CpuEvent, - alu_events: &mut HashMap>, nonce_lookup: &HashMap, ) { if matches!(event.instruction.opcode, Opcode::AUIPC) { @@ -600,26 +448,9 @@ impl CpuChip { auipc_columns.pc = Word::from(event.pc); auipc_columns.pc_range_checker.populate(event.pc); - - let add_event = AluEvent { - lookup_id: event.auipc_lookup_id, - shard: event.shard, - channel: event.channel, - clk: event.clk, - opcode: Opcode::ADD, - a: event.a, - b: event.pc, - c: event.b, - sub_lookups: create_alu_lookups(), - }; auipc_columns.auipc_nonce = F::from_canonical_u32( nonce_lookup.get(&event.auipc_lookup_id).copied().unwrap_or_default(), ); - - alu_events - .entry(Opcode::ADD) - .and_modify(|op_new_events| op_new_events.push(add_event)) - .or_insert(vec![add_event]); } } diff --git a/crates/core/machine/src/memory/global.rs b/crates/core/machine/src/memory/global.rs index a382d9855a..d59acbecb5 100644 --- a/crates/core/machine/src/memory/global.rs +++ b/crates/core/machine/src/memory/global.rs @@ -11,7 +11,7 @@ use sp1_core_executor::{events::MemoryInitializeFinalizeEvent, ExecutionRecord, use sp1_derive::AlignedBorrow; use sp1_stark::{ air::{ - AirInteraction, BaseAirBuilder, MachineAir, PublicValues, SP1AirBuilder, + AirInteraction, BaseAirBuilder, InteractionScope, MachineAir, PublicValues, SP1AirBuilder, SP1_PROOF_NUM_PV_ELTS, }, InteractionKind, Word, @@ -22,40 +22,35 @@ use crate::{ utils::pad_rows_fixed, }; -/// The type of memory chip that is being initialized. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum MemoryChipType { - Initialize, - Finalize, -} +use super::MemoryChipType; /// A memory chip that can initialize or finalize values in memory. -pub struct MemoryChip { +pub struct MemoryGlobalChip { pub kind: MemoryChipType, } -impl MemoryChip { +impl MemoryGlobalChip { /// Creates a new memory chip with a certain type. pub const fn new(kind: MemoryChipType) -> Self { Self { kind } } } -impl BaseAir for MemoryChip { +impl BaseAir for MemoryGlobalChip { fn width(&self) -> usize { NUM_MEMORY_INIT_COLS } } -impl MachineAir for MemoryChip { +impl MachineAir for MemoryGlobalChip { type Record = ExecutionRecord; type Program = Program; fn name(&self) -> String { match self.kind { - MemoryChipType::Initialize => "MemoryInit".to_string(), - MemoryChipType::Finalize => "MemoryFinalize".to_string(), + MemoryChipType::Initialize => "MemoryGlobalInit".to_string(), + MemoryChipType::Finalize => "MemoryGlobalFinalize".to_string(), } } @@ -69,8 +64,8 @@ impl MachineAir for MemoryChip { _output: &mut ExecutionRecord, ) -> RowMajorMatrix { let mut memory_events = match self.kind { - MemoryChipType::Initialize => input.memory_initialize_events.clone(), - MemoryChipType::Finalize => input.memory_finalize_events.clone(), + MemoryChipType::Initialize => input.global_memory_initialize_events.clone(), + MemoryChipType::Finalize => input.global_memory_finalize_events.clone(), }; let previous_addr_bits = match self.kind { @@ -139,10 +134,14 @@ impl MachineAir for MemoryChip { fn included(&self, shard: &Self::Record) -> bool { match self.kind { - MemoryChipType::Initialize => !shard.memory_initialize_events.is_empty(), - MemoryChipType::Finalize => !shard.memory_finalize_events.is_empty(), + MemoryChipType::Initialize => !shard.global_memory_initialize_events.is_empty(), + MemoryChipType::Finalize => !shard.global_memory_finalize_events.is_empty(), } } + + fn commit_scope(&self) -> InteractionScope { + InteractionScope::Global + } } #[derive(AlignedBorrow, Debug, Clone, Copy)] @@ -184,7 +183,7 @@ pub struct MemoryInitCols { pub(crate) const NUM_MEMORY_INIT_COLS: usize = size_of::>(); -impl Air for MemoryChip +impl Air for MemoryGlobalChip where AB: SP1AirBuilder, { @@ -215,19 +214,17 @@ where if self.kind == MemoryChipType::Initialize { let mut values = vec![AB::Expr::zero(), AB::Expr::zero(), local.addr.into()]; values.extend(value.map(Into::into)); - builder.receive(AirInteraction::new( - values, - local.is_real.into(), - InteractionKind::Memory, - )); + builder.send( + AirInteraction::new(values, local.is_real.into(), InteractionKind::Memory), + InteractionScope::Global, + ); } else { let mut values = vec![local.shard.into(), local.timestamp.into(), local.addr.into()]; values.extend(value); - builder.send(AirInteraction::new( - values, - local.is_real.into(), - InteractionKind::Memory, - )); + builder.receive( + AirInteraction::new(values, local.is_real.into(), InteractionKind::Memory), + InteractionScope::Global, + ); } // Canonically decompose the address into bits so we can do comparisons. @@ -380,18 +377,18 @@ mod tests { runtime.run().unwrap(); let shard = runtime.record.clone(); - let chip: MemoryChip = MemoryChip::new(MemoryChipType::Initialize); + let chip: MemoryGlobalChip = MemoryGlobalChip::new(MemoryChipType::Initialize); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); println!("{:?}", trace.values); - let chip: MemoryChip = MemoryChip::new(MemoryChipType::Finalize); + let chip: MemoryGlobalChip = MemoryGlobalChip::new(MemoryChipType::Finalize); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); println!("{:?}", trace.values); - for mem_event in shard.memory_finalize_events { + for mem_event in shard.global_memory_finalize_events { println!("{:?}", mem_event); } } @@ -407,14 +404,24 @@ mod tests { RiscvAir::machine(BabyBearPoseidon2::new()); let (pkey, _) = machine.setup(&program_clone); let opts = SP1CoreOpts::default(); - machine.generate_dependencies(&mut runtime.records, &opts); + machine.generate_dependencies(&mut runtime.records, &opts, None); let shards = runtime.records; + for shard in shards.clone() { + debug_interactions_with_all_chips::>( + &machine, + &pkey, + &[shard], + vec![InteractionKind::Memory], + InteractionScope::Local, + ); + } debug_interactions_with_all_chips::>( &machine, &pkey, &shards, vec![InteractionKind::Memory], + InteractionScope::Global, ); } @@ -428,7 +435,7 @@ mod tests { let machine = RiscvAir::machine(BabyBearPoseidon2::new()); let (pkey, _) = machine.setup(&program_clone); let opts = SP1CoreOpts::default(); - machine.generate_dependencies(&mut runtime.records, &opts); + machine.generate_dependencies(&mut runtime.records, &opts, None); let shards = runtime.records; debug_interactions_with_all_chips::>( @@ -436,6 +443,7 @@ mod tests { &pkey, &shards, vec![InteractionKind::Byte], + InteractionScope::Global, ); } } diff --git a/crates/core/machine/src/memory/local.rs b/crates/core/machine/src/memory/local.rs new file mode 100644 index 0000000000..bc272d8cac --- /dev/null +++ b/crates/core/machine/src/memory/local.rs @@ -0,0 +1,269 @@ +use std::{ + borrow::{Borrow, BorrowMut}, + mem::size_of, +}; + +use crate::utils::pad_to_power_of_two; +use itertools::Itertools; +use p3_air::{Air, BaseAir}; +use p3_field::PrimeField32; +use p3_matrix::{dense::RowMajorMatrix, Matrix}; +use sp1_core_executor::{ExecutionRecord, Program}; +use sp1_derive::AlignedBorrow; +use sp1_stark::{ + air::{AirInteraction, InteractionScope, MachineAir, SP1AirBuilder}, + InteractionKind, Word, +}; + +const NUM_LOCAL_MEMORY_ENTRIES_PER_ROW: usize = 2; + +pub(crate) const NUM_MEMORY_LOCAL_INIT_COLS: usize = size_of::>(); + +#[derive(AlignedBorrow, Debug, Clone, Copy)] +#[repr(C)] +struct SingleMemoryLocal { + /// The address of the memory access. + pub addr: T, + + /// The initial shard of the memory access. + pub initial_shard: T, + + /// The final shard of the memory access. + pub final_shard: T, + + /// The initial clk of the memory access. + pub initial_clk: T, + + /// The final clk of the memory access. + pub final_clk: T, + + /// The initial value of the memory access. + pub initial_value: Word, + + /// The final value of the memory access. + pub final_value: Word, + + /// Whether the memory access is a real access. + pub is_real: T, +} + +#[derive(AlignedBorrow, Debug, Clone, Copy)] +#[repr(C)] +pub struct MemoryLocalCols { + memory_local_entries: [SingleMemoryLocal; NUM_LOCAL_MEMORY_ENTRIES_PER_ROW], +} + +pub struct MemoryLocalChip {} + +impl MemoryLocalChip { + /// Creates a new memory chip with a certain type. + pub const fn new() -> Self { + Self {} + } +} + +impl BaseAir for MemoryLocalChip { + fn width(&self) -> usize { + NUM_MEMORY_LOCAL_INIT_COLS + } +} + +impl MachineAir for MemoryLocalChip { + type Record = ExecutionRecord; + + type Program = Program; + + fn name(&self) -> String { + "MemoryLocal".to_string() + } + + fn generate_dependencies(&self, _input: &ExecutionRecord, _output: &mut ExecutionRecord) { + // Do nothing since this chip has no dependencies. + } + + fn generate_trace( + &self, + input: &ExecutionRecord, + _output: &mut ExecutionRecord, + ) -> RowMajorMatrix { + let mut rows = Vec::<[F; NUM_MEMORY_LOCAL_INIT_COLS]>::new(); + + for local_mem_events in + &input.get_local_mem_events().chunks(NUM_LOCAL_MEMORY_ENTRIES_PER_ROW) + { + let mut row = [F::zero(); NUM_MEMORY_LOCAL_INIT_COLS]; + let cols: &mut MemoryLocalCols = row.as_mut_slice().borrow_mut(); + + for (cols, event) in cols.memory_local_entries.iter_mut().zip(local_mem_events) { + cols.addr = F::from_canonical_u32(event.addr); + cols.initial_shard = F::from_canonical_u32(event.initial_mem_access.shard); + cols.final_shard = F::from_canonical_u32(event.final_mem_access.shard); + cols.initial_clk = F::from_canonical_u32(event.initial_mem_access.timestamp); + cols.final_clk = F::from_canonical_u32(event.final_mem_access.timestamp); + cols.initial_value = event.initial_mem_access.value.into(); + cols.final_value = event.final_mem_access.value.into(); + cols.is_real = F::one(); + } + + rows.push(row); + } + let mut trace = RowMajorMatrix::new( + rows.into_iter().flatten().collect::>(), + NUM_MEMORY_LOCAL_INIT_COLS, + ); + + pad_to_power_of_two::(&mut trace.values); + + trace + } + + fn included(&self, shard: &Self::Record) -> bool { + shard.get_local_mem_events().nth(0).is_some() + } + + fn commit_scope(&self) -> InteractionScope { + InteractionScope::Global + } +} + +impl Air for MemoryLocalChip +where + AB: SP1AirBuilder, +{ + fn eval(&self, builder: &mut AB) { + let main = builder.main(); + let local = main.row_slice(0); + let local: &MemoryLocalCols = (*local).borrow(); + + for local in local.memory_local_entries.iter() { + builder.assert_eq( + local.is_real * local.is_real * local.is_real, + local.is_real * local.is_real * local.is_real, + ); + + for scope in [InteractionScope::Global, InteractionScope::Local] { + let mut values = + vec![local.initial_shard.into(), local.initial_clk.into(), local.addr.into()]; + values.extend(local.initial_value.map(Into::into)); + builder.receive( + AirInteraction::new( + values.clone(), + local.is_real.into(), + InteractionKind::Memory, + ), + scope, + ); + + let mut values = + vec![local.final_shard.into(), local.final_clk.into(), local.addr.into()]; + values.extend(local.final_value.map(Into::into)); + builder.send( + AirInteraction::new( + values.clone(), + local.is_real.into(), + InteractionKind::Memory, + ), + scope, + ); + } + } + } +} + +#[cfg(test)] +mod tests { + use p3_baby_bear::BabyBear; + use p3_matrix::dense::RowMajorMatrix; + use sp1_core_executor::{programs::tests::simple_program, ExecutionRecord, Executor}; + use sp1_stark::{ + air::{InteractionScope, MachineAir}, + baby_bear_poseidon2::BabyBearPoseidon2, + debug_interactions_with_all_chips, InteractionKind, SP1CoreOpts, StarkMachine, + }; + + use crate::{ + memory::MemoryLocalChip, riscv::RiscvAir, + syscall::precompiles::sha256::extend_tests::sha_extend_program, utils::setup_logger, + }; + + #[test] + fn test_local_memory_generate_trace() { + let program = simple_program(); + let mut runtime = Executor::new(program, SP1CoreOpts::default()); + runtime.run().unwrap(); + let shard = runtime.records[0].clone(); + + let chip: MemoryLocalChip = MemoryLocalChip::new(); + + let trace: RowMajorMatrix = + chip.generate_trace(&shard, &mut ExecutionRecord::default()); + println!("{:?}", trace.values); + + for mem_event in shard.global_memory_finalize_events { + println!("{:?}", mem_event); + } + } + + #[test] + fn test_memory_lookup_interactions() { + setup_logger(); + let program = sha_extend_program(); + let program_clone = program.clone(); + let mut runtime = Executor::new(program, SP1CoreOpts::default()); + runtime.run().unwrap(); + let machine: StarkMachine> = + RiscvAir::machine(BabyBearPoseidon2::new()); + let (pkey, _) = machine.setup(&program_clone); + let opts = SP1CoreOpts::default(); + machine.generate_dependencies(&mut runtime.records, &opts, None); + + let shards = runtime.records; + for shard in shards.clone() { + debug_interactions_with_all_chips::>( + &machine, + &pkey, + &[shard], + vec![InteractionKind::Memory], + InteractionScope::Local, + ); + } + debug_interactions_with_all_chips::>( + &machine, + &pkey, + &shards, + vec![InteractionKind::Memory], + InteractionScope::Global, + ); + } + + #[test] + fn test_byte_lookup_interactions() { + setup_logger(); + let program = sha_extend_program(); + let program_clone = program.clone(); + let mut runtime = Executor::new(program, SP1CoreOpts::default()); + runtime.run().unwrap(); + let machine = RiscvAir::machine(BabyBearPoseidon2::new()); + let (pkey, _) = machine.setup(&program_clone); + let opts = SP1CoreOpts::default(); + machine.generate_dependencies(&mut runtime.records, &opts, None); + + let shards = runtime.records; + for shard in shards.clone() { + debug_interactions_with_all_chips::>( + &machine, + &pkey, + &[shard], + vec![InteractionKind::Memory], + InteractionScope::Local, + ); + } + debug_interactions_with_all_chips::>( + &machine, + &pkey, + &shards, + vec![InteractionKind::Byte], + InteractionScope::Global, + ); + } +} diff --git a/crates/core/machine/src/memory/mod.rs b/crates/core/machine/src/memory/mod.rs index 13f9050f31..ba4a7a650a 100644 --- a/crates/core/machine/src/memory/mod.rs +++ b/crates/core/machine/src/memory/mod.rs @@ -1,8 +1,17 @@ mod columns; mod global; +mod local; mod program; mod trace; pub use columns::*; pub use global::*; +pub use local::*; pub use program::*; + +/// The type of memory chip that is being initialized. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum MemoryChipType { + Initialize, + Finalize, +} diff --git a/crates/core/machine/src/memory/program.rs b/crates/core/machine/src/memory/program.rs index c69e7e575b..65a3b836ed 100644 --- a/crates/core/machine/src/memory/program.rs +++ b/crates/core/machine/src/memory/program.rs @@ -9,7 +9,10 @@ use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ExecutionRecord, Program}; use sp1_derive::AlignedBorrow; use sp1_stark::{ - air::{AirInteraction, MachineAir, PublicValues, SP1AirBuilder, SP1_PROOF_NUM_PV_ELTS}, + air::{ + AirInteraction, InteractionScope, MachineAir, PublicValues, SP1AirBuilder, + SP1_PROOF_NUM_PV_ELTS, + }, InteractionKind, Word, }; @@ -140,6 +143,10 @@ impl MachineAir for MemoryProgramChip { fn included(&self, _: &Self::Record) -> bool { true } + + fn commit_scope(&self) -> InteractionScope { + InteractionScope::Global + } } impl BaseAir for MemoryProgramChip { @@ -189,10 +196,9 @@ where let mut values = vec![AB::Expr::zero(), AB::Expr::zero(), prep_local.addr.into()]; values.extend(prep_local.value.map(Into::into)); - builder.receive(AirInteraction::new( - values, - mult_local.multiplicity.into(), - InteractionKind::Memory, - )); + builder.send( + AirInteraction::new(values, mult_local.multiplicity.into(), InteractionKind::Memory), + InteractionScope::Global, + ); } } diff --git a/crates/core/machine/src/memory/trace.rs b/crates/core/machine/src/memory/trace.rs index 7dd5b12586..3b451ad241 100644 --- a/crates/core/machine/src/memory/trace.rs +++ b/crates/core/machine/src/memory/trace.rs @@ -6,12 +6,7 @@ use sp1_core_executor::events::{ use super::{MemoryAccessCols, MemoryReadCols, MemoryReadWriteCols, MemoryWriteCols}; impl MemoryWriteCols { - pub fn populate( - &mut self, - channel: u8, - record: MemoryWriteRecord, - output: &mut impl ByteRecord, - ) { + pub fn populate(&mut self, record: MemoryWriteRecord, output: &mut impl ByteRecord) { let current_record = MemoryRecord { value: record.value, shard: record.shard, timestamp: record.timestamp }; let prev_record = MemoryRecord { @@ -20,17 +15,12 @@ impl MemoryWriteCols { timestamp: record.prev_timestamp, }; self.prev_value = prev_record.value.into(); - self.access.populate_access(channel, current_record, prev_record, output); + self.access.populate_access(current_record, prev_record, output); } } impl MemoryReadCols { - pub fn populate( - &mut self, - channel: u8, - record: MemoryReadRecord, - output: &mut impl ByteRecord, - ) { + pub fn populate(&mut self, record: MemoryReadRecord, output: &mut impl ByteRecord) { let current_record = MemoryRecord { value: record.value, shard: record.shard, timestamp: record.timestamp }; let prev_record = MemoryRecord { @@ -38,31 +28,19 @@ impl MemoryReadCols { shard: record.prev_shard, timestamp: record.prev_timestamp, }; - self.access.populate_access(channel, current_record, prev_record, output); + self.access.populate_access(current_record, prev_record, output); } } impl MemoryReadWriteCols { - pub fn populate( - &mut self, - channel: u8, - record: MemoryRecordEnum, - output: &mut impl ByteRecord, - ) { + pub fn populate(&mut self, record: MemoryRecordEnum, output: &mut impl ByteRecord) { match record { - MemoryRecordEnum::Read(read_record) => self.populate_read(channel, read_record, output), - MemoryRecordEnum::Write(write_record) => { - self.populate_write(channel, write_record, output) - } + MemoryRecordEnum::Read(read_record) => self.populate_read(read_record, output), + MemoryRecordEnum::Write(write_record) => self.populate_write(write_record, output), } } - pub fn populate_write( - &mut self, - channel: u8, - record: MemoryWriteRecord, - output: &mut impl ByteRecord, - ) { + pub fn populate_write(&mut self, record: MemoryWriteRecord, output: &mut impl ByteRecord) { let current_record = MemoryRecord { value: record.value, shard: record.shard, timestamp: record.timestamp }; let prev_record = MemoryRecord { @@ -71,15 +49,10 @@ impl MemoryReadWriteCols { timestamp: record.prev_timestamp, }; self.prev_value = prev_record.value.into(); - self.access.populate_access(channel, current_record, prev_record, output); + self.access.populate_access(current_record, prev_record, output); } - pub fn populate_read( - &mut self, - channel: u8, - record: MemoryReadRecord, - output: &mut impl ByteRecord, - ) { + pub fn populate_read(&mut self, record: MemoryReadRecord, output: &mut impl ByteRecord) { let current_record = MemoryRecord { value: record.value, shard: record.shard, timestamp: record.timestamp }; let prev_record = MemoryRecord { @@ -88,14 +61,13 @@ impl MemoryReadWriteCols { timestamp: record.prev_timestamp, }; self.prev_value = prev_record.value.into(); - self.access.populate_access(channel, current_record, prev_record, output); + self.access.populate_access(current_record, prev_record, output); } } impl MemoryAccessCols { pub(crate) fn populate_access( &mut self, - channel: u8, current_record: MemoryRecord, prev_record: MemoryRecord, output: &mut impl ByteRecord, @@ -123,9 +95,9 @@ impl MemoryAccessCols { let shard = current_record.shard; // Add a byte table lookup with the 16Range op. - output.add_u16_range_check(shard, channel, diff_16bit_limb); + output.add_u16_range_check(shard, diff_16bit_limb); // Add a byte table lookup with the U8Range op. - output.add_u8_range_check(shard, channel, 0, diff_8bit_limb as u8); + output.add_u8_range_check(shard, 0, diff_8bit_limb as u8); } } diff --git a/crates/core/machine/src/operations/add.rs b/crates/core/machine/src/operations/add.rs index 5e1172b487..1ba8eb127f 100644 --- a/crates/core/machine/src/operations/add.rs +++ b/crates/core/machine/src/operations/add.rs @@ -23,7 +23,6 @@ impl AddOperation { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, a_u32: u32, b_u32: u32, ) -> u32 { @@ -52,9 +51,9 @@ impl AddOperation { // Range check { - record.add_u8_range_checks(shard, channel, &a); - record.add_u8_range_checks(shard, channel, &b); - record.add_u8_range_checks(shard, channel, &expected.to_le_bytes()); + record.add_u8_range_checks(shard, &a); + record.add_u8_range_checks(shard, &b); + record.add_u8_range_checks(shard, &expected.to_le_bytes()); } expected } @@ -64,8 +63,6 @@ impl AddOperation { a: Word, b: Word, cols: AddOperation, - shard: AB::Var, - channel: impl Into + Clone, is_real: AB::Expr, ) { let one = AB::Expr::one(); @@ -102,9 +99,9 @@ impl AddOperation { // Range check each byte. { - builder.slice_range_check_u8(&a.0, shard, channel.clone(), is_real.clone()); - builder.slice_range_check_u8(&b.0, shard, channel.clone(), is_real.clone()); - builder.slice_range_check_u8(&cols.value.0, shard, channel.clone(), is_real); + builder.slice_range_check_u8(&a.0, is_real.clone()); + builder.slice_range_check_u8(&b.0, is_real.clone()); + builder.slice_range_check_u8(&cols.value.0, is_real); } } } diff --git a/crates/core/machine/src/operations/add4.rs b/crates/core/machine/src/operations/add4.rs index 5fe5ec0fd1..fc010e9ab1 100644 --- a/crates/core/machine/src/operations/add4.rs +++ b/crates/core/machine/src/operations/add4.rs @@ -38,7 +38,6 @@ impl Add4Operation { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, a_u32: u32, b_u32: u32, c_u32: u32, @@ -70,11 +69,11 @@ impl Add4Operation { // Range check. { - record.add_u8_range_checks(shard, channel, &a); - record.add_u8_range_checks(shard, channel, &b); - record.add_u8_range_checks(shard, channel, &c); - record.add_u8_range_checks(shard, channel, &d); - record.add_u8_range_checks(shard, channel, &expected.to_le_bytes()); + record.add_u8_range_checks(shard, &a); + record.add_u8_range_checks(shard, &b); + record.add_u8_range_checks(shard, &c); + record.add_u8_range_checks(shard, &d); + record.add_u8_range_checks(shard, &expected.to_le_bytes()); } expected } @@ -86,18 +85,16 @@ impl Add4Operation { b: Word, c: Word, d: Word, - shard: AB::Var, - channel: impl Into + Copy, is_real: AB::Var, cols: Add4Operation, ) { // Range check each byte. { - builder.slice_range_check_u8(&a.0, shard, channel, is_real); - builder.slice_range_check_u8(&b.0, shard, channel, is_real); - builder.slice_range_check_u8(&c.0, shard, channel, is_real); - builder.slice_range_check_u8(&d.0, shard, channel, is_real); - builder.slice_range_check_u8(&cols.value.0, shard, channel, is_real); + builder.slice_range_check_u8(&a.0, is_real); + builder.slice_range_check_u8(&b.0, is_real); + builder.slice_range_check_u8(&c.0, is_real); + builder.slice_range_check_u8(&d.0, is_real); + builder.slice_range_check_u8(&cols.value.0, is_real); } builder.assert_bool(is_real); diff --git a/crates/core/machine/src/operations/add5.rs b/crates/core/machine/src/operations/add5.rs index 959d06dd10..dcd011f7f8 100644 --- a/crates/core/machine/src/operations/add5.rs +++ b/crates/core/machine/src/operations/add5.rs @@ -40,7 +40,6 @@ impl Add5Operation { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, a_u32: u32, b_u32: u32, c_u32: u32, @@ -78,12 +77,12 @@ impl Add5Operation { // Range check. { - record.add_u8_range_checks(shard, channel, &a); - record.add_u8_range_checks(shard, channel, &b); - record.add_u8_range_checks(shard, channel, &c); - record.add_u8_range_checks(shard, channel, &d); - record.add_u8_range_checks(shard, channel, &e); - record.add_u8_range_checks(shard, channel, &expected.to_le_bytes()); + record.add_u8_range_checks(shard, &a); + record.add_u8_range_checks(shard, &b); + record.add_u8_range_checks(shard, &c); + record.add_u8_range_checks(shard, &d); + record.add_u8_range_checks(shard, &e); + record.add_u8_range_checks(shard, &expected.to_le_bytes()); } expected @@ -92,18 +91,14 @@ impl Add5Operation { pub fn eval( builder: &mut AB, words: &[Word; 5], - shard: AB::Var, - channel: impl Into + Copy, is_real: AB::Var, cols: Add5Operation, ) { builder.assert_bool(is_real); // Range check each byte. { - words - .iter() - .for_each(|word| builder.slice_range_check_u8(&word.0, shard, channel, is_real)); - builder.slice_range_check_u8(&cols.value.0, shard, channel, is_real); + words.iter().for_each(|word| builder.slice_range_check_u8(&word.0, is_real)); + builder.slice_range_check_u8(&cols.value.0, is_real); } let mut builder_is_real = builder.when(is_real); diff --git a/crates/core/machine/src/operations/and.rs b/crates/core/machine/src/operations/and.rs index 5aaae62013..6f3dfd788a 100644 --- a/crates/core/machine/src/operations/and.rs +++ b/crates/core/machine/src/operations/and.rs @@ -17,14 +17,7 @@ pub struct AndOperation { } impl AndOperation { - pub fn populate( - &mut self, - record: &mut impl ByteRecord, - shard: u32, - channel: u8, - x: u32, - y: u32, - ) -> u32 { + pub fn populate(&mut self, record: &mut impl ByteRecord, shard: u32, x: u32, y: u32) -> u32 { let expected = x & y; let x_bytes = x.to_le_bytes(); let y_bytes = y.to_le_bytes(); @@ -34,7 +27,6 @@ impl AndOperation { let byte_event = ByteLookupEvent { shard, - channel, opcode: ByteOpcode::AND, a1: and as u16, a2: 0, @@ -52,8 +44,6 @@ impl AndOperation { a: Word, b: Word, cols: AndOperation, - shard: AB::Var, - channel: impl Into + Copy, is_real: AB::Var, ) { for i in 0..WORD_SIZE { @@ -62,8 +52,6 @@ impl AndOperation { cols.value[i], a[i], b[i], - shard, - channel, is_real, ); } diff --git a/crates/core/machine/src/operations/field/field_den.rs b/crates/core/machine/src/operations/field/field_den.rs index 610cbf66af..3c61a08e1d 100644 --- a/crates/core/machine/src/operations/field/field_den.rs +++ b/crates/core/machine/src/operations/field/field_den.rs @@ -35,7 +35,6 @@ impl FieldDenCols { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, a: &BigUint, b: &BigUint, sign: bool, @@ -83,10 +82,10 @@ impl FieldDenCols { self.witness_high = Limbs(p_witness_high.try_into().unwrap()); // Range checks - record.add_u8_range_checks_field(shard, channel, &self.result.0); - record.add_u8_range_checks_field(shard, channel, &self.carry.0); - record.add_u8_range_checks_field(shard, channel, &self.witness_low.0); - record.add_u8_range_checks_field(shard, channel, &self.witness_high.0); + record.add_u8_range_checks_field(shard, &self.result.0); + record.add_u8_range_checks_field(shard, &self.carry.0); + record.add_u8_range_checks_field(shard, &self.witness_low.0); + record.add_u8_range_checks_field(shard, &self.witness_high.0); result } @@ -103,8 +102,6 @@ where a: &Limbs, b: &Limbs, sign: bool, - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -133,25 +130,10 @@ where eval_field_operation::(builder, &p_vanishing, &p_witness_low, &p_witness_high); // Range checks for the result, carry, and witness columns. - builder.slice_range_check_u8( - &self.result.0, - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8( - &self.carry.0, - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8( - &self.witness_low.0, - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8(&self.witness_high.0, shard, channel.clone(), is_real); + builder.slice_range_check_u8(&self.result.0, is_real.clone()); + builder.slice_range_check_u8(&self.carry.0, is_real.clone()); + builder.slice_range_check_u8(&self.witness_low.0, is_real.clone()); + builder.slice_range_check_u8(&self.witness_high.0, is_real); } } @@ -245,7 +227,7 @@ mod tests { let cols: &mut TestCols = row.as_mut_slice().borrow_mut(); cols.a = P::to_limbs_field::(a); cols.b = P::to_limbs_field::(b); - cols.a_den_b.populate(output, 1, 0, a, b, self.sign); + cols.a_den_b.populate(output, 0, a, b, self.sign); row }) .collect::>(); @@ -276,15 +258,7 @@ mod tests { let main = builder.main(); let local = main.row_slice(0); let local: &TestCols = (*local).borrow(); - local.a_den_b.eval( - builder, - &local.a, - &local.b, - self.sign, - AB::F::one(), - AB::F::zero(), - AB::F::one(), - ); + local.a_den_b.eval(builder, &local.a, &local.b, self.sign, AB::F::zero()); } } diff --git a/crates/core/machine/src/operations/field/field_inner_product.rs b/crates/core/machine/src/operations/field/field_inner_product.rs index c90bf035d8..6d2e7cb1db 100644 --- a/crates/core/machine/src/operations/field/field_inner_product.rs +++ b/crates/core/machine/src/operations/field/field_inner_product.rs @@ -34,7 +34,6 @@ impl FieldInnerProductCols { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, a: &[BigUint], b: &[BigUint], ) -> BigUint { @@ -78,10 +77,10 @@ impl FieldInnerProductCols { self.witness_high = Limbs(p_witness_high.try_into().unwrap()); // Range checks - record.add_u8_range_checks_field(shard, channel, &self.result.0); - record.add_u8_range_checks_field(shard, channel, &self.carry.0); - record.add_u8_range_checks_field(shard, channel, &self.witness_low.0); - record.add_u8_range_checks_field(shard, channel, &self.witness_high.0); + record.add_u8_range_checks_field(shard, &self.result.0); + record.add_u8_range_checks_field(shard, &self.carry.0); + record.add_u8_range_checks_field(shard, &self.witness_low.0); + record.add_u8_range_checks_field(shard, &self.witness_high.0); result.clone() } @@ -96,8 +95,6 @@ where builder: &mut AB, a: &[Limbs], b: &[Limbs], - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -127,25 +124,10 @@ where eval_field_operation::(builder, &p_vanishing, &p_witness_low, &p_witness_high); // Range checks for the result, carry, and witness columns. - builder.slice_range_check_u8( - &self.result.0, - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8( - &self.carry.0, - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8( - &self.witness_low.0, - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8(&self.witness_high.0, shard, channel.clone(), is_real); + builder.slice_range_check_u8(&self.result.0, is_real.clone()); + builder.slice_range_check_u8(&self.carry.0, is_real.clone()); + builder.slice_range_check_u8(&self.witness_low.0, is_real.clone()); + builder.slice_range_check_u8(&self.witness_high.0, is_real); } } @@ -231,7 +213,7 @@ mod tests { let cols: &mut TestCols = row.as_mut_slice().borrow_mut(); cols.a[0] = P::to_limbs_field::(&a[0]); cols.b[0] = P::to_limbs_field::(&b[0]); - cols.a_ip_b.populate(output, 1, 0, a, b); + cols.a_ip_b.populate(output, 1, a, b); row }) .collect::>(); @@ -265,14 +247,7 @@ mod tests { let main = builder.main(); let local = main.row_slice(0); let local: &TestCols = (*local).borrow(); - local.a_ip_b.eval( - builder, - &local.a, - &local.b, - AB::F::one(), - AB::F::zero(), - AB::F::one(), - ); + local.a_ip_b.eval(builder, &local.a, &local.b, AB::F::one()); } } diff --git a/crates/core/machine/src/operations/field/field_op.rs b/crates/core/machine/src/operations/field/field_op.rs index b2120dad99..a69223fc5b 100644 --- a/crates/core/machine/src/operations/field/field_op.rs +++ b/crates/core/machine/src/operations/field/field_op.rs @@ -107,7 +107,6 @@ impl FieldOpCols { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, a: &BigUint, b: &BigUint, modulus: &BigUint, @@ -152,10 +151,10 @@ impl FieldOpCols { }; // Range checks - record.add_u8_range_checks_field(shard, channel, &self.result.0); - record.add_u8_range_checks_field(shard, channel, &self.carry.0); - record.add_u8_range_checks_field(shard, channel, &self.witness_low.0); - record.add_u8_range_checks_field(shard, channel, &self.witness_high.0); + record.add_u8_range_checks_field(shard, &self.result.0); + record.add_u8_range_checks_field(shard, &self.carry.0); + record.add_u8_range_checks_field(shard, &self.witness_low.0); + record.add_u8_range_checks_field(shard, &self.witness_high.0); result } @@ -166,12 +165,11 @@ impl FieldOpCols { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, a: &BigUint, b: &BigUint, op: FieldOperation, ) -> BigUint { - self.populate_with_modulus(record, shard, channel, a, b, &P::modulus(), op) + self.populate_with_modulus(record, shard, a, b, &P::modulus(), op) } } @@ -188,8 +186,6 @@ impl FieldOpCols { is_sub: impl Into + Clone, is_mul: impl Into + Clone, is_div: impl Into + Clone, - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -213,15 +209,7 @@ impl FieldOpCols { let p_div = p_res_param * p_b.clone(); let p_op = p_add * is_add + p_sub * is_sub + p_mul * is_mul + p_div * is_div; - self.eval_with_polynomials( - builder, - p_op, - modulus.clone(), - p_result, - shard, - channel, - is_real, - ); + self.eval_with_polynomials(builder, p_op, modulus.clone(), p_result, is_real); } #[allow(clippy::too_many_arguments)] @@ -232,8 +220,6 @@ impl FieldOpCols { b: &(impl Into> + Clone), modulus: &(impl Into> + Clone), op: FieldOperation, - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -250,15 +236,7 @@ impl FieldOpCols { FieldOperation::Add | FieldOperation::Sub => p_a + p_b, FieldOperation::Mul | FieldOperation::Div => p_a * p_b, }; - self.eval_with_polynomials( - builder, - p_op, - modulus.clone(), - p_result, - shard, - channel, - is_real, - ); + self.eval_with_polynomials(builder, p_op, modulus.clone(), p_result, is_real); } #[allow(clippy::too_many_arguments)] @@ -268,8 +246,6 @@ impl FieldOpCols { op: impl Into>, modulus: impl Into>, result: impl Into>, - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -286,30 +262,10 @@ impl FieldOpCols { eval_field_operation::(builder, &p_vanishing, &p_witness_low, &p_witness_high); // Range checks for the result, carry, and witness columns. - builder.slice_range_check_u8( - &self.result.0, - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8( - &self.carry.0, - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8( - p_witness_low.coefficients(), - shard.clone(), - channel.clone(), - is_real.clone(), - ); - builder.slice_range_check_u8( - p_witness_high.coefficients(), - shard.clone(), - channel.clone(), - is_real, - ); + builder.slice_range_check_u8(&self.result.0, is_real.clone()); + builder.slice_range_check_u8(&self.carry.0, is_real.clone()); + builder.slice_range_check_u8(p_witness_low.coefficients(), is_real.clone()); + builder.slice_range_check_u8(p_witness_high.coefficients(), is_real); } #[allow(clippy::too_many_arguments)] @@ -319,15 +275,13 @@ impl FieldOpCols { a: &(impl Into> + Clone), b: &(impl Into> + Clone), op: FieldOperation, - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, Limbs: Copy, { let p_limbs = Polynomial::from_iter(P::modulus_field_iter::().map(AB::Expr::from)); - self.eval_with_modulus::(builder, a, b, &p_limbs, op, shard, channel, is_real); + self.eval_with_modulus::(builder, a, b, &p_limbs, op, is_real); } } @@ -423,7 +377,7 @@ mod tests { let cols: &mut TestCols = row.as_mut_slice().borrow_mut(); cols.a = P::to_limbs_field::(a); cols.b = P::to_limbs_field::(b); - cols.a_op_b.populate(&mut blu_events, 1, 0, a, b, self.operation); + cols.a_op_b.populate(&mut blu_events, 1, a, b, self.operation); output.add_byte_lookup_events(blu_events); row }) @@ -458,15 +412,7 @@ mod tests { let main = builder.main(); let local = main.row_slice(0); let local: &TestCols = (*local).borrow(); - local.a_op_b.eval( - builder, - &local.a, - &local.b, - self.operation, - AB::F::one(), - AB::F::zero(), - AB::F::one(), - ); + local.a_op_b.eval(builder, &local.a, &local.b, self.operation, AB::F::one()); } } diff --git a/crates/core/machine/src/operations/field/field_sqrt.rs b/crates/core/machine/src/operations/field/field_sqrt.rs index 50d2cc4729..a0f40c6a48 100644 --- a/crates/core/machine/src/operations/field/field_sqrt.rs +++ b/crates/core/machine/src/operations/field/field_sqrt.rs @@ -43,7 +43,6 @@ impl FieldSqrtCols { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, a: &BigUint, sqrt_fn: impl Fn(&BigUint) -> BigUint, ) -> BigUint { @@ -53,7 +52,7 @@ impl FieldSqrtCols { // Use FieldOpCols to compute result * result. let sqrt_squared = - self.multiplication.populate(record, shard, channel, &sqrt, &sqrt, FieldOperation::Mul); + self.multiplication.populate(record, shard, &sqrt, &sqrt, FieldOperation::Mul); // If the result is indeed the square root of a, then result * result = a. assert_eq!(sqrt_squared, a.clone()); @@ -63,14 +62,13 @@ impl FieldSqrtCols { self.multiplication.result = P::to_limbs_field::(&sqrt); // Populate the range columns. - self.range.populate(record, shard, channel, &sqrt, &modulus); + self.range.populate(record, shard, &sqrt, &modulus); let sqrt_bytes = P::to_limbs(&sqrt); self.lsb = F::from_canonical_u8(sqrt_bytes[0] & 1); let and_event = ByteLookupEvent { shard, - channel, opcode: ByteOpcode::AND, a1: self.lsb.as_canonical_u32() as u16, a2: 0, @@ -82,7 +80,6 @@ impl FieldSqrtCols { // Add the byte range check for `sqrt`. record.add_u8_range_checks( shard, - channel, self.multiplication .result .0 @@ -107,8 +104,6 @@ where builder: &mut AB, a: &Limbs, is_odd: impl Into, - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -121,33 +116,18 @@ where multiplication.result = *a; // Compute sqrt * sqrt. We pass in P since we want its BaseField to be the mod. - multiplication.eval( - builder, - &sqrt, - &sqrt, - FieldOperation::Mul, - shard.clone(), - channel.clone(), - is_real.clone(), - ); + multiplication.eval(builder, &sqrt, &sqrt, FieldOperation::Mul, is_real.clone()); let modulus_limbs = P::to_limbs_field_vec(&P::modulus()); self.range.eval( builder, &sqrt, &limbs_from_vec::(modulus_limbs), - shard.clone(), - channel.clone(), is_real.clone(), ); // Range check that `sqrt` limbs are bytes. - builder.slice_range_check_u8( - sqrt.0.as_slice(), - shard.clone(), - channel.clone(), - is_real.clone(), - ); + builder.slice_range_check_u8(sqrt.0.as_slice(), is_real.clone()); // Assert that the square root is the positive one, i.e., with least significant bit 0. // This is done by computing LSB = least_significant_byte & 1. @@ -158,8 +138,6 @@ where self.lsb, sqrt[0], AB::F::one(), - shard, - channel, is_real, ); } @@ -246,7 +224,7 @@ mod tests { let mut row = [F::zero(); NUM_TEST_COLS]; let cols: &mut TestCols = row.as_mut_slice().borrow_mut(); cols.a = P::to_limbs_field::(a); - cols.sqrt.populate(&mut blu_events, 1, 0, a, ed25519_sqrt); + cols.sqrt.populate(&mut blu_events, 1, a, ed25519_sqrt); output.add_byte_lookup_events(blu_events); row }) @@ -283,14 +261,7 @@ mod tests { let local: &TestCols = (*local).borrow(); // eval verifies that local.sqrt.result is indeed the square root of local.a. - local.sqrt.eval( - builder, - &local.a, - AB::F::zero(), - AB::F::one(), - AB::F::zero(), - AB::F::one(), - ); + local.sqrt.eval(builder, &local.a, AB::F::zero(), AB::F::one()); } } diff --git a/crates/core/machine/src/operations/field/range.rs b/crates/core/machine/src/operations/field/range.rs index 0f6dce4144..b7490c584b 100644 --- a/crates/core/machine/src/operations/field/range.rs +++ b/crates/core/machine/src/operations/field/range.rs @@ -31,7 +31,6 @@ impl FieldLtCols { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, lhs: &BigUint, rhs: &BigUint, ) { @@ -53,7 +52,6 @@ impl FieldLtCols { record.add_byte_lookup_event(ByteLookupEvent { opcode: ByteOpcode::LTU, shard, - channel, a1: 1, a2: 0, b: *byte, @@ -79,8 +77,6 @@ impl FieldLtCols { builder: &mut AB, lhs: &E1, rhs: &E2, - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -145,8 +141,6 @@ impl FieldLtCols { AB::F::one(), self.lhs_comparison_byte, self.rhs_comparison_byte, - shard, - channel, is_real, ) } diff --git a/crates/core/machine/src/operations/fixed_rotate_right.rs b/crates/core/machine/src/operations/fixed_rotate_right.rs index 5f97ec2923..03a4454fdd 100644 --- a/crates/core/machine/src/operations/fixed_rotate_right.rs +++ b/crates/core/machine/src/operations/fixed_rotate_right.rs @@ -43,7 +43,6 @@ impl FixedRotateRightOperation { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, input: u32, rotation: usize, ) -> u32 { @@ -75,7 +74,6 @@ impl FixedRotateRightOperation { let byte_event = ByteLookupEvent { shard, - channel, opcode: ByteOpcode::ShrCarry, a1: shift as u16, a2: carry, @@ -110,8 +108,6 @@ impl FixedRotateRightOperation { input: Word, rotation: usize, cols: FixedRotateRightOperation, - shard: AB::Var, - channel: impl Into + Clone, is_real: AB::Var, ) { // Compute some constants with respect to the rotation needed for the rotation. @@ -138,8 +134,6 @@ impl FixedRotateRightOperation { cols.carry[i], input_bytes_rotated[i], AB::F::from_canonical_usize(nb_bits_to_shift), - shard, - channel.clone(), is_real, ); diff --git a/crates/core/machine/src/operations/fixed_shift_right.rs b/crates/core/machine/src/operations/fixed_shift_right.rs index d77acb9b42..50aa896205 100644 --- a/crates/core/machine/src/operations/fixed_shift_right.rs +++ b/crates/core/machine/src/operations/fixed_shift_right.rs @@ -43,7 +43,6 @@ impl FixedShiftRightOperation { &mut self, record: &mut impl ByteRecord, shard: u32, - channel: u8, input: u32, rotation: usize, ) -> u32 { @@ -74,7 +73,6 @@ impl FixedShiftRightOperation { let (shift, carry) = shr_carry(b, c); let byte_event = ByteLookupEvent { shard, - channel, opcode: ByteOpcode::ShrCarry, a1: shift as u16, a2: carry, @@ -109,8 +107,6 @@ impl FixedShiftRightOperation { input: Word, rotation: usize, cols: FixedShiftRightOperation, - shard: impl Into + Copy, - channel: impl Into + Copy, is_real: AB::Var, ) { // Compute some constants with respect to the rotation needed for the rotation. @@ -138,8 +134,6 @@ impl FixedShiftRightOperation { cols.carry[i], input_bytes_rotated[i].clone(), AB::F::from_canonical_usize(nb_bits_to_shift), - shard, - channel, is_real, ); diff --git a/crates/core/machine/src/operations/lt.rs b/crates/core/machine/src/operations/lt.rs index 2f531f18c8..5d9f000983 100644 --- a/crates/core/machine/src/operations/lt.rs +++ b/crates/core/machine/src/operations/lt.rs @@ -22,14 +22,7 @@ pub struct AssertLtColsBytes { } impl AssertLtColsBytes { - pub fn populate( - &mut self, - record: &mut impl ByteRecord, - shard: u32, - channel: u8, - a: &[u8], - b: &[u8], - ) { + pub fn populate(&mut self, record: &mut impl ByteRecord, shard: u32, a: &[u8], b: &[u8]) { let mut byte_flags = vec![0u8; N]; for (a_byte, b_byte, flag) in @@ -43,7 +36,6 @@ impl AssertLtColsBytes { record.add_byte_lookup_event(ByteLookupEvent { opcode: ByteOpcode::LTU, shard, - channel, a1: 1, a2: 0, b: *a_byte, @@ -69,8 +61,6 @@ impl AssertLtColsBytes { builder: &mut AB, a: &[Ea], b: &[Eb], - shard: impl Into + Clone, - channel: impl Into + Clone, is_real: impl Into + Clone, ) where V: Into, @@ -134,8 +124,6 @@ impl AssertLtColsBytes { AB::F::one(), self.a_comparison_byte, self.b_comparison_byte, - shard, - channel, is_real, ) } diff --git a/crates/core/machine/src/operations/not.rs b/crates/core/machine/src/operations/not.rs index bb09ff58e4..e9d32e5adf 100644 --- a/crates/core/machine/src/operations/not.rs +++ b/crates/core/machine/src/operations/not.rs @@ -14,19 +14,13 @@ pub struct NotOperation { } impl NotOperation { - pub fn populate( - &mut self, - record: &mut impl ByteRecord, - shard: u32, - channel: u8, - x: u32, - ) -> u32 { + pub fn populate(&mut self, record: &mut impl ByteRecord, shard: u32, x: u32) -> u32 { let expected = !x; let x_bytes = x.to_le_bytes(); for i in 0..WORD_SIZE { self.value[i] = F::from_canonical_u8(!x_bytes[i]); } - record.add_u8_range_checks(shard, channel, &x_bytes); + record.add_u8_range_checks(shard, &x_bytes); expected } @@ -35,8 +29,6 @@ impl NotOperation { builder: &mut AB, a: Word, cols: NotOperation, - shard: impl Into + Copy, - channel: impl Into + Copy, is_real: impl Into + Copy, ) { for i in (0..WORD_SIZE).step_by(2) { @@ -46,8 +38,6 @@ impl NotOperation { AB::F::zero(), a[i], a[i + 1], - shard, - channel, is_real, ); } diff --git a/crates/core/machine/src/operations/or.rs b/crates/core/machine/src/operations/or.rs index fb4a675820..2eaa3aadea 100644 --- a/crates/core/machine/src/operations/or.rs +++ b/crates/core/machine/src/operations/or.rs @@ -13,20 +13,13 @@ pub struct OrOperation { } impl OrOperation { - pub fn populate( - &mut self, - record: &mut ExecutionRecord, - shard: u32, - channel: u8, - x: u32, - y: u32, - ) -> u32 { + pub fn populate(&mut self, record: &mut ExecutionRecord, shard: u32, x: u32, y: u32) -> u32 { let expected = x | y; let x_bytes = x.to_le_bytes(); let y_bytes = y.to_le_bytes(); for i in 0..WORD_SIZE { self.value[i] = F::from_canonical_u8(x_bytes[i] | y_bytes[i]); - record.lookup_or(shard, channel, x_bytes[i], y_bytes[i]); + record.lookup_or(shard, x_bytes[i], y_bytes[i]); } expected } @@ -36,8 +29,6 @@ impl OrOperation { a: Word, b: Word, cols: OrOperation, - shard: impl Into + Copy, - channel: impl Into + Copy, is_real: AB::Var, ) { for i in 0..WORD_SIZE { @@ -46,8 +37,6 @@ impl OrOperation { cols.value[i], a[i], b[i], - shard, - channel, is_real, ); } diff --git a/crates/core/machine/src/operations/xor.rs b/crates/core/machine/src/operations/xor.rs index 93fa41ac44..c69113988c 100644 --- a/crates/core/machine/src/operations/xor.rs +++ b/crates/core/machine/src/operations/xor.rs @@ -16,14 +16,7 @@ pub struct XorOperation { } impl XorOperation { - pub fn populate( - &mut self, - record: &mut impl ByteRecord, - shard: u32, - channel: u8, - x: u32, - y: u32, - ) -> u32 { + pub fn populate(&mut self, record: &mut impl ByteRecord, shard: u32, x: u32, y: u32) -> u32 { let expected = x ^ y; let x_bytes = x.to_le_bytes(); let y_bytes = y.to_le_bytes(); @@ -33,7 +26,6 @@ impl XorOperation { let byte_event = ByteLookupEvent { shard, - channel, opcode: ByteOpcode::XOR, a1: xor as u16, a2: 0, @@ -51,8 +43,6 @@ impl XorOperation { a: Word, b: Word, cols: XorOperation, - shard: AB::Var, - channel: impl Into + Clone, is_real: AB::Var, ) { for i in 0..WORD_SIZE { @@ -61,8 +51,6 @@ impl XorOperation { cols.value[i], a[i], b[i], - shard, - channel.clone(), is_real, ); } diff --git a/crates/core/machine/src/riscv/cost.rs b/crates/core/machine/src/riscv/cost.rs index 0da65a34cc..6f81ce9255 100644 --- a/crates/core/machine/src/riscv/cost.rs +++ b/crates/core/machine/src/riscv/cost.rs @@ -127,6 +127,10 @@ impl CostEstimator for ExecutionReport { (bls12381_decompress_events as u64) * costs[&RiscvAirDiscriminants::Bls12381Decompress]; total_chips += 1; + let syscall_events = self.syscall_counts.values().sum::(); + total_area += (syscall_events as u64) * costs[&RiscvAirDiscriminants::Syscall]; + total_chips += 1; + let divrem_events = self.opcode_counts[Opcode::DIV] + self.opcode_counts[Opcode::REM] + self.opcode_counts[Opcode::DIVU] @@ -163,12 +167,19 @@ impl CostEstimator for ExecutionReport { total_area += (lt_events as u64) * costs[&RiscvAirDiscriminants::Lt]; total_chips += 1; - let memory_initialize_events = self.touched_memory_addresses; - total_area += (memory_initialize_events as u64) * costs[&RiscvAirDiscriminants::MemoryInit]; + let memory_global_initialize_events = self.touched_memory_addresses; + total_area += (memory_global_initialize_events as u64) + * costs[&RiscvAirDiscriminants::MemoryGlobalInit]; total_chips += 1; - let memory_finalize_events = self.touched_memory_addresses; - total_area += (memory_finalize_events as u64) * costs[&RiscvAirDiscriminants::MemoryFinal]; + let memory_global_finalize_events = self.touched_memory_addresses; + total_area += (memory_global_finalize_events as u64) + * costs[&RiscvAirDiscriminants::MemoryGlobalFinal]; + total_chips += 1; + + let memory_local_initialize_events = self.touched_memory_addresses; + total_area += + (memory_local_initialize_events as u64) * costs[&RiscvAirDiscriminants::MemoryLocal]; total_chips += 1; assert_eq!(total_chips, chips.len(), "chip count mismatch"); diff --git a/crates/core/machine/src/riscv/mod.rs b/crates/core/machine/src/riscv/mod.rs index 25b3258388..fe023ca739 100644 --- a/crates/core/machine/src/riscv/mod.rs +++ b/crates/core/machine/src/riscv/mod.rs @@ -6,7 +6,8 @@ pub use shape::*; use sp1_core_executor::{ExecutionRecord, Program}; use crate::{ - memory::{MemoryChipType, MemoryProgramChip}, + memory::{MemoryChipType, MemoryLocalChip, MemoryProgramChip}, + riscv::MemoryChipType::{Finalize, Initialize}, syscall::precompiles::fptower::{Fp2AddSubAssignChip, Fp2MulAssignChip, FpOpChip}, }; use hashbrown::{HashMap, HashSet}; @@ -14,7 +15,7 @@ use p3_field::PrimeField32; pub use riscv_chips::*; use sp1_curves::weierstrass::{bls12_381::Bls12381BaseField, bn254::Bn254BaseField}; use sp1_stark::{ - air::{MachineAir, SP1_PROOF_NUM_PV_ELTS}, + air::{InteractionScope, MachineAir, SP1_PROOF_NUM_PV_ELTS}, Chip, StarkGenericConfig, StarkMachine, }; use strum_macros::{EnumDiscriminants, EnumIter}; @@ -29,15 +30,19 @@ pub(crate) mod riscv_chips { alu::{AddSubChip, BitwiseChip, DivRemChip, LtChip, MulChip, ShiftLeft, ShiftRightChip}, bytes::ByteChip, cpu::CpuChip, - memory::MemoryChip, + memory::MemoryGlobalChip, program::ProgramChip, - syscall::precompiles::{ - edwards::{EdAddAssignChip, EdDecompressChip}, - keccak256::KeccakPermuteChip, - sha256::{ShaCompressChip, ShaExtendChip}, - uint256::Uint256MulChip, - weierstrass::{ - WeierstrassAddAssignChip, WeierstrassDecompressChip, WeierstrassDoubleAssignChip, + syscall::{ + chip::SyscallChip, + precompiles::{ + edwards::{EdAddAssignChip, EdDecompressChip}, + keccak256::KeccakPermuteChip, + sha256::{ShaCompressChip, ShaExtendChip}, + uint256::Uint256MulChip, + weierstrass::{ + WeierstrassAddAssignChip, WeierstrassDecompressChip, + WeierstrassDoubleAssignChip, + }, }, }, }; @@ -78,12 +83,16 @@ pub enum RiscvAir { ShiftRight(ShiftRightChip), /// A lookup table for byte operations. ByteLookup(ByteChip), - /// A table for initializing the memory state. - MemoryInit(MemoryChip), - /// A table for finalizing the memory state. - MemoryFinal(MemoryChip), + /// A table for initializing the global memory state. + MemoryGlobalInit(MemoryGlobalChip), + /// A table for finalizing the global memory state. + MemoryGlobalFinal(MemoryGlobalChip), + /// A table for the local memory state. + MemoryLocal(MemoryLocalChip), /// A table for initializing the program memory. ProgramMemory(MemoryProgramChip), + /// A table for all the syscall invocations. + Syscall(SyscallChip), /// A precompile for sha256 extend. Sha256Extend(ShaExtendChip), /// A precompile for sha256 compress. @@ -130,7 +139,7 @@ impl RiscvAir { #[instrument("construct RiscvAir machine", level = "debug", skip_all)] pub fn machine>(config: SC) -> StarkMachine { let chips = Self::chips(); - StarkMachine::new(config, chips, SP1_PROOF_NUM_PV_ELTS) + StarkMachine::new(config, chips, SP1_PROOF_NUM_PV_ELTS, true) } /// Get all the different RISC-V AIRs. @@ -269,6 +278,10 @@ impl RiscvAir { costs.insert(RiscvAirDiscriminants::Bls12381Decompress, bls12381_decompress.cost()); chips.push(bls12381_decompress); + let syscall = Chip::new(RiscvAir::Syscall(SyscallChip::default())); + costs.insert(RiscvAirDiscriminants::Syscall, syscall.cost()); + chips.push(syscall); + let div_rem = Chip::new(RiscvAir::DivRem(DivRemChip::default())); costs.insert(RiscvAirDiscriminants::DivRem, div_rem.cost()); chips.push(div_rem); @@ -297,15 +310,20 @@ impl RiscvAir { costs.insert(RiscvAirDiscriminants::Lt, lt.cost()); chips.push(lt); - let memory_init = - Chip::new(RiscvAir::MemoryInit(MemoryChip::new(MemoryChipType::Initialize))); - costs.insert(RiscvAirDiscriminants::MemoryInit, memory_init.cost()); - chips.push(memory_init); + let memory_global_init = Chip::new(RiscvAir::MemoryGlobalInit(MemoryGlobalChip::new( + MemoryChipType::Initialize, + ))); + costs.insert(RiscvAirDiscriminants::MemoryGlobalInit, memory_global_init.cost()); + chips.push(memory_global_init); + + let memory_global_finalize = + Chip::new(RiscvAir::MemoryGlobalFinal(MemoryGlobalChip::new(MemoryChipType::Finalize))); + costs.insert(RiscvAirDiscriminants::MemoryGlobalFinal, memory_global_finalize.cost()); + chips.push(memory_global_finalize); - let memory_finalize = - Chip::new(RiscvAir::MemoryFinal(MemoryChip::new(MemoryChipType::Finalize))); - costs.insert(RiscvAirDiscriminants::MemoryFinal, memory_finalize.cost()); - chips.push(memory_finalize); + let memory_local = Chip::new(RiscvAir::MemoryLocal(MemoryLocalChip::new())); + costs.insert(RiscvAirDiscriminants::MemoryLocal, memory_local.cost()); + chips.push(memory_local); let memory_program = Chip::new(RiscvAir::ProgramMemory(MemoryProgramChip::default())); costs.insert(RiscvAirDiscriminants::ProgramMemory, memory_program.cost()); @@ -360,20 +378,20 @@ impl RiscvAir { pub(crate) fn memory_init_final_airs() -> Vec { vec![ - RiscvAir::MemoryInit(MemoryChip::new(MemoryChipType::Initialize)), - RiscvAir::MemoryFinal(MemoryChip::new(MemoryChipType::Finalize)), + RiscvAir::MemoryGlobalInit(MemoryGlobalChip::new(MemoryChipType::Initialize)), + RiscvAir::MemoryGlobalFinal(MemoryGlobalChip::new(MemoryChipType::Finalize)), ] } pub(crate) fn get_memory_init_final_heights(record: &ExecutionRecord) -> Vec<(Self, usize)> { vec![ ( - RiscvAir::MemoryInit(MemoryChip::new(MemoryChipType::Initialize)), - record.memory_initialize_events.len(), + RiscvAir::MemoryGlobalInit(MemoryGlobalChip::new(Initialize)), + record.global_memory_initialize_events.len(), ), ( - RiscvAir::MemoryFinal(MemoryChip::new(MemoryChipType::Finalize)), - record.memory_finalize_events.len(), + RiscvAir::MemoryGlobalFinal(MemoryGlobalChip::new(Finalize)), + record.global_memory_finalize_events.len(), ), ] } diff --git a/crates/core/machine/src/riscv/shape.rs b/crates/core/machine/src/riscv/shape.rs index 5ccbb8af2a..c20dfbb7e9 100644 --- a/crates/core/machine/src/riscv/shape.rs +++ b/crates/core/machine/src/riscv/shape.rs @@ -6,10 +6,13 @@ use sp1_core_executor::{CoreShape, ExecutionRecord, Program}; use sp1_stark::{air::MachineAir, ProofShape}; use thiserror::Error; -use crate::memory::{MemoryChipType, MemoryProgramChip}; +use crate::{ + memory::MemoryProgramChip, + riscv::MemoryChipType::{Finalize, Initialize}, +}; use super::{ - AddSubChip, BitwiseChip, CpuChip, DivRemChip, LtChip, MemoryChip, MulChip, ProgramChip, + AddSubChip, BitwiseChip, CpuChip, DivRemChip, LtChip, MemoryGlobalChip, MulChip, ProgramChip, RiscvAir, ShiftLeft, ShiftRightChip, }; @@ -132,7 +135,8 @@ impl CoreShapeConfig { } // If the record is a global memory init/finalize record, try to fix the shape as such. - if !record.memory_initialize_events.is_empty() || !record.memory_finalize_events.is_empty() + if !record.global_memory_initialize_events.is_empty() + || !record.global_memory_finalize_events.is_empty() { let heights = RiscvAir::::get_memory_init_final_heights(record); let shape = @@ -372,14 +376,8 @@ impl Default for CoreShapeConfig { let memory_finalize_heights = vec![Some(10), Some(16), Some(18), Some(19), Some(20), Some(21), Some(22)]; let memory_allowed_log_heights = HashMap::from([ - ( - RiscvAir::MemoryInit(MemoryChip::new(MemoryChipType::Initialize)), - memory_init_heights, - ), - ( - RiscvAir::MemoryFinal(MemoryChip::new(MemoryChipType::Finalize)), - memory_finalize_heights, - ), + (RiscvAir::MemoryGlobalInit(MemoryGlobalChip::new(Initialize)), memory_init_heights), + (RiscvAir::MemoryGlobalFinal(MemoryGlobalChip::new(Finalize)), memory_finalize_heights), ]); let mut precompile_allowed_log_heights: Vec> = vec![]; diff --git a/crates/core/machine/src/syscall/chip.rs b/crates/core/machine/src/syscall/chip.rs new file mode 100644 index 0000000000..b4e00cf9e3 --- /dev/null +++ b/crates/core/machine/src/syscall/chip.rs @@ -0,0 +1,143 @@ +use std::{ + borrow::{Borrow, BorrowMut}, + mem::size_of, +}; + +use p3_air::{Air, BaseAir}; +use p3_field::PrimeField32; +use p3_matrix::{dense::RowMajorMatrix, Matrix}; +use sp1_core_executor::{ExecutionRecord, Program}; +use sp1_derive::AlignedBorrow; +use sp1_stark::air::{InteractionScope, MachineAir, SP1AirBuilder}; + +use crate::utils::pad_to_power_of_two; + +/// The number of main trace columns for `SyscallChip`. +pub const NUM_SYSCALL_COLS: usize = size_of::>(); + +/// A chip that stores the syscall invocations. +#[derive(Default)] +pub struct SyscallChip; + +/// The column layout for the chip. +#[derive(AlignedBorrow, Default, Clone, Copy)] +#[repr(C)] +pub struct SyscallCols { + /// The shard number of the syscall. + pub shard: T, + + /// The clk of the syscall. + pub clk: T, + + pub nonce: T, + + /// The syscall_id of the syscall. + pub syscall_id: T, + + /// The arg1. + pub arg1: T, + + /// The arg2. + pub arg2: T, + + pub is_real: T, +} + +impl MachineAir for SyscallChip { + type Record = ExecutionRecord; + + type Program = Program; + + fn name(&self) -> String { + "Syscall".to_string() + } + + fn generate_dependencies(&self, _input: &ExecutionRecord, _output: &mut ExecutionRecord) { + // Do nothing since this chip has no dependencies. + } + + fn generate_trace( + &self, + input: &ExecutionRecord, + _output: &mut ExecutionRecord, + ) -> RowMajorMatrix { + let mut rows = Vec::new(); + + for syscall_event in input.syscall_events.iter() { + let mut row = [F::zero(); NUM_SYSCALL_COLS]; + let cols: &mut SyscallCols = row.as_mut_slice().borrow_mut(); + + cols.shard = F::from_canonical_u32(syscall_event.shard); + cols.clk = F::from_canonical_u32(syscall_event.clk); + cols.syscall_id = F::from_canonical_u32(syscall_event.syscall_id); + cols.nonce = F::from_canonical_u32( + input.nonce_lookup.get(&syscall_event.lookup_id).copied().unwrap_or_default(), + ); + cols.arg1 = F::from_canonical_u32(syscall_event.arg1); + cols.arg2 = F::from_canonical_u32(syscall_event.arg2); + cols.is_real = F::one(); + + rows.push(row); + } + let mut trace = + RowMajorMatrix::new(rows.into_iter().flatten().collect::>(), NUM_SYSCALL_COLS); + + pad_to_power_of_two::(&mut trace.values); + + trace + } + + fn included(&self, shard: &Self::Record) -> bool { + !shard.syscall_events.is_empty() + } + + fn commit_scope(&self) -> InteractionScope { + InteractionScope::Global + } +} + +impl Air for SyscallChip +where + AB: SP1AirBuilder, +{ + fn eval(&self, builder: &mut AB) { + let main = builder.main(); + let local = main.row_slice(0); + let local: &SyscallCols = (*local).borrow(); + + builder.assert_eq( + local.is_real * local.is_real * local.is_real, + local.is_real * local.is_real * local.is_real, + ); + + // Receive the calls from the local bus from the CPU. + builder.receive_syscall( + local.shard, + local.clk, + local.nonce, + local.syscall_id, + local.arg1, + local.arg2, + local.is_real, + InteractionScope::Local, + ); + + // Send the call to the global bus to the precompile chips. + builder.send_syscall( + local.shard, + local.clk, + local.nonce, + local.syscall_id, + local.arg1, + local.arg2, + local.is_real, + InteractionScope::Global, + ); + } +} + +impl BaseAir for SyscallChip { + fn width(&self) -> usize { + NUM_SYSCALL_COLS + } +} diff --git a/crates/core/machine/src/syscall/mod.rs b/crates/core/machine/src/syscall/mod.rs index c0363937e7..ab4b7db7fc 100644 --- a/crates/core/machine/src/syscall/mod.rs +++ b/crates/core/machine/src/syscall/mod.rs @@ -1 +1,2 @@ +pub mod chip; pub mod precompiles; diff --git a/crates/core/machine/src/syscall/precompiles/README.md b/crates/core/machine/src/syscall/precompiles/README.md index 6ddd0e1e1c..1b7c645dd5 100644 --- a/crates/core/machine/src/syscall/precompiles/README.md +++ b/crates/core/machine/src/syscall/precompiles/README.md @@ -27,7 +27,6 @@ Define the necessary data structures that your chip will use. This might include #[repr(C)] pub struct CustomOpCols { pub shard: T, - pub channel: T, pub clk: T, pub x_ptr: T, pub y_ptr: T, @@ -47,7 +46,7 @@ impl Syscall for Uint256MulChip { 1 } - fn execute(&self, rt: &mut SyscallContext, arg1: u32, arg2: u32) -> Option { + fn execute(&self, rt: &mut SyscallContext, syscall: SyscallCode, arg1: u32, arg2: u32) -> Option { // Your execution logic here // Parse input pointers, perform the multiplication, and write the result } @@ -80,76 +79,40 @@ impl MachineAir for CustomOpChip { } } ``` -You will also have to update `core/src/runtime/record.rs` accordingly to handle these new events. +You will also have to update `core/executor/src/events/precompiles/mod.rs` accordingly to register the new precompile op. #### Add a new field for your chip's events -In the `ExecutionRecord` struct, add a new field to track events specific to your chip. This field will store all events generated by your chip during execution. +In the `PrecompileEvent` enum, add a new variant for you precompile op. ```rust -#[derive(Default, Clone, Debug, Serialize, Deserialize)] -pub struct ExecutionRecord { - // Other existing fields... +#[derive(Clone, Debug, Serialize, Deserialize, EnumIter)] +/// Precompile event. There should be one variant for every precompile syscall. +pub enum PrecompileEvent { + // Other existing variants... - /// A trace of the events for your custom operation. - pub custom_op_events: Vec, + /// A variant for your custom operation. + pub CustomOp(CustomOpEvent), } ``` -#### Update the `stats` method -In the `stats` method, add an entry to track the number of events associated with your chip. +#### Update the `get_local_mem_events` method +In the `get_local_mem_events` method, add your variant to the match statement to add an iterator of the op's local +memory events (if it has local memory events). ```rust -fn stats(&self) -> HashMap { - let mut stats = HashMap::new(); - // Other existing entries... +fn get_local_mem_events(&self) -> impl IntoIterator { + let mut iterators = Vec::new(); - stats.insert("custom_op_events".to_string(), self.custom_op_events.len()); - // Add other stats as necessary - stats -} -``` -#### Update the `append` method -In the append method, ensure that events from your chip are correctly appended when merging two `ExecutionRecord` instances. - -```rust -fn append(&mut self, other: &mut ExecutionRecord) { - // Other existing append operations... - - self.custom_op_events.append(&mut other.custom_op_events); -} -``` - -#### Update the `defer` method -Modify the `defer` method to handle the deferring of events specific to your chip. - -```rust -pub fn defer(&mut self) -> ExecutionRecord { - ExecutionRecord { - // Other deferred events... + for event in self.iter() { + match event { + // Other existing variants... - custom_op_events: std::mem::take(&mut self.custom_op_events), - ..Default::default() + PrecompileEvent::CustomOp(e) => { + iterators.push(e.local_mem_access.iter()); + } + } } -} -``` - -#### Update the `split` method -In the `split` method, ensure that events associated with your chip are properly split when distributing deferred events across shards. - -```rust -pub fn split(&mut self, last: bool, opts: SplitOpts) -> Vec { - let mut shards = Vec::new(); - - split_events!( - self, - custom_op_events, - shards, - opts.deferred_shift_threshold, - last - ); - - // Other event splits... - shards + iterators.into_iter().flatten() } ``` diff --git a/crates/core/machine/src/syscall/precompiles/edwards/ed_add.rs b/crates/core/machine/src/syscall/precompiles/edwards/ed_add.rs index 1c80bdd119..9299f68bfd 100644 --- a/crates/core/machine/src/syscall/precompiles/edwards/ed_add.rs +++ b/crates/core/machine/src/syscall/precompiles/edwards/ed_add.rs @@ -14,7 +14,7 @@ use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use p3_maybe_rayon::prelude::{IntoParallelRefIterator, ParallelIterator, ParallelSlice}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, EllipticCurveAddEvent, FieldOperation}, + events::{ByteLookupEvent, ByteRecord, EllipticCurveAddEvent, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -24,7 +24,7 @@ use sp1_curves::{ AffinePoint, EllipticCurve, }; use sp1_derive::AlignedBorrow; -use sp1_stark::air::{BaseAirBuilder, MachineAir, SP1AirBuilder}; +use sp1_stark::air::{BaseAirBuilder, InteractionScope, MachineAir, SP1AirBuilder}; use crate::{ memory::{value_as_limbs, MemoryReadCols, MemoryWriteCols}, @@ -44,7 +44,6 @@ pub const NUM_ED_ADD_COLS: usize = size_of::>(); pub struct EdAddAssignCols { pub is_real: T, pub shard: T, - pub channel: T, pub clk: T, pub nonce: T, pub p_ptr: T, @@ -75,7 +74,6 @@ impl EdAddAssignChip { fn populate_field_ops( record: &mut impl ByteRecord, shard: u32, - channel: u8, cols: &mut EdAddAssignCols, p_x: BigUint, p_y: BigUint, @@ -85,29 +83,24 @@ impl EdAddAssignChip { let x3_numerator = cols.x3_numerator.populate( record, shard, - channel, &[p_x.clone(), q_x.clone()], &[q_y.clone(), p_y.clone()], ); let y3_numerator = cols.y3_numerator.populate( record, shard, - channel, &[p_y.clone(), p_x.clone()], &[q_y.clone(), q_x.clone()], ); - let x1_mul_y1 = - cols.x1_mul_y1.populate(record, shard, channel, &p_x, &p_y, FieldOperation::Mul); - let x2_mul_y2 = - cols.x2_mul_y2.populate(record, shard, channel, &q_x, &q_y, FieldOperation::Mul); - let f = - cols.f.populate(record, shard, channel, &x1_mul_y1, &x2_mul_y2, FieldOperation::Mul); + let x1_mul_y1 = cols.x1_mul_y1.populate(record, shard, &p_x, &p_y, FieldOperation::Mul); + let x2_mul_y2 = cols.x2_mul_y2.populate(record, shard, &q_x, &q_y, FieldOperation::Mul); + let f = cols.f.populate(record, shard, &x1_mul_y1, &x2_mul_y2, FieldOperation::Mul); let d = E::d_biguint(); - let d_mul_f = cols.d_mul_f.populate(record, shard, channel, &f, &d, FieldOperation::Mul); + let d_mul_f = cols.d_mul_f.populate(record, shard, &f, &d, FieldOperation::Mul); - cols.x3_ins.populate(record, shard, channel, &x3_numerator, &d_mul_f, true); - cols.y3_ins.populate(record, shard, channel, &y3_numerator, &d_mul_f, false); + cols.x3_ins.populate(record, shard, &x3_numerator, &d_mul_f, true); + cols.y3_ins.populate(record, shard, &y3_numerator, &d_mul_f, false); } } @@ -125,10 +118,17 @@ impl MachineAir for Ed input: &ExecutionRecord, _: &mut ExecutionRecord, ) -> RowMajorMatrix { - let mut rows = input - .ed_add_events + let events = input.get_precompile_events(SyscallCode::ED_ADD); + + let mut rows = events .par_iter() .map(|event| { + let event = if let PrecompileEvent::EdAdd(event) = event { + event + } else { + unreachable!(); + }; + let mut row = [F::zero(); NUM_ED_ADD_COLS]; let cols: &mut EdAddAssignCols = row.as_mut_slice().borrow_mut(); let mut blu = Vec::new(); @@ -146,7 +146,6 @@ impl MachineAir for Ed Self::populate_field_ops( &mut vec![], 0, - 0, cols, zero.clone(), zero.clone(), @@ -173,14 +172,20 @@ impl MachineAir for Ed } fn generate_dependencies(&self, input: &Self::Record, output: &mut Self::Record) { - let chunk_size = std::cmp::max(input.ed_add_events.len() / num_cpus::get(), 1); + let events = input.get_precompile_events(SyscallCode::ED_ADD); + let chunk_size = std::cmp::max(events.len() / num_cpus::get(), 1); - let blu_batches = input - .ed_add_events + let blu_batches = events .par_chunks(chunk_size) .map(|events| { let mut blu: HashMap> = HashMap::new(); events.iter().for_each(|event| { + let event = if let PrecompileEvent::EdAdd(event) = event { + event + } else { + unreachable!(); + }; + let mut row = [F::zero(); NUM_ED_ADD_COLS]; let cols: &mut EdAddAssignCols = row.as_mut_slice().borrow_mut(); self.event_to_row(event, cols, &mut blu); @@ -193,7 +198,7 @@ impl MachineAir for Ed } fn included(&self, shard: &Self::Record) -> bool { - !shard.ed_add_events.is_empty() + !shard.get_precompile_events(SyscallCode::ED_ADD).is_empty() } } @@ -216,19 +221,18 @@ impl EdAddAssignChip { // Populate basic columns. cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.p_ptr = F::from_canonical_u32(event.p_ptr); cols.q_ptr = F::from_canonical_u32(event.q_ptr); - Self::populate_field_ops(blu, event.shard, event.channel, cols, p_x, p_y, q_x, q_y); + Self::populate_field_ops(blu, event.shard, cols, p_x, p_y, q_x, q_y); // Populate the memory access columns. for i in 0..WORDS_CURVE_POINT { - cols.q_access[i].populate(event.channel, event.q_memory_records[i], blu); + cols.q_access[i].populate(event.q_memory_records[i], blu); } for i in 0..WORDS_CURVE_POINT { - cols.p_access[i].populate(event.channel, event.p_memory_records[i], blu); + cols.p_access[i].populate(event.p_memory_records[i], blu); } } } @@ -260,94 +264,32 @@ where let y2 = limbs_from_prev_access(&local.q_access[8..16]); // x3_numerator = x1 * y2 + x2 * y1. - local.x3_numerator.eval( - builder, - &[x1, x2], - &[y2, y1], - local.shard, - local.channel, - local.is_real, - ); + local.x3_numerator.eval(builder, &[x1, x2], &[y2, y1], local.is_real); // y3_numerator = y1 * y2 + x1 * x2. - local.y3_numerator.eval( - builder, - &[y1, x1], - &[y2, x2], - local.shard, - local.channel, - local.is_real, - ); + local.y3_numerator.eval(builder, &[y1, x1], &[y2, x2], local.is_real); // f = x1 * x2 * y1 * y2. - local.x1_mul_y1.eval( - builder, - &x1, - &y1, - FieldOperation::Mul, - local.shard, - local.channel, - local.is_real, - ); - local.x2_mul_y2.eval( - builder, - &x2, - &y2, - FieldOperation::Mul, - local.shard, - local.channel, - local.is_real, - ); + local.x1_mul_y1.eval(builder, &x1, &y1, FieldOperation::Mul, local.is_real); + local.x2_mul_y2.eval(builder, &x2, &y2, FieldOperation::Mul, local.is_real); let x1_mul_y1 = local.x1_mul_y1.result; let x2_mul_y2 = local.x2_mul_y2.result; - local.f.eval( - builder, - &x1_mul_y1, - &x2_mul_y2, - FieldOperation::Mul, - local.shard, - local.channel, - local.is_real, - ); + local.f.eval(builder, &x1_mul_y1, &x2_mul_y2, FieldOperation::Mul, local.is_real); // d * f. let f = local.f.result; let d_biguint = E::d_biguint(); let d_const = E::BaseField::to_limbs_field::(&d_biguint); - local.d_mul_f.eval( - builder, - &f, - &d_const, - FieldOperation::Mul, - local.shard, - local.channel, - local.is_real, - ); + local.d_mul_f.eval(builder, &f, &d_const, FieldOperation::Mul, local.is_real); let d_mul_f = local.d_mul_f.result; // x3 = x3_numerator / (1 + d * f). - local.x3_ins.eval( - builder, - &local.x3_numerator.result, - &d_mul_f, - true, - local.shard, - local.channel, - local.is_real, - ); + local.x3_ins.eval(builder, &local.x3_numerator.result, &d_mul_f, true, local.is_real); // y3 = y3_numerator / (1 - d * f). - local.y3_ins.eval( - builder, - &local.y3_numerator.result, - &d_mul_f, - false, - local.shard, - local.channel, - local.is_real, - ); + local.y3_ins.eval(builder, &local.y3_numerator.result, &d_mul_f, false, local.is_real); // Constraint self.p_access.value = [self.x3_ins.result, self.y3_ins.result] // This is to ensure that p_access is updated with the new value. @@ -361,7 +303,6 @@ where builder.eval_memory_access_slice( local.shard, - local.channel, local.clk.into(), local.q_ptr, &local.q_access, @@ -370,7 +311,6 @@ where builder.eval_memory_access_slice( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(1), local.p_ptr, &local.p_access, @@ -379,13 +319,13 @@ where builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, AB::F::from_canonical_u32(SyscallCode::ED_ADD.syscall_id()), local.p_ptr, local.q_ptr, local.is_real, + InteractionScope::Global, ); } } diff --git a/crates/core/machine/src/syscall/precompiles/edwards/ed_decompress.rs b/crates/core/machine/src/syscall/precompiles/edwards/ed_decompress.rs index 0a2ee19f68..46c28f795c 100644 --- a/crates/core/machine/src/syscall/precompiles/edwards/ed_decompress.rs +++ b/crates/core/machine/src/syscall/precompiles/edwards/ed_decompress.rs @@ -11,7 +11,7 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, EdDecompressEvent, FieldOperation}, + events::{ByteLookupEvent, ByteRecord, EdDecompressEvent, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -23,7 +23,7 @@ use sp1_curves::{ params::{limbs_from_vec, FieldParameters, Limbs}, }; use sp1_derive::AlignedBorrow; -use sp1_stark::air::{BaseAirBuilder, MachineAir, SP1AirBuilder}; +use sp1_stark::air::{BaseAirBuilder, InteractionScope, MachineAir, SP1AirBuilder}; use typenum::U32; use crate::{ @@ -44,7 +44,6 @@ pub const NUM_ED_DECOMPRESS_COLS: usize = size_of::>(); pub struct EdDecompressCols { pub is_real: T, pub shard: T, - pub channel: T, pub clk: T, pub nonce: T, pub ptr: T, @@ -70,7 +69,6 @@ impl EdDecompressCols { let mut new_byte_lookup_events = Vec::new(); self.is_real = F::from_bool(true); self.shard = F::from_canonical_u32(event.shard); - self.channel = F::from_canonical_u8(event.channel); self.clk = F::from_canonical_u32(event.clk); self.ptr = F::from_canonical_u32(event.ptr); self.nonce = F::from_canonical_u32( @@ -78,20 +76,12 @@ impl EdDecompressCols { ); self.sign = F::from_bool(event.sign); for i in 0..8 { - self.x_access[i].populate( - event.channel, - event.x_memory_records[i], - &mut new_byte_lookup_events, - ); - self.y_access[i].populate( - event.channel, - event.y_memory_records[i], - &mut new_byte_lookup_events, - ); + self.x_access[i].populate(event.x_memory_records[i], &mut new_byte_lookup_events); + self.y_access[i].populate(event.y_memory_records[i], &mut new_byte_lookup_events); } let y = &BigUint::from_bytes_le(&event.y_bytes); - self.populate_field_ops::(&mut new_byte_lookup_events, event.shard, event.channel, y); + self.populate_field_ops::(&mut new_byte_lookup_events, event.shard, y); record.add_byte_lookup_events(new_byte_lookup_events); } @@ -100,26 +90,17 @@ impl EdDecompressCols { &mut self, blu_events: &mut Vec, shard: u32, - channel: u8, y: &BigUint, ) { let one = BigUint::one(); - self.y_range.populate(blu_events, shard, channel, y, &Ed25519BaseField::modulus()); - let yy = self.yy.populate(blu_events, shard, channel, y, y, FieldOperation::Mul); - let u = self.u.populate(blu_events, shard, channel, &yy, &one, FieldOperation::Sub); - let dyy = self.dyy.populate( - blu_events, - shard, - channel, - &E::d_biguint(), - &yy, - FieldOperation::Mul, - ); - let v = self.v.populate(blu_events, shard, channel, &one, &dyy, FieldOperation::Add); - let u_div_v = - self.u_div_v.populate(blu_events, shard, channel, &u, &v, FieldOperation::Div); - let x = self.x.populate(blu_events, shard, channel, &u_div_v, ed25519_sqrt); - self.neg_x.populate(blu_events, shard, channel, &BigUint::zero(), &x, FieldOperation::Sub); + self.y_range.populate(blu_events, shard, y, &Ed25519BaseField::modulus()); + let yy = self.yy.populate(blu_events, shard, y, y, FieldOperation::Mul); + let u = self.u.populate(blu_events, shard, &yy, &one, FieldOperation::Sub); + let dyy = self.dyy.populate(blu_events, shard, &E::d_biguint(), &yy, FieldOperation::Mul); + let v = self.v.populate(blu_events, shard, &one, &dyy, FieldOperation::Add); + let u_div_v = self.u_div_v.populate(blu_events, shard, &u, &v, FieldOperation::Div); + let x = self.x.populate(blu_events, shard, &u_div_v, ed25519_sqrt); + self.neg_x.populate(blu_events, shard, &BigUint::zero(), &x, FieldOperation::Sub); } } @@ -138,38 +119,24 @@ impl EdDecompressCols { builder, &y, &limbs_from_vec::(max_num_limbs), - self.shard, - self.channel, self.is_real, ); - self.yy.eval(builder, &y, &y, FieldOperation::Mul, self.shard, self.channel, self.is_real); + self.yy.eval(builder, &y, &y, FieldOperation::Mul, self.is_real); self.u.eval( builder, &self.yy.result, &[AB::Expr::one()].iter(), FieldOperation::Sub, - self.shard, - self.channel, self.is_real, ); let d_biguint = E::d_biguint(); let d_const = E::BaseField::to_limbs_field::(&d_biguint); - self.dyy.eval( - builder, - &d_const, - &self.yy.result, - FieldOperation::Mul, - self.shard, - self.channel, - self.is_real, - ); + self.dyy.eval(builder, &d_const, &self.yy.result, FieldOperation::Mul, self.is_real); self.v.eval( builder, &[AB::Expr::one()].iter(), &self.dyy.result, FieldOperation::Add, - self.shard, - self.channel, self.is_real, ); self.u_div_v.eval( @@ -177,31 +144,19 @@ impl EdDecompressCols { &self.u.result, &self.v.result, FieldOperation::Div, - self.shard, - self.channel, - self.is_real, - ); - self.x.eval( - builder, - &self.u_div_v.result, - AB::F::zero(), - self.shard, - self.channel, self.is_real, ); + self.x.eval(builder, &self.u_div_v.result, AB::F::zero(), self.is_real); self.neg_x.eval( builder, &[AB::Expr::zero()].iter(), &self.x.multiplication.result, FieldOperation::Sub, - self.shard, - self.channel, self.is_real, ); builder.eval_memory_access_slice( self.shard, - self.channel, self.clk, self.ptr, &self.x_access, @@ -209,7 +164,6 @@ impl EdDecompressCols { ); builder.eval_memory_access_slice( self.shard, - self.channel, self.clk, self.ptr.into() + AB::F::from_canonical_u32(32), &self.y_access, @@ -226,13 +180,13 @@ impl EdDecompressCols { builder.receive_syscall( self.shard, - self.channel, self.clk, self.nonce, AB::F::from_canonical_u32(SyscallCode::ED_DECOMPRESS.syscall_id()), self.ptr, self.sign, self.is_real, + InteractionScope::Global, ); } } @@ -263,9 +217,14 @@ impl MachineAir for EdDecompressChip RowMajorMatrix { let mut rows = Vec::new(); - - for i in 0..input.ed_decompress_events.len() { - let event = &input.ed_decompress_events[i]; + let events = input.get_precompile_events(SyscallCode::ED_DECOMPRESS); + + for event in events { + let event = if let PrecompileEvent::EdDecompress(event) = event { + event + } else { + unreachable!(); + }; let mut row = [F::zero(); NUM_ED_DECOMPRESS_COLS]; let cols: &mut EdDecompressCols = row.as_mut_slice().borrow_mut(); cols.populate::(event.clone(), output); @@ -279,7 +238,7 @@ impl MachineAir for EdDecompressChip = row.as_mut_slice().borrow_mut(); let zero = BigUint::zero(); - cols.populate_field_ops::(&mut vec![], 0, 0, &zero); + cols.populate_field_ops::(&mut vec![], 0, &zero); row }, input.fixed_log2_rows::(self), @@ -302,7 +261,7 @@ impl MachineAir for EdDecompressChip bool { - !shard.ed_decompress_events.is_empty() + !shard.get_precompile_events(SyscallCode::ED_DECOMPRESS).is_empty() } } diff --git a/crates/core/machine/src/syscall/precompiles/fptower/fp.rs b/crates/core/machine/src/syscall/precompiles/fptower/fp.rs index b22518cce2..e15d784281 100644 --- a/crates/core/machine/src/syscall/precompiles/fptower/fp.rs +++ b/crates/core/machine/src/syscall/precompiles/fptower/fp.rs @@ -12,7 +12,7 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, FieldOperation}, + events::{ByteLookupEvent, ByteRecord, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -21,7 +21,7 @@ use sp1_curves::{ weierstrass::{FieldType, FpOpField}, }; use sp1_derive::AlignedBorrow; -use sp1_stark::air::{BaseAirBuilder, MachineAir, Polynomial, SP1AirBuilder}; +use sp1_stark::air::{BaseAirBuilder, InteractionScope, MachineAir, Polynomial, SP1AirBuilder}; use crate::{ memory::{value_as_limbs, MemoryReadCols, MemoryWriteCols}, @@ -43,7 +43,6 @@ pub struct FpOpChip

{ pub struct FpOpCols { pub is_real: T, pub shard: T, - pub channel: T, pub nonce: T, pub clk: T, pub is_add: T, @@ -65,7 +64,6 @@ impl FpOpChip

{ fn populate_field_ops( blu_events: &mut Vec, shard: u32, - channel: u8, cols: &mut FpOpCols, p: BigUint, q: BigUint, @@ -73,7 +71,7 @@ impl FpOpChip

{ ) { let modulus_bytes = P::MODULUS; let modulus = BigUint::from_bytes_le(modulus_bytes); - cols.output.populate_with_modulus(blu_events, shard, channel, &p, &q, &modulus, op); + cols.output.populate_with_modulus(blu_events, shard, &p, &q, &modulus, op); } } @@ -90,16 +88,24 @@ impl MachineAir for FpOpChip

{ } fn generate_trace(&self, input: &Self::Record, output: &mut Self::Record) -> RowMajorMatrix { + // All the fp events for a given curve are coalesce to the curve's Add operation. Only retrieve + // precompile events for that operation. + // TODO: Fix this. + let events = match P::FIELD_TYPE { - FieldType::Bn254 => &input.bn254_fp_events, - FieldType::Bls12381 => &input.bls12381_fp_events, + FieldType::Bn254 => input.get_precompile_events(SyscallCode::BN254_FP_ADD).iter(), + FieldType::Bls12381 => input.get_precompile_events(SyscallCode::BLS12381_FP_ADD).iter(), }; let mut rows = Vec::new(); let mut new_byte_lookup_events = Vec::new(); - for i in 0..events.len() { - let event = &events[i]; + for event in events { + let event = match (P::FIELD_TYPE, event) { + (FieldType::Bn254, PrecompileEvent::Bn254Fp(event)) => event, + (FieldType::Bls12381, PrecompileEvent::Bls12381Fp(event)) => event, + _ => unreachable!(), + }; let mut row = vec![F::zero(); num_fp_cols::

()]; let cols: &mut FpOpCols = row.as_mut_slice().borrow_mut(); @@ -113,7 +119,6 @@ impl MachineAir for FpOpChip

{ cols.is_mul = F::from_canonical_u8((event.op == FieldOperation::Mul) as u8); cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.x_ptr = F::from_canonical_u32(event.x_ptr); cols.y_ptr = F::from_canonical_u32(event.y_ptr); @@ -121,7 +126,6 @@ impl MachineAir for FpOpChip

{ Self::populate_field_ops( &mut new_byte_lookup_events, event.shard, - event.channel, cols, p, q, @@ -130,20 +134,12 @@ impl MachineAir for FpOpChip

{ // Populate the memory access columns. for i in 0..cols.y_access.len() { - cols.y_access[i].populate( - event.channel, - event.y_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.y_access[i].populate(event.y_memory_records[i], &mut new_byte_lookup_events); } for i in 0..cols.x_access.len() { - cols.x_access[i].populate( - event.channel, - event.x_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.x_access[i].populate(event.x_memory_records[i], &mut new_byte_lookup_events); } - rows.push(row) + rows.push(row); } output.add_byte_lookup_events(new_byte_lookup_events); @@ -158,7 +154,6 @@ impl MachineAir for FpOpChip

{ Self::populate_field_ops( &mut vec![], 0, - 0, cols, zero.clone(), zero, @@ -184,9 +179,22 @@ impl MachineAir for FpOpChip

{ } fn included(&self, shard: &Self::Record) -> bool { + // All the fp events for a given curve are coalesce to the curve's Add operation. Only check for + // that operation. + // TODO: Fix this. + + assert!( + shard.get_precompile_events(SyscallCode::BN254_FP_SUB).is_empty() + && shard.get_precompile_events(SyscallCode::BN254_FP_MUL).is_empty() + && shard.get_precompile_events(SyscallCode::BLS12381_FP_SUB).is_empty() + && shard.get_precompile_events(SyscallCode::BLS12381_FP_MUL).is_empty() + ); + match P::FIELD_TYPE { - FieldType::Bn254 => !shard.bn254_fp_events.is_empty(), - FieldType::Bls12381 => !shard.bls12381_fp_events.is_empty(), + FieldType::Bn254 => !shard.get_precompile_events(SyscallCode::BN254_FP_ADD).is_empty(), + FieldType::Bls12381 => { + !shard.get_precompile_events(SyscallCode::BLS12381_FP_ADD).is_empty() + } } } } @@ -237,8 +245,6 @@ where local.is_sub, local.is_mul, AB::F::zero(), - local.shard, - local.channel, local.is_real, ); @@ -248,7 +254,6 @@ where builder.eval_memory_access_slice( local.shard, - local.channel, local.clk.into(), local.y_ptr, &local.y_access, @@ -256,7 +261,6 @@ where ); builder.eval_memory_access_slice( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(1), /* We read p at +1 since p, q could be the * same. */ local.x_ptr, @@ -285,13 +289,13 @@ where builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, syscall_id_felt, local.x_ptr, local.y_ptr, local.is_real, + InteractionScope::Global, ); } } diff --git a/crates/core/machine/src/syscall/precompiles/fptower/fp2_addsub.rs b/crates/core/machine/src/syscall/precompiles/fptower/fp2_addsub.rs index 9f4e0ec919..6b32755034 100644 --- a/crates/core/machine/src/syscall/precompiles/fptower/fp2_addsub.rs +++ b/crates/core/machine/src/syscall/precompiles/fptower/fp2_addsub.rs @@ -12,7 +12,7 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, FieldOperation}, + events::{ByteLookupEvent, ByteRecord, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -21,7 +21,7 @@ use sp1_curves::{ weierstrass::{FieldType, FpOpField}, }; use sp1_derive::AlignedBorrow; -use sp1_stark::air::{BaseAirBuilder, MachineAir, Polynomial, SP1AirBuilder}; +use sp1_stark::air::{BaseAirBuilder, InteractionScope, MachineAir, Polynomial, SP1AirBuilder}; use typenum::Unsigned; use crate::{ @@ -40,7 +40,6 @@ pub const fn num_fp2_addsub_cols() -> usize { pub struct Fp2AddSubAssignCols { pub is_real: T, pub shard: T, - pub channel: T, pub nonce: T, pub clk: T, pub is_add: T, @@ -65,7 +64,6 @@ impl Fp2AddSubAssignChip

{ fn populate_field_ops( blu_events: &mut Vec, shard: u32, - channel: u8, cols: &mut Fp2AddSubAssignCols, p_x: BigUint, p_y: BigUint, @@ -75,8 +73,8 @@ impl Fp2AddSubAssignChip

{ ) { let modulus_bytes = P::MODULUS; let modulus = BigUint::from_bytes_le(modulus_bytes); - cols.c0.populate_with_modulus(blu_events, shard, channel, &p_x, &q_x, &modulus, op); - cols.c1.populate_with_modulus(blu_events, shard, channel, &p_y, &q_y, &modulus, op); + cols.c0.populate_with_modulus(blu_events, shard, &p_x, &q_x, &modulus, op); + cols.c1.populate_with_modulus(blu_events, shard, &p_y, &q_y, &modulus, op); } } @@ -93,16 +91,26 @@ impl MachineAir for Fp2AddSubAssignChip

{ } fn generate_trace(&self, input: &Self::Record, output: &mut Self::Record) -> RowMajorMatrix { + // All the fp2 sub and add events for a given curve are coalesce to the curve's Add operation. Only retrieve + // precompile events for that operation. + // TODO: Fix this. + let events = match P::FIELD_TYPE { - FieldType::Bn254 => &input.bn254_fp2_addsub_events, - FieldType::Bls12381 => &input.bls12381_fp2_addsub_events, + FieldType::Bn254 => input.get_precompile_events(SyscallCode::BN254_FP2_ADD).iter(), + FieldType::Bls12381 => { + input.get_precompile_events(SyscallCode::BLS12381_FP2_ADD).iter() + } }; let mut rows = Vec::new(); let mut new_byte_lookup_events = Vec::new(); - for i in 0..events.len() { - let event = &events[i]; + for event in events { + let event = match (P::FIELD_TYPE, event) { + (FieldType::Bn254, PrecompileEvent::Bn254Fp2AddSub(event)) => event, + (FieldType::Bls12381, PrecompileEvent::Bls12381Fp2AddSub(event)) => event, + _ => unreachable!(), + }; let mut row = vec![F::zero(); num_fp2_addsub_cols::

()]; let cols: &mut Fp2AddSubAssignCols = row.as_mut_slice().borrow_mut(); @@ -117,7 +125,6 @@ impl MachineAir for Fp2AddSubAssignChip

{ cols.is_real = F::one(); cols.is_add = F::from_bool(event.op == FieldOperation::Add); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.x_ptr = F::from_canonical_u32(event.x_ptr); cols.y_ptr = F::from_canonical_u32(event.y_ptr); @@ -125,7 +132,6 @@ impl MachineAir for Fp2AddSubAssignChip

{ Self::populate_field_ops( &mut new_byte_lookup_events, event.shard, - event.channel, cols, p_x, p_y, @@ -136,20 +142,12 @@ impl MachineAir for Fp2AddSubAssignChip

{ // Populate the memory access columns. for i in 0..cols.y_access.len() { - cols.y_access[i].populate( - event.channel, - event.y_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.y_access[i].populate(event.y_memory_records[i], &mut new_byte_lookup_events); } for i in 0..cols.x_access.len() { - cols.x_access[i].populate( - event.channel, - event.x_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.x_access[i].populate(event.x_memory_records[i], &mut new_byte_lookup_events); } - rows.push(row) + rows.push(row); } output.add_byte_lookup_events(new_byte_lookup_events); @@ -164,7 +162,6 @@ impl MachineAir for Fp2AddSubAssignChip

{ Self::populate_field_ops( &mut vec![], 0, - 0, cols, zero.clone(), zero.clone(), @@ -195,9 +192,20 @@ impl MachineAir for Fp2AddSubAssignChip

{ } fn included(&self, shard: &Self::Record) -> bool { + // All the fp2 sub and add events for a given curve are coalesce to the curve's Add operation. Only retrieve + // precompile events for that operation. + // TODO: Fix this. + + assert!( + shard.get_precompile_events(SyscallCode::BN254_FP_SUB).is_empty() + && shard.get_precompile_events(SyscallCode::BLS12381_FP_SUB).is_empty() + ); + match P::FIELD_TYPE { - FieldType::Bn254 => !shard.bn254_fp2_addsub_events.is_empty(), - FieldType::Bls12381 => !shard.bls12381_fp2_addsub_events.is_empty(), + FieldType::Bn254 => !shard.get_precompile_events(SyscallCode::BN254_FP2_ADD).is_empty(), + FieldType::Bls12381 => { + !shard.get_precompile_events(SyscallCode::BLS12381_FP2_ADD).is_empty() + } } } } @@ -247,8 +255,6 @@ where AB::Expr::one() - local.is_add, AB::F::zero(), AB::F::zero(), - local.shard, - local.channel, local.is_real, ); @@ -261,8 +267,6 @@ where AB::Expr::one() - local.is_add, AB::F::zero(), AB::F::zero(), - local.shard, - local.channel, local.is_real, ); } @@ -277,7 +281,6 @@ where ); builder.eval_memory_access_slice( local.shard, - local.channel, local.clk.into(), local.y_ptr, &local.y_access, @@ -285,7 +288,6 @@ where ); builder.eval_memory_access_slice( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(1), /* We read p at +1 since p, q could be the * same. */ local.x_ptr, @@ -309,13 +311,13 @@ where builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, syscall_id_felt, local.x_ptr, local.y_ptr, local.is_real, + InteractionScope::Global, ); } } diff --git a/crates/core/machine/src/syscall/precompiles/fptower/fp2_mul.rs b/crates/core/machine/src/syscall/precompiles/fptower/fp2_mul.rs index 802ff0656c..07fb9c3af7 100644 --- a/crates/core/machine/src/syscall/precompiles/fptower/fp2_mul.rs +++ b/crates/core/machine/src/syscall/precompiles/fptower/fp2_mul.rs @@ -11,7 +11,7 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, FieldOperation}, + events::{ByteLookupEvent, ByteRecord, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -20,7 +20,7 @@ use sp1_curves::{ weierstrass::{FieldType, FpOpField}, }; use sp1_derive::AlignedBorrow; -use sp1_stark::air::{BaseAirBuilder, MachineAir, Polynomial, SP1AirBuilder}; +use sp1_stark::air::{BaseAirBuilder, InteractionScope, MachineAir, Polynomial, SP1AirBuilder}; use std::mem::size_of; use typenum::Unsigned; @@ -40,7 +40,6 @@ pub const fn num_fp2_mul_cols() -> usize { pub struct Fp2MulAssignCols { pub is_real: T, pub shard: T, - pub channel: T, pub nonce: T, pub clk: T, pub x_ptr: T, @@ -69,7 +68,6 @@ impl Fp2MulAssignChip

{ fn populate_field_ops( blu_events: &mut Vec, shard: u32, - channel: u8, cols: &mut Fp2MulAssignCols, p_x: BigUint, p_y: BigUint, @@ -81,7 +79,6 @@ impl Fp2MulAssignChip

{ let a0_mul_b0 = cols.a0_mul_b0.populate_with_modulus( blu_events, shard, - channel, &p_x, &q_x, &modulus, @@ -90,7 +87,6 @@ impl Fp2MulAssignChip

{ let a1_mul_b1 = cols.a1_mul_b1.populate_with_modulus( blu_events, shard, - channel, &p_y, &q_y, &modulus, @@ -99,7 +95,6 @@ impl Fp2MulAssignChip

{ let a0_mul_b1 = cols.a0_mul_b1.populate_with_modulus( blu_events, shard, - channel, &p_x, &q_y, &modulus, @@ -108,7 +103,6 @@ impl Fp2MulAssignChip

{ let a1_mul_b0 = cols.a1_mul_b0.populate_with_modulus( blu_events, shard, - channel, &p_y, &q_x, &modulus, @@ -117,7 +111,6 @@ impl Fp2MulAssignChip

{ cols.c0.populate_with_modulus( blu_events, shard, - channel, &a0_mul_b0, &a1_mul_b1, &modulus, @@ -126,7 +119,6 @@ impl Fp2MulAssignChip

{ cols.c1.populate_with_modulus( blu_events, shard, - channel, &a0_mul_b1, &a1_mul_b0, &modulus, @@ -149,15 +141,20 @@ impl MachineAir for Fp2MulAssignChip

{ fn generate_trace(&self, input: &Self::Record, output: &mut Self::Record) -> RowMajorMatrix { let events = match P::FIELD_TYPE { - FieldType::Bn254 => &input.bn254_fp2_mul_events, - FieldType::Bls12381 => &input.bls12381_fp2_mul_events, + FieldType::Bn254 => input.get_precompile_events(SyscallCode::BN254_FP2_MUL), + FieldType::Bls12381 => input.get_precompile_events(SyscallCode::BLS12381_FP2_MUL), }; let mut rows = Vec::new(); let mut new_byte_lookup_events = Vec::new(); - for i in 0..events.len() { - let event = &events[i]; + for event in events { + let event = match (P::FIELD_TYPE, event) { + (FieldType::Bn254, PrecompileEvent::Bn254Fp2Mul(event)) => event, + (FieldType::Bls12381, PrecompileEvent::Bls12381Fp2Mul(event)) => event, + _ => unreachable!(), + }; + let mut row = vec![F::zero(); num_fp2_mul_cols::

()]; let cols: &mut Fp2MulAssignCols = row.as_mut_slice().borrow_mut(); @@ -170,7 +167,6 @@ impl MachineAir for Fp2MulAssignChip

{ cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.x_ptr = F::from_canonical_u32(event.x_ptr); cols.y_ptr = F::from_canonical_u32(event.y_ptr); @@ -178,7 +174,6 @@ impl MachineAir for Fp2MulAssignChip

{ Self::populate_field_ops( &mut new_byte_lookup_events, event.shard, - event.channel, cols, p_x, p_y, @@ -188,20 +183,12 @@ impl MachineAir for Fp2MulAssignChip

{ // Populate the memory access columns. for i in 0..cols.y_access.len() { - cols.y_access[i].populate( - event.channel, - event.y_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.y_access[i].populate(event.y_memory_records[i], &mut new_byte_lookup_events); } for i in 0..cols.x_access.len() { - cols.x_access[i].populate( - event.channel, - event.x_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.x_access[i].populate(event.x_memory_records[i], &mut new_byte_lookup_events); } - rows.push(row) + rows.push(row); } output.add_byte_lookup_events(new_byte_lookup_events); @@ -215,7 +202,6 @@ impl MachineAir for Fp2MulAssignChip

{ Self::populate_field_ops( &mut vec![], 0, - 0, cols, zero.clone(), zero.clone(), @@ -246,8 +232,10 @@ impl MachineAir for Fp2MulAssignChip

{ fn included(&self, shard: &Self::Record) -> bool { match P::FIELD_TYPE { - FieldType::Bn254 => !shard.bn254_fp2_mul_events.is_empty(), - FieldType::Bls12381 => !shard.bls12381_fp2_mul_events.is_empty(), + FieldType::Bn254 => !shard.get_precompile_events(SyscallCode::BN254_FP2_MUL).is_empty(), + FieldType::Bls12381 => { + !shard.get_precompile_events(SyscallCode::BLS12381_FP2_MUL).is_empty() + } } } } @@ -291,8 +279,6 @@ where &q_x, &p_modulus, FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); @@ -302,8 +288,6 @@ where &q_y, &p_modulus, FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); @@ -313,8 +297,6 @@ where &local.a1_mul_b1.result, &p_modulus, FieldOperation::Sub, - local.shard, - local.channel, local.is_real, ); } @@ -326,8 +308,6 @@ where &q_y, &p_modulus, FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); @@ -337,8 +317,6 @@ where &q_x, &p_modulus, FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); @@ -348,8 +326,6 @@ where &local.a1_mul_b0.result, &p_modulus, FieldOperation::Add, - local.shard, - local.channel, local.is_real, ); } @@ -365,7 +341,6 @@ where builder.eval_memory_access_slice( local.shard, - local.channel, local.clk.into(), local.y_ptr, &local.y_access, @@ -373,7 +348,6 @@ where ); builder.eval_memory_access_slice( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(1), /* We read p at +1 since p, q could be the * same. */ local.x_ptr, @@ -390,13 +364,13 @@ where builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, syscall_id_felt, local.x_ptr, local.y_ptr, local.is_real, + InteractionScope::Global, ); } } diff --git a/crates/core/machine/src/syscall/precompiles/keccak256/air.rs b/crates/core/machine/src/syscall/precompiles/keccak256/air.rs index 4a17ea1b3c..75a9136b97 100644 --- a/crates/core/machine/src/syscall/precompiles/keccak256/air.rs +++ b/crates/core/machine/src/syscall/precompiles/keccak256/air.rs @@ -5,7 +5,7 @@ use p3_field::AbstractField; use p3_keccak_air::{KeccakAir, NUM_KECCAK_COLS, NUM_ROUNDS, U64_LIMBS}; use p3_matrix::Matrix; use sp1_core_executor::syscalls::SyscallCode; -use sp1_stark::air::{SP1AirBuilder, SubAirBuilder}; +use sp1_stark::air::{InteractionScope, SP1AirBuilder, SubAirBuilder}; use super::{ columns::{KeccakMemCols, NUM_KECCAK_MEM_COLS}, @@ -54,7 +54,6 @@ where builder.eval_memory_access( local.shard, - local.channel, local.clk + final_step, // The clk increments by 1 after a final step local.state_addr + AB::Expr::from_canonical_u32(i * 4), &local.state_mem[i as usize], @@ -66,13 +65,13 @@ where builder.assert_eq(local.receive_ecall, first_step * local.is_real); builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, AB::F::from_canonical_u32(SyscallCode::KECCAK_PERMUTE.syscall_id()), local.state_addr, AB::Expr::zero(), local.receive_ecall, + InteractionScope::Global, ); // Constrain that the inputs stay the same throughout the 24 rows of each cycle @@ -80,7 +79,6 @@ where let mut transition_not_final_builder = transition_builder.when(not_final_step); transition_not_final_builder.assert_eq(local.shard, next.shard); transition_not_final_builder.assert_eq(local.clk, next.clk); - transition_not_final_builder.assert_eq(local.channel, next.channel); transition_not_final_builder.assert_eq(local.state_addr, next.state_addr); transition_not_final_builder.assert_eq(local.is_real, next.is_real); @@ -126,12 +124,7 @@ where // Range check all the values in `state_mem` to be bytes. for i in 0..STATE_NUM_WORDS { - builder.slice_range_check_u8( - &local.state_mem[i].value().0, - local.shard, - local.channel, - local.do_memory_check, - ); + builder.slice_range_check_u8(&local.state_mem[i].value().0, local.do_memory_check); } let mut sub_builder = diff --git a/crates/core/machine/src/syscall/precompiles/keccak256/columns.rs b/crates/core/machine/src/syscall/precompiles/keccak256/columns.rs index ad3aa5f099..7b622b3bc1 100644 --- a/crates/core/machine/src/syscall/precompiles/keccak256/columns.rs +++ b/crates/core/machine/src/syscall/precompiles/keccak256/columns.rs @@ -18,7 +18,6 @@ pub(crate) struct KeccakMemCols { pub keccak: KeccakCols, pub shard: T, - pub channel: T, pub clk: T, pub nonce: T, pub state_addr: T, diff --git a/crates/core/machine/src/syscall/precompiles/keccak256/trace.rs b/crates/core/machine/src/syscall/precompiles/keccak256/trace.rs index bca7080734..757c7c9c32 100644 --- a/crates/core/machine/src/syscall/precompiles/keccak256/trace.rs +++ b/crates/core/machine/src/syscall/precompiles/keccak256/trace.rs @@ -4,8 +4,12 @@ use p3_field::PrimeField32; use p3_keccak_air::{generate_trace_rows, NUM_KECCAK_COLS, NUM_ROUNDS}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use p3_maybe_rayon::prelude::{ParallelIterator, ParallelSlice}; -use sp1_core_executor::{ExecutionRecord, Program}; -use sp1_stark::{air::MachineAir, MachineRecord}; +use sp1_core_executor::{ + events::{KeccakPermuteEvent, PrecompileEvent}, + syscalls::SyscallCode, + ExecutionRecord, Program, +}; +use sp1_stark::air::MachineAir; use super::{ columns::{KeccakMemCols, NUM_KECCAK_MEM_COLS}, @@ -26,21 +30,29 @@ impl MachineAir for KeccakPermuteChip { input: &ExecutionRecord, output: &mut ExecutionRecord, ) -> RowMajorMatrix { - let num_events = input.keccak_permute_events.len(); + let events = input.get_precompile_events(SyscallCode::KECCAK_PERMUTE); + let num_events = events.len(); let chunk_size = std::cmp::max(num_events / num_cpus::get(), 1); + fn event_transform(event: &PrecompileEvent) -> &KeccakPermuteEvent { + if let PrecompileEvent::KeccakPermute(event) = event { + event + } else { + unreachable!() + } + } + // Use par_chunks to generate the trace in parallel. - let rows_and_records = (0..num_events) + let rows_and_blu_events = (0..num_events) .collect::>() .par_chunks(chunk_size) .map(|chunk| { - let mut record = ExecutionRecord::default(); let mut new_byte_lookup_events = Vec::new(); // First generate all the p3_keccak_air traces at once. let perm_inputs = chunk .iter() - .map(|event_index| input.keccak_permute_events[*event_index].pre_state) + .map(|event_index| event_transform(&events[*event_index]).pre_state) .collect::>(); let p3_keccak_trace = generate_trace_rows::(perm_inputs); @@ -50,10 +62,9 @@ impl MachineAir for KeccakPermuteChip { .flat_map(|(index_in_chunk, event_index)| { let mut rows = Vec::new(); - let event = &input.keccak_permute_events[*event_index]; + let event = event_transform(&events[*event_index]); let start_clk = event.clk; let shard = event.shard; - let channel = event.channel; // Create all the rows for the permutation. for i in 0..NUM_ROUNDS { @@ -66,7 +77,6 @@ impl MachineAir for KeccakPermuteChip { let cols: &mut KeccakMemCols = row.as_mut_slice().borrow_mut(); cols.shard = F::from_canonical_u32(shard); - cols.channel = F::from_canonical_u8(channel); cols.clk = F::from_canonical_u32(start_clk); cols.state_addr = F::from_canonical_u32(event.state_addr); cols.is_real = F::one(); @@ -75,14 +85,10 @@ impl MachineAir for KeccakPermuteChip { if i == 0 { for (j, read_record) in event.state_read_records.iter().enumerate() { - cols.state_mem[j].populate_read( - channel, - *read_record, - &mut new_byte_lookup_events, - ); + cols.state_mem[j] + .populate_read(*read_record, &mut new_byte_lookup_events); new_byte_lookup_events.add_u8_range_checks( shard, - channel, &read_record.value.to_le_bytes(), ); } @@ -95,14 +101,10 @@ impl MachineAir for KeccakPermuteChip { for (j, write_record) in event.state_write_records.iter().enumerate() { - cols.state_mem[j].populate_write( - channel, - *write_record, - &mut new_byte_lookup_events, - ); + cols.state_mem[j] + .populate_write(*write_record, &mut new_byte_lookup_events); new_byte_lookup_events.add_u8_range_checks( shard, - channel, &write_record.value.to_le_bytes(), ); } @@ -114,16 +116,15 @@ impl MachineAir for KeccakPermuteChip { rows }) .collect::>(); - record.add_byte_lookup_events(new_byte_lookup_events); - (rows, record) + (rows, new_byte_lookup_events) }) .collect::>(); // Generate the trace rows for each event. let mut rows: Vec<[F; NUM_KECCAK_MEM_COLS]> = vec![]; - for (mut row, mut record) in rows_and_records { + for (mut row, blu_events) in rows_and_blu_events { rows.append(&mut row); - output.append(&mut record); + output.add_byte_lookup_events(blu_events); } let nb_rows = rows.len(); @@ -167,6 +168,6 @@ impl MachineAir for KeccakPermuteChip { } fn included(&self, shard: &Self::Record) -> bool { - !shard.keccak_permute_events.is_empty() + !shard.get_precompile_events(SyscallCode::KECCAK_PERMUTE).is_empty() } } diff --git a/crates/core/machine/src/syscall/precompiles/sha256/compress/air.rs b/crates/core/machine/src/syscall/precompiles/sha256/compress/air.rs index db1a58a7f0..d804933942 100644 --- a/crates/core/machine/src/syscall/precompiles/sha256/compress/air.rs +++ b/crates/core/machine/src/syscall/precompiles/sha256/compress/air.rs @@ -4,7 +4,10 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::AbstractField; use p3_matrix::Matrix; use sp1_core_executor::syscalls::SyscallCode; -use sp1_stark::{air::SP1AirBuilder, Word}; +use sp1_stark::{ + air::{InteractionScope, SP1AirBuilder}, + Word, +}; use super::{ columns::{ShaCompressCols, NUM_SHA_COMPRESS_COLS}, @@ -51,13 +54,13 @@ where builder.assert_eq(local.start, local.is_real * local.octet[0] * local.octet_num[0]); builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, AB::F::from_canonical_u32(SyscallCode::SHA_COMPRESS.syscall_id()), local.w_ptr, local.h_ptr, local.start, + InteractionScope::Global, ); } } @@ -172,10 +175,6 @@ impl ShaCompressChip { .when(local.is_real) .when_not(local.is_last_row) .assert_eq(local.clk, next.clk); - builder - .when_transition() - .when_not(local.is_last_row) - .assert_eq(local.channel, next.channel); builder .when_transition() .when(local.is_real) @@ -209,7 +208,6 @@ impl ShaCompressChip { fn eval_memory(&self, builder: &mut AB, local: &ShaCompressCols) { builder.eval_memory_access( local.shard, - local.channel, local.clk + local.is_finalize, local.mem_addr, &local.mem, @@ -296,8 +294,6 @@ impl ShaCompressChip { local.e, 6, local.e_rr_6, - local.shard, - local.channel, local.is_compression, ); // Calculate e rightrotate 11. @@ -306,8 +302,6 @@ impl ShaCompressChip { local.e, 11, local.e_rr_11, - local.shard, - local.channel, local.is_compression, ); // Calculate e rightrotate 25. @@ -316,8 +310,6 @@ impl ShaCompressChip { local.e, 25, local.e_rr_25, - local.shard, - local.channel, local.is_compression, ); // Calculate (e rightrotate 6) xor (e rightrotate 11). @@ -326,8 +318,6 @@ impl ShaCompressChip { local.e_rr_6.value, local.e_rr_11.value, local.s1_intermediate, - local.shard, - local.channel, local.is_compression, ); // Calculate S1 := ((e rightrotate 6) xor (e rightrotate 11)) xor (e rightrotate 25). @@ -336,39 +326,20 @@ impl ShaCompressChip { local.s1_intermediate.value, local.e_rr_25.value, local.s1, - local.shard, - local.channel, local.is_compression, ); // Calculate ch := (e and f) xor ((not e) and g). // Calculate e and f. - AndOperation::::eval( - builder, - local.e, - local.f, - local.e_and_f, - local.shard, - local.channel, - local.is_compression, - ); + AndOperation::::eval(builder, local.e, local.f, local.e_and_f, local.is_compression); // Calculate not e. - NotOperation::::eval( - builder, - local.e, - local.e_not, - local.shard, - local.channel, - local.is_compression, - ); + NotOperation::::eval(builder, local.e, local.e_not, local.is_compression); // Calculate (not e) and g. AndOperation::::eval( builder, local.e_not.value, local.g, local.e_not_and_g, - local.shard, - local.channel, local.is_compression, ); // Calculate ch := (e and f) xor ((not e) and g). @@ -377,8 +348,6 @@ impl ShaCompressChip { local.e_and_f.value, local.e_not_and_g.value, local.ch, - local.shard, - local.channel, local.is_compression, ); @@ -386,8 +355,6 @@ impl ShaCompressChip { Add5Operation::::eval( builder, &[local.h, local.s1.value, local.ch.value, local.k, local.mem.access.value], - local.shard, - local.channel, local.is_compression, local.temp1, ); @@ -399,8 +366,6 @@ impl ShaCompressChip { local.a, 2, local.a_rr_2, - local.shard, - local.channel, local.is_compression, ); // Calculate a rightrotate 13. @@ -409,8 +374,6 @@ impl ShaCompressChip { local.a, 13, local.a_rr_13, - local.shard, - local.channel, local.is_compression, ); // Calculate a rightrotate 22. @@ -419,8 +382,6 @@ impl ShaCompressChip { local.a, 22, local.a_rr_22, - local.shard, - local.channel, local.is_compression, ); // Calculate (a rightrotate 2) xor (a rightrotate 13). @@ -429,8 +390,6 @@ impl ShaCompressChip { local.a_rr_2.value, local.a_rr_13.value, local.s0_intermediate, - local.shard, - local.channel, local.is_compression, ); // Calculate S0 := ((a rightrotate 2) xor (a rightrotate 13)) xor (a rightrotate 22). @@ -439,50 +398,22 @@ impl ShaCompressChip { local.s0_intermediate.value, local.a_rr_22.value, local.s0, - local.shard, - local.channel, local.is_compression, ); // Calculate maj := (a and b) xor (a and c) xor (b and c). // Calculate a and b. - AndOperation::::eval( - builder, - local.a, - local.b, - local.a_and_b, - local.shard, - local.channel, - local.is_compression, - ); + AndOperation::::eval(builder, local.a, local.b, local.a_and_b, local.is_compression); // Calculate a and c. - AndOperation::::eval( - builder, - local.a, - local.c, - local.a_and_c, - local.shard, - local.channel, - local.is_compression, - ); + AndOperation::::eval(builder, local.a, local.c, local.a_and_c, local.is_compression); // Calculate b and c. - AndOperation::::eval( - builder, - local.b, - local.c, - local.b_and_c, - local.shard, - local.channel, - local.is_compression, - ); + AndOperation::::eval(builder, local.b, local.c, local.b_and_c, local.is_compression); // Calculate (a and b) xor (a and c). XorOperation::::eval( builder, local.a_and_b.value, local.a_and_c.value, local.maj_intermediate, - local.shard, - local.channel, local.is_compression, ); // Calculate maj := ((a and b) xor (a and c)) xor (b and c). @@ -491,8 +422,6 @@ impl ShaCompressChip { local.maj_intermediate.value, local.b_and_c.value, local.maj, - local.shard, - local.channel, local.is_compression, ); @@ -502,8 +431,6 @@ impl ShaCompressChip { local.s0.value, local.maj.value, local.temp2, - local.shard, - local.channel, local.is_compression.into(), ); @@ -513,8 +440,6 @@ impl ShaCompressChip { local.d, local.temp1.value, local.d_add_temp1, - local.shard, - local.channel, local.is_compression.into(), ); @@ -524,8 +449,6 @@ impl ShaCompressChip { local.temp1.value, local.temp2.value, local.temp1_add_temp2, - local.shard, - local.channel, local.is_compression.into(), ); @@ -581,8 +504,6 @@ impl ShaCompressChip { local.mem.prev_value, local.finalized_operand, local.finalize_add, - local.shard, - local.channel, local.is_finalize.into(), ); diff --git a/crates/core/machine/src/syscall/precompiles/sha256/compress/columns.rs b/crates/core/machine/src/syscall/precompiles/sha256/compress/columns.rs index d45b03ac7c..5d48b9edcc 100644 --- a/crates/core/machine/src/syscall/precompiles/sha256/compress/columns.rs +++ b/crates/core/machine/src/syscall/precompiles/sha256/compress/columns.rs @@ -25,7 +25,6 @@ pub const NUM_SHA_COMPRESS_COLS: usize = size_of::>(); pub struct ShaCompressCols { /// Inputs. pub shard: T, - pub channel: T, pub nonce: T, pub clk: T, pub w_ptr: T, diff --git a/crates/core/machine/src/syscall/precompiles/sha256/compress/trace.rs b/crates/core/machine/src/syscall/precompiles/sha256/compress/trace.rs index 8d327d9820..9d9015f78d 100644 --- a/crates/core/machine/src/syscall/precompiles/sha256/compress/trace.rs +++ b/crates/core/machine/src/syscall/precompiles/sha256/compress/trace.rs @@ -6,7 +6,8 @@ use p3_field::PrimeField32; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use p3_maybe_rayon::prelude::{ParallelIterator, ParallelSlice}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, ShaCompressEvent}, + events::{ByteLookupEvent, ByteRecord, PrecompileEvent, ShaCompressEvent}, + syscalls::SyscallCode, ExecutionRecord, Program, }; use sp1_stark::{air::MachineAir, Word}; @@ -34,9 +35,13 @@ impl MachineAir for ShaCompressChip { let rows = Vec::new(); let mut wrapped_rows = Some(rows); - for i in 0..input.sha_compress_events.len() { - let event = input.sha_compress_events[i].clone(); - self.event_to_rows(&event, &mut wrapped_rows, &mut Vec::new()); + for event in input.get_precompile_events(SyscallCode::SHA_COMPRESS) { + let event = if let PrecompileEvent::ShaCompress(event) = event { + event + } else { + unreachable!() + }; + self.event_to_rows(event, &mut wrapped_rows, &mut Vec::new()); } let mut rows = wrapped_rows.unwrap(); @@ -89,14 +94,19 @@ impl MachineAir for ShaCompressChip { } fn generate_dependencies(&self, input: &Self::Record, output: &mut Self::Record) { - let chunk_size = std::cmp::max(input.sha_compress_events.len() / num_cpus::get(), 1); + let events = input.get_precompile_events(SyscallCode::SHA_COMPRESS); + let chunk_size = std::cmp::max(events.len() / num_cpus::get(), 1); - let blu_batches = input - .sha_compress_events + let blu_batches = events .par_chunks(chunk_size) .map(|events| { let mut blu: HashMap> = HashMap::new(); events.iter().for_each(|event| { + let event = if let PrecompileEvent::ShaCompress(event) = event { + event + } else { + unreachable!() + }; self.event_to_rows::(event, &mut None, &mut blu); }); blu @@ -107,7 +117,7 @@ impl MachineAir for ShaCompressChip { } fn included(&self, shard: &Self::Record) -> bool { - !shard.sha_compress_events.is_empty() + !shard.get_precompile_events(SyscallCode::SHA_COMPRESS).is_empty() } } @@ -119,7 +129,6 @@ impl ShaCompressChip { blu: &mut impl ByteRecord, ) { let shard = event.shard; - let channel = event.channel; let og_h = event.h; @@ -131,7 +140,6 @@ impl ShaCompressChip { let cols: &mut ShaCompressCols = row.as_mut_slice().borrow_mut(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.w_ptr = F::from_canonical_u32(event.w_ptr); cols.h_ptr = F::from_canonical_u32(event.h_ptr); @@ -140,7 +148,7 @@ impl ShaCompressChip { cols.octet_num[octet_num_idx] = F::one(); cols.is_initialize = F::one(); - cols.mem.populate_read(channel, event.h_read_records[j], blu); + cols.mem.populate_read(event.h_read_records[j], blu); cols.mem_addr = F::from_canonical_u32(event.h_ptr + (j * 4) as u32); cols.a = Word::from(event.h_read_records[0].value); @@ -174,11 +182,10 @@ impl ShaCompressChip { cols.octet_num[octet_num_idx] = F::one(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.w_ptr = F::from_canonical_u32(event.w_ptr); cols.h_ptr = F::from_canonical_u32(event.h_ptr); - cols.mem.populate_read(channel, event.w_i_read_records[j], blu); + cols.mem.populate_read(event.w_i_read_records[j], blu); cols.mem_addr = F::from_canonical_u32(event.w_ptr + (j * 4) as u32); let a = h_array[0]; @@ -198,39 +205,35 @@ impl ShaCompressChip { cols.g = Word::from(g); cols.h = Word::from(h); - let e_rr_6 = cols.e_rr_6.populate(blu, shard, channel, e, 6); - let e_rr_11 = cols.e_rr_11.populate(blu, shard, channel, e, 11); - let e_rr_25 = cols.e_rr_25.populate(blu, shard, channel, e, 25); - let s1_intermediate = - cols.s1_intermediate.populate(blu, shard, channel, e_rr_6, e_rr_11); - let s1 = cols.s1.populate(blu, shard, channel, s1_intermediate, e_rr_25); + let e_rr_6 = cols.e_rr_6.populate(blu, shard, e, 6); + let e_rr_11 = cols.e_rr_11.populate(blu, shard, e, 11); + let e_rr_25 = cols.e_rr_25.populate(blu, shard, e, 25); + let s1_intermediate = cols.s1_intermediate.populate(blu, shard, e_rr_6, e_rr_11); + let s1 = cols.s1.populate(blu, shard, s1_intermediate, e_rr_25); - let e_and_f = cols.e_and_f.populate(blu, shard, channel, e, f); - let e_not = cols.e_not.populate(blu, shard, channel, e); - let e_not_and_g = cols.e_not_and_g.populate(blu, shard, channel, e_not, g); - let ch = cols.ch.populate(blu, shard, channel, e_and_f, e_not_and_g); + let e_and_f = cols.e_and_f.populate(blu, shard, e, f); + let e_not = cols.e_not.populate(blu, shard, e); + let e_not_and_g = cols.e_not_and_g.populate(blu, shard, e_not, g); + let ch = cols.ch.populate(blu, shard, e_and_f, e_not_and_g); - let temp1 = - cols.temp1.populate(blu, shard, channel, h, s1, ch, event.w[j], SHA_COMPRESS_K[j]); + let temp1 = cols.temp1.populate(blu, shard, h, s1, ch, event.w[j], SHA_COMPRESS_K[j]); - let a_rr_2 = cols.a_rr_2.populate(blu, shard, channel, a, 2); - let a_rr_13 = cols.a_rr_13.populate(blu, shard, channel, a, 13); - let a_rr_22 = cols.a_rr_22.populate(blu, shard, channel, a, 22); - let s0_intermediate = - cols.s0_intermediate.populate(blu, shard, channel, a_rr_2, a_rr_13); - let s0 = cols.s0.populate(blu, shard, channel, s0_intermediate, a_rr_22); + let a_rr_2 = cols.a_rr_2.populate(blu, shard, a, 2); + let a_rr_13 = cols.a_rr_13.populate(blu, shard, a, 13); + let a_rr_22 = cols.a_rr_22.populate(blu, shard, a, 22); + let s0_intermediate = cols.s0_intermediate.populate(blu, shard, a_rr_2, a_rr_13); + let s0 = cols.s0.populate(blu, shard, s0_intermediate, a_rr_22); - let a_and_b = cols.a_and_b.populate(blu, shard, channel, a, b); - let a_and_c = cols.a_and_c.populate(blu, shard, channel, a, c); - let b_and_c = cols.b_and_c.populate(blu, shard, channel, b, c); - let maj_intermediate = - cols.maj_intermediate.populate(blu, shard, channel, a_and_b, a_and_c); - let maj = cols.maj.populate(blu, shard, channel, maj_intermediate, b_and_c); + let a_and_b = cols.a_and_b.populate(blu, shard, a, b); + let a_and_c = cols.a_and_c.populate(blu, shard, a, c); + let b_and_c = cols.b_and_c.populate(blu, shard, b, c); + let maj_intermediate = cols.maj_intermediate.populate(blu, shard, a_and_b, a_and_c); + let maj = cols.maj.populate(blu, shard, maj_intermediate, b_and_c); - let temp2 = cols.temp2.populate(blu, shard, channel, s0, maj); + let temp2 = cols.temp2.populate(blu, shard, s0, maj); - let d_add_temp1 = cols.d_add_temp1.populate(blu, shard, channel, d, temp1); - let temp1_add_temp2 = cols.temp1_add_temp2.populate(blu, shard, channel, temp1, temp2); + let d_add_temp1 = cols.d_add_temp1.populate(blu, shard, d, temp1); + let temp1_add_temp2 = cols.temp1_add_temp2.populate(blu, shard, temp1, temp2); h_array[7] = g; h_array[6] = f; @@ -258,7 +261,6 @@ impl ShaCompressChip { let cols: &mut ShaCompressCols = row.as_mut_slice().borrow_mut(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.w_ptr = F::from_canonical_u32(event.w_ptr); cols.h_ptr = F::from_canonical_u32(event.h_ptr); @@ -267,8 +269,8 @@ impl ShaCompressChip { cols.octet_num[octet_num_idx] = F::one(); cols.is_finalize = F::one(); - cols.finalize_add.populate(blu, shard, channel, og_h[j], h_array[j]); - cols.mem.populate_write(channel, event.h_write_records[j], blu); + cols.finalize_add.populate(blu, shard, og_h[j], h_array[j]); + cols.mem.populate_write(event.h_write_records[j], blu); cols.mem_addr = F::from_canonical_u32(event.h_ptr + (j * 4) as u32); v[j] = h_array[j]; diff --git a/crates/core/machine/src/syscall/precompiles/sha256/extend/air.rs b/crates/core/machine/src/syscall/precompiles/sha256/extend/air.rs index 0344bf1b6c..cdfdfebdfd 100644 --- a/crates/core/machine/src/syscall/precompiles/sha256/extend/air.rs +++ b/crates/core/machine/src/syscall/precompiles/sha256/extend/air.rs @@ -2,7 +2,7 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::AbstractField; use p3_matrix::Matrix; use sp1_core_executor::syscalls::SyscallCode; -use sp1_stark::air::SP1AirBuilder; +use sp1_stark::air::{InteractionScope, SP1AirBuilder}; use super::{ShaExtendChip, ShaExtendCols, NUM_SHA_EXTEND_COLS}; use crate::{ @@ -52,10 +52,6 @@ where .when_transition() .when_not(local.cycle_16_end.result * local.cycle_48[2]) .assert_eq(local.clk, next.clk); - builder - .when_transition() - .when_not(local.cycle_16_end.result * local.cycle_48[2]) - .assert_eq(local.channel, next.channel); builder .when_transition() .when_not(local.cycle_16_end.result * local.cycle_48[2]) @@ -64,7 +60,6 @@ where // Read w[i-15]. builder.eval_memory_access( local.shard, - local.channel, local.clk + (local.i - i_start), local.w_ptr + (local.i - AB::F::from_canonical_u32(15)) * nb_bytes_in_word, &local.w_i_minus_15, @@ -74,7 +69,6 @@ where // Read w[i-2]. builder.eval_memory_access( local.shard, - local.channel, local.clk + (local.i - i_start), local.w_ptr + (local.i - AB::F::from_canonical_u32(2)) * nb_bytes_in_word, &local.w_i_minus_2, @@ -84,7 +78,6 @@ where // Read w[i-16]. builder.eval_memory_access( local.shard, - local.channel, local.clk + (local.i - i_start), local.w_ptr + (local.i - AB::F::from_canonical_u32(16)) * nb_bytes_in_word, &local.w_i_minus_16, @@ -94,7 +87,6 @@ where // Read w[i-7]. builder.eval_memory_access( local.shard, - local.channel, local.clk + (local.i - i_start), local.w_ptr + (local.i - AB::F::from_canonical_u32(7)) * nb_bytes_in_word, &local.w_i_minus_7, @@ -108,8 +100,6 @@ where *local.w_i_minus_15.value(), 7, local.w_i_minus_15_rr_7, - local.shard, - local.channel, local.is_real, ); // w[i-15] rightrotate 18. @@ -118,8 +108,6 @@ where *local.w_i_minus_15.value(), 18, local.w_i_minus_15_rr_18, - local.shard, - local.channel, local.is_real, ); // w[i-15] rightshift 3. @@ -128,8 +116,6 @@ where *local.w_i_minus_15.value(), 3, local.w_i_minus_15_rs_3, - local.shard, - local.channel, local.is_real, ); // (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) @@ -138,8 +124,6 @@ where local.w_i_minus_15_rr_7.value, local.w_i_minus_15_rr_18.value, local.s0_intermediate, - local.shard, - local.channel, local.is_real, ); // s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift 3) @@ -148,8 +132,6 @@ where local.s0_intermediate.value, local.w_i_minus_15_rs_3.value, local.s0, - local.shard, - local.channel, local.is_real, ); @@ -160,8 +142,6 @@ where *local.w_i_minus_2.value(), 17, local.w_i_minus_2_rr_17, - local.shard, - local.channel, local.is_real, ); // w[i-2] rightrotate 19. @@ -170,8 +150,6 @@ where *local.w_i_minus_2.value(), 19, local.w_i_minus_2_rr_19, - local.shard, - local.channel, local.is_real, ); // w[i-2] rightshift 10. @@ -180,8 +158,6 @@ where *local.w_i_minus_2.value(), 10, local.w_i_minus_2_rs_10, - local.shard, - local.channel, local.is_real, ); // (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) @@ -190,8 +166,6 @@ where local.w_i_minus_2_rr_17.value, local.w_i_minus_2_rr_19.value, local.s1_intermediate, - local.shard, - local.channel, local.is_real, ); // s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightshift 10) @@ -200,8 +174,6 @@ where local.s1_intermediate.value, local.w_i_minus_2_rs_10.value, local.s1, - local.shard, - local.channel, local.is_real, ); @@ -212,8 +184,6 @@ where local.s0.value, *local.w_i_minus_7.value(), local.s1.value, - local.shard, - local.channel, local.is_real, local.s2, ); @@ -221,7 +191,6 @@ where // Write `s2` to `w[i]`. builder.eval_memory_access( local.shard, - local.channel, local.clk + (local.i - i_start), local.w_ptr + local.i * nb_bytes_in_word, &local.w_i, @@ -233,13 +202,13 @@ where // Receive syscall event in first row of 48-cycle. builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, AB::F::from_canonical_u32(SyscallCode::SHA_EXTEND.syscall_id()), local.w_ptr, AB::Expr::zero(), local.cycle_48_start, + InteractionScope::Global, ); // Assert that is_real is a bool. diff --git a/crates/core/machine/src/syscall/precompiles/sha256/extend/columns.rs b/crates/core/machine/src/syscall/precompiles/sha256/extend/columns.rs index 2bb4f11afc..ff7a5f5f7c 100644 --- a/crates/core/machine/src/syscall/precompiles/sha256/extend/columns.rs +++ b/crates/core/machine/src/syscall/precompiles/sha256/extend/columns.rs @@ -17,7 +17,6 @@ pub const NUM_SHA_EXTEND_COLS: usize = size_of::>(); pub struct ShaExtendCols { /// Inputs. pub shard: T, - pub channel: T, pub nonce: T, pub clk: T, pub w_ptr: T, diff --git a/crates/core/machine/src/syscall/precompiles/sha256/extend/mod.rs b/crates/core/machine/src/syscall/precompiles/sha256/extend/mod.rs index 998ef38663..cb3aea1bbb 100644 --- a/crates/core/machine/src/syscall/precompiles/sha256/extend/mod.rs +++ b/crates/core/machine/src/syscall/precompiles/sha256/extend/mod.rs @@ -66,7 +66,7 @@ pub mod extend_tests { #[test] fn generate_trace() { let mut shard = ExecutionRecord::default(); - shard.add_events = vec![AluEvent::new(0, 0, 0, Opcode::ADD, 14, 8, 6)]; + shard.add_events = vec![AluEvent::new(0, 0, Opcode::ADD, 14, 8, 6)]; let chip = ShaExtendChip::new(); let trace: RowMajorMatrix = chip.generate_trace(&shard, &mut ExecutionRecord::default()); diff --git a/crates/core/machine/src/syscall/precompiles/sha256/extend/trace.rs b/crates/core/machine/src/syscall/precompiles/sha256/extend/trace.rs index d38b32d85b..7a3ecaac76 100644 --- a/crates/core/machine/src/syscall/precompiles/sha256/extend/trace.rs +++ b/crates/core/machine/src/syscall/precompiles/sha256/extend/trace.rs @@ -4,7 +4,8 @@ use p3_field::PrimeField32; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use p3_maybe_rayon::prelude::{ParallelIterator, ParallelSlice}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, ShaExtendEvent}, + events::{ByteLookupEvent, ByteRecord, PrecompileEvent, ShaExtendEvent}, + syscalls::SyscallCode, ExecutionRecord, Program, }; use sp1_stark::air::MachineAir; @@ -30,12 +31,10 @@ impl MachineAir for ShaExtendChip { let mut new_byte_lookup_events = Vec::new(); let mut wrapped_rows = Some(rows); - for i in 0..input.sha_extend_events.len() { - self.event_to_rows( - &input.sha_extend_events[i], - &mut wrapped_rows, - &mut new_byte_lookup_events, - ); + for event in input.get_precompile_events(SyscallCode::SHA_EXTEND).iter() { + let event = + if let PrecompileEvent::ShaExtend(event) = event { event } else { unreachable!() }; + self.event_to_rows(event, &mut wrapped_rows, &mut new_byte_lookup_events); } let mut rows = wrapped_rows.unwrap(); @@ -68,14 +67,19 @@ impl MachineAir for ShaExtendChip { } fn generate_dependencies(&self, input: &Self::Record, output: &mut Self::Record) { - let chunk_size = std::cmp::max(input.sha_extend_events.len() / num_cpus::get(), 1); + let events = input.get_precompile_events(SyscallCode::SHA_EXTEND); + let chunk_size = std::cmp::max(events.len() / num_cpus::get(), 1); - let blu_batches = input - .sha_extend_events + let blu_batches = events .par_chunks(chunk_size) .map(|events| { let mut blu: HashMap> = HashMap::new(); events.iter().for_each(|event| { + let event = if let PrecompileEvent::ShaExtend(event) = event { + event + } else { + unreachable!() + }; self.event_to_rows::(event, &mut None, &mut blu); }); blu @@ -86,7 +90,7 @@ impl MachineAir for ShaExtendChip { } fn included(&self, shard: &Self::Record) -> bool { - !shard.sha_extend_events.is_empty() + !shard.get_precompile_events(SyscallCode::SHA_EXTEND).is_empty() } } @@ -104,59 +108,40 @@ impl ShaExtendChip { cols.is_real = F::one(); cols.populate_flags(j); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.w_ptr = F::from_canonical_u32(event.w_ptr); - cols.w_i_minus_15.populate(event.channel, event.w_i_minus_15_reads[j], blu); - cols.w_i_minus_2.populate(event.channel, event.w_i_minus_2_reads[j], blu); - cols.w_i_minus_16.populate(event.channel, event.w_i_minus_16_reads[j], blu); - cols.w_i_minus_7.populate(event.channel, event.w_i_minus_7_reads[j], blu); + cols.w_i_minus_15.populate(event.w_i_minus_15_reads[j], blu); + cols.w_i_minus_2.populate(event.w_i_minus_2_reads[j], blu); + cols.w_i_minus_16.populate(event.w_i_minus_16_reads[j], blu); + cols.w_i_minus_7.populate(event.w_i_minus_7_reads[j], blu); // `s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift // 3)`. let w_i_minus_15 = event.w_i_minus_15_reads[j].value; - let w_i_minus_15_rr_7 = - cols.w_i_minus_15_rr_7.populate(blu, shard, event.channel, w_i_minus_15, 7); - let w_i_minus_15_rr_18 = - cols.w_i_minus_15_rr_18.populate(blu, shard, event.channel, w_i_minus_15, 18); - let w_i_minus_15_rs_3 = - cols.w_i_minus_15_rs_3.populate(blu, shard, event.channel, w_i_minus_15, 3); - let s0_intermediate = cols.s0_intermediate.populate( - blu, - shard, - event.channel, - w_i_minus_15_rr_7, - w_i_minus_15_rr_18, - ); - let s0 = - cols.s0.populate(blu, shard, event.channel, s0_intermediate, w_i_minus_15_rs_3); + let w_i_minus_15_rr_7 = cols.w_i_minus_15_rr_7.populate(blu, shard, w_i_minus_15, 7); + let w_i_minus_15_rr_18 = cols.w_i_minus_15_rr_18.populate(blu, shard, w_i_minus_15, 18); + let w_i_minus_15_rs_3 = cols.w_i_minus_15_rs_3.populate(blu, shard, w_i_minus_15, 3); + let s0_intermediate = + cols.s0_intermediate.populate(blu, shard, w_i_minus_15_rr_7, w_i_minus_15_rr_18); + let s0 = cols.s0.populate(blu, shard, s0_intermediate, w_i_minus_15_rs_3); // `s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor (w[i-2] rightshift // 10)`. let w_i_minus_2 = event.w_i_minus_2_reads[j].value; - let w_i_minus_2_rr_17 = - cols.w_i_minus_2_rr_17.populate(blu, shard, event.channel, w_i_minus_2, 17); - let w_i_minus_2_rr_19 = - cols.w_i_minus_2_rr_19.populate(blu, shard, event.channel, w_i_minus_2, 19); - let w_i_minus_2_rs_10 = - cols.w_i_minus_2_rs_10.populate(blu, shard, event.channel, w_i_minus_2, 10); - let s1_intermediate = cols.s1_intermediate.populate( - blu, - shard, - event.channel, - w_i_minus_2_rr_17, - w_i_minus_2_rr_19, - ); - let s1 = - cols.s1.populate(blu, shard, event.channel, s1_intermediate, w_i_minus_2_rs_10); + let w_i_minus_2_rr_17 = cols.w_i_minus_2_rr_17.populate(blu, shard, w_i_minus_2, 17); + let w_i_minus_2_rr_19 = cols.w_i_minus_2_rr_19.populate(blu, shard, w_i_minus_2, 19); + let w_i_minus_2_rs_10 = cols.w_i_minus_2_rs_10.populate(blu, shard, w_i_minus_2, 10); + let s1_intermediate = + cols.s1_intermediate.populate(blu, shard, w_i_minus_2_rr_17, w_i_minus_2_rr_19); + let s1 = cols.s1.populate(blu, shard, s1_intermediate, w_i_minus_2_rs_10); // Compute `s2`. let w_i_minus_7 = event.w_i_minus_7_reads[j].value; let w_i_minus_16 = event.w_i_minus_16_reads[j].value; - cols.s2.populate(blu, shard, event.channel, w_i_minus_16, s0, w_i_minus_7, s1); + cols.s2.populate(blu, shard, w_i_minus_16, s0, w_i_minus_7, s1); - cols.w_i.populate(event.channel, event.w_i_writes[j], blu); + cols.w_i.populate(event.w_i_writes[j], blu); if rows.as_ref().is_some() { rows.as_mut().unwrap().push(row); diff --git a/crates/core/machine/src/syscall/precompiles/uint256/air.rs b/crates/core/machine/src/syscall/precompiles/uint256/air.rs index 3cc4f803b1..80cd98a52c 100644 --- a/crates/core/machine/src/syscall/precompiles/uint256/air.rs +++ b/crates/core/machine/src/syscall/precompiles/uint256/air.rs @@ -18,7 +18,7 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ - events::{ByteRecord, FieldOperation}, + events::{ByteRecord, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -28,7 +28,7 @@ use sp1_curves::{ }; use sp1_derive::AlignedBorrow; use sp1_stark::{ - air::{BaseAirBuilder, MachineAir, Polynomial, SP1AirBuilder}, + air::{BaseAirBuilder, InteractionScope, MachineAir, Polynomial, SP1AirBuilder}, MachineRecord, }; use std::{ @@ -59,9 +59,6 @@ pub struct Uint256MulCols { /// The shard number of the syscall. pub shard: T, - /// The byte lookup channel. - pub channel: T, - /// The clock cycle of the syscall. pub clk: T, @@ -110,7 +107,7 @@ impl MachineAir for Uint256MulChip { ) -> RowMajorMatrix { // Generate the trace rows & corresponding records for each chunk of events concurrently. let rows_and_records = input - .uint256_mul_events + .get_precompile_events(SyscallCode::UINT256_MUL) .chunks(1) .map(|events| { let mut records = ExecutionRecord::default(); @@ -119,6 +116,11 @@ impl MachineAir for Uint256MulChip { let rows = events .iter() .map(|event| { + let event = if let PrecompileEvent::Uint256Mul(event) = event { + event + } else { + unreachable!() + }; let mut row: [F; NUM_COLS] = [F::zero(); NUM_COLS]; let cols: &mut Uint256MulCols = row.as_mut_slice().borrow_mut(); @@ -131,25 +133,17 @@ impl MachineAir for Uint256MulChip { // Assign basic values to the columns. cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.x_ptr = F::from_canonical_u32(event.x_ptr); cols.y_ptr = F::from_canonical_u32(event.y_ptr); // Populate memory columns. for i in 0..WORDS_FIELD_ELEMENT { - cols.x_memory[i].populate( - event.channel, - event.x_memory_records[i], - &mut new_byte_lookup_events, - ); - cols.y_memory[i].populate( - event.channel, - event.y_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.x_memory[i] + .populate(event.x_memory_records[i], &mut new_byte_lookup_events); + cols.y_memory[i] + .populate(event.y_memory_records[i], &mut new_byte_lookup_events); cols.modulus_memory[i].populate( - event.channel, event.modulus_memory_records[i], &mut new_byte_lookup_events, ); @@ -165,7 +159,6 @@ impl MachineAir for Uint256MulChip { let result = cols.output.populate_with_modulus( &mut new_byte_lookup_events, event.shard, - event.channel, &x, &y, &effective_modulus, @@ -178,7 +171,6 @@ impl MachineAir for Uint256MulChip { cols.output_range_check.populate( &mut new_byte_lookup_events, event.shard, - event.channel, &result, &effective_modulus, ); @@ -207,7 +199,7 @@ impl MachineAir for Uint256MulChip { let x = BigUint::zero(); let y = BigUint::zero(); - cols.output.populate(&mut vec![], 0, 0, &x, &y, FieldOperation::Mul); + cols.output.populate(&mut vec![], 0, &x, &y, FieldOperation::Mul); row }, @@ -229,7 +221,7 @@ impl MachineAir for Uint256MulChip { } fn included(&self, shard: &Self::Record) -> bool { - !shard.uint256_mul_events.is_empty() + !shard.get_precompile_events(SyscallCode::UINT256_MUL).is_empty() } } @@ -291,8 +283,6 @@ where &y_limbs, &p_modulus, FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); @@ -302,8 +292,6 @@ where builder, &local.output.result, &modulus_limbs, - local.shard, - local.channel, local.modulus_is_not_zero, ); builder.assert_eq( @@ -319,7 +307,6 @@ where // Read and write x. builder.eval_memory_access_slice( local.shard, - local.channel, local.clk.into() + AB::Expr::one(), local.x_ptr, &local.x_memory, @@ -330,7 +317,6 @@ where // we read it contiguously from the y_ptr memory location. builder.eval_memory_access_slice( local.shard, - local.channel, local.clk.into(), local.y_ptr, &[local.y_memory, local.modulus_memory].concat(), @@ -340,13 +326,13 @@ where // Receive the arguments. builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, AB::F::from_canonical_u32(SyscallCode::UINT256_MUL.syscall_id()), local.x_ptr, local.y_ptr, local.is_real, + InteractionScope::Global, ); // Assert that is_real is a boolean. diff --git a/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_add.rs b/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_add.rs index 26a0f87f93..e2d0c5e36f 100644 --- a/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_add.rs +++ b/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_add.rs @@ -11,7 +11,7 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, FieldOperation}, + events::{ByteLookupEvent, ByteRecord, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -21,7 +21,7 @@ use sp1_curves::{ AffinePoint, CurveType, EllipticCurve, }; use sp1_derive::AlignedBorrow; -use sp1_stark::air::{MachineAir, SP1AirBuilder}; +use sp1_stark::air::{InteractionScope, MachineAir, SP1AirBuilder}; use typenum::Unsigned; use crate::{ @@ -43,7 +43,6 @@ pub const fn num_weierstrass_add_cols() -> usize pub struct WeierstrassAddAssignCols { pub is_real: T, pub shard: T, - pub channel: T, pub nonce: T, pub clk: T, pub p_ptr: T, @@ -75,7 +74,6 @@ impl WeierstrassAddAssignChip { fn populate_field_ops( blu_events: &mut Vec, shard: u32, - channel: u8, cols: &mut WeierstrassAddAssignCols, p_x: BigUint, p_y: BigUint, @@ -87,28 +85,15 @@ impl WeierstrassAddAssignChip { // slope = (q.y - p.y) / (q.x - p.x). let slope = { - let slope_numerator = cols.slope_numerator.populate( - blu_events, - shard, - channel, - &q_y, - &p_y, - FieldOperation::Sub, - ); + let slope_numerator = + cols.slope_numerator.populate(blu_events, shard, &q_y, &p_y, FieldOperation::Sub); - let slope_denominator = cols.slope_denominator.populate( - blu_events, - shard, - channel, - &q_x, - &p_x, - FieldOperation::Sub, - ); + let slope_denominator = + cols.slope_denominator.populate(blu_events, shard, &q_x, &p_x, FieldOperation::Sub); cols.slope.populate( blu_events, shard, - channel, &slope_numerator, &slope_denominator, FieldOperation::Div, @@ -117,26 +102,13 @@ impl WeierstrassAddAssignChip { // x = slope * slope - (p.x + q.x). let x = { - let slope_squared = cols.slope_squared.populate( - blu_events, - shard, - channel, - &slope, - &slope, - FieldOperation::Mul, - ); - let p_x_plus_q_x = cols.p_x_plus_q_x.populate( - blu_events, - shard, - channel, - &p_x, - &q_x, - FieldOperation::Add, - ); + let slope_squared = + cols.slope_squared.populate(blu_events, shard, &slope, &slope, FieldOperation::Mul); + let p_x_plus_q_x = + cols.p_x_plus_q_x.populate(blu_events, shard, &p_x, &q_x, FieldOperation::Add); cols.x3_ins.populate( blu_events, shard, - channel, &slope_squared, &p_x_plus_q_x, FieldOperation::Sub, @@ -145,18 +117,11 @@ impl WeierstrassAddAssignChip { // y = slope * (p.x - x_3n) - p.y. { - let p_x_minus_x = cols.p_x_minus_x.populate( - blu_events, - shard, - channel, - &p_x, - &x, - FieldOperation::Sub, - ); + let p_x_minus_x = + cols.p_x_minus_x.populate(blu_events, shard, &p_x, &x, FieldOperation::Sub); let slope_times_p_x_minus_x = cols.slope_times_p_x_minus_x.populate( blu_events, shard, - channel, &slope, &p_x_minus_x, FieldOperation::Mul, @@ -164,7 +129,6 @@ impl WeierstrassAddAssignChip { cols.y3_ins.populate( blu_events, shard, - channel, &slope_times_p_x_minus_x, &p_y, FieldOperation::Sub, @@ -194,9 +158,9 @@ impl MachineAir output: &mut ExecutionRecord, ) -> RowMajorMatrix { let events = match E::CURVE_TYPE { - CurveType::Secp256k1 => &input.secp256k1_add_events, - CurveType::Bn254 => &input.bn254_add_events, - CurveType::Bls12381 => &input.bls12381_add_events, + CurveType::Secp256k1 => input.get_precompile_events(SyscallCode::SECP256K1_ADD), + CurveType::Bn254 => input.get_precompile_events(SyscallCode::BN254_ADD), + CurveType::Bls12381 => input.get_precompile_events(SyscallCode::BLS12381_ADD), _ => panic!("Unsupported curve"), }; @@ -204,8 +168,13 @@ impl MachineAir let mut new_byte_lookup_events = Vec::new(); - for i in 0..events.len() { - let event = &events[i]; + for event in events.iter() { + let event = match (E::CURVE_TYPE, event) { + (CurveType::Secp256k1, PrecompileEvent::Secp256k1Add(event)) => event, + (CurveType::Bn254, PrecompileEvent::Bn254Add(event)) => event, + (CurveType::Bls12381, PrecompileEvent::Bls12381Add(event)) => event, + _ => panic!("Unsupported curve"), + }; let mut row = vec![F::zero(); num_weierstrass_add_cols::()]; let cols: &mut WeierstrassAddAssignCols = row.as_mut_slice().borrow_mut(); @@ -221,7 +190,6 @@ impl MachineAir // Populate basic columns. cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.p_ptr = F::from_canonical_u32(event.p_ptr); cols.q_ptr = F::from_canonical_u32(event.q_ptr); @@ -229,7 +197,6 @@ impl MachineAir Self::populate_field_ops( &mut new_byte_lookup_events, event.shard, - event.channel, cols, p_x, p_y, @@ -239,18 +206,10 @@ impl MachineAir // Populate the memory access columns. for i in 0..cols.q_access.len() { - cols.q_access[i].populate( - event.channel, - event.q_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.q_access[i].populate(event.q_memory_records[i], &mut new_byte_lookup_events); } for i in 0..cols.p_access.len() { - cols.p_access[i].populate( - event.channel, - event.p_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.p_access[i].populate(event.p_memory_records[i], &mut new_byte_lookup_events); } rows.push(row); @@ -267,7 +226,6 @@ impl MachineAir Self::populate_field_ops( &mut vec![], 0, - 0, cols, zero.clone(), zero.clone(), @@ -299,9 +257,13 @@ impl MachineAir fn included(&self, shard: &Self::Record) -> bool { match E::CURVE_TYPE { - CurveType::Secp256k1 => !shard.secp256k1_add_events.is_empty(), - CurveType::Bn254 => !shard.bn254_add_events.is_empty(), - CurveType::Bls12381 => !shard.bls12381_add_events.is_empty(), + CurveType::Secp256k1 => { + !shard.get_precompile_events(SyscallCode::SECP256K1_ADD).is_empty() + } + CurveType::Bn254 => !shard.get_precompile_events(SyscallCode::BN254_ADD).is_empty(), + CurveType::Bls12381 => { + !shard.get_precompile_events(SyscallCode::BLS12381_ADD).is_empty() + } _ => panic!("Unsupported curve"), } } @@ -339,33 +301,15 @@ where // slope = (q.y - p.y) / (q.x - p.x). let slope = { - local.slope_numerator.eval( - builder, - &q_y, - &p_y, - FieldOperation::Sub, - local.shard, - local.channel, - local.is_real, - ); + local.slope_numerator.eval(builder, &q_y, &p_y, FieldOperation::Sub, local.is_real); - local.slope_denominator.eval( - builder, - &q_x, - &p_x, - FieldOperation::Sub, - local.shard, - local.channel, - local.is_real, - ); + local.slope_denominator.eval(builder, &q_x, &p_x, FieldOperation::Sub, local.is_real); local.slope.eval( builder, &local.slope_numerator.result, &local.slope_denominator.result, FieldOperation::Div, - local.shard, - local.channel, local.is_real, ); @@ -374,33 +318,15 @@ where // x = slope * slope - self.x - other.x. let x = { - local.slope_squared.eval( - builder, - slope, - slope, - FieldOperation::Mul, - local.shard, - local.channel, - local.is_real, - ); + local.slope_squared.eval(builder, slope, slope, FieldOperation::Mul, local.is_real); - local.p_x_plus_q_x.eval( - builder, - &p_x, - &q_x, - FieldOperation::Add, - local.shard, - local.channel, - local.is_real, - ); + local.p_x_plus_q_x.eval(builder, &p_x, &q_x, FieldOperation::Add, local.is_real); local.x3_ins.eval( builder, &local.slope_squared.result, &local.p_x_plus_q_x.result, FieldOperation::Sub, - local.shard, - local.channel, local.is_real, ); @@ -409,23 +335,13 @@ where // y = slope * (p.x - x_3n) - q.y. { - local.p_x_minus_x.eval( - builder, - &p_x, - x, - FieldOperation::Sub, - local.shard, - local.channel, - local.is_real, - ); + local.p_x_minus_x.eval(builder, &p_x, x, FieldOperation::Sub, local.is_real); local.slope_times_p_x_minus_x.eval( builder, slope, &local.p_x_minus_x.result, FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); @@ -434,8 +350,6 @@ where &local.slope_times_p_x_minus_x.result, &p_y, FieldOperation::Sub, - local.shard, - local.channel, local.is_real, ); } @@ -454,7 +368,6 @@ where builder.eval_memory_access_slice( local.shard, - local.channel, local.clk.into(), local.q_ptr, &local.q_access, @@ -462,7 +375,6 @@ where ); builder.eval_memory_access_slice( local.shard, - local.channel, local.clk + AB::F::from_canonical_u32(1), /* We read p at +1 since p, q could be the * same. */ local.p_ptr, @@ -484,13 +396,13 @@ where builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, syscall_id_felt, local.p_ptr, local.q_ptr, local.is_real, + InteractionScope::Global, ); } } diff --git a/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs b/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs index 1ab3e1e97f..2ab3c70de4 100644 --- a/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs +++ b/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_decompress.rs @@ -11,7 +11,7 @@ use p3_air::{Air, AirBuilder, BaseAir}; use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_executor::{ - events::{ByteRecord, FieldOperation}, + events::{ByteRecord, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -21,7 +21,7 @@ use sp1_curves::{ CurveType, EllipticCurve, }; use sp1_derive::AlignedBorrow; -use sp1_stark::air::{BaseAirBuilder, MachineAir, SP1AirBuilder}; +use sp1_stark::air::{BaseAirBuilder, InteractionScope, MachineAir, SP1AirBuilder}; use std::marker::PhantomData; use typenum::Unsigned; @@ -42,7 +42,6 @@ pub const fn num_weierstrass_decompress_cols() -> pub struct WeierstrassDecompressCols { pub is_real: T, pub shard: T, - pub channel: T, pub clk: T, pub nonce: T, pub ptr: T, @@ -105,28 +104,25 @@ impl WeierstrassDecompressChip { fn populate_field_ops( record: &mut impl ByteRecord, shard: u32, - channel: u8, cols: &mut WeierstrassDecompressCols, x: BigUint, ) { // Y = sqrt(x^3 + b) - cols.range_x.populate(record, shard, channel, &x, &E::BaseField::modulus()); - let x_2 = - cols.x_2.populate(record, shard, channel, &x.clone(), &x.clone(), FieldOperation::Mul); - let x_3 = cols.x_3.populate(record, shard, channel, &x_2, &x, FieldOperation::Mul); + cols.range_x.populate(record, shard, &x, &E::BaseField::modulus()); + let x_2 = cols.x_2.populate(record, shard, &x.clone(), &x.clone(), FieldOperation::Mul); + let x_3 = cols.x_3.populate(record, shard, &x_2, &x, FieldOperation::Mul); let b = E::b_int(); - let x_3_plus_b = - cols.x_3_plus_b.populate(record, shard, channel, &x_3, &b, FieldOperation::Add); + let x_3_plus_b = cols.x_3_plus_b.populate(record, shard, &x_3, &b, FieldOperation::Add); let sqrt_fn = match E::CURVE_TYPE { CurveType::Secp256k1 => secp256k1_sqrt, CurveType::Bls12381 => bls12381_sqrt, _ => panic!("Unsupported curve"), }; - let y = cols.y.populate(record, shard, channel, &x_3_plus_b, sqrt_fn); + let y = cols.y.populate(record, shard, &x_3_plus_b, sqrt_fn); let zero = BigUint::zero(); - cols.neg_y.populate(record, shard, channel, &zero, &y, FieldOperation::Sub); + cols.neg_y.populate(record, shard, &zero, &y, FieldOperation::Sub); } } @@ -150,8 +146,8 @@ impl MachineAir output: &mut ExecutionRecord, ) -> RowMajorMatrix { let events = match E::CURVE_TYPE { - CurveType::Secp256k1 => &input.k256_decompress_events, - CurveType::Bls12381 => &input.bls12381_decompress_events, + CurveType::Secp256k1 => input.get_precompile_events(SyscallCode::SECP256K1_DECOMPRESS), + CurveType::Bls12381 => input.get_precompile_events(SyscallCode::BLS12381_DECOMPRESS), _ => panic!("Unsupported curve"), }; @@ -163,42 +159,32 @@ impl MachineAir let modulus = E::BaseField::modulus(); - for i in 0..events.len() { - let event = events[i].clone(); + for event in events { + let event = match (E::CURVE_TYPE, event) { + (CurveType::Secp256k1, PrecompileEvent::Secp256k1Decompress(event)) => event, + (CurveType::Bls12381, PrecompileEvent::Bls12381Decompress(event)) => event, + _ => panic!("Unsupported curve"), + }; + let mut row = vec![F::zero(); width]; let cols: &mut WeierstrassDecompressCols = row[0..weierstrass_width].borrow_mut(); cols.is_real = F::from_bool(true); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.ptr = F::from_canonical_u32(event.ptr); cols.sign_bit = F::from_bool(event.sign_bit); let x = BigUint::from_bytes_le(&event.x_bytes); - Self::populate_field_ops( - &mut new_byte_lookup_events, - event.shard, - event.channel, - cols, - x, - ); + Self::populate_field_ops(&mut new_byte_lookup_events, event.shard, cols, x); for i in 0..cols.x_access.len() { - cols.x_access[i].populate( - event.channel, - event.x_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.x_access[i].populate(event.x_memory_records[i], &mut new_byte_lookup_events); } for i in 0..cols.y_access.len() { - cols.y_access[i].populate_write( - event.channel, - event.y_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.y_access[i] + .populate_write(event.y_memory_records[i], &mut new_byte_lookup_events); } if matches!(self.sign_rule, SignChoiceRule::Lexicographic) { @@ -217,7 +203,6 @@ impl MachineAir choice_cols.neg_y_range_check.populate( &mut new_byte_lookup_events, event.shard, - event.channel, &neg_y, &modulus, ); @@ -225,7 +210,6 @@ impl MachineAir choice_cols.neg_y_range_check.populate( &mut new_byte_lookup_events, event.shard, - event.channel, &decompressed_y, &modulus, ); @@ -237,7 +221,6 @@ impl MachineAir choice_cols.comparison_lt_cols.populate( &mut new_byte_lookup_events, event.shard, - event.channel, &neg_y, &decompressed_y, ); @@ -248,7 +231,6 @@ impl MachineAir choice_cols.comparison_lt_cols.populate( &mut new_byte_lookup_events, event.shard, - event.channel, &decompressed_y, &neg_y, ); @@ -274,7 +256,7 @@ impl MachineAir cols.x_access[i].access.value = words[i].into(); } - Self::populate_field_ops(&mut vec![], 0, 0, cols, dummy_value); + Self::populate_field_ops(&mut vec![], 0, cols, dummy_value); row }, input.fixed_log2_rows::(self), @@ -294,8 +276,12 @@ impl MachineAir fn included(&self, shard: &Self::Record) -> bool { match E::CURVE_TYPE { - CurveType::Secp256k1 => !shard.k256_decompress_events.is_empty(), - CurveType::Bls12381 => !shard.bls12381_decompress_events.is_empty(), + CurveType::Secp256k1 => { + !shard.get_precompile_events(SyscallCode::SECP256K1_DECOMPRESS).is_empty() + } + CurveType::Bls12381 => { + !shard.get_precompile_events(SyscallCode::BLS12381_DECOMPRESS).is_empty() + } _ => panic!("Unsupported curve"), } } @@ -345,28 +331,10 @@ where builder, &x, &limbs_from_vec::::Limbs, AB::F>(max_num_limbs), - local.shard, - local.channel, - local.is_real, - ); - local.x_2.eval( - builder, - &x, - &x, - FieldOperation::Mul, - local.shard, - local.channel, - local.is_real, - ); - local.x_3.eval( - builder, - &local.x_2.result, - &x, - FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); + local.x_2.eval(builder, &x, &x, FieldOperation::Mul, local.is_real); + local.x_3.eval(builder, &local.x_2.result, &x, FieldOperation::Mul, local.is_real); let b = E::b_int(); let b_const = E::BaseField::to_limbs_field::(&b); local.x_3_plus_b.eval( @@ -374,8 +342,6 @@ where &local.x_3.result, &b_const, FieldOperation::Add, - local.shard, - local.channel, local.is_real, ); @@ -384,19 +350,10 @@ where &[AB::Expr::zero()].iter(), &local.y.multiplication.result, FieldOperation::Sub, - local.shard, - local.channel, local.is_real, ); - local.y.eval( - builder, - &local.x_3_plus_b.result, - local.y.lsb, - local.shard, - local.channel, - local.is_real, - ); + local.y.eval(builder, &local.x_3_plus_b.result, local.y.lsb, local.is_real); let y_limbs: Limbs::Limbs> = limbs_from_access(&local.y_access); @@ -442,8 +399,6 @@ where builder, &local.neg_y.result, &modulus_limbs, - local.shard, - local.channel, local.is_real, ); @@ -498,8 +453,6 @@ where builder, &local.y.multiplication.result, &local.neg_y.result, - local.shard, - local.channel, choice_cols.when_sqrt_y_res_is_lt, ); @@ -507,8 +460,6 @@ where builder, &local.neg_y.result, &local.y.multiplication.result, - local.shard, - local.channel, choice_cols.when_neg_y_res_is_lt, ); } @@ -517,7 +468,6 @@ where for i in 0..num_words_field_element { builder.eval_memory_access( local.shard, - local.channel, local.clk, local.ptr.into() + AB::F::from_canonical_u32((i as u32) * 4 + num_limbs as u32), &local.x_access[i], @@ -527,7 +477,6 @@ where for i in 0..num_words_field_element { builder.eval_memory_access( local.shard, - local.channel, local.clk, local.ptr.into() + AB::F::from_canonical_u32((i as u32) * 4), &local.y_access[i], @@ -547,13 +496,13 @@ where builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, syscall_id, local.ptr, local.sign_bit, local.is_real, + InteractionScope::Global, ); } } diff --git a/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_double.rs b/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_double.rs index 616adfe326..0914962860 100644 --- a/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_double.rs +++ b/crates/core/machine/src/syscall/precompiles/weierstrass/weierstrass_double.rs @@ -12,7 +12,7 @@ use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use p3_maybe_rayon::prelude::{ParallelIterator, ParallelSlice}; use sp1_core_executor::{ - events::{ByteLookupEvent, ByteRecord, FieldOperation}, + events::{ByteLookupEvent, ByteRecord, FieldOperation, PrecompileEvent}, syscalls::SyscallCode, ExecutionRecord, Program, }; @@ -22,10 +22,7 @@ use sp1_curves::{ AffinePoint, CurveType, EllipticCurve, }; use sp1_derive::AlignedBorrow; -use sp1_stark::{ - air::{MachineAir, SP1AirBuilder}, - MachineRecord, -}; +use sp1_stark::air::{InteractionScope, MachineAir, SP1AirBuilder}; use crate::{ memory::{MemoryCols, MemoryWriteCols}, @@ -46,7 +43,6 @@ pub const fn num_weierstrass_double_cols() -> usi pub struct WeierstrassDoubleAssignCols { pub is_real: T, pub shard: T, - pub channel: T, pub nonce: T, pub clk: T, pub p_ptr: T, @@ -77,7 +73,6 @@ impl WeierstrassDoubleAssignChip { fn populate_field_ops( blu_events: &mut Vec, shard: u32, - channel: u8, cols: &mut WeierstrassDoubleAssignCols, p_x: BigUint, p_y: BigUint, @@ -90,18 +85,11 @@ impl WeierstrassDoubleAssignChip { let slope = { // slope_numerator = a + (p.x * p.x) * 3. let slope_numerator = { - let p_x_squared = cols.p_x_squared.populate( - blu_events, - shard, - channel, - &p_x, - &p_x, - FieldOperation::Mul, - ); + let p_x_squared = + cols.p_x_squared.populate(blu_events, shard, &p_x, &p_x, FieldOperation::Mul); let p_x_squared_times_3 = cols.p_x_squared_times_3.populate( blu_events, shard, - channel, &p_x_squared, &BigUint::from(3u32), FieldOperation::Mul, @@ -109,7 +97,6 @@ impl WeierstrassDoubleAssignChip { cols.slope_numerator.populate( blu_events, shard, - channel, &a, &p_x_squared_times_3, FieldOperation::Add, @@ -120,7 +107,6 @@ impl WeierstrassDoubleAssignChip { let slope_denominator = cols.slope_denominator.populate( blu_events, shard, - channel, &BigUint::from(2u32), &p_y, FieldOperation::Mul, @@ -129,7 +115,6 @@ impl WeierstrassDoubleAssignChip { cols.slope.populate( blu_events, shard, - channel, &slope_numerator, &slope_denominator, FieldOperation::Div, @@ -138,26 +123,13 @@ impl WeierstrassDoubleAssignChip { // x = slope * slope - (p.x + p.x). let x = { - let slope_squared = cols.slope_squared.populate( - blu_events, - shard, - channel, - &slope, - &slope, - FieldOperation::Mul, - ); - let p_x_plus_p_x = cols.p_x_plus_p_x.populate( - blu_events, - shard, - channel, - &p_x, - &p_x, - FieldOperation::Add, - ); + let slope_squared = + cols.slope_squared.populate(blu_events, shard, &slope, &slope, FieldOperation::Mul); + let p_x_plus_p_x = + cols.p_x_plus_p_x.populate(blu_events, shard, &p_x, &p_x, FieldOperation::Add); cols.x3_ins.populate( blu_events, shard, - channel, &slope_squared, &p_x_plus_p_x, FieldOperation::Sub, @@ -166,18 +138,11 @@ impl WeierstrassDoubleAssignChip { // y = slope * (p.x - x) - p.y. { - let p_x_minus_x = cols.p_x_minus_x.populate( - blu_events, - shard, - channel, - &p_x, - &x, - FieldOperation::Sub, - ); + let p_x_minus_x = + cols.p_x_minus_x.populate(blu_events, shard, &p_x, &x, FieldOperation::Sub); let slope_times_p_x_minus_x = cols.slope_times_p_x_minus_x.populate( blu_events, shard, - channel, &slope, &p_x_minus_x, FieldOperation::Mul, @@ -185,7 +150,6 @@ impl WeierstrassDoubleAssignChip { cols.y3_ins.populate( blu_events, shard, - channel, &slope_times_p_x_minus_x, &p_y, FieldOperation::Sub, @@ -216,24 +180,32 @@ impl MachineAir ) -> RowMajorMatrix { // collects the events based on the curve type. let events = match E::CURVE_TYPE { - CurveType::Secp256k1 => &input.secp256k1_double_events, - CurveType::Bn254 => &input.bn254_double_events, - CurveType::Bls12381 => &input.bls12381_double_events, + CurveType::Secp256k1 => input.get_precompile_events(SyscallCode::SECP256K1_DOUBLE), + CurveType::Bn254 => input.get_precompile_events(SyscallCode::BN254_DOUBLE), + CurveType::Bls12381 => input.get_precompile_events(SyscallCode::BLS12381_DOUBLE), _ => panic!("Unsupported curve"), }; let chunk_size = std::cmp::max(events.len() / num_cpus::get(), 1); // Generate the trace rows & corresponding records for each chunk of events in parallel. - let rows_and_records = events + let rows_and_blus = events .par_chunks(chunk_size) .map(|events| { - let mut record = ExecutionRecord::default(); let mut new_byte_lookup_events = Vec::new(); let rows = events .iter() .map(|event| { + let event = match (E::CURVE_TYPE, event) { + (CurveType::Secp256k1, PrecompileEvent::Secp256k1Double(event)) => { + event + } + (CurveType::Bn254, PrecompileEvent::Bn254Double(event)) => event, + (CurveType::Bls12381, PrecompileEvent::Bls12381Double(event)) => event, + _ => panic!("Unsupported curve"), + }; + let mut row = vec![F::zero(); num_weierstrass_double_cols::()]; let cols: &mut WeierstrassDoubleAssignCols = @@ -247,14 +219,12 @@ impl MachineAir // Populate basic columns. cols.is_real = F::one(); cols.shard = F::from_canonical_u32(event.shard); - cols.channel = F::from_canonical_u8(event.channel); cols.clk = F::from_canonical_u32(event.clk); cols.p_ptr = F::from_canonical_u32(event.p_ptr); Self::populate_field_ops( &mut new_byte_lookup_events, event.shard, - event.channel, cols, p_x, p_y, @@ -262,25 +232,22 @@ impl MachineAir // Populate the memory access columns. for i in 0..cols.p_access.len() { - cols.p_access[i].populate( - event.channel, - event.p_memory_records[i], - &mut new_byte_lookup_events, - ); + cols.p_access[i] + .populate(event.p_memory_records[i], &mut new_byte_lookup_events); } row }) .collect::>(); - record.add_byte_lookup_events(new_byte_lookup_events); - (rows, record) + (rows, new_byte_lookup_events) }) .collect::>(); // Generate the trace rows for each event. let mut rows = Vec::new(); - for mut row_and_record in rows_and_records { - rows.extend(row_and_record.0); - output.append(&mut row_and_record.1); + for (chunk_rows, chunk_blus) in rows_and_blus { + rows.extend(chunk_rows); + + output.add_byte_lookup_events(chunk_blus); } pad_rows_fixed( @@ -290,7 +257,7 @@ impl MachineAir let cols: &mut WeierstrassDoubleAssignCols = row.as_mut_slice().borrow_mut(); let zero = BigUint::zero(); - Self::populate_field_ops(&mut vec![], 0, 0, cols, zero.clone(), zero.clone()); + Self::populate_field_ops(&mut vec![], 0, cols, zero.clone(), zero.clone()); row }, input.fixed_log2_rows::(self), @@ -316,9 +283,13 @@ impl MachineAir fn included(&self, shard: &Self::Record) -> bool { match E::CURVE_TYPE { - CurveType::Secp256k1 => !shard.secp256k1_double_events.is_empty(), - CurveType::Bn254 => !shard.bn254_double_events.is_empty(), - CurveType::Bls12381 => !shard.bls12381_double_events.is_empty(), + CurveType::Secp256k1 => { + !shard.get_precompile_events(SyscallCode::SECP256K1_DOUBLE).is_empty() + } + CurveType::Bn254 => !shard.get_precompile_events(SyscallCode::BN254_DOUBLE).is_empty(), + CurveType::Bls12381 => { + !shard.get_precompile_events(SyscallCode::BLS12381_DOUBLE).is_empty() + } _ => panic!("Unsupported curve"), } } @@ -357,23 +328,13 @@ where let slope = { // slope_numerator = a + (p.x * p.x) * 3. { - local.p_x_squared.eval( - builder, - &p_x, - &p_x, - FieldOperation::Mul, - local.shard, - local.channel, - local.is_real, - ); + local.p_x_squared.eval(builder, &p_x, &p_x, FieldOperation::Mul, local.is_real); local.p_x_squared_times_3.eval( builder, &local.p_x_squared.result, &E::BaseField::to_limbs_field::(&BigUint::from(3u32)), FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); @@ -382,8 +343,6 @@ where &a, &local.p_x_squared_times_3.result, FieldOperation::Add, - local.shard, - local.channel, local.is_real, ); }; @@ -394,8 +353,6 @@ where &E::BaseField::to_limbs_field::(&BigUint::from(2u32)), &p_y, FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); @@ -404,8 +361,6 @@ where &local.slope_numerator.result, &local.slope_denominator.result, FieldOperation::Div, - local.shard, - local.channel, local.is_real, ); @@ -414,31 +369,13 @@ where // x = slope * slope - (p.x + p.x). let x = { - local.slope_squared.eval( - builder, - slope, - slope, - FieldOperation::Mul, - local.shard, - local.channel, - local.is_real, - ); - local.p_x_plus_p_x.eval( - builder, - &p_x, - &p_x, - FieldOperation::Add, - local.shard, - local.channel, - local.is_real, - ); + local.slope_squared.eval(builder, slope, slope, FieldOperation::Mul, local.is_real); + local.p_x_plus_p_x.eval(builder, &p_x, &p_x, FieldOperation::Add, local.is_real); local.x3_ins.eval( builder, &local.slope_squared.result, &local.p_x_plus_p_x.result, FieldOperation::Sub, - local.shard, - local.channel, local.is_real, ); &local.x3_ins.result @@ -446,22 +383,12 @@ where // y = slope * (p.x - x) - p.y. { - local.p_x_minus_x.eval( - builder, - &p_x, - x, - FieldOperation::Sub, - local.shard, - local.channel, - local.is_real, - ); + local.p_x_minus_x.eval(builder, &p_x, x, FieldOperation::Sub, local.is_real); local.slope_times_p_x_minus_x.eval( builder, slope, &local.p_x_minus_x.result, FieldOperation::Mul, - local.shard, - local.channel, local.is_real, ); local.y3_ins.eval( @@ -469,8 +396,6 @@ where &local.slope_times_p_x_minus_x.result, &p_y, FieldOperation::Sub, - local.shard, - local.channel, local.is_real, ); } @@ -489,7 +414,6 @@ where builder.eval_memory_access_slice( local.shard, - local.channel, local.clk.into(), local.p_ptr, &local.p_access, @@ -510,13 +434,13 @@ where builder.receive_syscall( local.shard, - local.channel, local.clk, local.nonce, syscall_id_felt, local.p_ptr, AB::Expr::zero(), local.is_real, + InteractionScope::Global, ); } } diff --git a/crates/core/machine/src/utils/prove.rs b/crates/core/machine/src/utils/prove.rs index 55452e5675..3a81bd946d 100644 --- a/crates/core/machine/src/utils/prove.rs +++ b/crates/core/machine/src/utils/prove.rs @@ -9,19 +9,21 @@ use std::{ use web_time::Instant; use crate::riscv::{CoreShapeConfig, RiscvAir}; -use p3_challenger::CanObserve; +use p3_challenger::{CanObserve, FieldChallenger}; use p3_field::AbstractField; use p3_maybe_rayon::prelude::*; use serde::{de::DeserializeOwned, Serialize}; use size::Size; use sp1_stark::{ - baby_bear_poseidon2::BabyBearPoseidon2, MachineProvingKey, MachineVerificationError, + air::InteractionScope, baby_bear_poseidon2::BabyBearPoseidon2, MachineProvingKey, + MachineVerificationError, }; use std::thread::ScopedJoinHandle; use thiserror::Error; use p3_baby_bear::BabyBear; use p3_field::PrimeField32; +use p3_matrix::Matrix; use crate::{ io::{SP1PublicValues, SP1Stdin}, @@ -212,9 +214,6 @@ where let span = tracing::Span::current().clone(); - #[cfg(feature = "debug")] - let all_records_tx = all_records_tx.clone(); - let handle = s.spawn(move || { let _span = span.enter(); tracing::debug_span!("phase 1 trace generation").in_scope(|| { @@ -228,11 +227,6 @@ where .in_scope(|| trace_checkpoint(program.clone(), &checkpoint, opts)); reset_seek(&mut checkpoint); - // Generate the dependencies. - tracing::debug_span!("generate dependencies").in_scope(|| { - prover.machine().generate_dependencies(&mut records, &opts) - }); - // Wait for our turn to update the state. record_gen_sync.wait_for_turn(index); @@ -287,9 +281,6 @@ where // Let another worker update the state. record_gen_sync.advance_turn(); - #[cfg(feature = "debug")] - all_records_tx.send(records.clone()).unwrap(); - // Fix the shape of the records. if let Some(shape_config) = shape_config { for record in records.iter_mut() { @@ -298,10 +289,15 @@ where } // Generate the traces. - let traces = records - .par_iter() - .map(|record| prover.generate_traces(record)) - .collect::>(); + let mut traces = vec![]; + tracing::debug_span!("generate traces", index).in_scope(|| { + traces = records + .par_iter() + .map(|record| { + prover.generate_traces(record, InteractionScope::Global) + }) + .collect::>(); + }); // Wait for our turn. trace_gen_sync.wait_for_turn(index); @@ -329,8 +325,6 @@ where p1_record_and_trace_gen_handles.push(handle); } drop(p1_records_and_traces_tx); - #[cfg(feature = "debug")] - drop(all_records_tx); // Create the challenger and observe the verifying key. let mut challenger = prover.config().challenger(); @@ -364,10 +358,24 @@ where .zip(traces.into_par_iter()) .map(|(record, traces)| { let _span = span.enter(); - let data = prover.commit(record, traces); - let main_commit = data.main_commit.clone(); + + for (name, trace) in traces.clone() { + let trace_width = trace.width(); + let trace_height = trace.height(); + tracing::debug!( + "Phase 1 area: {:<15} | Main Cols = {:<5} | Rows = {:<5} | Cells = {:<10}", + name, + trace_width, + trace_height, + trace_width * trace_height, + ); + + } + + let data = prover.commit(&record, traces); + let phase1_main_commit = data.main_commit.clone(); drop(data); - main_commit + phase1_main_commit }) .collect::>(); @@ -375,7 +383,7 @@ where for (commit, public_values) in commitments.into_iter().zip(public_values.into_iter()) { - prover.observe(&mut challenger, commit, &public_values); + prover.observe(&mut challenger, commit.clone(), &public_values); } }); } @@ -391,15 +399,26 @@ where p1_record_and_trace_gen_handles.into_iter().for_each(|handle| handle.join().unwrap()); // Wait until the phase 1 prover has completely finished. - let challenger = phase_1_prover_handle.join().unwrap(); + let mut challenger = phase_1_prover_handle.join().unwrap(); + + // Sample for the global permutation challenges. + // Obtain the challenges used for the global permutation argument. + let mut global_permutation_challenges: Vec = Vec::new(); + for _ in 0..2 { + global_permutation_challenges.push(challenger.sample_ext_element()); + } // Spawn the phase 2 record generator thread. let p2_record_gen_sync = Arc::new(TurnBasedSync::new()); let p2_trace_gen_sync = Arc::new(TurnBasedSync::new()); let (p2_records_and_traces_tx, p2_records_and_traces_rx) = - sync_channel::<(Vec, Vec>)>>)>( - opts.records_and_traces_channel_capacity, - ); + sync_channel::<( + Vec, + ( + Vec>)>>, + Vec>)>>, + ), + )>(opts.records_and_traces_channel_capacity); let p2_records_and_traces_tx = Arc::new(Mutex::new(p2_records_and_traces_tx)); let report_aggregate = Arc::new(Mutex::new(ExecutionReport::default())); @@ -418,6 +437,10 @@ where let program = program.clone(); let span = tracing::Span::current().clone(); + + #[cfg(feature = "debug")] + let all_records_tx = all_records_tx.clone(); + let handle = s.spawn(move || { let _span = span.enter(); tracing::debug_span!("phase 2 trace generation").in_scope(|| { @@ -431,11 +454,6 @@ where *report_aggregate.lock().unwrap() += report; reset_seek(&mut checkpoint); - // Generate the dependencies. - tracing::debug_span!("generate dependencies").in_scope(|| { - prover.machine().generate_dependencies(&mut records, &opts) - }); - // Wait for our turn to update the state. record_gen_sync.wait_for_turn(index); @@ -483,9 +501,17 @@ where } records.append(&mut deferred); + // Generate the dependencies. + tracing::debug_span!("generate dependencies", index).in_scope(|| { + prover.machine().generate_dependencies(&mut records, &opts, None); + }); + // Let another worker update the state. record_gen_sync.advance_turn(); + #[cfg(feature = "debug")] + all_records_tx.send(records.clone()).unwrap(); + // Fix the shape of the records. if let Some(shape_config) = shape_config { for record in records.iter_mut() { @@ -494,25 +520,45 @@ where } // Generate the traces. - let traces = records - .par_iter() - .map(|record| prover.generate_traces(record)) - .collect::>(); + let mut local_traces = Vec::new(); + tracing::debug_span!("generate local traces", index).in_scope(|| { + local_traces = records + .par_iter() + .map(|record| { + prover.generate_traces(record, InteractionScope::Local) + }) + .collect::>(); + }); + + let mut global_traces = Vec::new(); + tracing::debug_span!("generate global traces", index).in_scope(|| { + global_traces = records + .par_iter() + .map(|record| { + prover.generate_traces(record, InteractionScope::Global) + }) + .collect::>(); + }); trace_gen_sync.wait_for_turn(index); - // Send the records to the phase 1 prover. + // Send the records to the phase 2 prover. let chunked_records = chunk_vec(records, opts.shard_batch_size); - let chunked_traces = chunk_vec(traces, opts.shard_batch_size); - chunked_records.into_iter().zip(chunked_traces).for_each( - |(records, traces)| { + let chunked_global_traces = + chunk_vec(global_traces, opts.shard_batch_size); + let chunked_local_traces = + chunk_vec(local_traces, opts.shard_batch_size); + chunked_records + .into_iter() + .zip(chunked_global_traces.into_iter()) + .zip(chunked_local_traces.into_iter()) + .for_each(|((records, global_traces), local_traces)| { records_and_traces_tx .lock() .unwrap() - .send((records, traces)) + .send((records, (global_traces, local_traces))) .unwrap(); - }, - ); + }); trace_gen_sync.advance_turn(); } else { @@ -524,6 +570,8 @@ where p2_record_and_trace_gen_handles.push(handle); } drop(p2_records_and_traces_tx); + #[cfg(feature = "debug")] + drop(all_records_tx); // Spawn the phase 2 prover thread. let p2_prover_span = tracing::Span::current().clone(); @@ -536,10 +584,21 @@ where let span = tracing::Span::current().clone(); shard_proofs.par_extend( records.into_par_iter().zip(traces.into_par_iter()).map( - |(record, traces)| { + |(record, (global_traces, local_traces))| { let _span = span.enter(); - let data = prover.commit(record, traces); - prover.open(pk, data, &mut challenger.clone()).unwrap() + + let global_data = prover.commit(&record, global_traces); + let local_data = prover.commit(&record, local_traces); + + prover + .open( + pk, + Some(global_data), + local_data, + &mut challenger.clone(), + &global_permutation_challenges, + ) + .unwrap() }, ), ); diff --git a/crates/derive/src/lib.rs b/crates/derive/src/lib.rs index 1896c312ef..924be7d913 100644 --- a/crates/derive/src/lib.rs +++ b/crates/derive/src/lib.rs @@ -184,6 +184,13 @@ pub fn machine_air_derive(input: TokenStream) -> TokenStream { } }); + let commit_scope_arms = variants.iter().map(|(variant_name, field)| { + let field_ty = &field.ty; + quote! { + #name::#variant_name(x) => <#field_ty as sp1_stark::air::MachineAir>::commit_scope(x) + } + }); + let machine_air = quote! { impl #impl_generics sp1_stark::air::MachineAir for #name #ty_generics #where_clause { type Record = #execution_record_path; @@ -236,6 +243,12 @@ pub fn machine_air_derive(input: TokenStream) -> TokenStream { #(#included_arms,)* } } + + fn commit_scope(&self) -> InteractionScope { + match self { + #(#commit_scope_arms,)* + } + } } }; diff --git a/crates/prover/src/lib.rs b/crates/prover/src/lib.rs index 21b06428a6..02e3dc812c 100644 --- a/crates/prover/src/lib.rs +++ b/crates/prover/src/lib.rs @@ -46,7 +46,7 @@ use sp1_core_machine::{ riscv::{CoreShapeConfig, RiscvAir}, utils::{concurrency::TurnBasedSync, SP1CoreProverError}, }; -use sp1_stark::MachineProvingKey; +use sp1_stark::{air::InteractionScope, MachineProvingKey}; use sp1_primitives::hash_deferred_proof; @@ -471,7 +471,7 @@ impl SP1Prover { assert_eq!(reconstruct_challenger.output_buffer.len(), 16); for proof in batch.iter() { - reconstruct_challenger.observe(proof.commitment.main_commit); + reconstruct_challenger.observe(proof.commitment.global_main_commit); reconstruct_challenger .observe_slice(&proof.public_values[0..self.core_prover.num_pv_elts()]); } @@ -574,7 +574,7 @@ impl SP1Prover { let mut leaf_challenger = self.core_prover.config().challenger(); vk.vk.observe_into(&mut leaf_challenger); shard_proofs.iter().for_each(|proof| { - leaf_challenger.observe(proof.commitment.main_commit); + leaf_challenger.observe(proof.commitment.global_main_commit); leaf_challenger.observe_slice(&proof.public_values[0..self.core_prover.num_pv_elts()]); }); @@ -691,15 +691,19 @@ impl SP1Prover { // Generate the dependencies. let mut records = vec![record]; tracing::debug_span!("generate dependencies").in_scope(|| { - self.compress_prover - .machine() - .generate_dependencies(&mut records, &opts.recursion_opts) + self.compress_prover.machine().generate_dependencies( + &mut records, + &opts.recursion_opts, + None, + ) }); // Generate the traces. let record = records.into_iter().next().unwrap(); - let traces = tracing::debug_span!("generate traces") - .in_scope(|| self.compress_prover.generate_traces(&record)); + let traces = tracing::debug_span!("generate traces").in_scope(|| { + self.compress_prover + .generate_traces(&record, InteractionScope::Local) + }); // Wait for our turn to update the state. record_and_trace_sync.wait_for_turn(index); @@ -758,20 +762,30 @@ impl SP1Prover { ); // Commit to the record and traces. - let data = tracing::debug_span!("commit") - .in_scope(|| self.compress_prover.commit(record, traces)); + let local_data = tracing::debug_span!("commit") + .in_scope(|| self.compress_prover.commit(&record, traces)); // Observe the commitment. - tracing::debug_span!("observe commitment").in_scope(|| { - challenger.observe(data.main_commit); + tracing::debug_span!("observe public values").in_scope(|| { challenger.observe_slice( - &data.public_values[0..self.compress_prover.num_pv_elts()], + &local_data.public_values[0..self.compress_prover.num_pv_elts()], ); }); // Generate the proof. let proof = tracing::debug_span!("open").in_scope(|| { - self.compress_prover.open(&pk, data, &mut challenger).unwrap() + self.compress_prover + .open( + &pk, + None, + local_data, + &mut challenger, + &[ + ::Challenge::zero(), + ::Challenge::zero(), + ], + ) + .unwrap() }); // Verify the proof. diff --git a/crates/prover/src/verify.rs b/crates/prover/src/verify.rs index d940977027..839d12cff1 100644 --- a/crates/prover/src/verify.rs +++ b/crates/prover/src/verify.rs @@ -201,13 +201,13 @@ impl SP1Prover { return Err(MachineVerificationError::InvalidPublicValues( "last_init_addr_bits != last_finalize_addr_bits_prev", )); - } else if !shard_proof.contains_memory_init() + } else if !shard_proof.contains_global_memory_init() && public_values.previous_init_addr_bits != public_values.last_init_addr_bits { return Err(MachineVerificationError::InvalidPublicValues( "previous_init_addr_bits != last_init_addr_bits", )); - } else if !shard_proof.contains_memory_finalize() + } else if !shard_proof.contains_global_memory_finalize() && public_values.previous_finalize_addr_bits != public_values.last_finalize_addr_bits { diff --git a/crates/recursion/circuit-v2/Cargo.toml b/crates/recursion/circuit-v2/Cargo.toml index bfe7afe9ac..4fb2e2dcf8 100644 --- a/crates/recursion/circuit-v2/Cargo.toml +++ b/crates/recursion/circuit-v2/Cargo.toml @@ -28,16 +28,11 @@ p3-baby-bear = { workspace = true } sp1-core-machine = { workspace = true } sp1-core-executor = { workspace = true } sp1-stark = { workspace = true } - -# todo: remove this dependency once everything is migrated. -sp1-recursion-program = { workspace = true } - sp1-recursion-core-v2 = { workspace = true } sp1-recursion-derive = { workspace = true } sp1-recursion-compiler = { workspace = true } sp1-primitives = { workspace = true } sp1-recursion-gnark-ffi = { workspace = true } -sp1-recursion-circuit = { workspace = true } itertools = "0.13.0" serde = { version = "1.0.204", features = ["derive"] } @@ -46,6 +41,7 @@ rand = "0.8.5" tracing = "0.1.40" hashbrown = { version = "0.14.5", features = ["serde", "inline-more"] } stacker = "0.1" +num-traits = "0.2.19" [dev-dependencies] sp1-core-executor = { workspace = true, features = ["programs"] } diff --git a/crates/recursion/circuit-v2/src/constraints.rs b/crates/recursion/circuit-v2/src/constraints.rs index 5f1b4aebbe..fa3c506764 100644 --- a/crates/recursion/circuit-v2/src/constraints.rs +++ b/crates/recursion/circuit-v2/src/constraints.rs @@ -101,7 +101,7 @@ where main: opening.main.view(), perm: perm_opening.view(), perm_challenges: permutation_challenges, - cumulative_sum: opening.cumulative_sum, + cumulative_sums: &[opening.global_cumulative_sum, opening.local_cumulative_sum], public_values, is_first_row: selectors.is_first_row, is_last_row: selectors.is_last_row, diff --git a/crates/recursion/circuit-v2/src/machine/compress.rs b/crates/recursion/circuit-v2/src/machine/compress.rs index 1f9079e040..e6bc7e0e14 100644 --- a/crates/recursion/circuit-v2/src/machine/compress.rs +++ b/crates/recursion/circuit-v2/src/machine/compress.rs @@ -14,7 +14,7 @@ use p3_commit::Mmcs; use p3_field::AbstractField; use p3_matrix::dense::RowMajorMatrix; -use sp1_recursion_compiler::ir::{Builder, Felt}; +use sp1_recursion_compiler::ir::{Builder, Ext, Felt}; use sp1_recursion_core_v2::{ air::{ChallengerPublicValues, RecursionPublicValues, RECURSIVE_PROOF_NUM_PV_ELTS}, @@ -128,7 +128,8 @@ where array::from_fn(|_| unsafe { MaybeUninit::zeroed().assume_init() }); let mut reconstruct_deferred_digest: [Felt<_>; POSEIDON_NUM_WORDS] = core::array::from_fn(|_| unsafe { MaybeUninit::zeroed().assume_init() }); - let mut cumulative_sum: [Felt<_>; D] = core::array::from_fn(|_| builder.eval(C::F::zero())); + let mut global_cumulative_sum: [Felt<_>; D] = + core::array::from_fn(|_| builder.eval(C::F::zero())); let mut init_addr_bits: [Felt<_>; 32] = core::array::from_fn(|_| unsafe { MaybeUninit::zeroed().assume_init() }); let mut finalize_addr_bits: [Felt<_>; 32] = @@ -150,12 +151,22 @@ where } // Observe the main commitment and public values. - challenger.observe(builder, shard_proof.commitment.main_commit); challenger.observe_slice( builder, shard_proof.public_values[0..machine.num_pv_elts()].iter().copied(), ); - StarkVerifier::verify_shard(builder, &vk, machine, &mut challenger, &shard_proof); + + assert!(!shard_proof.contains_global_main_commitment()); + + let zero_ext: Ext = builder.eval(C::F::zero()); + StarkVerifier::verify_shard( + builder, + &vk, + machine, + &mut challenger, + &shard_proof, + &[zero_ext, zero_ext], + ); // Get the current public values. let current_public_values: &RecursionPublicValues> = @@ -411,7 +422,7 @@ where // Update the cumulative sum. for (sum_element, current_sum_element) in - cumulative_sum.iter_mut().zip_eq(current_public_values.cumulative_sum.iter()) + global_cumulative_sum.iter_mut().zip_eq(current_public_values.cumulative_sum.iter()) { *sum_element = builder.eval(*sum_element + *current_sum_element); } @@ -443,7 +454,7 @@ where // Assign the committed value digests. compress_public_values.committed_value_digest = committed_value_digest; // Assign the cumulative sum. - compress_public_values.cumulative_sum = cumulative_sum; + compress_public_values.cumulative_sum = global_cumulative_sum; // Assign the `is_complete` flag. compress_public_values.is_complete = is_complete; // Set the compress vk digest. diff --git a/crates/recursion/circuit-v2/src/machine/core.rs b/crates/recursion/circuit-v2/src/machine/core.rs index 7cab9b4883..8bc1f72675 100644 --- a/crates/recursion/circuit-v2/src/machine/core.rs +++ b/crates/recursion/circuit-v2/src/machine/core.rs @@ -35,7 +35,7 @@ use sp1_recursion_core_v2::{ }; use crate::{ - challenger::{CanObserveVariable, DuplexChallengerVariable}, + challenger::{CanObserveVariable, DuplexChallengerVariable, FieldChallengerVariable}, stark::{ShardProofVariable, StarkVerifier}, BabyBearFriConfig, BabyBearFriConfigVariable, CircuitConfig, VerifyingKeyVariable, }; @@ -167,7 +167,7 @@ where initial_reconstruct_challenger.copy(builder); // Initialize the cumulative sum. - let mut cumulative_sum: Ext<_, _> = builder.eval(C::EF::zero().cons()); + let mut global_cumulative_sum: Ext<_, _> = builder.eval(C::EF::zero().cons()); // Assert that the number of proofs is not zero. assert!(!shard_proofs.is_empty()); @@ -284,7 +284,18 @@ where // Do not verify the cumulative sum here, since the permutation challenge is shared // between all shards. let mut challenger = leaf_challenger.copy(builder); - StarkVerifier::verify_shard(builder, &vk, machine, &mut challenger, &shard_proof); + + let global_permutation_challenges = + (0..2).map(|_| challenger.sample_ext(builder)).collect::>(); + + StarkVerifier::verify_shard( + builder, + &vk, + machine, + &mut challenger, + &shard_proof, + &global_permutation_challenges, + ); // Assert that first shard has a "CPU". Equivalently, assert that if the shard does // not have a "CPU", then the current shard is not 1. @@ -495,14 +506,15 @@ where C::range_check_felt(builder, public_values.shard, MAX_LOG_NUMBER_OF_SHARDS); // Update the reconstruct challenger. - reconstruct_challenger.observe(builder, shard_proof.commitment.main_commit); + reconstruct_challenger.observe(builder, shard_proof.commitment.global_main_commit); for element in shard_proof.public_values.iter().take(machine.num_pv_elts()) { reconstruct_challenger.observe(builder, *element); } // Cumulative sum is updated by sums of all chips. for values in shard_proof.opened_values.chips.iter() { - cumulative_sum = builder.eval(cumulative_sum + values.cumulative_sum); + global_cumulative_sum = + builder.eval(global_cumulative_sum + values.global_cumulative_sum); } } @@ -517,7 +529,7 @@ where let final_challenger_public_values = reconstruct_challenger.public_values(builder); // Collect the cumulative sum. - let cumulative_sum_array = builder.ext2felt_v2(cumulative_sum); + let global_cumulative_sum_array = builder.ext2felt_v2(global_cumulative_sum); // Collect the deferred proof digests. let zero: Felt<_> = builder.eval(C::F::zero()); @@ -548,7 +560,7 @@ where recursion_public_values.leaf_challenger = leaf_challenger_public_values; recursion_public_values.start_reconstruct_challenger = initial_challenger_public_values; recursion_public_values.end_reconstruct_challenger = final_challenger_public_values; - recursion_public_values.cumulative_sum = cumulative_sum_array; + recursion_public_values.cumulative_sum = global_cumulative_sum_array; recursion_public_values.start_reconstruct_deferred_digest = start_deferred_digest; recursion_public_values.end_reconstruct_deferred_digest = end_deferred_digest; recursion_public_values.exit_code = exit_code; diff --git a/crates/recursion/circuit-v2/src/machine/deferred.rs b/crates/recursion/circuit-v2/src/machine/deferred.rs index 8e9ff784d4..5669f888f4 100644 --- a/crates/recursion/circuit-v2/src/machine/deferred.rs +++ b/crates/recursion/circuit-v2/src/machine/deferred.rs @@ -10,7 +10,7 @@ use p3_field::AbstractField; use p3_matrix::dense::RowMajorMatrix; use sp1_primitives::consts::WORD_SIZE; -use sp1_recursion_compiler::ir::{Builder, Felt}; +use sp1_recursion_compiler::ir::{Builder, Ext, Felt}; use sp1_stark::{ air::{MachineAir, POSEIDON_NUM_WORDS}, @@ -130,13 +130,23 @@ where challenger.observe(builder, zero); } - // Observe the main commitment and public values. - challenger.observe(builder, shard_proof.commitment.main_commit); + // Observe the and public values. challenger.observe_slice( builder, shard_proof.public_values[0..machine.num_pv_elts()].iter().copied(), ); - StarkVerifier::verify_shard(builder, &vk, machine, &mut challenger, &shard_proof); + + assert!(!shard_proof.contains_global_main_commitment()); + + let zero_ext: Ext = builder.eval(C::F::zero()); + StarkVerifier::verify_shard( + builder, + &vk, + machine, + &mut challenger, + &shard_proof, + &[zero_ext, zero_ext], + ); // Get the current public values. let current_public_values: &RecursionPublicValues> = diff --git a/crates/recursion/circuit-v2/src/stark.rs b/crates/recursion/circuit-v2/src/stark.rs index 2dd5b49fd3..a7ffc18568 100644 --- a/crates/recursion/circuit-v2/src/stark.rs +++ b/crates/recursion/circuit-v2/src/stark.rs @@ -1,21 +1,18 @@ use hashbrown::HashMap; use itertools::{izip, Itertools}; -use p3_commit::Mmcs; -use p3_matrix::dense::RowMajorMatrix; - +use num_traits::cast::ToPrimitive; use p3_air::Air; use p3_baby_bear::BabyBear; -use p3_commit::{Pcs, TwoAdicMultiplicativeCoset}; -use p3_field::TwoAdicField; -use sp1_stark::{ShardCommitment, ShardOpenedValues, Val}; - -use p3_commit::PolynomialSpace; +use p3_commit::{Mmcs, Pcs, PolynomialSpace, TwoAdicMultiplicativeCoset}; +use p3_field::{Field, TwoAdicField}; +use p3_matrix::dense::RowMajorMatrix; use sp1_recursion_compiler::{ circuit::CircuitV2Builder, ir::{Builder, Config, Ext}, prelude::Felt, }; +use sp1_stark::{air::InteractionScope, ShardCommitment, ShardOpenedValues, Val}; use sp1_stark::{air::MachineAir, StarkGenericConfig, StarkMachine, StarkVerifyingKey}; use crate::{ @@ -36,6 +33,7 @@ pub struct ShardProofVariable, SC: BabyBearFriConf pub opened_values: ShardOpenedValues>, pub opening_proof: TwoAdicPcsProofVariable, pub chip_ordering: HashMap, + pub chip_scopes: Vec, pub public_values: Vec>, } @@ -87,19 +85,40 @@ where machine: &StarkMachine, challenger: &mut SC::FriChallengerVariable, proof: &ShardProofVariable, + global_permutation_challenges: &[Ext], ) where A: for<'a> Air>, { let chips = machine.shard_chips_ordered(&proof.chip_ordering).collect::>(); + let has_global_main_commit = proof.contains_global_main_commitment(); + let ShardProofVariable { commitment, opened_values, opening_proof, chip_ordering, + chip_scopes, public_values, } = proof; + // Assert that the byte multiplicities don't overflow. + let mut max_byte_lookup_mult = 0u64; + chips.iter().zip(opened_values.chips.iter()).for_each(|(chip, val)| { + max_byte_lookup_mult = max_byte_lookup_mult + .checked_add( + (chip.num_sent_byte_lookups() as u64) + .checked_mul(1u64.checked_shl(val.log_degree as u32).unwrap()) + .unwrap(), + ) + .unwrap(); + }); + + assert!( + max_byte_lookup_mult <= SC::Val::order().to_u64().unwrap(), + "Byte multiplicities overflow" + ); + let log_degrees = opened_values.chips.iter().map(|val| val.log_degree).collect::>(); let log_quotient_degrees = @@ -110,9 +129,16 @@ where .map(|log_degree| Self::natural_domain_for_degree(machine.config(), 1 << log_degree)) .collect::>(); - let ShardCommitment { main_commit, permutation_commit, quotient_commit } = *commitment; + let ShardCommitment { + global_main_commit, + local_main_commit, + permutation_commit, + quotient_commit, + } = *commitment; + + challenger.observe(builder, local_main_commit); - let permutation_challenges = + let local_permutation_challenges = (0..2).map(|_| challenger.sample_ext(builder)).collect::>(); challenger.observe(builder, permutation_commit); @@ -185,15 +211,33 @@ where }) .collect::>(); + // Split the main_domains_points_and_opens to the global and local chips. + let mut global_trace_points_and_openings = Vec::new(); + let mut local_trace_points_and_openings = Vec::new(); + for (i, points_and_openings) in + main_domains_points_and_opens.clone().into_iter().enumerate() + { + let scope = chip_scopes[i]; + if scope == InteractionScope::Global { + global_trace_points_and_openings.push(points_and_openings); + } else { + local_trace_points_and_openings.push(points_and_openings); + } + } + // Create the pcs rounds. let prep_commit = vk.commitment; let prep_round = TwoAdicPcsRoundVariable { batch_commit: prep_commit, domains_points_and_opens: preprocessed_domains_points_and_opens, }; - let main_round = TwoAdicPcsRoundVariable { - batch_commit: main_commit, - domains_points_and_opens: main_domains_points_and_opens, + let global_main_round = TwoAdicPcsRoundVariable { + batch_commit: global_main_commit, + domains_points_and_opens: global_trace_points_and_openings, + }; + let local_main_round = TwoAdicPcsRoundVariable { + batch_commit: local_main_commit, + domains_points_and_opens: local_trace_points_and_openings, }; let perm_round = TwoAdicPcsRoundVariable { batch_commit: permutation_commit, @@ -203,7 +247,12 @@ where batch_commit: quotient_commit, domains_points_and_opens: quotient_domains_points_and_opens, }; - let rounds = vec![prep_round, main_round, perm_round, quotient_round]; + + let rounds = if has_global_main_commit { + vec![prep_round, global_main_round, local_main_round, perm_round, quotient_round] + } else { + vec![prep_round, local_main_round, perm_round, quotient_round] + }; // Verify the pcs proof builder.cycle_tracker_v2_enter("stage-d-verify-pcs".to_string()); @@ -213,6 +262,12 @@ where // Verify the constrtaint evaluations. builder.cycle_tracker_v2_enter("stage-e-verify-constraints".to_string()); + let permutation_challenges = global_permutation_challenges + .iter() + .chain(local_permutation_challenges.iter()) + .copied() + .collect::>(); + for (chip, trace_domain, qc_domains, values) in izip!(chips.iter(), trace_domains, quotient_chunk_domains, opened_values.chips.iter(),) { @@ -246,11 +301,15 @@ impl, SC: BabyBearFriConfigVariable> ShardProof } pub fn contains_memory_init(&self) -> bool { - self.chip_ordering.contains_key("MemoryInit") + self.chip_ordering.contains_key("MemoryGlobalInit") } pub fn contains_memory_finalize(&self) -> bool { - self.chip_ordering.contains_key("MemoryFinalize") + self.chip_ordering.contains_key("MemoryGlobalFinalize") + } + + pub fn contains_global_main_commitment(&self) -> bool { + self.chip_scopes.contains(&InteractionScope::Global) } } @@ -345,16 +404,27 @@ pub mod tests { .collect::>(); // Observe all the commitments, and put the proofs into the witness stream. for proof in proofs.iter() { - let ShardCommitment { main_commit, .. } = proof.commitment; - challenger.observe(&mut builder, main_commit); + let ShardCommitment { global_main_commit, .. } = proof.commitment; + challenger.observe(&mut builder, global_main_commit); let pv_slice = &proof.public_values[..machine.num_pv_elts()]; challenger.observe_slice(&mut builder, pv_slice.iter().cloned()); } + + let global_permutation_challenges = + (0..2).map(|_| challenger.sample_ext(&mut builder)).collect::>(); + // Verify the first proof. let num_shards = num_shards_in_batch.unwrap_or(proofs.len()); for proof in proofs.into_iter().take(num_shards) { let mut challenger = challenger.copy(&mut builder); - StarkVerifier::verify_shard(&mut builder, &vk, &machine, &mut challenger, &proof); + StarkVerifier::verify_shard( + &mut builder, + &vk, + &machine, + &mut challenger, + &proof, + &global_permutation_challenges, + ); } (builder.into_operations(), witness_stream) } diff --git a/crates/recursion/circuit-v2/src/witness/mod.rs b/crates/recursion/circuit-v2/src/witness/mod.rs index 92811f7dc0..82a0ec612a 100644 --- a/crates/recursion/circuit-v2/src/witness/mod.rs +++ b/crates/recursion/circuit-v2/src/witness/mod.rs @@ -143,6 +143,7 @@ where let opening_proof = self.opening_proof.read(builder); let public_values = self.public_values.read(builder); let chip_ordering = self.chip_ordering.clone(); + let chip_scopes = self.chip_scopes.clone(); ShardProofVariable { commitment, @@ -150,6 +151,7 @@ where opening_proof, public_values, chip_ordering, + chip_scopes, } } @@ -165,14 +167,21 @@ impl> Witnessable for ShardCommitment type WitnessVariable = ShardCommitment; fn read(&self, builder: &mut Builder) -> Self::WitnessVariable { - let main_commit = self.main_commit.read(builder); + let global_main_commit = self.global_main_commit.read(builder); + let local_main_commit = self.local_main_commit.read(builder); let permutation_commit = self.permutation_commit.read(builder); let quotient_commit = self.quotient_commit.read(builder); - Self::WitnessVariable { main_commit, permutation_commit, quotient_commit } + Self::WitnessVariable { + global_main_commit, + local_main_commit, + permutation_commit, + quotient_commit, + } } fn write(&self, witness: &mut impl WitnessWriter) { - self.main_commit.write(witness); + self.global_main_commit.write(witness); + self.local_main_commit.write(witness); self.permutation_commit.write(witness); self.quotient_commit.write(witness); } @@ -203,14 +212,16 @@ impl> Witnessable let main = self.main.read(builder); let permutation = self.permutation.read(builder); let quotient = self.quotient.read(builder); - let cumulative_sum = self.cumulative_sum.read(builder); + let global_cumulative_sum = self.global_cumulative_sum.read(builder); + let local_cumulative_sum = self.local_cumulative_sum.read(builder); let log_degree = self.log_degree; Self::WitnessVariable { preprocessed, main, permutation, quotient, - cumulative_sum, + global_cumulative_sum, + local_cumulative_sum, log_degree, } } @@ -220,6 +231,7 @@ impl> Witnessable self.main.write(witness); self.permutation.write(witness); self.quotient.write(witness); - self.cumulative_sum.write(witness); + self.global_cumulative_sum.write(witness); + self.local_cumulative_sum.write(witness); } } diff --git a/crates/recursion/core-v2/src/builder.rs b/crates/recursion/core-v2/src/builder.rs index 1542081a6c..86d17d5595 100644 --- a/crates/recursion/core-v2/src/builder.rs +++ b/crates/recursion/core-v2/src/builder.rs @@ -2,7 +2,7 @@ use p3_air::AirBuilderWithPublicValues; use p3_field::AbstractField; use sp1_recursion_core::air::Block; use sp1_stark::{ - air::{AirInteraction, BaseAirBuilder, MachineAirBuilder}, + air::{AirInteraction, BaseAirBuilder, InteractionScope, MachineAirBuilder}, InteractionKind, }; @@ -32,11 +32,14 @@ pub trait RecursionAirBuilder: BaseAirBuilder { val: Block, mult: impl Into, ) { - self.send(AirInteraction::new( - once(addr.0).chain(val).map(Into::into).collect(), - mult.into(), - InteractionKind::Memory, - )); + self.send( + AirInteraction::new( + once(addr.0).chain(val).map(Into::into).collect(), + mult.into(), + InteractionKind::Memory, + ), + InteractionScope::Local, + ); } fn receive_single>( @@ -56,10 +59,13 @@ pub trait RecursionAirBuilder: BaseAirBuilder { val: Block, mult: impl Into, ) { - self.receive(AirInteraction::new( - once(addr.0).chain(val).map(Into::into).collect(), - mult.into(), - InteractionKind::Memory, - )); + self.receive( + AirInteraction::new( + once(addr.0).chain(val).map(Into::into).collect(), + mult.into(), + InteractionKind::Memory, + ), + InteractionScope::Local, + ); } } diff --git a/crates/recursion/core-v2/src/machine.rs b/crates/recursion/core-v2/src/machine.rs index 31784ebcee..957f2726f7 100644 --- a/crates/recursion/core-v2/src/machine.rs +++ b/crates/recursion/core-v2/src/machine.rs @@ -3,7 +3,10 @@ use std::ops::{Add, AddAssign}; use hashbrown::HashMap; use p3_field::{extension::BinomiallyExtendable, PrimeField32}; use sp1_recursion_core::runtime::D; -use sp1_stark::{air::MachineAir, Chip, StarkGenericConfig, StarkMachine, PROOF_MAX_NUM_PVS}; +use sp1_stark::{ + air::{InteractionScope, MachineAir}, + Chip, StarkGenericConfig, StarkMachine, PROOF_MAX_NUM_PVS, +}; use crate::{ chips::{ @@ -79,7 +82,7 @@ impl, const DEGREE: usize, const COL_P .map(Chip::new) .into_iter() .collect::>(); - StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) + StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS, false) } /// Get a machine with all chips, except the dummy chip. @@ -99,7 +102,7 @@ impl, const DEGREE: usize, const COL_P .map(Chip::new) .into_iter() .collect::>(); - StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) + StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS, false) } /// A machine with dyunamic chip sizes that includes the wide variant of the Poseidon2 chip. @@ -116,7 +119,7 @@ impl, const DEGREE: usize, const COL_P .map(Chip::new) .into_iter() .collect::>(); - StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) + StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS, false) } pub fn shrink_machine>(config: SC) -> StarkMachine { @@ -140,7 +143,7 @@ impl, const DEGREE: usize, const COL_P .map(Chip::new) .into_iter() .collect::>(); - StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) + StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS, false) } pub fn shrink_shape() -> RecursionShape { diff --git a/crates/recursion/core-v2/src/runtime/record.rs b/crates/recursion/core-v2/src/runtime/record.rs index 062ebd89ef..bc219525f5 100644 --- a/crates/recursion/core-v2/src/runtime/record.rs +++ b/crates/recursion/core-v2/src/runtime/record.rs @@ -1,5 +1,6 @@ use std::{array, sync::Arc}; +use hashbrown::HashMap; use p3_field::{AbstractField, Field, PrimeField32}; use sp1_recursion_core::air::RecursionPublicValues; use sp1_stark::{air::MachineAir, MachineRecord, SP1CoreOpts, PROOF_MAX_NUM_PVS}; @@ -30,7 +31,16 @@ impl MachineRecord for ExecutionRecord { type Config = SP1CoreOpts; fn stats(&self) -> hashbrown::HashMap { - hashbrown::HashMap::from([("cpu_events".to_owned(), 1337usize)]) + let mut stats = HashMap::new(); + stats.insert("base_alu_events".to_string(), self.base_alu_events.len()); + stats.insert("ext_alu_events".to_string(), self.ext_alu_events.len()); + stats.insert("mem_var_events".to_string(), self.mem_var_events.len()); + + stats.insert("poseidon2_events".to_string(), self.poseidon2_events.len()); + stats.insert("exp_reverse_bits_events".to_string(), self.exp_reverse_bits_len_events.len()); + stats.insert("fri_fold_events".to_string(), self.fri_fold_events.len()); + + stats } fn append(&mut self, other: &mut Self) { diff --git a/crates/recursion/core/src/air/builder.rs b/crates/recursion/core/src/air/builder.rs index 0794f09bd9..3c8c92722b 100644 --- a/crates/recursion/core/src/air/builder.rs +++ b/crates/recursion/core/src/air/builder.rs @@ -7,7 +7,7 @@ use core::iter::{once, repeat}; use p3_air::{AirBuilder, AirBuilderWithPublicValues}; use p3_field::AbstractField; use sp1_stark::{ - air::{AirInteraction, BaseAirBuilder, MachineAirBuilder}, + air::{AirInteraction, BaseAirBuilder, InteractionScope, MachineAirBuilder}, InteractionKind, }; @@ -50,8 +50,14 @@ pub trait RecursionMemoryAirBuilder: RecursionInteractionAirBuilder { .chain(memory_access.value().clone().map(Into::into)) .collect(); - self.receive(AirInteraction::new(prev_values, is_real.clone(), InteractionKind::Memory)); - self.send(AirInteraction::new(current_values, is_real, InteractionKind::Memory)); + self.receive( + AirInteraction::new(prev_values, is_real.clone(), InteractionKind::Memory), + InteractionScope::Local, + ); + self.send( + AirInteraction::new(current_values, is_real, InteractionKind::Memory), + InteractionScope::Local, + ); } fn recursion_eval_memory_access_single + Clone>( @@ -82,8 +88,14 @@ pub trait RecursionMemoryAirBuilder: RecursionInteractionAirBuilder { .chain(repeat(Self::Expr::zero()).take(3)) .collect(); - self.receive(AirInteraction::new(prev_values, is_real.clone(), InteractionKind::Memory)); - self.send(AirInteraction::new(current_values, is_real, InteractionKind::Memory)); + self.receive( + AirInteraction::new(prev_values, is_real.clone(), InteractionKind::Memory), + InteractionScope::Local, + ); + self.send( + AirInteraction::new(current_values, is_real, InteractionKind::Memory), + InteractionScope::Local, + ); } /// Verifies that the memory access happens after the previous memory access. @@ -151,11 +163,14 @@ pub trait RecursionInteractionAirBuilder: BaseAirBuilder { val: impl Into, is_real: impl Into, ) { - self.send(AirInteraction::new( - vec![range_check_opcode.into(), val.into()], - is_real.into(), - InteractionKind::Range, - )); + self.send( + AirInteraction::new( + vec![range_check_opcode.into(), val.into()], + is_real.into(), + InteractionKind::Range, + ), + InteractionScope::Global, + ); } /// Receives a range check operation to be processed. @@ -165,11 +180,14 @@ pub trait RecursionInteractionAirBuilder: BaseAirBuilder { val: impl Into, is_real: impl Into, ) { - self.receive(AirInteraction::new( - vec![range_check_opcode.into(), val.into()], - is_real.into(), - InteractionKind::Range, - )); + self.receive( + AirInteraction::new( + vec![range_check_opcode.into(), val.into()], + is_real.into(), + InteractionKind::Range, + ), + InteractionScope::Global, + ); } fn send_program + Copy>( @@ -183,11 +201,10 @@ pub trait RecursionInteractionAirBuilder: BaseAirBuilder { .chain(instruction.into_iter().map(|x| x.into())) .chain(selectors.into_iter().map(|x| x.into())) .collect::>(); - self.send(AirInteraction::new( - program_interaction_vals, - is_real.into(), - InteractionKind::Program, - )); + self.send( + AirInteraction::new(program_interaction_vals, is_real.into(), InteractionKind::Program), + InteractionScope::Global, + ); } fn receive_program + Copy>( @@ -201,11 +218,10 @@ pub trait RecursionInteractionAirBuilder: BaseAirBuilder { .chain(instruction.into_iter().map(|x| x.into())) .chain(selectors.into_iter().map(|x| x.into())) .collect::>(); - self.receive(AirInteraction::new( - program_interaction_vals, - is_real.into(), - InteractionKind::Program, - )); + self.receive( + AirInteraction::new(program_interaction_vals, is_real.into(), InteractionKind::Program), + InteractionScope::Global, + ); } fn send_table + Clone>( @@ -216,7 +232,10 @@ pub trait RecursionInteractionAirBuilder: BaseAirBuilder { ) { let table_interaction_vals = table.iter().map(|x| x.clone().into()); let values = once(opcode.into()).chain(table_interaction_vals).collect(); - self.send(AirInteraction::new(values, is_real.into(), InteractionKind::Syscall)); + self.send( + AirInteraction::new(values, is_real.into(), InteractionKind::Syscall), + InteractionScope::Local, + ); } fn receive_table + Clone>( @@ -227,6 +246,9 @@ pub trait RecursionInteractionAirBuilder: BaseAirBuilder { ) { let table_interaction_vals = table.iter().map(|x| x.clone().into()); let values = once(opcode.into()).chain(table_interaction_vals).collect(); - self.receive(AirInteraction::new(values, is_real.into(), InteractionKind::Syscall)); + self.receive( + AirInteraction::new(values, is_real.into(), InteractionKind::Syscall), + InteractionScope::Local, + ); } } diff --git a/crates/recursion/core/src/air/multi_builder.rs b/crates/recursion/core/src/air/multi_builder.rs index 48711b5294..57027d8fa4 100644 --- a/crates/recursion/core/src/air/multi_builder.rs +++ b/crates/recursion/core/src/air/multi_builder.rs @@ -2,7 +2,7 @@ use p3_air::{ AirBuilder, AirBuilderWithPublicValues, ExtensionBuilder, FilteredAirBuilder, PermutationAirBuilder, }; -use sp1_stark::air::MessageBuilder; +use sp1_stark::air::{InteractionScope, MessageBuilder}; /// The MultiBuilder is used for the multi table. It is used to create a virtual builder for one of /// the sub tables in the multi table. @@ -85,12 +85,12 @@ impl<'a, AB: PermutationAirBuilder> PermutationAirBuilder for MultiBuilder<'a, A } impl<'a, AB: AirBuilder + MessageBuilder, M> MessageBuilder for MultiBuilder<'a, AB> { - fn send(&mut self, message: M) { - self.inner.send(message); + fn send(&mut self, message: M, scope: InteractionScope) { + self.inner.send(message, scope); } - fn receive(&mut self, message: M) { - self.inner.receive(message); + fn receive(&mut self, message: M, scope: InteractionScope) { + self.inner.receive(message, scope); } } diff --git a/crates/recursion/core/src/air/public_values.rs b/crates/recursion/core/src/air/public_values.rs index 95c14d51a8..c0f8143194 100644 --- a/crates/recursion/core/src/air/public_values.rs +++ b/crates/recursion/core/src/air/public_values.rs @@ -134,7 +134,8 @@ pub struct RecursionPublicValues { /// The leaf challenger containing the entropy from the main trace commitment. pub leaf_challenger: ChallengerPublicValues, - /// Current cumulative sum of lookup bus. + /// Current cumulative sum of lookup bus. Note that for recursive proofs for core proofs, this + /// contains the global cumulative sum. For all other proofs, it's the local cumulative sum. pub cumulative_sum: [T; 4], /// Whether the proof completely proves the program execution. diff --git a/crates/recursion/core/src/memory/air.rs b/crates/recursion/core/src/memory/air.rs index 2b0257bcb8..d739df67b7 100644 --- a/crates/recursion/core/src/memory/air.rs +++ b/crates/recursion/core/src/memory/air.rs @@ -4,7 +4,7 @@ use p3_field::{AbstractField, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use sp1_core_machine::utils::{next_power_of_two, par_for_each_row}; use sp1_stark::{ - air::{AirInteraction, MachineAir}, + air::{AirInteraction, InteractionScope, MachineAir}, InteractionKind, }; use std::borrow::{Borrow, BorrowMut}; @@ -181,30 +181,36 @@ where local.is_finalize, ); - builder.send(AirInteraction::new( - vec![ - local.timestamp.into(), - local.addr.into(), - local.value[0].into(), - local.value[1].into(), - local.value[2].into(), - local.value[3].into(), - ], - local.is_initialize.into(), - InteractionKind::Memory, - )); - builder.receive(AirInteraction::new( - vec![ - local.timestamp.into(), - local.addr.into(), - local.value[0].into(), - local.value[1].into(), - local.value[2].into(), - local.value[3].into(), - ], - local.is_finalize.into(), - InteractionKind::Memory, - )); + builder.send( + AirInteraction::new( + vec![ + local.timestamp.into(), + local.addr.into(), + local.value[0].into(), + local.value[1].into(), + local.value[2].into(), + local.value[3].into(), + ], + local.is_initialize.into(), + InteractionKind::Memory, + ), + InteractionScope::Global, + ); + builder.receive( + AirInteraction::new( + vec![ + local.timestamp.into(), + local.addr.into(), + local.value[0].into(), + local.value[1].into(), + local.value[2].into(), + local.value[3].into(), + ], + local.is_finalize.into(), + InteractionKind::Memory, + ), + InteractionScope::Global, + ); } } diff --git a/crates/recursion/core/src/stark/config.rs b/crates/recursion/core/src/stark/config.rs index 3713fb2ed3..5d6a5838d1 100644 --- a/crates/recursion/core/src/stark/config.rs +++ b/crates/recursion/core/src/stark/config.rs @@ -3,7 +3,7 @@ use p3_bn254_fr::{Bn254Fr, DiffusionMatrixBN254}; use p3_challenger::MultiField32Challenger; use p3_commit::ExtensionMmcs; use p3_dft::Radix2DitParallel; -use p3_field::extension::BinomialExtensionField; +use p3_field::{extension::BinomialExtensionField, AbstractField}; use p3_fri::{ BatchOpening, CommitPhaseProofStep, FriConfig, FriProof, QueryProof, TwoAdicFriPcs, TwoAdicFriPcsProof, @@ -12,17 +12,20 @@ use p3_merkle_tree::FieldMerkleTreeMmcs; use p3_poseidon2::{Poseidon2, Poseidon2ExternalMatrixGeneral}; use p3_symmetric::{Hash, MultiField32PaddingFreeSponge, TruncatedPermutation}; use serde::{Deserialize, Serialize}; -use sp1_stark::StarkGenericConfig; +use sp1_stark::{Com, StarkGenericConfig, ZeroCommitment}; use super::{poseidon2::bn254_poseidon2_rc3, utils}; +pub const DIGEST_SIZE: usize = 1; + /// A configuration for outer recursion. pub type OuterVal = BabyBear; pub type OuterChallenge = BinomialExtensionField; pub type OuterPerm = Poseidon2; -pub type OuterHash = MultiField32PaddingFreeSponge; -pub type OuterDigestHash = Hash; -pub type OuterDigest = [Bn254Fr; 1]; +pub type OuterHash = + MultiField32PaddingFreeSponge; +pub type OuterDigestHash = Hash; +pub type OuterDigest = [Bn254Fr; DIGEST_SIZE]; pub type OuterCompress = TruncatedPermutation; pub type OuterValMmcs = FieldMerkleTreeMmcs; pub type OuterChallengeMmcs = ExtensionMmcs; @@ -164,6 +167,12 @@ impl StarkGenericConfig for BabyBearPoseidon2Outer { } } +impl ZeroCommitment for OuterPcs { + fn zero_commitment(&self) -> Com { + OuterDigestHash::from([Bn254Fr::zero(); DIGEST_SIZE]) + } +} + /// The FRI config for testing recursion. pub fn test_fri_config() -> FriConfig { let perm = outer_perm(); diff --git a/crates/recursion/core/src/stark/mod.rs b/crates/recursion/core/src/stark/mod.rs index 0c2104b3ea..a737aab74b 100644 --- a/crates/recursion/core/src/stark/mod.rs +++ b/crates/recursion/core/src/stark/mod.rs @@ -9,7 +9,7 @@ use crate::{ }; use core::iter::once; use p3_field::{extension::BinomiallyExtendable, PrimeField32}; -use sp1_stark::{Chip, StarkGenericConfig, StarkMachine, PROOF_MAX_NUM_PVS}; +use sp1_stark::{air::InteractionScope, Chip, StarkGenericConfig, StarkMachine, PROOF_MAX_NUM_PVS}; use std::marker::PhantomData; use crate::runtime::D; @@ -39,19 +39,19 @@ impl, const DEGREE: usize> RecursionAi /// A recursion machine that can have dynamic trace sizes. pub fn machine>(config: SC) -> StarkMachine { let chips = Self::get_all().into_iter().map(Chip::new).collect::>(); - StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) + StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS, false) } /// A recursion machine with fixed trace sizes tuned to work specifically for the wrap layer. pub fn wrap_machine>(config: SC) -> StarkMachine { let chips = Self::get_wrap_all().into_iter().map(Chip::new).collect::>(); - StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) + StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS, false) } /// A recursion machine with fixed trace sizes tuned to work specifically for the wrap layer. pub fn wrap_machine_dyn>(config: SC) -> StarkMachine { let chips = Self::get_wrap_dyn_all().into_iter().map(Chip::new).collect::>(); - StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS) + StarkMachine::new(config, chips, PROOF_MAX_NUM_PVS, false) } pub fn get_all() -> Vec { diff --git a/crates/sdk/src/provers/cpu.rs b/crates/sdk/src/provers/cpu.rs index e1828716e4..891c34459c 100644 --- a/crates/sdk/src/provers/cpu.rs +++ b/crates/sdk/src/provers/cpu.rs @@ -50,7 +50,8 @@ impl Prover for CpuProver { kind: SP1ProofKind, ) -> Result { // Generate the core proof. - let proof = self.prover.prove_core(pk, &stdin, opts.sp1_prover_opts, context)?; + let proof: sp1_prover::SP1ProofWithMetadata = + self.prover.prove_core(pk, &stdin, opts.sp1_prover_opts, context)?; if kind == SP1ProofKind::Core { return Ok(SP1ProofWithPublicValues { proof: SP1Proof::Core(proof.proof.0), diff --git a/crates/sdk/src/provers/mock.rs b/crates/sdk/src/provers/mock.rs index 109adc66c3..29dcd5880f 100644 --- a/crates/sdk/src/provers/mock.rs +++ b/crates/sdk/src/provers/mock.rs @@ -69,7 +69,8 @@ impl Prover for MockProver { let shard_proof = ShardProof { commitment: ShardCommitment { - main_commit: [BabyBear::zero(); 8].into(), + global_main_commit: [BabyBear::zero(); 8].into(), + local_main_commit: [BabyBear::zero(); 8].into(), permutation_commit: [BabyBear::zero(); 8].into(), quotient_commit: [BabyBear::zero(); 8].into(), }, @@ -84,6 +85,7 @@ impl Prover for MockProver { query_openings: vec![], }, chip_ordering: HashMap::new(), + chip_scopes: vec![], public_values: vec![], }; diff --git a/crates/stark/Cargo.toml b/crates/stark/Cargo.toml index 0d5e773441..164901b194 100644 --- a/crates/stark/Cargo.toml +++ b/crates/stark/Cargo.toml @@ -37,9 +37,11 @@ itertools = "0.13.0" tracing = "0.1.40" rayon-scan = "0.1.1" arrayref = "0.3.8" +strum = "0.26.3" +strum_macros = "0.26.4" getrandom = { version = "0.2.15", features = ["custom"] } sysinfo = "0.30.13" - +num-traits = "0.2.19" [dev-dependencies] sp1-zkvm = { workspace = true } diff --git a/crates/stark/src/air/builder.rs b/crates/stark/src/air/builder.rs index 16d41e1c54..c64f1677cd 100644 --- a/crates/stark/src/air/builder.rs +++ b/crates/stark/src/air/builder.rs @@ -6,26 +6,50 @@ use p3_field::{AbstractField, Field}; use p3_uni_stark::{ ProverConstraintFolder, StarkGenericConfig, SymbolicAirBuilder, VerifierConstraintFolder, }; +use serde::{Deserialize, Serialize}; +use strum_macros::{Display, EnumIter}; use super::{interaction::AirInteraction, BinomialExtension}; use crate::{lookup::InteractionKind, Word}; +/// The scope of an interaction. +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + Hash, + Display, + EnumIter, + PartialOrd, + Ord, + Serialize, + Deserialize, +)] +pub enum InteractionScope { + /// Global scope. + Global = 0, + /// Local scope. + Local, +} + /// A builder that can send and receive messages (or interactions) with other AIRs. pub trait MessageBuilder { /// Sends a message. - fn send(&mut self, message: M); + fn send(&mut self, message: M, scope: InteractionScope); /// Receives a message. - fn receive(&mut self, message: M); + fn receive(&mut self, message: M, scope: InteractionScope); } /// A message builder for which sending and receiving messages is a no-op. pub trait EmptyMessageBuilder: AirBuilder {} impl MessageBuilder for AB { - fn send(&mut self, _message: M) {} + fn send(&mut self, _message: M, _scope: InteractionScope) {} - fn receive(&mut self, _message: M) {} + fn receive(&mut self, _message: M, _scope: InteractionScope) {} } /// A trait which contains basic methods for building an AIR. @@ -90,11 +114,9 @@ pub trait ByteAirBuilder: BaseAirBuilder { a: impl Into, b: impl Into, c: impl Into, - shard: impl Into, - channel: impl Into, multiplicity: impl Into, ) { - self.send_byte_pair(opcode, a, Self::Expr::zero(), b, c, shard, channel, multiplicity); + self.send_byte_pair(opcode, a, Self::Expr::zero(), b, c, multiplicity); } /// Sends a byte operation with two outputs to be processed. @@ -106,23 +128,16 @@ pub trait ByteAirBuilder: BaseAirBuilder { a2: impl Into, b: impl Into, c: impl Into, - shard: impl Into, - channel: impl Into, multiplicity: impl Into, ) { - self.send(AirInteraction::new( - vec![ - opcode.into(), - a1.into(), - a2.into(), - b.into(), - c.into(), - shard.into(), - channel.into(), - ], - multiplicity.into(), - InteractionKind::Byte, - )); + self.send( + AirInteraction::new( + vec![opcode.into(), a1.into(), a2.into(), b.into(), c.into()], + multiplicity.into(), + InteractionKind::Byte, + ), + InteractionScope::Local, + ); } /// Receives a byte operation to be processed. @@ -133,11 +148,9 @@ pub trait ByteAirBuilder: BaseAirBuilder { a: impl Into, b: impl Into, c: impl Into, - shard: impl Into, - channel: impl Into, multiplicity: impl Into, ) { - self.receive_byte_pair(opcode, a, Self::Expr::zero(), b, c, shard, channel, multiplicity); + self.receive_byte_pair(opcode, a, Self::Expr::zero(), b, c, multiplicity); } /// Receives a byte operation with two outputs to be processed. @@ -149,23 +162,16 @@ pub trait ByteAirBuilder: BaseAirBuilder { a2: impl Into, b: impl Into, c: impl Into, - shard: impl Into, - channel: impl Into, multiplicity: impl Into, ) { - self.receive(AirInteraction::new( - vec![ - opcode.into(), - a1.into(), - a2.into(), - b.into(), - c.into(), - shard.into(), - channel.into(), - ], - multiplicity.into(), - InteractionKind::Byte, - )); + self.receive( + AirInteraction::new( + vec![opcode.into(), a1.into(), a2.into(), b.into(), c.into()], + multiplicity.into(), + InteractionKind::Byte, + ), + InteractionScope::Local, + ); } } @@ -180,7 +186,6 @@ pub trait AluAirBuilder: BaseAirBuilder { b: Word>, c: Word>, shard: impl Into, - channel: impl Into, nonce: impl Into, multiplicity: impl Into, ) { @@ -189,11 +194,13 @@ pub trait AluAirBuilder: BaseAirBuilder { .chain(b.0.into_iter().map(Into::into)) .chain(c.0.into_iter().map(Into::into)) .chain(once(shard.into())) - .chain(once(channel.into())) .chain(once(nonce.into())) .collect(); - self.send(AirInteraction::new(values, multiplicity.into(), InteractionKind::Alu)); + self.send( + AirInteraction::new(values, multiplicity.into(), InteractionKind::Alu), + InteractionScope::Local, + ); } /// Receives an ALU operation to be processed. @@ -205,7 +212,6 @@ pub trait AluAirBuilder: BaseAirBuilder { b: Word>, c: Word>, shard: impl Into, - channel: impl Into, nonce: impl Into, multiplicity: impl Into, ) { @@ -214,11 +220,13 @@ pub trait AluAirBuilder: BaseAirBuilder { .chain(b.0.into_iter().map(Into::into)) .chain(c.0.into_iter().map(Into::into)) .chain(once(shard.into())) - .chain(once(channel.into())) .chain(once(nonce.into())) .collect(); - self.receive(AirInteraction::new(values, multiplicity.into(), InteractionKind::Alu)); + self.receive( + AirInteraction::new(values, multiplicity.into(), InteractionKind::Alu), + InteractionScope::Local, + ); } /// Sends an syscall operation to be processed (with "ECALL" opcode). @@ -226,27 +234,29 @@ pub trait AluAirBuilder: BaseAirBuilder { fn send_syscall( &mut self, shard: impl Into + Clone, - channel: impl Into + Clone, clk: impl Into + Clone, nonce: impl Into + Clone, syscall_id: impl Into + Clone, arg1: impl Into + Clone, arg2: impl Into + Clone, multiplicity: impl Into, + scope: InteractionScope, ) { - self.send(AirInteraction::new( - vec![ - shard.clone().into(), - channel.clone().into(), - clk.clone().into(), - nonce.clone().into(), - syscall_id.clone().into(), - arg1.clone().into(), - arg2.clone().into(), - ], - multiplicity.into(), - InteractionKind::Syscall, - )); + self.send( + AirInteraction::new( + vec![ + shard.clone().into(), + clk.clone().into(), + nonce.clone().into(), + syscall_id.clone().into(), + arg1.clone().into(), + arg2.clone().into(), + ], + multiplicity.into(), + InteractionKind::Syscall, + ), + scope, + ); } /// Receives a syscall operation to be processed. @@ -254,27 +264,29 @@ pub trait AluAirBuilder: BaseAirBuilder { fn receive_syscall( &mut self, shard: impl Into + Clone, - channel: impl Into + Clone, clk: impl Into + Clone, nonce: impl Into + Clone, syscall_id: impl Into + Clone, arg1: impl Into + Clone, arg2: impl Into + Clone, multiplicity: impl Into, + scope: InteractionScope, ) { - self.receive(AirInteraction::new( - vec![ - shard.clone().into(), - channel.clone().into(), - clk.clone().into(), - nonce.clone().into(), - syscall_id.clone().into(), - arg1.clone().into(), - arg2.clone().into(), - ], - multiplicity.into(), - InteractionKind::Syscall, - )); + self.receive( + AirInteraction::new( + vec![ + shard.clone().into(), + clk.clone().into(), + nonce.clone().into(), + syscall_id.clone().into(), + arg1.clone().into(), + arg2.clone().into(), + ], + multiplicity.into(), + InteractionKind::Syscall, + ), + scope, + ); } } @@ -317,12 +329,12 @@ pub trait ExtensionAirBuilder: BaseAirBuilder { } /// A builder that implements a permutation argument. -pub trait MultiTableAirBuilder: PermutationAirBuilder { +pub trait MultiTableAirBuilder<'a>: PermutationAirBuilder { /// The type of the cumulative sum. - type Sum: Into; + type Sum: Into + Copy; /// Returns the cumulative sum of the permutation. - fn cumulative_sum(&self) -> Self::Sum; + fn cumulative_sums(&self) -> &'a [Self::Sum]; } /// A trait that contains the common helper methods for building `SP1 recursion` and SP1 machine @@ -336,12 +348,12 @@ pub trait MachineAirBuilder: pub trait SP1AirBuilder: MachineAirBuilder + ByteAirBuilder + AluAirBuilder {} impl<'a, AB: AirBuilder + MessageBuilder, M> MessageBuilder for FilteredAirBuilder<'a, AB> { - fn send(&mut self, message: M) { - self.inner.send(message); + fn send(&mut self, message: M, scope: InteractionScope) { + self.inner.send(message, scope); } - fn receive(&mut self, message: M) { - self.inner.receive(message); + fn receive(&mut self, message: M, scope: InteractionScope) { + self.inner.receive(message, scope); } } diff --git a/crates/stark/src/air/machine.rs b/crates/stark/src/air/machine.rs index f80a1dadad..4973c4769c 100644 --- a/crates/stark/src/air/machine.rs +++ b/crates/stark/src/air/machine.rs @@ -6,6 +6,8 @@ use crate::MachineRecord; pub use sp1_derive::MachineAir; +use super::InteractionScope; + /// An AIR that is part of a multi table AIR arithmetization. pub trait MachineAir: BaseAir + 'static + Send + Sync { /// The execution record containing events for producing the air trace. @@ -41,6 +43,11 @@ pub trait MachineAir: BaseAir + 'static + Send + Sync { fn generate_preprocessed_trace(&self, _program: &Self::Program) -> Option> { None } + + /// Specifies whether it's trace should be part of either the global or local commit. + fn commit_scope(&self) -> InteractionScope { + InteractionScope::Local + } } /// A program that defines the control flow of a machine through a program counter. diff --git a/crates/stark/src/bb31_poseidon2.rs b/crates/stark/src/bb31_poseidon2.rs index 0ad00e86ac..8c610f54e8 100644 --- a/crates/stark/src/bb31_poseidon2.rs +++ b/crates/stark/src/bb31_poseidon2.rs @@ -1,11 +1,11 @@ #![allow(missing_docs)] -use crate::StarkGenericConfig; +use crate::{Com, StarkGenericConfig, ZeroCommitment}; use p3_baby_bear::{BabyBear, DiffusionMatrixBabyBear}; use p3_challenger::DuplexChallenger; use p3_commit::ExtensionMmcs; use p3_dft::Radix2DitParallel; -use p3_field::{extension::BinomialExtensionField, Field}; +use p3_field::{extension::BinomialExtensionField, AbstractField, Field}; use p3_fri::{ BatchOpening, CommitPhaseProofStep, FriConfig, FriProof, QueryProof, TwoAdicFriPcs, TwoAdicFriPcsProof, @@ -23,7 +23,7 @@ pub type InnerVal = BabyBear; pub type InnerChallenge = BinomialExtensionField; pub type InnerPerm = Poseidon2; -pub type InnerHash = PaddingFreeSponge; +pub type InnerHash = PaddingFreeSponge; pub type InnerDigestHash = Hash; pub type InnerDigest = [InnerVal; DIGEST_SIZE]; pub type InnerCompress = TruncatedPermutation; @@ -144,27 +144,34 @@ impl StarkGenericConfig for BabyBearPoseidon2Inner { } } +impl ZeroCommitment for InnerPcs { + fn zero_commitment(&self) -> Com { + InnerDigestHash::from([InnerVal::zero(); DIGEST_SIZE]) + } +} + pub mod baby_bear_poseidon2 { use p3_baby_bear::{BabyBear, DiffusionMatrixBabyBear}; use p3_challenger::DuplexChallenger; use p3_commit::ExtensionMmcs; use p3_dft::Radix2DitParallel; - use p3_field::{extension::BinomialExtensionField, Field}; + use p3_field::{extension::BinomialExtensionField, AbstractField, Field}; use p3_fri::{FriConfig, TwoAdicFriPcs}; use p3_merkle_tree::FieldMerkleTreeMmcs; use p3_poseidon2::{Poseidon2, Poseidon2ExternalMatrixGeneral}; - use p3_symmetric::{PaddingFreeSponge, TruncatedPermutation}; + use p3_symmetric::{Hash, PaddingFreeSponge, TruncatedPermutation}; use serde::{Deserialize, Serialize}; use sp1_primitives::RC_16_30; - use crate::StarkGenericConfig; + use crate::{Com, StarkGenericConfig, ZeroCommitment, DIGEST_SIZE}; pub type Val = BabyBear; pub type Challenge = BinomialExtensionField; pub type Perm = Poseidon2; - pub type MyHash = PaddingFreeSponge; + pub type MyHash = PaddingFreeSponge; + pub type DigestHash = Hash; pub type MyCompress = TruncatedPermutation; pub type ValMmcs = FieldMerkleTreeMmcs< ::Packing, @@ -336,4 +343,10 @@ pub mod baby_bear_poseidon2 { Challenger::new(self.perm.clone()) } } + + impl ZeroCommitment for Pcs { + fn zero_commitment(&self) -> Com { + DigestHash::from([Val::zero(); DIGEST_SIZE]) + } + } } diff --git a/crates/stark/src/chip.rs b/crates/stark/src/chip.rs index 8797ed3d58..9ba6651565 100644 --- a/crates/stark/src/chip.rs +++ b/crates/stark/src/chip.rs @@ -12,8 +12,7 @@ use crate::{ }; use super::{ - eval_permutation_constraints, generate_permutation_trace, permutation_trace_width, - PROOF_MAX_NUM_PVS, + eval_permutation_constraints, generate_permutation_trace, get_grouped_maps, PROOF_MAX_NUM_PVS, }; /// An Air that encodes lookups based on interactions. @@ -96,6 +95,12 @@ where self.sends.len() + self.receives.len() } + /// Returns the number of sent byte lookups in the chip. + #[inline] + pub fn num_sent_byte_lookups(&self) -> usize { + self.sends.iter().filter(|i| i.kind == InteractionKind::Byte).count() + } + /// Returns the number of sends of the given kind. #[inline] pub fn num_sends_by_kind(&self, kind: InteractionKind) -> usize { @@ -114,7 +119,7 @@ where preprocessed: Option<&RowMajorMatrix>, main: &RowMajorMatrix, random_elements: &[EF], - ) -> RowMajorMatrix + ) -> (RowMajorMatrix, EF, EF) where F: PrimeField, A: MachineAir, @@ -133,7 +138,10 @@ where /// Returns the width of the permutation trace. #[inline] pub fn permutation_width(&self) -> usize { - permutation_trace_width(self.sends().len() + self.receives().len(), self.logup_batch_size()) + let (_, _, grouped_widths) = + get_grouped_maps(self.sends(), self.receives(), self.logup_batch_size()); + + grouped_widths.values().sum() } /// Returns the cost of a row in the chip. @@ -201,14 +209,18 @@ where fn included(&self, shard: &Self::Record) -> bool { self.air.included(shard) } + + fn commit_scope(&self) -> crate::air::InteractionScope { + self.air.commit_scope() + } } // Implement AIR directly on Chip, evaluating both execution and permutation constraints. -impl Air for Chip +impl<'a, F, A, AB> Air for Chip where F: Field, A: Air, - AB: SP1AirBuilder + MultiTableAirBuilder + PairBuilder, + AB: SP1AirBuilder + MultiTableAirBuilder<'a> + PairBuilder + 'a, { fn eval(&self, builder: &mut AB) { // Evaluate the execution trace constraints. diff --git a/crates/stark/src/config.rs b/crates/stark/src/config.rs index 59df5f0165..4ed127bac7 100644 --- a/crates/stark/src/config.rs +++ b/crates/stark/src/config.rs @@ -54,7 +54,9 @@ pub trait StarkGenericConfig: 'static + Send + Sync + Serialize + DeserializeOwn type Domain: PolynomialSpace + Sync; /// The PCS used to commit to trace polynomials. - type Pcs: Pcs + Sync; + type Pcs: Pcs + + Sync + + ZeroCommitment; /// The field from which most random challenges are drawn. type Challenge: ExtensionField; @@ -71,6 +73,10 @@ pub trait StarkGenericConfig: 'static + Send + Sync + Serialize + DeserializeOwn fn challenger(&self) -> Self::Challenger; } +pub trait ZeroCommitment { + fn zero_commitment(&self) -> Com; +} + pub struct UniConfig(pub SC); impl p3_uni_stark::StarkGenericConfig for UniConfig { diff --git a/crates/stark/src/debug.rs b/crates/stark/src/debug.rs index 2e1ccd9d3d..a02e4db00b 100644 --- a/crates/stark/src/debug.rs +++ b/crates/stark/src/debug.rs @@ -21,14 +21,15 @@ use crate::air::{EmptyMessageBuilder, MachineAir, MultiTableAirBuilder}; /// Checks that the constraints of the given AIR are satisfied, including the permutation trace. /// /// Note that this does not actually verify the proof. -#[allow(clippy::needless_pass_by_value)] +#[allow(clippy::too_many_arguments)] pub fn debug_constraints( chip: &MachineChip, preprocessed: Option<&RowMajorMatrix>>, main: &RowMajorMatrix>, perm: &RowMajorMatrix, perm_challenges: &[SC::Challenge], - public_values: Vec>, + public_values: &[Val], + cumulative_sums: &[SC::Challenge], ) where SC: StarkGenericConfig, Val: PrimeField32, @@ -40,8 +41,6 @@ pub fn debug_constraints( return; } - let cumulative_sum = perm.row_slice(perm.height() - 1).last().copied().unwrap(); - // Check that constraints are satisfied. (0..height).for_each(|i| { let i_next = (i + 1) % height; @@ -69,7 +68,6 @@ pub fn debug_constraints( let perm_next = perm.row_slice(i_next); let perm_next = &(*perm_next); - let public_values = public_values.clone(); let mut builder = DebugConstraintBuilder { preprocessed: VerticalPair::new( RowMajorMatrixView::new_row(&preprocessed_local), @@ -84,11 +82,11 @@ pub fn debug_constraints( RowMajorMatrixView::new_row(perm_next), ), perm_challenges, - cumulative_sum, + cumulative_sums, is_first_row: Val::::zero(), is_last_row: Val::::zero(), is_transition: Val::::one(), - public_values: &public_values, + public_values, }; if i == 0 { builder.is_first_row = Val::::one(); @@ -130,7 +128,7 @@ pub struct DebugConstraintBuilder<'a, F: Field, EF: ExtensionField> { pub(crate) preprocessed: VerticalPair, RowMajorMatrixView<'a, F>>, pub(crate) main: VerticalPair, RowMajorMatrixView<'a, F>>, pub(crate) perm: VerticalPair, RowMajorMatrixView<'a, EF>>, - pub(crate) cumulative_sum: EF, + pub(crate) cumulative_sums: &'a [EF], pub(crate) perm_challenges: &'a [EF], pub(crate) is_first_row: F, pub(crate) is_last_row: F, @@ -252,15 +250,15 @@ where } } -impl<'a, F, EF> MultiTableAirBuilder for DebugConstraintBuilder<'a, F, EF> +impl<'a, F, EF> MultiTableAirBuilder<'a> for DebugConstraintBuilder<'a, F, EF> where F: Field, EF: ExtensionField, { type Sum = EF; - fn cumulative_sum(&self) -> Self::Sum { - self.cumulative_sum + fn cumulative_sums(&self) -> &'a [Self::Sum] { + self.cumulative_sums } } diff --git a/crates/stark/src/folder.rs b/crates/stark/src/folder.rs index a99e06c31b..4666e2e94c 100644 --- a/crates/stark/src/folder.rs +++ b/crates/stark/src/folder.rs @@ -27,8 +27,8 @@ pub struct ProverConstraintFolder<'a, SC: StarkGenericConfig> { >, /// The challenges for the permutation. pub perm_challenges: &'a [PackedChallenge], - /// The cumulative sum of the permutation. - pub cumulative_sum: SC::Challenge, + /// The cumulative sums for the permutation. + pub cumulative_sums: &'a [PackedChallenge], /// The selector for the first row. pub is_first_row: PackedVal, /// The selector for the last row. @@ -111,11 +111,11 @@ impl<'a, SC: StarkGenericConfig> PermutationAirBuilder for ProverConstraintFolde } } -impl<'a, SC: StarkGenericConfig> MultiTableAirBuilder for ProverConstraintFolder<'a, SC> { +impl<'a, SC: StarkGenericConfig> MultiTableAirBuilder<'a> for ProverConstraintFolder<'a, SC> { type Sum = PackedChallenge; - fn cumulative_sum(&self) -> Self::Sum { - PackedChallenge::::from_f(self.cumulative_sum) + fn cumulative_sums(&self) -> &'a [Self::Sum] { + self.cumulative_sums } } @@ -155,8 +155,8 @@ pub struct GenericVerifierConstraintFolder<'a, F, EF, PubVar, Var, Expr> { pub perm: VerticalPair, RowMajorMatrixView<'a, Var>>, /// The challenges for the permutation. pub perm_challenges: &'a [Var], - /// The cumulative sum of the permutation. - pub cumulative_sum: Var, + /// The cumulative sums of the permutation. + pub cumulative_sums: &'a [Var], /// The selector for the first row. pub is_first_row: Var, /// The selector for the last row. @@ -316,7 +316,7 @@ where } } -impl<'a, F, EF, PubVar, Var, Expr> MultiTableAirBuilder +impl<'a, F, EF, PubVar, Var, Expr> MultiTableAirBuilder<'a> for GenericVerifierConstraintFolder<'a, F, EF, PubVar, Var, Expr> where F: Field, @@ -347,8 +347,8 @@ where { type Sum = Var; - fn cumulative_sum(&self) -> Self::Sum { - self.cumulative_sum + fn cumulative_sums(&self) -> &'a [Self::Sum] { + self.cumulative_sums } } diff --git a/crates/stark/src/lookup/builder.rs b/crates/stark/src/lookup/builder.rs index df0fa8a75b..153d660483 100644 --- a/crates/stark/src/lookup/builder.rs +++ b/crates/stark/src/lookup/builder.rs @@ -4,7 +4,7 @@ use p3_matrix::dense::RowMajorMatrix; use p3_uni_stark::{Entry, SymbolicExpression, SymbolicVariable}; use crate::{ - air::{AirInteraction, MessageBuilder}, + air::{AirInteraction, InteractionScope, MessageBuilder}, PROOF_MAX_NUM_PVS, }; @@ -93,22 +93,22 @@ impl PairBuilder for InteractionBuilder { } impl MessageBuilder>> for InteractionBuilder { - fn send(&mut self, message: AirInteraction>) { + fn send(&mut self, message: AirInteraction>, scope: InteractionScope) { let values = message.values.into_iter().map(|v| symbolic_to_virtual_pair(&v)).collect::>(); let multiplicity = symbolic_to_virtual_pair(&message.multiplicity); - self.sends.push(Interaction::new(values, multiplicity, message.kind)); + self.sends.push(Interaction::new(values, multiplicity, message.kind, scope)); } - fn receive(&mut self, message: AirInteraction>) { + fn receive(&mut self, message: AirInteraction>, scope: InteractionScope) { let values = message.values.into_iter().map(|v| symbolic_to_virtual_pair(&v)).collect::>(); let multiplicity = symbolic_to_virtual_pair(&message.multiplicity); - self.receives.push(Interaction::new(values, multiplicity, message.kind)); + self.receives.push(Interaction::new(values, multiplicity, message.kind, scope)); } } @@ -240,18 +240,27 @@ mod tests { let y = local[1]; let z = local[2]; - builder.send(AirInteraction::new( - vec![x.into(), y.into()], - AB::F::from_canonical_u32(3).into(), - InteractionKind::Alu, - )); - builder.send(AirInteraction::new( - vec![x + y, z.into()], - AB::F::from_canonical_u32(5).into(), - InteractionKind::Alu, - )); - - builder.receive(AirInteraction::new(vec![x.into()], y.into(), InteractionKind::Byte)); + builder.send( + AirInteraction::new( + vec![x.into(), y.into()], + AB::F::from_canonical_u32(3).into(), + InteractionKind::Alu, + ), + InteractionScope::Local, + ); + builder.send( + AirInteraction::new( + vec![x + y, z.into()], + AB::F::from_canonical_u32(5).into(), + InteractionKind::Alu, + ), + InteractionScope::Local, + ); + + builder.receive( + AirInteraction::new(vec![x.into()], y.into(), InteractionKind::Byte), + InteractionScope::Local, + ); } } diff --git a/crates/stark/src/lookup/debug.rs b/crates/stark/src/lookup/debug.rs index b555cb0471..8d051d8f82 100644 --- a/crates/stark/src/lookup/debug.rs +++ b/crates/stark/src/lookup/debug.rs @@ -5,7 +5,10 @@ use p3_field::{AbstractField, Field, PrimeField32, PrimeField64}; use p3_matrix::Matrix; use super::InteractionKind; -use crate::{air::MachineAir, MachineChip, StarkGenericConfig, StarkMachine, StarkProvingKey, Val}; +use crate::{ + air::{InteractionScope, MachineAir}, + MachineChip, StarkGenericConfig, StarkMachine, StarkProvingKey, Val, +}; /// The data for an interaction. #[derive(Debug)] @@ -61,6 +64,7 @@ pub fn debug_interactions>>( pkey: &StarkProvingKey, record: &A::Record, interaction_kinds: Vec, + scope: InteractionScope, ) -> (BTreeMap>>>, BTreeMap>) { let mut key_to_vec_data = BTreeMap::new(); let mut key_to_count = BTreeMap::new(); @@ -72,9 +76,12 @@ pub fn debug_interactions>>( let mut main = trace.clone(); let height = trace.clone().height(); - let nb_send_interactions = chip.sends().len(); + let sends = chip.sends().iter().filter(|s| s.scope == scope).collect::>(); + let receives = chip.receives().iter().filter(|r| r.scope == scope).collect::>(); + + let nb_send_interactions = sends.len(); for row in 0..height { - for (m, interaction) in chip.sends().iter().chain(chip.receives().iter()).enumerate() { + for (m, interaction) in sends.iter().chain(receives.iter()).enumerate() { if !interaction_kinds.contains(&interaction.kind) { continue; } @@ -94,7 +101,12 @@ pub fn debug_interactions>>( let expr: Val = value.apply(preprocessed_row, main.row_mut(row)); values.push(expr); } - let key = format!("{} {}", &interaction.kind.to_string(), vec_to_string(values)); + let key = format!( + "{} {} {}", + &interaction.scope.to_string(), + &interaction.kind.to_string(), + vec_to_string(values) + ); key_to_vec_data.entry(key.clone()).or_insert_with(Vec::new).push(InteractionData { chip_name: chip.name(), kind: interaction.kind, @@ -124,12 +136,17 @@ pub fn debug_interactions_with_all_chips( pkey: &StarkProvingKey, shards: &[A::Record], interaction_kinds: Vec, + scope: InteractionScope, ) -> bool where SC: StarkGenericConfig, SC::Val: PrimeField32, A: MachineAir, { + if scope == InteractionScope::Local { + assert!(shards.len() == 1); + } + let mut final_map = BTreeMap::new(); let mut total = SC::Val::zero(); @@ -138,7 +155,7 @@ where let mut total_events = 0; for shard in shards { let (_, count) = - debug_interactions::(chip, pkey, shard, interaction_kinds.clone()); + debug_interactions::(chip, pkey, shard, interaction_kinds.clone(), scope); total_events += count.len(); for (key, value) in count.iter() { let entry = diff --git a/crates/stark/src/lookup/interaction.rs b/crates/stark/src/lookup/interaction.rs index 04538aa179..0ff89ab592 100644 --- a/crates/stark/src/lookup/interaction.rs +++ b/crates/stark/src/lookup/interaction.rs @@ -3,7 +3,10 @@ use core::fmt::{Debug, Display}; use p3_air::VirtualPairCol; use p3_field::Field; +use crate::air::InteractionScope; + /// An interaction for a lookup or a permutation argument. +#[derive(Clone)] pub struct Interaction { /// The values of the interaction. pub values: Vec>, @@ -11,6 +14,8 @@ pub struct Interaction { pub multiplicity: VirtualPairCol, /// The kind of interaction. pub kind: InteractionKind, + /// The scope of the interaction. + pub scope: InteractionScope, } /// The type of interaction for a lookup argument. @@ -64,8 +69,9 @@ impl Interaction { values: Vec>, multiplicity: VirtualPairCol, kind: InteractionKind, + scope: InteractionScope, ) -> Self { - Self { values, multiplicity, kind } + Self { values, multiplicity, kind, scope } } /// The index of the argument in the lookup table. @@ -76,7 +82,10 @@ impl Interaction { impl Debug for Interaction { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Interaction").field("kind", &self.kind).finish_non_exhaustive() + f.debug_struct("Interaction") + .field("kind", &self.kind) + .field("scope", &self.scope) + .finish_non_exhaustive() } } diff --git a/crates/stark/src/machine.rs b/crates/stark/src/machine.rs index 4f983b7e1f..d0d85e0e4e 100644 --- a/crates/stark/src/machine.rs +++ b/crates/stark/src/machine.rs @@ -7,12 +7,12 @@ use p3_field::{AbstractExtensionField, AbstractField, Field, PrimeField32}; use p3_matrix::{dense::RowMajorMatrix, Dimensions, Matrix}; use p3_maybe_rayon::prelude::*; use serde::{de::DeserializeOwned, Deserialize, Serialize}; -use std::{cmp::Reverse, fmt::Debug, time::Instant}; +use std::{array, cmp::Reverse, fmt::Debug, time::Instant}; use tracing::instrument; use super::{debug_constraints, Dom}; use crate::{ - air::{MachineAir, MachineProgram}, + air::{InteractionScope, MachineAir, MachineProgram}, lookup::{debug_interactions_with_all_chips, InteractionKind}, record::MachineRecord, DebugConstraintBuilder, ShardProof, VerifierConstraintFolder, @@ -34,12 +34,20 @@ pub struct StarkMachine { /// The number of public values elements that the machine uses num_pv_elts: usize, + + /// Contains a global bus. This should be true for the core machine and false otherwise. + contains_global_bus: bool, } impl StarkMachine { /// Creates a new [`StarkMachine`]. - pub const fn new(config: SC, chips: Vec, A>>, num_pv_elts: usize) -> Self { - Self { config, chips, num_pv_elts } + pub const fn new( + config: SC, + chips: Vec, A>>, + num_pv_elts: usize, + contains_global_bus: bool, + ) -> Self { + Self { config, chips, num_pv_elts, contains_global_bus } } } @@ -114,6 +122,11 @@ impl>> StarkMachine { self.num_pv_elts } + /// Returns whether the machine contains a global bus. + pub const fn contains_global_bus(&self) -> bool { + self.contains_global_bus + } + /// Returns the id of all chips in the machine that have preprocessed columns. pub fn preprocessed_chip_ids(&self) -> Vec { self.chips @@ -189,7 +202,8 @@ impl>> StarkMachine { }); // Order the chips and traces by trace size (biggest first), and get the ordering map. - named_preprocessed_traces.sort_by_key(|(_, trace)| Reverse(trace.height())); + named_preprocessed_traces + .sort_by_key(|(name, trace)| Reverse((trace.height(), name.clone()))); let pcs = self.config.pcs(); @@ -236,8 +250,20 @@ impl>> StarkMachine { &self, records: &mut [A::Record], opts: &::Config, + chips_filter: Option<&[String]>, ) { - let chips = self.chips(); + let chips = self + .chips + .iter() + .filter(|chip| { + if let Some(chips_filter) = chips_filter { + chips_filter.contains(&chip.name()) + } else { + true + } + }) + .collect::>(); + records.iter_mut().for_each(|record| { chips.iter().for_each(|chip| { tracing::debug_span!("chip dependencies", chip = chip.name()).in_scope(|| { @@ -268,12 +294,16 @@ impl>> StarkMachine { SC::Challenger: Clone, A: for<'a> Air>, { + let contains_global_bus = self.contains_global_bus(); + // Observe the preprocessed commitment. vk.observe_into(challenger); tracing::debug_span!("observe challenges for all shards").in_scope(|| { - proof.shard_proofs.iter().for_each(|proof| { - challenger.observe(proof.commitment.main_commit.clone()); - challenger.observe_slice(&proof.public_values[0..self.num_pv_elts()]); + proof.shard_proofs.iter().for_each(|shard_proof| { + if contains_global_bus { + challenger.observe(shard_proof.commitment.global_main_commit.clone()); + } + challenger.observe_slice(&shard_proof.public_values[0..self.num_pv_elts()]); }); }); @@ -282,6 +312,15 @@ impl>> StarkMachine { return Err(MachineVerificationError::EmptyProof); } + // Obtain the challenges used for the global permutation argument. + let global_permutation_challenges: [SC::Challenge; 2] = array::from_fn(|_| { + if contains_global_bus { + challenger.sample_ext_element() + } else { + SC::Challenge::zero() + } + }); + tracing::debug_span!("verify shard proofs").in_scope(|| { for (i, shard_proof) in proof.shard_proofs.iter().enumerate() { tracing::debug_span!("verifying shard", shard = i).in_scope(|| { @@ -293,6 +332,7 @@ impl>> StarkMachine { &chips, &mut challenger.clone(), shard_proof, + &global_permutation_challenges, ) .map_err(MachineVerificationError::InvalidShardProof) })?; @@ -304,13 +344,30 @@ impl>> StarkMachine { // Verify the cumulative sum is 0. tracing::debug_span!("verify cumulative sum is 0").in_scope(|| { let mut sum = SC::Challenge::zero(); - for proof in proof.shard_proofs.iter() { - sum += proof.cumulative_sum(); + let mut local_err = None; + for (shard_num, proof) in proof.shard_proofs.iter().enumerate() { + sum += proof.cumulative_sum(InteractionScope::Global); + if !proof.cumulative_sum(InteractionScope::Local).is_zero() { + local_err = Some(MachineVerificationError::NonZeroCumulativeSum( + InteractionScope::Local, + shard_num + 1, + )); + break; + } } - match sum.is_zero() { - true => Ok(()), - false => Err(MachineVerificationError::NonZeroCumulativeSum), + + if let Some(err) = local_err { + return Err(err); + } + + if !sum.is_zero() { + return Err(MachineVerificationError::NonZeroCumulativeSum( + InteractionScope::Global, + 0, + )); } + + Ok(()) }) } @@ -327,13 +384,18 @@ impl>> StarkMachine { { tracing::debug!("checking constraints for each shard"); - // Obtain the challenges used for the permutation argument. + // Obtain the challenges used for the global permutation argument. let mut permutation_challenges: Vec = Vec::new(); for _ in 0..2 { permutation_challenges.push(challenger.sample_ext_element()); } - let mut cumulative_sum = SC::Challenge::zero(); + // Obtain the challenges used for the local permutation argument. + for _ in 0..2 { + permutation_challenges.push(challenger.sample_ext_element()); + } + + let mut global_cumulative_sum = SC::Challenge::zero(); for shard in records.iter() { // Filter the chips based on what is used. let chips = self.shard_chips(shard).collect::>(); @@ -357,19 +419,31 @@ impl>> StarkMachine { .par_iter() .zip(traces.par_iter_mut()) .map(|(chip, (main_trace, pre_trace))| { - let perm_trace = chip.generate_permutation_trace( + let (trace, global_sum, local_sum) = chip.generate_permutation_trace( *pre_trace, main_trace, &permutation_challenges, ); - let cumulative_sum = - perm_trace.row_slice(main_trace.height() - 1).last().copied().unwrap(); - (perm_trace, cumulative_sum) + (trace, [global_sum, local_sum]) }) .unzip_into_vecs(&mut permutation_traces, &mut cumulative_sums); }); - cumulative_sum += cumulative_sums.iter().copied().sum::(); + global_cumulative_sum += + cumulative_sums.iter().map(|sum| sum[0]).sum::(); + + let local_cumulative_sum = + cumulative_sums.iter().map(|sum| sum[1]).sum::(); + if !local_cumulative_sum.is_zero() { + debug_interactions_with_all_chips::( + self, + pk, + &[shard.clone()], + InteractionKind::all_kinds(), + InteractionScope::Local, + ); + panic!("Local cumulative sum is not zero"); + } // Compute some statistics. for i in 0..chips.len() { @@ -399,7 +473,8 @@ impl>> StarkMachine { &traces[i].0, &permutation_traces[i], &permutation_challenges, - shard.public_values(), + &shard.public_values(), + &cumulative_sums[i], ); } }); @@ -407,17 +482,16 @@ impl>> StarkMachine { tracing::info!("Constraints verified successfully"); - println!("Cumulative sum: {cumulative_sum}"); - - // If the cumulative sum is not zero, debug the interactions. - if !cumulative_sum.is_zero() { + // If the global cumulative sum is not zero, debug the interactions. + if !global_cumulative_sum.is_zero() { debug_interactions_with_all_chips::( self, pk, &records, InteractionKind::all_kinds(), + InteractionScope::Global, ); - panic!("Cumulative sum is not zero"); + panic!("Global cumulative sum is not zero"); } } } @@ -429,7 +503,7 @@ pub enum MachineVerificationError { /// An error occurred during the verification of a global proof. InvalidGlobalProof(VerificationError), /// The cumulative sum is non-zero. - NonZeroCumulativeSum, + NonZeroCumulativeSum(InteractionScope, usize), /// The public values digest is invalid. InvalidPublicValuesDigest, /// The debug interactions failed. @@ -458,8 +532,8 @@ impl Debug for MachineVerificationError { MachineVerificationError::InvalidGlobalProof(e) => { write!(f, "Invalid global proof: {:?}", e) } - MachineVerificationError::NonZeroCumulativeSum => { - write!(f, "Non-zero cumulative sum") + MachineVerificationError::NonZeroCumulativeSum(scope, shard) => { + write!(f, "Non-zero cumulative sum. Scope: {}, Shard: {}", scope, shard) } MachineVerificationError::InvalidPublicValuesDigest => { write!(f, "Invalid public values digest") diff --git a/crates/stark/src/permutation.rs b/crates/stark/src/permutation.rs index 583cb80641..950dc55409 100644 --- a/crates/stark/src/permutation.rs +++ b/crates/stark/src/permutation.rs @@ -1,19 +1,28 @@ use std::borrow::Borrow; +use hashbrown::HashMap; use itertools::Itertools; use p3_air::{ExtensionBuilder, PairBuilder}; -use p3_field::{AbstractExtensionField, AbstractField, ExtensionField, Field, Powers, PrimeField}; +use p3_field::{AbstractExtensionField, AbstractField, ExtensionField, Field, PrimeField}; use p3_matrix::{dense::RowMajorMatrix, Matrix}; use p3_maybe_rayon::prelude::*; use rayon_scan::ScanParallelIterator; +use strum::IntoEnumIterator; -use crate::{air::MultiTableAirBuilder, lookup::Interaction}; +use crate::{ + air::{InteractionScope, MultiTableAirBuilder}, + lookup::Interaction, +}; /// Computes the width of the permutation trace. #[inline] #[must_use] pub const fn permutation_trace_width(num_interactions: usize, batch_size: usize) -> usize { - num_interactions.div_ceil(batch_size) + 1 + if num_interactions == 0 { + 0 + } else { + num_interactions.div_ceil(batch_size) + 1 + } } /// Populates a permutation row. @@ -26,10 +35,14 @@ pub fn populate_permutation_row>( main_row: &[F], sends: &[Interaction], receives: &[Interaction], - alpha: EF, - betas: Powers, + random_elements: &[EF], batch_size: usize, ) { + let alpha = random_elements[0]; + + // Generate the RLC elements to uniquely identify each item in the looked up tuple. + let betas = random_elements[1].powers(); + let interaction_chunks = &sends .iter() .map(|int| (int, true)) @@ -60,6 +73,50 @@ pub fn populate_permutation_row>( } } +/// Returns the sends, receives, and permutation trace width grouped by scope. +#[allow(clippy::type_complexity)] +pub fn get_grouped_maps( + sends: &[Interaction], + receives: &[Interaction], + batch_size: usize, +) -> ( + HashMap>>, + HashMap>>, + HashMap, +) { + // Create a hashmap of scope -> vec. + let mut sends = sends.to_vec(); + sends.sort_by_key(|k| k.scope); + let grouped_sends: HashMap<_, _> = sends + .iter() + .chunk_by(|int| int.scope) + .into_iter() + .map(|(k, values)| (k, values.cloned().collect_vec())) + .collect(); + + // Create a hashmap of scope -> vec. + let mut receives = receives.to_vec(); + receives.sort_by_key(|k| k.scope); + let grouped_receives: HashMap<_, _> = receives + .iter() + .chunk_by(|int| int.scope) + .into_iter() + .map(|(k, values)| (k, values.cloned().collect_vec())) + .collect(); + + // Create a hashmap of scope -> permutation trace width. + let grouped_widths = InteractionScope::iter() + .map(|scope| { + let empty_vec = vec![]; + let sends = grouped_sends.get(&scope).unwrap_or(&empty_vec); + let receives = grouped_receives.get(&scope).unwrap_or(&empty_vec); + (scope, permutation_trace_width(sends.len() + receives.len(), batch_size)) + }) + .collect(); + + (grouped_sends, grouped_receives, grouped_widths) +} + /// Generates the permutation trace for the given chip and main trace based on a variant of `LogUp`. /// /// The permutation trace has `(N+1)*EF::NUM_COLS` columns, where N is the number of interactions in @@ -71,81 +128,109 @@ pub fn generate_permutation_trace>( main: &RowMajorMatrix, random_elements: &[EF], batch_size: usize, -) -> RowMajorMatrix { - // Generate the RLC elements to uniquely identify each interaction. - let alpha = random_elements[0]; - - // Generate the RLC elements to uniquely identify each item in the looked up tuple. - let betas = random_elements[1].powers(); +) -> (RowMajorMatrix, EF, EF) { + let (grouped_sends, grouped_receives, grouped_widths) = + get_grouped_maps(sends, receives, batch_size); - // Iterate over the rows of the main trace to compute the permutation trace values. In - // particular, for each row i, interaction j, and columns c_0, ..., c_{k-1} we compute the sum: - // - // permutation_trace_values[i][j] = \alpha^j + \sum_k \beta^k * f_{i, c_k} - // - // where f_{i, c_k} is the value at row i for column c_k. The computed value is essentially a - // fingerprint for the interaction. - let permutation_trace_width = permutation_trace_width(sends.len() + receives.len(), batch_size); let height = main.height(); + let permutation_trace_width = grouped_widths.values().sum::(); let mut permutation_trace = RowMajorMatrix::new( vec![EF::zero(); permutation_trace_width * height], permutation_trace_width, ); - // Compute the permutation trace values in parallel. - match preprocessed { - Some(prep) => { - permutation_trace - .par_rows_mut() - .zip_eq(prep.par_row_slices()) - .zip_eq(main.par_row_slices()) - .for_each(|((row, prep_row), main_row)| { - populate_permutation_row( - row, - prep_row, - main_row, - sends, - receives, - alpha, - betas.clone(), - batch_size, - ); - }); + let mut global_cumulative_sum = EF::zero(); + let mut local_cumulative_sum = EF::zero(); + + for scope in InteractionScope::iter() { + let empty_vec = vec![]; + let sends = grouped_sends.get(&scope).unwrap_or(&empty_vec); + let receives = grouped_receives.get(&scope).unwrap_or(&empty_vec); + + if sends.is_empty() && receives.is_empty() { + continue; } - None => { - permutation_trace.par_rows_mut().zip_eq(main.par_row_slices()).for_each( - |(row, main_row)| { - populate_permutation_row( - row, - &[], - main_row, - sends, - receives, - alpha, - betas.clone(), - batch_size, - ); - }, - ); + + let random_elements = match scope { + InteractionScope::Global => &random_elements[0..2], + InteractionScope::Local => &random_elements[2..4], + }; + + let row_range = match scope { + InteractionScope::Global => { + 0..*grouped_widths.get(&InteractionScope::Global).expect("Expected global scope") + } + InteractionScope::Local => { + let global_perm_width = + *grouped_widths.get(&InteractionScope::Global).expect("Expected global scope"); + let local_perm_width = + *grouped_widths.get(&InteractionScope::Local).expect("Expected local scope"); + global_perm_width..global_perm_width + local_perm_width + } + }; + + // Compute the permutation trace values in parallel. + match preprocessed { + Some(prep) => { + permutation_trace + .par_rows_mut() + .zip_eq(prep.par_row_slices()) + .zip_eq(main.par_row_slices()) + .for_each(|((row, prep_row), main_row)| { + populate_permutation_row( + &mut row[row_range.start..row_range.end], + prep_row, + main_row, + sends, + receives, + random_elements, + batch_size, + ); + }); + } + None => { + permutation_trace.par_rows_mut().zip_eq(main.par_row_slices()).for_each( + |(row, main_row)| { + populate_permutation_row( + &mut row[row_range.start..row_range.end], + &[], + main_row, + sends, + receives, + random_elements, + batch_size, + ); + }, + ); + } } - } - let zero = EF::zero(); - let cumulative_sums = permutation_trace - .par_rows_mut() - .map(|row| row[0..permutation_trace_width - 1].iter().copied().sum::()) - .collect::>(); + let zero = EF::zero(); + let cumulative_sums = permutation_trace + .par_rows_mut() + .map(|row| row[row_range.start..row_range.end - 1].iter().copied().sum::()) + .collect::>(); - let cumulative_sums = - cumulative_sums.into_par_iter().scan(|a, b| *a + *b, zero).collect::>(); + let cumulative_sums = + cumulative_sums.into_par_iter().scan(|a, b| *a + *b, zero).collect::>(); - permutation_trace.par_rows_mut().zip_eq(cumulative_sums.into_par_iter()).for_each( - |(row, cumulative_sum)| { - *row.last_mut().unwrap() = cumulative_sum; - }, - ); + match scope { + InteractionScope::Global => { + global_cumulative_sum = *cumulative_sums.last().unwrap(); + } + InteractionScope::Local => { + local_cumulative_sum = *cumulative_sums.last().unwrap(); + } + } - permutation_trace + permutation_trace.par_rows_mut().zip_eq(cumulative_sums.clone().into_par_iter()).for_each( + |(row, cumulative_sum)| { + row[row_range.end - 1] = cumulative_sum; + }, + ); + } + + (permutation_trace, global_cumulative_sum, local_cumulative_sum) } /// Evaluates the permutation constraints for the given chip. @@ -154,7 +239,8 @@ pub fn generate_permutation_trace>( /// - The running sum column starts at zero. /// - That the RLC per interaction is computed correctly. /// - The running sum column ends at the (currently) given cumalitive sum. -pub fn eval_permutation_constraints( +#[allow(clippy::too_many_lines)] +pub fn eval_permutation_constraints<'a, F, AB>( sends: &[Interaction], receives: &[Interaction], batch_size: usize, @@ -162,14 +248,18 @@ pub fn eval_permutation_constraints( ) where F: Field, AB::EF: ExtensionField, - AB: MultiTableAirBuilder + PairBuilder, + AB: MultiTableAirBuilder<'a, F = F> + PairBuilder, + AB: 'a, { + let (grouped_sends, grouped_receives, grouped_widths) = + get_grouped_maps(sends, receives, batch_size); + // Get the permutation challenges. let permutation_challenges = builder.permutation_randomness(); - let (alpha, beta): (AB::ExprEF, AB::ExprEF) = - (permutation_challenges[0].into(), permutation_challenges[1].into()); - - // Get the preprocssed, main, and permutation trace. + let random_elements: Vec = + permutation_challenges.iter().map(|x| (*x).into()).collect(); + let cumulative_sums: Vec = + builder.cumulative_sums().iter().map(|x| (*x).into()).collect(); let preprocessed = builder.preprocessed(); let main = builder.main(); let perm = builder.permutation().to_row_major_matrix(); @@ -184,84 +274,127 @@ pub fn eval_permutation_constraints( let perm_next = perm.row_slice(1); let perm_next: &[AB::VarEF] = (*perm_next).borrow(); - // Ensure that each batch sum m_i/f_i is computed correctly. - let interaction_chunks = &sends - .iter() - .map(|int| (int, true)) - .chain(receives.iter().map(|int| (int, false))) - .chunks(batch_size); - // Assert that the permutation trace width is correct. - let expected_perm_width = permutation_trace_width(sends.len() + receives.len(), batch_size); + let expected_perm_width = grouped_widths.values().sum::(); if perm_width != expected_perm_width { panic!( "permutation trace width is incorrect: expected {expected_perm_width}, got {perm_width}", ); } - // Assert that the i-eth entry is equal to the sum_i m_i/rlc_i by constraints: - // entry * \prod_i rlc_i = \sum_i m_i * \prod_{j!=i} rlc_j over all columns of the permutation - // trace except the last column. - for (entry, chunk) in perm_local[0..perm_local.len() - 1].iter().zip(interaction_chunks) { - // First, we calculate the random linear combinations and multiplicities with the correct - // sign depending on wetther the interaction is a send or a recieve. - let mut rlcs: Vec = Vec::with_capacity(batch_size); - let mut multiplicities: Vec = Vec::with_capacity(batch_size); - for (interaction, is_send) in chunk { - let mut rlc = alpha.clone(); - let mut betas = beta.powers(); - - rlc += betas.next().unwrap() - * AB::ExprEF::from_canonical_usize(interaction.argument_index()); - for (field, beta) in interaction.values.iter().zip(betas.clone()) { - let elem = field.apply::(&preprocessed_local, main_local); - rlc += beta * elem; + for scope in InteractionScope::iter() { + let random_elements = match scope { + InteractionScope::Global => &random_elements[0..2], + InteractionScope::Local => &random_elements[2..4], + }; + + let (alpha, beta) = (&random_elements[0], &random_elements[1]); + + let perm_local = match scope { + InteractionScope::Global => &perm_local[0..*grouped_widths.get(&scope).unwrap()], + InteractionScope::Local => { + let global_perm_width = *grouped_widths.get(&InteractionScope::Global).unwrap(); + &perm_local + [global_perm_width..global_perm_width + *grouped_widths.get(&scope).unwrap()] + } + }; + + let perm_next = match scope { + InteractionScope::Global => &perm_next[0..*grouped_widths.get(&scope).unwrap()], + InteractionScope::Local => { + let global_perm_width = *grouped_widths.get(&InteractionScope::Global).unwrap(); + &perm_next + [global_perm_width..global_perm_width + *grouped_widths.get(&scope).unwrap()] } - rlcs.push(rlc); - - let send_factor = if is_send { AB::F::one() } else { -AB::F::one() }; - multiplicities.push( - interaction - .multiplicity - .apply::(&preprocessed_local, main_local) - * send_factor, - ); + }; + + let empty_vec = vec![]; + let sends = grouped_sends.get(&scope).unwrap_or(&empty_vec); + let receives = grouped_receives.get(&scope).unwrap_or(&empty_vec); + + if sends.is_empty() && receives.is_empty() { + continue; } - // Now we can calculate the numerator and denominator of the combined batch. - let mut product = AB::ExprEF::one(); - let mut numerator = AB::ExprEF::zero(); - for (i, (m, rlc)) in multiplicities.into_iter().zip(rlcs.iter()).enumerate() { - // Calculate the running product of all rlcs. - product *= rlc.clone(); - - // Calculate the product of all but the current rlc. - let mut all_but_current = AB::ExprEF::one(); - for other_rlc in rlcs.iter().enumerate().filter(|(j, _)| i != *j).map(|(_, rlc)| rlc) { - all_but_current *= other_rlc.clone(); + // Ensure that each batch sum m_i/f_i is computed correctly. + let interaction_chunks = &sends + .iter() + .map(|int| (int, true)) + .chain(receives.iter().map(|int| (int, false))) + .chunks(batch_size); + + // Assert that the i-eth entry is equal to the sum_i m_i/rlc_i by constraints: + // entry * \prod_i rlc_i = \sum_i m_i * \prod_{j!=i} rlc_j over all columns of the permutation + // trace except the last column. + for (entry, chunk) in perm_local[0..perm_local.len() - 1].iter().zip(interaction_chunks) { + // First, we calculate the random linear combinations and multiplicities with the correct + // sign depending on wetther the interaction is a send or a recieve. + let mut rlcs: Vec = Vec::with_capacity(batch_size); + let mut multiplicities: Vec = Vec::with_capacity(batch_size); + for (interaction, is_send) in chunk { + let mut rlc = alpha.clone(); + let mut betas = beta.powers(); + + rlc += betas.next().unwrap() + * AB::ExprEF::from_canonical_usize(interaction.argument_index()); + for (field, beta) in interaction.values.iter().zip(betas.clone()) { + let elem = field.apply::(&preprocessed_local, main_local); + rlc += beta * elem; + } + rlcs.push(rlc); + + let send_factor = if is_send { AB::F::one() } else { -AB::F::one() }; + multiplicities.push( + interaction + .multiplicity + .apply::(&preprocessed_local, main_local) + * send_factor, + ); + } + + // Now we can calculate the numerator and denominator of the combined batch. + let mut product = AB::ExprEF::one(); + let mut numerator = AB::ExprEF::zero(); + for (i, (m, rlc)) in multiplicities.into_iter().zip(rlcs.iter()).enumerate() { + // Calculate the running product of all rlcs. + product *= rlc.clone(); + + // Calculate the product of all but the current rlc. + let mut all_but_current = AB::ExprEF::one(); + for other_rlc in + rlcs.iter().enumerate().filter(|(j, _)| i != *j).map(|(_, rlc)| rlc) + { + all_but_current *= other_rlc.clone(); + } + numerator += AB::ExprEF::from_base(m) * all_but_current; } - numerator += AB::ExprEF::from_base(m) * all_but_current; + + // Finally, assert that the entry is equal to the numerator divided by the product. + let entry: AB::ExprEF = (*entry).into(); + builder.assert_eq_ext(product.clone() * entry.clone(), numerator); } - // Finally, assert that the entry is equal to the numerator divided by the product. - let entry: AB::ExprEF = (*entry).into(); - builder.assert_eq_ext(product.clone() * entry.clone(), numerator); - } + // Compute the running local and next permutation sums. + let perm_width = grouped_widths.get(&scope).unwrap(); + let sum_local = + perm_local[..perm_width - 1].iter().map(|x| (*x).into()).sum::(); + let sum_next = perm_next[..perm_width - 1].iter().map(|x| (*x).into()).sum::(); + let phi_local: AB::ExprEF = (*perm_local.last().unwrap()).into(); + let phi_next: AB::ExprEF = (*perm_next.last().unwrap()).into(); - // Compute the running local and next permutation sums. - let cumulative_sum = builder.cumulative_sum(); - let sum_local = perm_local[..perm_width - 1].iter().map(|x| (*x).into()).sum::(); - let sum_next = perm_next[..perm_width - 1].iter().map(|x| (*x).into()).sum::(); - let phi_local: AB::ExprEF = (*perm_local.last().unwrap()).into(); - let phi_next: AB::ExprEF = (*perm_next.last().unwrap()).into(); + // Assert that cumulative sum is initialized to `phi_local` on the first row. + builder.when_first_row().assert_eq_ext(phi_local.clone(), sum_local); - // Assert that cumulative sum is initialized to `phi_local` on the first row. - builder.when_first_row().assert_eq_ext(phi_local.clone(), sum_local); + // Assert that the cumulative sum is constrained to `phi_next - phi_local` on the transition + // rows. + builder.when_transition().assert_eq_ext(phi_next - phi_local.clone(), sum_next); - // Assert that the cumulative sum is constrained to `phi_next - phi_local` on the transition - // rows. - builder.when_transition().assert_eq_ext(phi_next - phi_local.clone(), sum_next); + // Assert that the cumulative sum is constrained to `phi_local` on the last row. + let cumulative_sum = match scope { + InteractionScope::Global => &cumulative_sums[0], + InteractionScope::Local => &cumulative_sums[1], + }; - // Assert that the cumulative sum is constrained to `phi_local` on the last row. - builder.when_last_row().assert_eq_ext(*perm_local.last().unwrap(), cumulative_sum); + builder.when_last_row().assert_eq_ext(*perm_local.last().unwrap(), cumulative_sum.clone()); + } } diff --git a/crates/stark/src/prover.rs b/crates/stark/src/prover.rs index c4dc7656e6..35c98eaa30 100644 --- a/crates/stark/src/prover.rs +++ b/crates/stark/src/prover.rs @@ -1,9 +1,10 @@ use core::fmt::Display; +use hashbrown::HashMap; use itertools::Itertools; use serde::{de::DeserializeOwned, Serialize}; -use std::{cmp::Reverse, error::Error, time::Instant}; +use std::{array, cmp::Reverse, error::Error, time::Instant}; -use crate::{AirOpenedValues, ChipOpenedValues, ShardOpenedValues}; +use crate::{air::InteractionScope, AirOpenedValues, ChipOpenedValues, ShardOpenedValues}; use p3_air::Air; use p3_challenger::{CanObserve, FieldChallenger}; use p3_commit::{Pcs, PolynomialSpace}; @@ -17,17 +18,26 @@ use super::{ VerifierConstraintFolder, }; use crate::{ - air::MachineAir, lookup::InteractionBuilder, opts::SP1CoreOpts, record::MachineRecord, - Challenger, DebugConstraintBuilder, MachineChip, MachineProof, PackedChallenge, PcsProverData, - ProverConstraintFolder, ShardCommitment, ShardMainData, ShardProof, StarkVerifyingKey, + air::MachineAir, config::ZeroCommitment, lookup::InteractionBuilder, opts::SP1CoreOpts, + record::MachineRecord, Challenger, DebugConstraintBuilder, MachineChip, MachineProof, + PackedChallenge, PcsProverData, ProverConstraintFolder, ShardCommitment, ShardMainData, + ShardProof, StarkVerifyingKey, }; +/// A merged prover data item from the global and local prover data. +pub struct MergedProverDataItem<'a, M> { + /// The trace. + pub trace: &'a M, + /// The main data index. + pub main_data_idx: usize, +} + /// An algorithmic & hardware independent prover implementation for any [`MachineAir`]. pub trait MachineProver>: 'static + Send + Sync { /// The type used to store the traces. - type DeviceMatrix; + type DeviceMatrix: Matrix; /// The type used to store the polynomial commitment schemes data. type DeviceProverData; @@ -48,14 +58,22 @@ pub trait MachineProver>: fn setup(&self, program: &A::Program) -> (Self::DeviceProvingKey, StarkVerifyingKey); /// Generate the main traces. - fn generate_traces(&self, record: &A::Record) -> Vec<(String, RowMajorMatrix>)> { - // Filter the chips based on what is used. + fn generate_traces( + &self, + record: &A::Record, + interaction_scope: InteractionScope, + ) -> Vec<(String, RowMajorMatrix>)> { let shard_chips = self.shard_chips(record).collect::>(); + let chips = shard_chips + .iter() + .filter(|chip| chip.commit_scope() == interaction_scope) + .collect::>(); + assert!(!chips.is_empty()); // For each chip, generate the trace. let parent_span = tracing::debug_span!("generate traces for shard"); parent_span.in_scope(|| { - shard_chips + chips .par_iter() .map(|chip| { let chip_name = chip.name(); @@ -76,7 +94,7 @@ pub trait MachineProver>: /// Commit to the main traces. fn commit( &self, - record: A::Record, + record: &A::Record, traces: Vec<(String, RowMajorMatrix>)>, ) -> ShardMainData; @@ -98,8 +116,10 @@ pub trait MachineProver>: fn open( &self, pk: &Self::DeviceProvingKey, - data: ShardMainData, + global_data: Option>, + local_data: ShardMainData, challenger: &mut SC::Challenger, + global_permutation_challenges: &[SC::Challenge], ) -> Result, Self::Error>; /// Generate a proof for the given records. @@ -147,6 +167,100 @@ pub trait MachineProver>: { self.machine().debug_constraints(pk, records, challenger); } + + /// Merge the global and local chips' sorted traces. + #[allow(clippy::type_complexity)] + fn merge_shard_traces<'a, 'b>( + &'a self, + global_traces: &'b [Self::DeviceMatrix], + global_chip_ordering: &'b HashMap, + local_traces: &'b [Self::DeviceMatrix], + local_chip_ordering: &'b HashMap, + ) -> ( + HashMap, + Vec, + Vec>, + ) + where + 'a: 'b, + { + // Get the sort order of the chips. + let global_chips = global_chip_ordering + .iter() + .sorted_by_key(|(_, &i)| i) + .map(|chip| chip.0.clone()) + .collect::>(); + let local_chips = local_chip_ordering + .iter() + .sorted_by_key(|(_, &i)| i) + .map(|chip| chip.0.clone()) + .collect::>(); + + let mut merged_chips = Vec::with_capacity(global_traces.len() + local_traces.len()); + let mut merged_prover_data = Vec::with_capacity(global_chips.len() + local_chips.len()); + + assert!(global_traces.len() == global_chips.len()); + let mut global_iter = global_traces.iter().zip(global_chips.iter()).enumerate(); + assert!(local_traces.len() == local_chips.len()); + let mut local_iter = local_traces.iter().zip(local_chips.iter()).enumerate(); + + let mut global_next = global_iter.next(); + let mut local_next = local_iter.next(); + + let mut chip_scopes = Vec::new(); + + while global_next.is_some() || local_next.is_some() { + match (global_next, local_next) { + (Some(global), Some(local)) => { + let (global_prover_data_idx, (global_trace, global_chip)) = global; + let (local_prover_data_idx, (local_trace, local_chip)) = local; + if global_trace.height() >= local_trace.height() { + merged_chips.push(global_chip.clone()); + chip_scopes.push(InteractionScope::Global); + merged_prover_data.push(MergedProverDataItem { + trace: global_trace, + main_data_idx: global_prover_data_idx, + }); + global_next = global_iter.next(); + } else { + merged_chips.push(local_chip.clone()); + chip_scopes.push(InteractionScope::Local); + merged_prover_data.push(MergedProverDataItem { + trace: local_trace, + main_data_idx: local_prover_data_idx, + }); + local_next = local_iter.next(); + } + } + (Some(global), None) => { + let (global_prover_data_idx, (global_trace, global_chip)) = global; + merged_chips.push(global_chip.clone()); + chip_scopes.push(InteractionScope::Global); + merged_prover_data.push(MergedProverDataItem { + trace: global_trace, + main_data_idx: global_prover_data_idx, + }); + global_next = global_iter.next(); + } + (None, Some(local)) => { + let (local_prover_data_idx, (local_trace, local_chip)) = local; + merged_chips.push(local_chip.clone()); + chip_scopes.push(InteractionScope::Local); + merged_prover_data.push(MergedProverDataItem { + trace: local_trace, + main_data_idx: local_prover_data_idx, + }); + local_next = local_iter.next(); + } + (None, None) => break, + } + } + + let chip_ordering = + merged_chips.iter().enumerate().map(|(i, name)| (name.clone(), i)).collect(); + + (chip_ordering, chip_scopes, merged_prover_data) + } } /// A proving key for any [`MachineAir`] that is agnostic to hardware. @@ -209,7 +323,7 @@ where fn commit( &self, - record: A::Record, + record: &A::Record, mut named_traces: Vec<(String, RowMajorMatrix>)>, ) -> ShardMainData { // Order the chips and traces by trace size (biggest first), and get the ordering map. @@ -250,15 +364,49 @@ where fn open( &self, pk: &StarkProvingKey, - mut data: ShardMainData, + global_data: Option>, + local_data: ShardMainData, challenger: &mut ::Challenger, + global_permutation_challenges: &[SC::Challenge], ) -> Result, Self::Error> { - let chips = self.machine().shard_chips_ordered(&data.chip_ordering).collect::>(); + let (global_traces, global_main_commit, global_main_data, global_chip_ordering) = + if let Some(global_data) = global_data { + let ShardMainData { + traces: global_traces, + main_commit: global_main_commit, + main_data: global_main_data, + chip_ordering: global_chip_ordering, + public_values: _, + } = global_data; + (global_traces, global_main_commit, Some(global_main_data), global_chip_ordering) + } else { + (vec![], self.config().pcs().zero_commitment(), None, HashMap::new()) + }; + + let ShardMainData { + traces: local_traces, + main_commit: local_main_commit, + main_data: local_main_data, + chip_ordering: local_chip_ordering, + public_values: local_public_values, + } = local_data; + + // Merge the chip ordering and traces from the global and local data. + let (all_chips_ordering, all_chip_scopes, all_shard_data) = self.merge_shard_traces( + &global_traces, + &global_chip_ordering, + &local_traces, + &local_chip_ordering, + ); + + let chips = self.machine().shard_chips_ordered(&all_chips_ordering).collect::>(); + + assert!(chips.len() == all_shard_data.len()); + let config = self.machine().config(); - // Get the traces. - let traces = &mut data.traces; - let degrees = traces.iter().map(|trace| trace.height()).collect::>(); + let degrees = + all_shard_data.iter().map(|shard_data| shard_data.trace.height()).collect::>(); let log_degrees = degrees.iter().map(|degree| log2_strict_usize(*degree)).collect::>(); @@ -270,13 +418,24 @@ where let trace_domains = degrees.iter().map(|degree| pcs.natural_domain_for_degree(*degree)).collect::>(); - // Obtain the challenges used for the permutation argument. - let mut permutation_challenges: Vec = Vec::new(); + // Observe the main commitment. + challenger.observe(local_main_commit.clone()); + + // Obtain the challenges used for the local permutation argument. + let mut local_permutation_challenges: Vec = Vec::new(); for _ in 0..2 { - permutation_challenges.push(challenger.sample_ext_element()); + local_permutation_challenges.push(challenger.sample_ext_element()); } + + let permutation_challenges = global_permutation_challenges + .iter() + .chain(local_permutation_challenges.iter()) + .copied() + .collect::>(); + let packed_perm_challenges = permutation_challenges .iter() + .chain(local_permutation_challenges.iter()) .map(|c| PackedChallenge::::from_f(*c)) .collect::>(); @@ -285,25 +444,24 @@ where tracing::debug_span!("generate permutation traces").in_scope(|| { chips .par_iter() - .zip(traces.par_iter_mut()) - .map(|(chip, main_trace): (&&MachineChip, _)| { + .zip(all_shard_data.par_iter()) + .map(|(chip, shard_data)| { let preprocessed_trace = pk.chip_ordering.get(&chip.name()).map(|&index| &pk.traces[index]); - let perm_trace = chip.generate_permutation_trace( + let (perm_trace, global_sum, local_sum) = chip.generate_permutation_trace( preprocessed_trace, - main_trace, + shard_data.trace, &permutation_challenges, ); - let cumulative_sum = - perm_trace.row_slice(main_trace.height() - 1).last().copied().unwrap(); - ((perm_trace, preprocessed_trace), cumulative_sum) + ((perm_trace, preprocessed_trace), [global_sum, local_sum]) }) .unzip() }); // Compute some statistics. for i in 0..chips.len() { - let trace_width = traces[i].width(); + let trace_width = all_shard_data[i].trace.width(); + let trace_height = all_shard_data[i].trace.height(); let prep_width = prep_traces[i].map_or(0, |x| x.width()); let permutation_width = permutation_traces[i].width(); let total_width = trace_width @@ -315,8 +473,8 @@ where trace_width, prep_width, permutation_width * >::D, - traces[i].height(), - total_width * traces[i].height(), + trace_height, + total_width * trace_height, ); } @@ -373,15 +531,27 @@ where quotient_domain.size() ]) }); + let scope = all_chip_scopes[i]; + let main_data = if scope == InteractionScope::Global { + global_main_data + .as_ref() + .expect("Expected global_main_data to be Some") + } else { + &local_main_data + }; let main_trace_on_quotient_domains = pcs - .get_evaluations_on_domain(&data.main_data, i, *quotient_domain) + .get_evaluations_on_domain( + main_data, + all_shard_data[i].main_data_idx, + *quotient_domain, + ) .to_row_major_matrix(); let permutation_trace_on_quotient_domains = pcs .get_evaluations_on_domain(&permutation_data, i, *quotient_domain) .to_row_major_matrix(); quotient_values( chips[i], - cumulative_sums[i], + &cumulative_sums[i], trace_domains[i], *quotient_domain, preprocessed_trace_on_quotient_domains, @@ -389,7 +559,7 @@ where permutation_trace_on_quotient_domains, &packed_perm_challenges, alpha, - &data.public_values, + &local_public_values, ) }) }) @@ -446,22 +616,61 @@ where let quotient_opening_points = (0..num_quotient_chunks).map(|_| vec![zeta]).collect::>(); - let (openings, opening_proof) = tracing::debug_span!("open multi batches").in_scope(|| { - pcs.open( - vec![ - (&pk.data, preprocessed_opening_points), - (&data.main_data, trace_opening_points.clone()), - (&permutation_data, trace_opening_points), - ("ient_data, quotient_opening_points), - ], - challenger, - ) - }); + // Split the trace_opening_points to the global and local chips. + let mut global_trace_opening_points = Vec::with_capacity(global_chip_ordering.len()); + let mut local_trace_opening_points = Vec::with_capacity(local_chip_ordering.len()); + for (i, trace_opening_point) in trace_opening_points.clone().into_iter().enumerate() { + let scope = all_chip_scopes[i]; + if scope == InteractionScope::Global { + global_trace_opening_points.push(trace_opening_point); + } else { + local_trace_opening_points.push(trace_opening_point); + } + } + + let rounds = if let Some(global_main_data) = global_main_data.as_ref() { + vec![ + (&pk.data, preprocessed_opening_points), + (global_main_data, global_trace_opening_points), + (&local_main_data, local_trace_opening_points), + (&permutation_data, trace_opening_points), + ("ient_data, quotient_opening_points), + ] + } else { + vec![ + (&pk.data, preprocessed_opening_points), + (&local_main_data, local_trace_opening_points), + (&permutation_data, trace_opening_points), + ("ient_data, quotient_opening_points), + ] + }; + + let (openings, opening_proof) = + tracing::debug_span!("open multi batches").in_scope(|| pcs.open(rounds, challenger)); // Collect the opened values for each chip. - let [preprocessed_values, main_values, permutation_values, mut quotient_values] = - openings.try_into().unwrap(); - assert!(main_values.len() == chips.len()); + let ( + preprocessed_values, + global_main_values, + local_main_values, + permutation_values, + mut quotient_values, + ) = if global_main_data.is_some() { + let [preprocessed_values, global_main_values, local_main_values, permutation_values, quotient_values] = + openings.try_into().unwrap(); + ( + preprocessed_values, + Some(global_main_values), + local_main_values, + permutation_values, + quotient_values, + ) + } else { + let [preprocessed_values, local_main_values, permutation_values, quotient_values] = + openings.try_into().unwrap(); + (preprocessed_values, None, local_main_values, permutation_values, quotient_values) + }; + let preprocessed_opened_values = preprocessed_values .into_iter() .map(|op| { @@ -470,6 +679,26 @@ where }) .collect::>(); + // Merge the global and local main values. + let mut main_values = + Vec::with_capacity(global_chip_ordering.len() + local_chip_ordering.len()); + for chip in chips.iter() { + let global_order = global_chip_ordering.get(&chip.name()); + let local_order = local_chip_ordering.get(&chip.name()); + match (global_order, local_order) { + (Some(&global_order), None) => { + let global_main_values = + global_main_values.as_ref().expect("Global main values should be Some"); + main_values.push(global_main_values[global_order].clone()); + } + (None, Some(&local_order)) => { + main_values.push(local_main_values[local_order].clone()); + } + _ => unreachable!(), + } + } + assert!(main_values.len() == chips.len()); + let main_opened_values = main_values .into_iter() .map(|op| { @@ -484,6 +713,7 @@ where AirOpenedValues { local, next } }) .collect::>(); + let mut quotient_opened_values = Vec::with_capacity(log_quotient_degrees.len()); for log_quotient_degree in log_quotient_degrees.iter() { let degree = 1 << *log_quotient_degree; @@ -498,7 +728,7 @@ where .zip_eq(cumulative_sums) .zip_eq(log_degrees.iter()) .enumerate() - .map(|(i, ((((main, permutation), quotient), cumulative_sum), log_degree))| { + .map(|(i, ((((main, permutation), quotient), cumulative_sums), log_degree))| { let preprocessed = pk .chip_ordering .get(&chips[i].name()) @@ -509,7 +739,8 @@ where main, permutation, quotient, - cumulative_sum, + global_cumulative_sum: cumulative_sums[0], + local_cumulative_sum: cumulative_sums[1], log_degree: *log_degree, } }) @@ -517,14 +748,16 @@ where Ok(ShardProof:: { commitment: ShardCommitment { - main_commit: data.main_commit.clone(), + global_main_commit, + local_main_commit, permutation_commit, quotient_commit, }, opened_values: ShardOpenedValues { chips: opened_values }, opening_proof, - chip_ordering: data.chip_ordering, - public_values: data.public_values, + chip_ordering: all_chips_ordering, + chip_scopes: all_chip_scopes, + public_values: local_public_values, }) } @@ -543,33 +776,70 @@ where where A: for<'a> Air, SC::Challenge>>, { - // Generate dependencies. - self.machine().generate_dependencies(&mut records, &opts); - // Observe the preprocessed commitment. pk.observe_into(challenger); - // Generate and commit the traces for each shard. - let shard_data = records - .into_par_iter() + let contains_global_bus = self.machine().contains_global_bus(); + + if contains_global_bus { + // Generate dependencies. + self.machine().generate_dependencies(&mut records, &opts, None); + } + + // Generate and commit the global traces for each shard. + let global_data = records + .par_iter() .map(|record| { - let named_traces = self.generate_traces(&record); - self.commit(record, named_traces) + if contains_global_bus { + let global_named_traces = + self.generate_traces(record, InteractionScope::Global); + Some(self.commit(record, global_named_traces)) + } else { + None + } }) .collect::>(); // Observe the challenges for each segment. tracing::debug_span!("observing all challenges").in_scope(|| { - shard_data.iter().for_each(|data| { - challenger.observe(data.main_commit.clone()); - challenger.observe_slice(&data.public_values[0..self.num_pv_elts()]); + global_data.iter().zip_eq(records.iter()).for_each(|(global_data, record)| { + if contains_global_bus { + challenger.observe( + global_data + .as_ref() + .expect("must have a global commitment") + .main_commit + .clone(), + ); + } + challenger.observe_slice(&record.public_values::()[0..self.num_pv_elts()]); }); }); + // Obtain the challenges used for the global permutation argument. + let global_permutation_challenges: [SC::Challenge; 2] = array::from_fn(|_| { + if contains_global_bus { + challenger.sample_ext_element() + } else { + SC::Challenge::zero() + } + }); + let shard_proofs = tracing::info_span!("prove_shards").in_scope(|| { - shard_data + global_data .into_par_iter() - .map(|data| self.open(pk, data, &mut challenger.clone())) + .zip_eq(records.par_iter()) + .map(|(global_shard_data, record)| { + let local_named_traces = self.generate_traces(record, InteractionScope::Local); + let local_shard_data = self.commit(record, local_named_traces); + self.open( + pk, + global_shard_data, + local_shard_data, + &mut challenger.clone(), + &global_permutation_challenges, + ) + }) .collect::, _>>() })?; diff --git a/crates/stark/src/quotient.rs b/crates/stark/src/quotient.rs index 8bf903f77a..b22651e946 100644 --- a/crates/stark/src/quotient.rs +++ b/crates/stark/src/quotient.rs @@ -18,7 +18,7 @@ use super::{ #[allow(clippy::too_many_lines)] pub fn quotient_values( chip: &Chip, A>, - cumulative_sum: SC::Challenge, + cumulative_sums: &[SC::Challenge], trace_domain: Domain, quotient_domain: Domain, preprocessed_trace_on_quotient_domain: Mat, @@ -120,6 +120,12 @@ where .collect(); let accumulator = PackedChallenge::::zero(); + + let packed_cumulative_sums = cumulative_sums + .iter() + .map(|c| PackedChallenge::::from_f(*c)) + .collect::>(); + let mut folder = ProverConstraintFolder { preprocessed: VerticalPair::new( RowMajorMatrixView::new_row(&prep_local), @@ -134,7 +140,7 @@ where RowMajorMatrixView::new_row(&perm_next), ), perm_challenges, - cumulative_sum, + cumulative_sums: &packed_cumulative_sums, is_first_row, is_last_row, is_transition, diff --git a/crates/stark/src/types.rs b/crates/stark/src/types.rs index 9652ea9e84..6b2506bbd1 100644 --- a/crates/stark/src/types.rs +++ b/crates/stark/src/types.rs @@ -8,6 +8,7 @@ use p3_matrix::{dense::RowMajorMatrixView, stack::VerticalPair}; use serde::{Deserialize, Serialize}; use super::{Challenge, Com, OpeningProof, StarkGenericConfig, Val}; +use crate::air::InteractionScope; pub type QuotientOpenedValues = Vec; @@ -33,7 +34,8 @@ impl ShardMainData { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ShardCommitment { - pub main_commit: C, + pub global_main_commit: C, + pub local_main_commit: C, pub permutation_commit: C, pub quotient_commit: C, } @@ -54,7 +56,8 @@ pub struct ChipOpenedValues { pub main: AirOpenedValues, pub permutation: AirOpenedValues, pub quotient: Vec>, - pub cumulative_sum: T, + pub global_cumulative_sum: T, + pub local_cumulative_sum: T, pub log_degree: usize, } @@ -75,6 +78,7 @@ pub struct ShardProof { pub opened_values: ShardOpenedValues>, pub opening_proof: OpeningProof, pub chip_ordering: HashMap, + pub chip_scopes: Vec, pub public_values: Vec>, } @@ -99,8 +103,15 @@ impl AirOpenedValues { } impl ShardProof { - pub fn cumulative_sum(&self) -> Challenge { - self.opened_values.chips.iter().map(|c| c.cumulative_sum).sum() + pub fn cumulative_sum(&self, scope: InteractionScope) -> Challenge { + self.opened_values + .chips + .iter() + .map(|c| match scope { + InteractionScope::Global => c.global_cumulative_sum, + InteractionScope::Local => c.local_cumulative_sum, + }) + .sum() } pub fn log_degree_cpu(&self) -> usize { @@ -112,12 +123,16 @@ impl ShardProof { self.chip_ordering.contains_key("CPU") } - pub fn contains_memory_init(&self) -> bool { - self.chip_ordering.contains_key("MemoryInit") + pub fn contains_global_memory_init(&self) -> bool { + self.chip_ordering.contains_key("MemoryGlobalInit") } - pub fn contains_memory_finalize(&self) -> bool { - self.chip_ordering.contains_key("MemoryFinalize") + pub fn contains_global_memory_finalize(&self) -> bool { + self.chip_ordering.contains_key("MemoryGlobalFinalize") + } + + pub fn contains_global_main_commitment(&self) -> bool { + self.chip_scopes.contains(&InteractionScope::Global) } } diff --git a/crates/stark/src/verifier.rs b/crates/stark/src/verifier.rs index 43bbf61798..30bec21f85 100644 --- a/crates/stark/src/verifier.rs +++ b/crates/stark/src/verifier.rs @@ -5,17 +5,21 @@ use std::{ }; use itertools::Itertools; +use num_traits::cast::ToPrimitive; use p3_air::{Air, BaseAir}; use p3_challenger::{CanObserve, FieldChallenger}; use p3_commit::{LagrangeSelectors, Pcs, PolynomialSpace}; -use p3_field::{AbstractExtensionField, AbstractField}; +use p3_field::{AbstractExtensionField, AbstractField, Field}; use super::{ folder::VerifierConstraintFolder, types::{AirOpenedValues, ChipOpenedValues, ShardCommitment, ShardProof}, Domain, OpeningError, StarkGenericConfig, StarkVerifyingKey, Val, }; -use crate::{air::MachineAir, MachineChip}; +use crate::{ + air::{InteractionScope, MachineAir}, + MachineChip, +}; /// A verifier for a collection of air chips. pub struct Verifier(PhantomData, PhantomData); @@ -29,6 +33,7 @@ impl>> Verifier { chips: &[&MachineChip], challenger: &mut SC::Challenger, proof: &ShardProof, + global_permutation_challenges: &[SC::Challenge], ) -> Result<(), VerificationError> where A: for<'a> Air>, @@ -40,6 +45,7 @@ impl>> Verifier { opened_values, opening_proof, chip_ordering, + chip_scopes, public_values, .. } = proof; @@ -50,6 +56,23 @@ impl>> Verifier { return Err(VerificationError::ChipOpeningLengthMismatch); } + // Assert that the byte multiplicities don't overflow. + let mut max_byte_lookup_mult = 0u64; + chips.iter().zip(opened_values.chips.iter()).for_each(|(chip, val)| { + max_byte_lookup_mult = max_byte_lookup_mult + .checked_add( + (chip.num_sent_byte_lookups() as u64) + .checked_mul(1u64.checked_shl(val.log_degree as u32).unwrap()) + .unwrap(), + ) + .unwrap(); + }); + + assert!( + max_byte_lookup_mult <= SC::Val::order().to_u64().unwrap(), + "Byte multiplicities overflow" + ); + let log_degrees = opened_values.chips.iter().map(|val| val.log_degree).collect::>(); let log_quotient_degrees = @@ -60,9 +83,16 @@ impl>> Verifier { .map(|log_degree| pcs.natural_domain_for_degree(1 << log_degree)) .collect::>(); - let ShardCommitment { main_commit, permutation_commit, quotient_commit } = commitment; + let ShardCommitment { + global_main_commit, + local_main_commit, + permutation_commit, + quotient_commit, + } = commitment; - let permutation_challenges = + challenger.observe(local_main_commit.clone()); + + let local_permutation_challenges = (0..2).map(|_| challenger.sample_ext_element::()).collect::>(); challenger.observe(permutation_commit.clone()); @@ -141,20 +171,48 @@ impl>> Verifier { }) .collect::>(); + // Split the main_domains_points_and_opens to the global and local chips. + let mut global_trace_points_and_openings = Vec::new(); + let mut local_trace_points_and_openings = Vec::new(); + for (i, points_and_openings) in + main_domains_points_and_opens.clone().into_iter().enumerate() + { + let scope = chip_scopes[i]; + if scope == InteractionScope::Global { + global_trace_points_and_openings.push(points_and_openings); + } else { + local_trace_points_and_openings.push(points_and_openings); + } + } + + let rounds = if !global_trace_points_and_openings.is_empty() { + vec![ + (vk.commit.clone(), preprocessed_domains_points_and_opens), + (global_main_commit.clone(), global_trace_points_and_openings), + (local_main_commit.clone(), local_trace_points_and_openings), + (permutation_commit.clone(), perm_domains_points_and_opens), + (quotient_commit.clone(), quotient_domains_points_and_opens), + ] + } else { + vec![ + (vk.commit.clone(), preprocessed_domains_points_and_opens), + (local_main_commit.clone(), local_trace_points_and_openings), + (permutation_commit.clone(), perm_domains_points_and_opens), + (quotient_commit.clone(), quotient_domains_points_and_opens), + ] + }; + config .pcs() - .verify( - vec![ - (vk.commit.clone(), preprocessed_domains_points_and_opens), - (main_commit.clone(), main_domains_points_and_opens), - (permutation_commit.clone(), perm_domains_points_and_opens), - (quotient_commit.clone(), quotient_domains_points_and_opens), - ], - opening_proof, - challenger, - ) + .verify(rounds, opening_proof, challenger) .map_err(|e| VerificationError::InvalidopeningArgument(e))?; + let permutation_challenges = global_permutation_challenges + .iter() + .chain(local_permutation_challenges.iter()) + .copied() + .collect::>(); + // Verify the constrtaint evaluations. for (chip, trace_domain, qc_domains, values) in izip!(chips.iter(), trace_domains, quotient_chunk_domains, opened_values.chips.iter(),) @@ -310,12 +368,14 @@ impl>> Verifier { next: unflatten(&opening.permutation.next), }; + let cumulative_sums = [opening.global_cumulative_sum, opening.local_cumulative_sum]; + let cumulative_sums = cumulative_sums.as_slice(); let mut folder = VerifierConstraintFolder:: { preprocessed: opening.preprocessed.view(), main: opening.main.view(), perm: perm_opening.view(), perm_challenges: permutation_challenges, - cumulative_sum: opening.cumulative_sum, + cumulative_sums, is_first_row: selectors.is_first_row, is_last_row: selectors.is_last_row, is_transition: selectors.is_transition, diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 51c68a21fb..f4f019326f 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -5155,6 +5155,7 @@ dependencies = [ "bincode", "clap", "dirs", + "eyre", "hex", "itertools 0.13.0", "lru", @@ -5185,29 +5186,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "sp1-recursion-circuit" -version = "1.2.0" -dependencies = [ - "bincode", - "itertools 0.13.0", - "p3-air", - "p3-baby-bear", - "p3-bn254-fr", - "p3-commit", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-util", - "serde", - "sp1-core-machine", - "sp1-recursion-compiler", - "sp1-recursion-core", - "sp1-recursion-derive", - "sp1-recursion-program", - "sp1-stark", -] - [[package]] name = "sp1-recursion-circuit-v2" version = "1.2.0" @@ -5215,6 +5193,7 @@ dependencies = [ "bincode", "hashbrown 0.14.5", "itertools 0.13.0", + "num-traits", "p3-air", "p3-baby-bear", "p3-bn254-fr", @@ -5234,12 +5213,10 @@ dependencies = [ "sp1-core-executor", "sp1-core-machine", "sp1-primitives", - "sp1-recursion-circuit", "sp1-recursion-compiler", "sp1-recursion-core-v2", "sp1-recursion-derive", "sp1-recursion-gnark-ffi", - "sp1-recursion-program", "sp1-stark", "stacker", "tracing", @@ -5382,36 +5359,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "sp1-recursion-program" -version = "1.2.0" -dependencies = [ - "itertools 0.13.0", - "p3-air", - "p3-baby-bear", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-matrix", - "p3-maybe-rayon", - "p3-merkle-tree", - "p3-poseidon2", - "p3-symmetric", - "p3-util", - "rand", - "serde", - "sp1-core-executor", - "sp1-core-machine", - "sp1-primitives", - "sp1-recursion-compiler", - "sp1-recursion-core", - "sp1-stark", - "stacker", - "tracing", -] - [[package]] name = "sp1-sdk" version = "1.2.0" @@ -5428,6 +5375,7 @@ dependencies = [ "hashbrown 0.14.5", "hex", "indicatif", + "itertools 0.13.0", "log", "num-bigint 0.4.6", "p3-baby-bear", @@ -5465,6 +5413,7 @@ dependencies = [ "getrandom", "hashbrown 0.14.5", "itertools 0.13.0", + "num-traits", "p3-air", "p3-baby-bear", "p3-challenger", @@ -5483,6 +5432,8 @@ dependencies = [ "serde", "sp1-derive", "sp1-primitives", + "strum", + "strum_macros", "sysinfo", "tracing", ] diff --git a/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf b/examples/fibonacci/program/elf/riscv32im-succinct-zkvm-elf index 9c76358a925f19ae427c0bd213687dfdf28144e7..dcddbc9af36cbea5ca357d16a4a6cd16c48b58ba 100755 GIT binary patch delta 10950 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 delta 10938 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 diff --git a/examples/tendermint/program/elf/riscv32im-succinct-zkvm-elf b/examples/tendermint/program/elf/riscv32im-succinct-zkvm-elf index c20d62e67c4194d4787d1937f6326c0d07a6bc31..3667523ac0a0896a17786437ab5cc4beb4b70b8f 100755 GIT binary patch literal 1153004 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/f*Ph5@u4L=t7^rfGCDtw0zvA!N{%Xbf6 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૒p^M>HFJl;K3|`cea^b8|0unT^)b)C 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

g;?&H3}dW7ep#rpLTe{Esy~ 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 z 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 z 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ℜ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

Vq3pYah*!P+rzXsw)Gi- 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 z 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 literal 1258964 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

huY6PNS8R<#-?9&9TJsmOcQ4Ge$1k+znipo~ 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

{ z`qU!yDeG3#r-ZUUk1GvTHf-Zd6>zA=(}d8E!o}5NEGRlL{$tFE|7NU;HkhW z9MI9v2%Ur1gqK{yxSgJ~##ivRgr|k)HJ&Q@bQJwl=h1H#u4?#R!`N%%s+}c&4&&Y@ z@Xek&LZ7qK^!VVPMLH7DXW* zE=xXFeMZ*v3yGT{@s>VnI3izyJ84BLmuNagykuiW_4`Bzc9Cf{-WSAPQ{(+4>buqN z?LVVF`3WogwSPeU=IZy^cTj&)jrYUUpIH4q@fPZHmQmS$_MfTWP~-h`)UU68Z~qtd z>#E-u-a~z-#{0*qFEV@uJhP`zpYzYk_qNM}5^n-kX9rJqHZ`dKaS++1;_X*uUYM(hf z(_u=UWzGxZoDrd~J}Nq5it~RHo)_e)JfM8*zXePuSnX+v2UEI z414%(2^PS{C$}DTMqu4m2J7|!*1(MRn3LH6-;M|zd^?TxP3e0FYs_yw^J`#!60dDS zpsSYVCwr!9zsOk8pOjoZXRnmAUx33lXq3!fdoKK;}w07HOW_O2aJ-k?*gUXq;e=9cY>1*^^-@a`k3lWE8 z(6DwFjLhzRhV?LK1uE}mjk;nxC~TxI>$-a@bqB_-3k{PvC)RG(fA`hYT{U)H>=Ra@ zg}OF%JB&;L`%T#xif5Q|Htn@y<4}7iF%Ga!6{=xvTyZQ|>+y7r$9Vps#&|A0+IXzH zSev^7+B0V_wC06~(4Wj!hg_D+z{eip?}`RM6UdAC81w_&Y=aiH?+xgY$$c5{6nxfm zyLuevmb<@tZn1aOnA?lq0{jr>DOdbe-0)AI4s<-W%uXIjt(q$!n)woAx`mH4jj?NQ0nx`&w zRPi!$n<_e*>#Z@Lw=tiI(9wyR_V`3-X;VN;k7G`$w^Yw5wxsr)a*OqxvTyR7Qnysk z$@sH3KBw3j)pIiD)t*yoj-J!TH+fF6z#lr`=bE0*8e>kQcpi2u#k;&t@C3O?j}Myk zX7aEDa{gfaKh)+*sWINiBd;2pe7-jjPZ%z3Yxdu)&B0`M=+3Td-*dvh88YA*4wDm@_IJW3Bx zG$*&1Hb(Ru-M*X!O@@DwFD5?OHO(o??$9B3_|-YqZ^rcX?pHR5y6LX`X8uF}p7-=I z>emPLe-+e!YE1vlsA_jTV^Zg$QcuncMaR(dPR!B1sy!XR40|RpQ~I!R9dj!A_8xsa zJAbCfVco5NcW#${YQ_{$F6DWj)qC=l);QCq ze|6rea-uT#C3Wa+z&Uxx{vw=p%mq)@!+O5B9%buLjNdSeJ+6I*)p%1~<+a|wmo$a{} z{(J0IH(OU+*YhgiRO5TQU4Nf#cOCruMt^^9#rMi)$$EklSviX%#}s`#yFa1qmYu|{ zl=Dl;8M9TLah@&bY^r@bJ6H7hk`D@Jrkurvisxz~JBY7{=nd)|wOQF0enbByn!Rak9xjyh(W-WpPJA_W(RI;rGY^B4f$myWm-S}6)J4~QcrkUM1r>G023H!h z#CHIe+SY=9*LRkg)<5?Ib|GwfYi`BAW(DV=E5jTEefQ?T&8~ zU{FWFKKCKlejNIx*Ctqx4_YdQMBcPIP5hU(fM*YaXS+BX=oUL3ID-tJzkffmHt_%6 zf-M;TBgUX}GI1}49EIKj{>{fnrS%reoBvtMYr4wv+PcA;TdK`huE%zZ{Z!gxnIdzs5ME*nlSDHYl56QZy&UF z82exWdqh_0EtE4y%G)V#qr7!k@lNh}skW2NVPaew_>v+2bmQ-%;1pXXGE%ZJENhBv z#9G<-YN>TH9s&jiFn~`2+u$zG64B|M#F-)!l>Cbn?>aA~Xt9$$gLX#BwEXgAzSn0x zw)pmCZy49J9z{2En;3sN-7Gt6Dt!4Q^#ApW{zso-`FTzG z99NA09Ahgh=2+IhedS5$|6>*XA7kGoy2o|jsWmY!XG~-4yKL9^!^9Aq?^v|pnv>A~ z`zrb`+xLkdN&hFl?{jkgKgPb#zI*)Vn2S}+QSW<&+lg%_q5rpx-M@XyN$7v!*!>qC zItl&HsoB5iMRwxDC!zn=n*D3q{`Hg4|BQ>y(*KF$SZWG=RO6VMqkR(Qm=d|P zoQ{o6+x5C%H~zFeCU=d;pzVp}Itl&1Fn0g;1t+2ZXUFcp@R^g) z|K6kYfBi}5U*hJK<3t(X$=-ev`hTpV|6|}}_Pp`ON#nMFG z{*SdLe>MJVk`q6#>NU~2;@8F>Cb`)aFezJ;>=h@We>t};$CI-D3+JDN{>9&`x_=G- zwI`wfNfrH<(cc=*lfBW6|fQMQgYF66Bt!1sN#vd-Z+Iqi+!F?y8|Jr)L>c6nzB=ldY_mAEe z<>za9O%mfz^HYzGy(jF;#vdjr(fh}sdD+`eLjOn8`wPbOVn~cTk1)Pj0h2NwRfwO2{x{U@U%}t* zI|==-t>|CN0b2h5ko14zc$d3@K1z6J;hP!6ow26>x8#G`nHtj<(^9^yXH5T$s@H`t zh#H@@%qDJT@eb|o`Q>+L)m=UOylAG za3AveG0HxTU(8C{R{n&g{?vE2M}OCi@!bXVcWqUf<~#pHf1ju-Q**Ev(cj0%D4R=v zAFV3WbNCJYU0qeC+q{?ll2v8;yZ@%Yk5rYZaVGEyid|7vrrIpD(cg!w%G7t+d*}}z zt(F=vOU$Rg4_1}waejmTE*qold-Qi{?Xm**iE~}G%j|XZcX92q!W8+^duz9u;Lfx0S5;-I&B9OU@7+~ps!iLazjsyjr{I#fkp9lET~#%9(o%YKIbW>l4_Htj#5 zziCxvS)t|jdirarD${fSJpH+~%d#J!zsXf)y3HHuZ&Fp6nuC2O{WaAt%RWYbja7R| zx5=JQHH`5cyefyUX~mw<-_fQ~SGz3ROMiClvczljXH}Kyb!ebJe4Q)$(`B!{F<(20 z_m&fTe@P~QuPa&9Bj!B5#Q3Ii$6_lyo;ywAhpq3nZ)XkH8=fP)op&M|+VPMlaqrdq zvl0U>EPkf=i4vPu%Ef=Tmv~iXhXZ$+e6Ea!R7d0`}Q*g(I z62M*e(F^>`VV>Hb0meG!1F@s=UEQ=^e7s{XTI4HXPGxJ6m)H$zewj{_{ZO?Q4!*`t zrakW9Z|&f3ZR2lk<8N)_Z!NKk>cqF2-~U5vlzU?I8s*-EHA?+_{MRV<)7oof{PO?4 zHA?+(^cpQR<-XO4;Zf{=jsF@M->bbwxgU<>8kK0Z&@|V6)O_=4a%zip;xxHpoKKF! zIE~xigmL~KqD!%xNALM&>%{lGv3C6TJobc|yd!n z@ee5Z46hlC)H-^x^Z16)ko}ORqK>ev41~1j_aiCci#Lo@)9!BoLR^^i-`9X z=bjdFPwSPI+}Fz#vZ2g8m18cHNsxQ$8x4_U$|j#1cd+X9JuI&cSu2bj*1iE*#*{l} zw%k1{#xo|CGBOQuu){`ZlbToVD)P#3w_IWle-nQV-fvd-0smY2aJj4IwWWjh(nhk| zX0ITZAnQrns&DC!ev5q$t+x-m6RP{75j`m@7fcPR~Hda zCeA%Beiy7T<*wVNoQem&J{bxtpAwgQTO0nM>sQu#&mt4j*vRvTADP5{Eln&a$7Y81FXm zWF#NZFT}Q&iOHSqQF**Fa!>ob6@lzlbr)OiqY3{>9x8+~?cI!%`)GG;fgf>ik2MZ* zihf$|(&>C`8@ZoHevIy^z}uMU4i2bwCGV!;4qk1zSKE!k$NX?BZOEGB9Cy$*i7Ov+ z2Mbc(r1;!M?z(nuMJKW&eX9OK>bFXL%iTy^rmjILo22XRTY5a?FC1e$a`#ZiBzFflEf=~NJ74gT9OR+okL#O? zc&Tu*9=t5=*Vq}78$hi&>uTN8jZOnT$UW6|lUVxoVb|Wwz69Tap~jEgOQpQ*rFW_S z&dfy*LEp-3Rr&qm65kyB06xU|lKgxc9uMkVf3t`ymo_q#TcWpc2e>Sc`>1sq4I{?E zTm>d0`2$n4*<`r_+c84;LbXVtux^3*7P|;5e8>O63 zo4#-MSLB3>esYlVk(^Ndk`u~4hrJ9A7jr`0T$U4RcaRfG!P8hDeeMF&E$Ez3{m*`q ze31i}c$?3v^X^d?+(-8F#(A(F1!758atuDbW1xP_lVoraM7$C446q zweMlA)8SyfzFC?(c8*f6gU#3i?tHL}M#`OB*>|b)-3AP0-C-xW|Kro$Khz&`UwhSx ze)SV3{d;bfd^BAxD)*S*)e-zAg5PZLYnzgr%uNidx=SwY>QXtzhW7!Nf!L14QE-C) zJ}2~qHdYPr{w~Asq8*!j0WFgzkw<`>Ts+&RNiK_K-iO?-EHFKABs#d2{lQ!=BTo+Z z(v#10UhQ%oB74YfaG)_V7ZrE^Kl^*;#$7vSM4fv=QRgRom)5bobosvvECr{$@b<8* zm4fArg2Y1smfK>ZVVUcGeXzvV3M`?Wc0X(4rND0)_ZNpJ`Lb3$?~Z%jTb$&9MO|esTKj@H;&U9ZJo|OE^wwdZX=B{|7`Y!cF z|KklI)(pEHxrw^Zs!Lv*I6bJR`L=HV^HLAq+#bE@Cr1C;N0_S~L(u=~*Ed(Ay|h;* zTx6aC@(L;cymXDq_=O8e!5t7@H(5sW8_S%Yd`f1rZ9V%O=*g5^rLTeK@jjYp`2JSAWv3eiIUS_?Z z2SNTly$=_=UF*y~t2g3yHJG0IU1#)#dLv#aUaxZVnUqOxKJ`ofJ%ci1Q9Wx-Tbhms z?Z06C9sKV8rH0klO-$EahJX3jP4`zfo9>4*5?Qek3FEG2esw`pzNW%|EZW4iBO zWBQl$nCx$J$Ft;SS^I@+;1lMK?~|Kl?Pbq+ck=uyxmniEUE*z#XL7Twz2_ot8_$=K zn`P~*v%R}{{sOsK);@BhcQ4P+lAC4i_iy*^hH0voG|x>4nL~wZ#O!mXVzao|=&OH;zt@Fr2-Wt)9X zTMV!1L6I9(d^_a%2ITn$l`~N z;8Maz!qc@jK|4rLpI}r^asBj*tE+V^#Hv-_@S)->GkqeKU#2jG-IqkymM3 z=$**d@Qh6>l|7w!hQy&caQTbG4l-(+B#hZacRMc&m6UvLAdq@$c|mEq81FNt`Hj?)m873pmpN#hSc9Sg?|tuFe@>Iwh6JDbRV{>z*d)ap&fpAPjB(T)gfiw!dpG1Bm(H2uu)htBY!bd0d3`+!|Sb0Yn6rr`pE^TTCbgZXG5 zhNc&Ib7P$OzE(5Z@$dAa@8O4VAJ_)o9g2xAC}*gL^LuVfyemDsEvN6&`WhI4NpY6J$<*Qa)E83t0*mRO{!V+(8q<^mTd zp~IsJ)YUE3Q+u8J`jil#uVl_u;4gKz`luH^6gN^Oe(TlXbG4T)09WpJ48@)KC1A6+ zR{S&Pk5T*YYOW7&V~l%awzXGeYgwP!1FUplqx*NhbQ&KN@#%0b<`BGB#x*204W}~J z#>!ke`1_)BVczG>CEsSG3bm|ht=OvL^U>?PRIZM7u47H>&YRD}ro@{W2V;uq7JLf* zx6G%s|1EeZ_tbg>dgWhN@L-+UV5DN9ud2fTE~mXIMmzeI;=R-^i{N(?TxiLlr7aIU{eqr2w|t~BHj#4C*CXW6uPMJ71|l+EBTbngKw&+Z6&%= z*iQbhfH{5S6mT9s0Rpx_@k}a?26Tuno(pLFi{_!$Q z;2X^be8NlSnvv_x$n|N+^=ZiUX|}FUSH87aPV6A`gFfKFy0`T;GCrF%Yns5Dn<{bj zc6kmicl0$nt$GtYpb0!~gwOGJjvNZsE8x%7;J{RHU@FfVoYo=MM{i{P8(IHG)?dz@ zP_;9iwi0zY_cqw^A>hrLLz@%i(^nV|HKtkj3e9F87Q7nUX#Nx**3V=-K71|U#o9i% z*OHoAs$QQ%9V+-1{Hq0@7Pj!xsH$V-4J;Oaqv;Lw!XGU14)8}RJwyDGCNjE$L+A&h ze<*)3>j*x#;yXP))zrn#$!Gw+HUUJ2TxE#ak#f8?1%(AL;P z)~}pae3Gi2JZ%Q;ux6FoS*)3=pH*&K+8MjgJoUehedSf=r{oRugJ0es$@GqDoDHjd zqT;jjo3O(^y%FA=*W8mEqWsIjS1o-o&@hJbT*NsQw_f&Ya;n(0%al_UE7mgD;)6qpKtCtxuYQCqXP?_rDDHjH+CtkLNA)3;g|g zbn0|hAV+|O-9uf+fOfwvI+1Id;7gaHd5N1$q*unEPyYi|Uv~7|`-<15Rhi+FytkirUK-Vgd!FQ5+Je_CYMz45c@n=Xe@AurOmhSG zBmVv#opyD5I z%V+%+)3xD~2Q~XM&!5dy9n22j^)38ce8)A@yIb>@FV^ ziR1g29mi%upAvmX>~HZ$Nc=Cl9le+P=y1O1DaTaI{u5rR03XOnY@)_q!B{{3#>V=( z$Jxa>;pf0r{M?y%mp)b-MrP%JuZrd-LI#oS#^!}!Aqg1fBQd7PkC%V)@@s-p>(VIZ!~%XBL+HC zT=-$;D0sF!tz~Y99|}#XYj1ds>hjxOOnh{CvsQ_Do;<4AcO5+o{bqN;JN;h%`wZ_% zJMh&^^jj7B-UaXUdruyd`^2wwzqgs#-+_pY&!2X6zxgV~5A5hh(_VhN;YCevQ=ac#Jl@$@n- zB?FqZVZpD1X>Ir@ICXGwcO;y|DPJQ;h#1Vqif@OgXaIk2gB={@LH{_``Bpq(8#*|?HlSR6Mdb1ECvqKuTng?%u@xQ zMb{F3^;V@fqklyA9`8mc?Ti>(O~ZK1jJT0l++RMEF+cZ~;t|8q=M)b^7Kk5FB@jz>Ybj*^8#b^Ikq{e`XVT8S6EF*DT_P=*2H@LLYw={<2Hyda^E=8ua~T zmtZ4o|9{U`K=;O8I8Uz~uDMO@gUHxO&D$sHv`Qx@4rce%gnF&^wIFBj+6C%a0zHZS zUg+!i5%@>`%edZ}{Y$sEj(d60*OcD7={}{OeOA5OQ^&h?#Cqgj_A~Cfc$7Bv$?q2L zMBf*`Nkr@@)zW~p8SPTbn6Y!YPY_{;NEhR zya%q=ca!(fgU;O}`Znzrbo`R^d*3c->ox2&y+PL7>v zD&6zprxXrAH{?W-`x@RK>wW4BI;lxquv%npV7I5{cuP=*yY-hd2`^XDE8QduwZ%p4`aJTg&w1Z5uJ6CvtxRdt1@d-SH-SKfaqIZ!O=A z_!x|B;9+$)7o030Xg5d#8E++7~|@#QD#a z1KNy04oqD8Vsn5eiF5h!wDa*qYx3CJ5XgpQIrsLi_w$dO1(6NQ$YTg|F%_N^_hr^C zQFubkL&yJ}uHZ@a&MV4zf=?#mJvzdLvA4WhW&i|DJ3u5>S*;Yd}#JP%a*BJ z;NB}U<(%KL&(M9iD(bI52mZL|$#b;f=drUyUsl(9!YjHnzx{8aJN(mh>@94qm!Cg7 ze9!aQ%*)s*2l-BPYiyRXjWhhxlVUdq{>UTZL({4R=6-iKu?4G|^_U@T1^w{->+JV+ z_c{8Kajp+kV59ms$?v-1rQ9O%yH+hJ6`LdQlfIN4{>+ikKYB#zSN00NwfOtaQLg({o^{|~)S~t>Y?#{~ zLq|`&?tU`X>+Ay^%5J`rJ_qsD1wL2h8&rP1P}fm>PkS4_DU~Z6@HTCBu&*J3e4nTj zWuFi5TYPzCKByh_i020Qy&>z~nyL%%bc6W!pbyD?QTf)74tFQP?fXTaiSSHvbI{2i z$M^RPzQ6B^@9%;!9ejT#zCRP+pJCwd@;Y*caXB%n%S#eNR`DKuu;_MqEjVA3^AhOe ze;u3h)5-TW@(I-ae-G}H^YatsubmRyf7>3pFL81;ZuP9l8PM|0k6)bpO_ux=x&MFv zhx(>W$3c7XiLznrt}e+zK(`EOUA>d#JTLkFZGSPj-C{Io_s0*bZ^+$Nx!UR*&6>zd z#{Q)1>GR(yvX4r&`wa)*s>DwH9`xe-RLD~% zH0`B(iHAouf0cF0jUH?^IFop|>L9uHo0Q$*B(ddI+^P8wY|!l+!SSD_^x?ys$fc}q z_2j$5<|()PVDow3Y)a|=jmz}RPp{O6SN#${dUc}m{`!N>_{!jI<9*nhc53!bqk85@ z7w!K{ay4fgsjz)>{|qCAja#+-ZSOgKWc)Iub|pfIVC3hF!+ubWr(kb z)fn)p+fkEqO=U0ESB{pykv?P`k}o^{P4Y2JH%*-uBAGaZZM-_V*GSERR#-xWMN}(9D}U z`_dL){IgvVZ<__}Cjy#U_mpNVL2ru0Bkq0t`vS4Zt4+@F>(q=6Q#0m`sPhf6OX_^< zdUAOmFrjhu!Ud5{w<=!s5y|_M-vZO%UiP|k+mQDCT21BKN-nIsCPq8Nu9AJ^)2aQa zRb?C64)>z+eq__NYLD$Rnj=q)Y6rQ{R7`?`QjJ z+}x+n@cYF^*9qNb?}{J82EUWskcTYO>pH9(%kjCSJ9XpoZuXy8`tWV|JY_%0ZLED_ zuj#b*k>}87I?cN2Q~?j#-t-e4n_O#gI+#;Cv{l1=Yt-ILuIL={yA~Zu>r6Zk0mYVt2=b(@y;;U{|dv|_JDz$c)jI3@@aCMYI(Lw?0DT7?1vr-y3^mU(MMSKWCT1#ekphtAAu&`^tq8? zUh%*0l6m%y9+#_q&*+Q3wOZuAxoLr%p{F4mRg9Cp!zyQf<;7%)@XGV{etwE`I-#eG zmC{vSK!8uFaxDKsG)?;viSr3BQ*XT|F5>u~lbljujW49F4;-CZ zYsU*yGCiNqQ4{D@zjlFU*JU|pvsN>bwVY466g-31)~+|~t|a=~26P$teYF+$d)Bc& znjyJ}0q$$l>9^i#E07neOOEQ4K-c0tk8AW=+q$2;;?+Sese+BxR-*FH;5->Y6~t>)fsk>@M?HgAZ{p!7HO zZShX{U)r{E@VH>!A^(U>;5)#OwTNZI{)(%Cds^|V^^9NJ$-Jilj~wl;F7vN5PI?{u z=*#3nErhnn2ZuKqjK#r!=*&l7C2z?|w2-Uxxl8;w>t9otV)uOhRrrGD*DX-}L6cgh zZbQ!K2M7AWfpG2d(KYxz>%(;yU!>yKFJE}wvtKegC$4)LPx2?+=#CnLoao8xUU~ka zJL?MFUk}dJ-TUg;!?N}oIS51WtckGFjtS3jBU?@NE+olb%Sfhf8?y9X*7{OlGlX0z z!$$izCw(t_EB*qRGgHA}?4i#c4{{(1$N-^zbcrT(32gRU6E;T^HivD%GrW$Rjm=?Wb2P$hnghNB{#jaW z$PXL1f5b^oo#iA8v&h4n1s+{OF40VKA9+PYGl6n(-sfOp|7iGu)$@)LMWp1ofsU=Kf0xKaFM*v14Nll>MlGUPFQt9VR2;4$W%Rd)9h zYthba+iYv+w&5$bMf`o&GjEaOWj0|B3z#7{CtYUK3TFSf!{%rj$agx_?Y znZR!rV!OSf_)WK!4)_f@g_HTseCC#9{_q>UX2SfRp1^OKB)2r+ZCX3Do(y zdzN9A=bWi;ke9j6gwL2FFOVq#uYrdsUIWhoCjwqGzXf^zxtV^v)I|K^G&rH{k~Lln zecpRH@9V^50$$^4{ZsuO_>EfI3O^WPZCN|DwoO4UPIeXi!*-+ZsR6H>pwSDgt@c%S z)-&*tS_9lUJ$B#cr1mI$q!679gZy^UK>|L)yOw5UYTzR^pFn>HrRB`>+kTeVeXi8AD8?Ggcd20171O9y5;Fw=nvAlRY8ws5}Pgf9%s6PC>&LcsGB%{4Vn1q;H~A%3K5{N|!C}xEP!l^>%1RcH=9O zSEb<19!CY!7-zl*@cbG3-@tXA%f3k3-E^&zk)L%E?DK6+;#;{w_by^jGr|{Hk-cS0ezR(8~TKY$(m!c1>^fMdzMTYyWcaDF^Y|+#`h^3 z_&EvDStZtozwXzLk#7TdN#6e{Xa3Zv(@}_`-$c>3*>|?E%1P#`(6_75x2w>%EuLFE zx12WYxAYLX+9)FZ>{smX(b3&>sbT5Itpj#V0zDesN5@ush3b0F_;uiIycF?ka_DR= zx@{F0Yaf4KXE^DV0>KEoar?2BKX6@G?wne%NTZ%Qpk0ibrJ6fep-y+YyNvw!>JypNxz2koy zAE2$*m6Pmk?INy0AMDpOw)SY5Pf{a+b#|*?M-J`AShc-^xYEa8c-=W!;_H9oIkZ}} zsp?*S)p_~A>b~X%@8XLT8VtUN7A`6mD*MHt#n;RS7JO2*PF5@b z#0u!BQo|8_n|RcpzcJq)=ee?`!FYrE z%2vrqmiOLU)X0+O3G%Dd+LLS5M;>~x|6btl$i7JNHzH?3S-G6GsO)v5pUNJtK%daV zJpjy#{$YIY{p0D(XPX*u6 zf91Y*E91ehRFK-nDt4x1k1c0qeDg-`RrbNj_>8Vm#zdVdYjwnZ0X=wHN>hHq9_ys| z<>lLtYv4x84E>UwO2-ezn7vW(RrbV*?@z`+-`K1L(e3o<8QJS*teALD>A<@Fcjy)i z&>a?_J1lV8S{9;PEOe5&g*Nr5#D6dPSg;p1mkfEx$Ba}i>05=Q?BP^;v8Hmi{!`Wq znq^OTj#$1{t8`&SrN)fNM03SY%&re4;pNed|PWnU#egQu91MYtV z`o4+pX2H{`MKu3cJl})gvxxqZFr9kg=gg(O&jc6Har?{(e1E)#yv$YjK6`H+au2~x zi}4VD5WWu#1h*95&(DOjU9D)} zj;7!_+f4VnqX7>XSUZ6SWLsG4h`+YmEbqm%W4}D>uZ>ycvr@0`*|TG7*n`>29?Svp z!sS+Nt+gMHc!R7>$BBsXXk7Q^#98-!>;+x|?i^-aPawZ}w{;(~d=K~tUL_CH##-i$ z9B(_p{Uv<2PB+^2=-y+`o|ZZ#v`0H8IQjs%oW$;FLU%X}4iPU(kKkw7VFKfe>PW1G z+AGENHEY`nKQ*=ytK4cucJ*NMO8o(WbJ?DZWBVz&ll_&-Ma7O3yHn|KfxfgB90xbi z728^Zy^~^l;b-@Op^|Gwq0{W|f=@~wi7pkiSv<)c40zrJYr-;iQ{jl{cYM1k(C=jL z|Gy$9W+NwNBPV9l@1@9zOPyryQfT^8C$aKUY|u-1ehJSnkvS@vHelf!8a0f;Zo?-= zBRM&e54I?#Ow4echVzF48ZJn# zgurc_hAVK-{+KaEokTzKxdi_ySopInFRin;3>~v$2RsKovkg3K?F3)1*PZk#bU+iF zzCu^@BQc|ne$%aeY6kwaK;Mu$pcP)CJtsWS{k_z5Z=h53=w@S}Ta6PMo92t&ZHZhi z;;#_=$gjfQ5Ls#amOdlMrN~YP_SDhPZRpz!-qSwjwdbZUs?qYcbqVKHY=bxJmaGr& zgl!dX3D!(kwP3>bZ{{8P&%(oz!K%;fN1cvUmRn2ivI(5oN3VQ|@n4;_P17RRFYZY! zYt4o;idVuHC(Q3V0%vbtX}U45z&I;o2*)XBO9|enF@*QB%XzOp97lOR%fMM;lEf&J zD{bS^PJ=x)?CV=dyi#y7C-7kYIW6)K-(^060Zird7Oo6Vb zy_B1x_yjxx8wy?_>r8$nd_wFfVx>}lMaeZ~2L|i;0djAo4i2&do3Apq{4V4-K4E1? zL0dWM5($l!YM{01iabs8clk^fY$_#B6VL{75%_Ut3p7Gr0N zPwf%Fnxo|BO(aKA*&-V$@) z%N+ZdZJEZMK=Ohqnj3pZl{r3r<=fE>Z+N*Uig~yDZC9iwikU3 zeuF*CT;M$g3;1!bgpP-<)V?<&@W-x-xQ#m-je$E!~R%r(JQ7H$-)#5x;N(P zQ{Wx-@Q!-;L_;8tbG1PYWOb$sxTOP!95_^{1qQXOA9zu!_U7pIMq8=QYb(@wt+_fU zaUA)ob4JkAD&nFdf5JI4PN{v^c0FTlVjWqF`7)*v@+5EhC;Gi$EJWfS;%gO~M`9Q3 zv*VgT@6h1W@XA}2jqz@;|5>HKPQI_bOKL$FDfHTbwOWQ+=ht&wll$a#oa$qW!M$#d3er*VyU})HlKwS}QUd9@NWt)w|i-%kL78dii2=cak}= zUlb4alEeWlE$@E0AD_<%v7K(Q^{V}~@M-EUiaw&`T3`bZBa2lVqhURk0jbBbEU3pa zaCIQx5-OMLqpBWD*9b7ZpdSGEyoMh@wNbpmU1!1rI#s)(Gr~i3`HgOZEkum1T;qjj z;GGWMO^OA9chuv{shH4oNBjofZ~eOWLRt2jc|j9<V_EDxT((k5bkN;cL)3|Ab#~ zt~YX9UgZ8x99dMdg4%%EN8vf(P)X=gcw{|%De9%c zee!ys6=Ehs@PfVEFF*@&uT*8U>%>*4fyi1q^Go%}kom&*yH67mLBa=m@P*?N6VM8l>JJf&v&Pgw%PTT#|Oj|hBwr&;KByrycC!uP$ zH6n+JAIh0`)MBJA+XUG}%{6q9cAb6v=&$L%MhATvxr8p0YYgh@7pWsuXkeZVzzh8W zxs%qX!gHn?a|%=8IaA@0)Gpjx?<5XU*X?+NHzx;wD8MJ-1HxyeZexmfTH&?WI>3;z z@=SPR8$2PsLvoPNgUWEuN}o~s1kNFRY0IDv|Jd!XM0M$~8(A0E0Vcpk3DPTPXExTkEXKp)*v9*5vtr~?L-$GwjfHbaa9owfcwP$pz~6_rZ%x+(#!s7xGd%wK8*zTfGa+13gIa%Z}zW z^qdAG)r(wQ3}1}`7lA!6N-|FC0q|{N-}$Y;S^B93_O;+P{2kjA`N8`p@)f$zkz-as zHk7E_sDtl3Z|8Xj&*$&s-6S&b3gqtfx>NfA>)%-=>&yF7kR?-$Ik_q5EZ_q8(0W+b zjr-8boI<_e&bcytedh~+`9*=m0y(gReHRln|!_4F9LU-NAX!A zUqd@4c+UBxMU(L(J4@K<1sypKE(SR2w4OlL!UOORNS?VjM_|_rYz40lE7>dhgc=*; z@?InF2worN7b$yJ4|Uo-+~15|elvRc&FJMfLwmPC%eOem+%3p}Tb#toTd;SrWeOkV z`A4C@kAk-!_1D2*w_5CR#245#m%WU{=9SJ)OvBn7!Jl;lczYx7bJcGIr*Ejxe+Pe; z_3!q+o0J~X(RY*6s{ao7d?UDXlauJAX#{PQfa)IAXZlzUN zimg*SPBU7;w@M#o9#_#ueA9x!K5|+YUg;!SuH^kIDm12^X@A08XZn_YMOcsJyT;tY zEU_ou=HJCuFU|5&*hXn=q_lnsI5?ZRQZKh8y60@C_0SCFGMoFCFh99>iIXnPkoD!; z=}Nb5XWhkyo-g-w-pTPzVFtKM&7FR5d56*?0~}g~e=3~k-TkfJz><2m?Drp7S3i!Y z+F@@XK1IP}edzZeSVGQLng475YHW?y8~uCgu)9n@)~)h21Ha!|13L%)6$|pH@P&#50rdObb;~v+K(j1&Rt^?ug#MS(;wQHBEz%Ond?mEJ`;X26F8CQ*4NCsHUkT4 z4DW3=I&!nTdHO7)y)=t=u`~5cyc94^0=M~nvPXJ0K2ZfzfhYJf!6s5?yTF8aT9PH+_n|o_8~_r zGH%Ajah$cR;CL=Kj^o+CVH^RDC;HxpY=7T*IG*Hwdgy)d-uGb-yf474VOIaUiV((I? z?a)#$ox=ww_X^Nb37_0v?&-6D?NTRk=)>@L*0ZpbHkKN5^lJk8fp&yv&Ogkv+%?e7 zHD0=O4bMM}JtuZtAQO~5)~}5<#HgqAwtw?32N&CQeCpsH_{mtLZ5bcq>RW24anWyE ziSfv|4VU~2YLSC;nCmLGmD>5_1}Q!2c>R3`w7$v$L! zCqAzdv{;-L@-z5kC-OJ<0oKO~$FtCB?M8ln8hN)0ow^Xnn6`dwr*3SlPm_z2j5)2H z=mQU+3p`Nmv|SMcPQ}b|c{0klXv_<$e zon$vPz6!(}>P+%M1D;iPTKsQ@8?B>mm%NB9r(Sje zAI<&fXDxNe@;WD(t3#HfL#>1+@4!!0sNuQf1lPbz$W6T#ySPtte>G}~EFSx#olU~4 zS$Ca2>ga?0in%&?LY+6aR0~h2_1bf_@Pt};0(s?y8hAntI9>x!hy#oI={7Ynv3wSF zORn1kuc(}|{gOM6Ptn{Nk-S%>uQrH1nEfN_cP7O5?R$Ho zm|Di%ksI#0*YL0lhr30uL#O_u{-|ANYQxrF>+-$bT|*7wom0ntZ%2dsY7eo&&6@k! zC%BsU2A-haZ$H->baD0ukXtq!+mVxbiJfgnsqxXE`~(|(^*-m{rP)*Tz@2qk*Z^QT3UF|&b4SWbA)%a~JD<}>iUSG<9H zUoi%+dBxav4Rp1g`8N`BEdu6z5sh-(ASMBF=65BQMvroF!+`DqAK6aUP5*=bi zX6IaeY=-=uUp~BcXKoVQA9~y@+q?FLrNE$!XT|G?JAc})!{@VMHhl^%Nv#(4H;NA> zkgq>hJb-&jPgMA+U2Dhdv|;nhO=laCCn)5EXxuF}Fmni@-;- zyrgbqqVLM7KERi-{pWypBxBu)PgsvQn+IrXgAR|wmg{9LN>az>Y^DdiV;{Cn{@*5b z)=3`xhGu2WSg)~HpZUJM270-N*!u=*lv&_Ts*CT5z2jSPdwWd3`5n}-T8up!J?s7n z`|E2H+L-odfA3fS(^-E5&!~4GXP#%O2BC{xJYS%V9jpDGHyAyW=_NM2`he_V-s211 z)P7w%_dECS0QY`+)_t{lh21klb3bSOmi^E>i2JY8ZR$%7M+L{RYX%l;UI%-CiI=(m zy5UCm6FY8j5_`epKJ4hJ_)&Fyna7D&nXE}EVkDzlX6*)a9%8lkeivC#&@*)d`fzL{ zGFq;=cO%#^JT!As4HpOZ>v8?v6TpNv&h{o0<4Kb@%3ctNS~v9pMKa zIl{whA0(bf%qv_UeDkOA!%|y#$!TJ#XNb3+aW+GH={;whM}D9={V#~0{;V^|y}`OO z#-rDqaULU9=IonL&P1Fu&ke$D-7sgV^ky}=mrp8I8Z)dQz@095c3qPD8Qa_v@lUY+Hhx*GVdRj?iV$zQxE_yjGF2rL9{@ED2J26PQv zc=osMnjSr~vqyN)Hh4VeoL#ApHCo$*hmJ-1|6F*i@C9RTz+W>l>FWagRjqM8>n^sM zguhDefxnh@5&jzQ$EGA-og5Cwy3*53lWEud2}7m3qePVGnCT@h#Df_>CL^wwCy{G)vYhSQ~9kfWzQw1&@op z=$Y!haoo=LC^;m!{qViN@+7x{aj`Dmxnm{HTJVs?{swqy6x|NI4|I;=i|FV47WnGo zTX~aukjh8<_c!~!=ykzf+MZ@~G_XnELP00yxByQO%IeYB0wXBrDY|}B7_xbZT z@Lh8JyZrO&yQr0BZ%kM_Hs3gY51E246V{Zi4*Ia#chSGyJKEt}#N1W?#iQY~x#1ZY zFNAG4sy2G1jl3GW9ksa6I&W5awl(3mbHXzk%5AlUzmM3u{-4N(S|?ekB@dT)WDC0O zLUh|4y6tu7wky$X(RGvPx~=HC33T20LovISI8OBBS$Fl5SBRh9{gY?rtDKXV9<}3o zwO@l@z(lTC>yg1JWU9p;CiWTC5MxpKR0WCsnaE>edE4RP=q19>MGuo$BQZ!r#UxAA z{N{N(&(l0_mFI%vCG4v0?5lg)aFW}RZ%-q?bn!>ygDen7D-jdme*4qxL--E%%n#)` zw35^57kVxUP2vN68eiylSoInJzE$#$&Nzclp;N*$2I9yq;m1qPc!TSZXM3n!w&b+a zN*pqYyi32pv-sKJ-8<1Kk-18z+(WKJRBR)3N{PpdeWdnxzchBe@Q5O{0(gJtP8}X_ zBH)Ju`dHLDL4S;82{v0FI`BH|a$>dvA}`{=sn0Y9mJo}Qcznt92G;3LTJG&ZXITfF zhPby!{N?z4OEPv~j$O`tdCuNtX>$*-mUv5vc9}2v(cCk6&YpbfYYBeiKGw0M*`JTU zBK#@fF`;gpQ28TS+kEw`zmD@U8%-0QAv)kWbIl%gugCYvUNLFs{5G=hk-e2;wdN0u zfg0jM;KXCH9-l||mG$@#bFM+32-kx(ayGyD^%%=XPgY>wtkwV-1k4+(lZ;Pf)IY+L zY7OYeOJd8-#g?0kE!U1M*N!bW4_j_tDQ^vp_(0ctgMPaH zyPR^eY z8ODAZ-lX)`%9(4GeDAI-I7mBUXUR1u_zNCfB;Wg5;fKY~0F#ON-WP7a>{FNaB{$}r zwgtzX`8x9j*P|tJkd>VH{d3x`s#12#1A$tQ1ktt@H}{8iT%C( z;hqKIow;!y_;^4274YRz6WAG)d<*o_Uh=@gc@N=b&HhhvTpK3DOWzAWfL|at1Ac;^0{m*fpS8&G z{Q_VpxF9eT880xLkpD~lkcuxEJaWvn~5D8F9v;Q2=F5fJ{xnrZ6#Cifgltji1ct_1rHyY|a|L%#-{G2CzH*Y=zd zpO9Zy;_R9n`4Sp(s6gKZwa(6K?m4`JJ%k{;?Hx7Uhb{C$@S_#HN+8Du zph@C{0WSjg6-{Q}`|EJ0LR*}}EOZ6j%;4MNBKDm&`t&FLDm^ryr`=8~X9&`tlYA$9 z`)XZ{gE5SKNzVIv+b@OZ1TMvD}x^gJicqO(3PUgcIb;e zpmsbbw939v_?^lb6u+a6|6cK{R_f?-_M*@*bd8STv@X;uu^{@W(64G29vHSOZAyF6 z);R4JFNId2!5n>;X*b}9=!ocm^l>ijGI!2z+hy;{Td>`ih5`WPqv)-Z3-m{T&nIXY+N zfdk3C;K3pE%Ht8EP1ijYi|>a&B4;F*5&kK$1&JLw31ai)bT|nUJ)%kcpykobM|b9#JV_pwylNO7yJpC zAp9S_pY37$w@?8L79-~F!Nv;Vu9D6xv> zlho4=>LM>1d~l{+wedkacAw_nevthN_woJUgPAKiPi&d^G`Vg%srv_b|L9TtHNQMN z_OH9~AA&o`JAeO%EP9gU?drjrWk0pWQhB`LZ|zfFS4+fLJT>Ai)+6Wz)mx(M8>lK( zZ>ieLcR9(&!Dbfz)%9-Lga&wyT@>DX2Q+I!hjQjEc9HzOSN0x|8`}qs9O8S)tChdW znN0JyqVa<0q0tIo?C4{^R15TkO)NaGjXpYb&ML`*|D|eQYO^KwvX?<8-y<*h7`Lky zpvN3i=fv_Z`N-rLb0)0MInz$-acuRzTAmY^8X`uehq=<^Y>~spvwEJ9$HU(px;lrJ zZ^`8%pDWqdz%z2ch8lR*K)d9X?d7b`lAPDs$TM=rIPbGVC(lgI{oG6Z>RS3NHSxTO z=hW^RqK?<`Cf{1k`1w1rx7m)~D({d}(AUg6&B6J5QR2(+0^!q9oil#<8+{fUpdMsF zx1lHCKXLs&B5O3hp4vwyuHP1(IaNcf9qVE4g|FoV?}BeGEKEilrhxR=&tFM+Hfa|Zv& zXXjh^Ot`GbLPfg11Bwe2y(>#p>Lsk<^{ir1+rHA5_D4K zkrTKn}MehslkSoIG@gTKYB5lXowQyeo-3LBli!QK%1hQ6?2mA->7g>_~utZ^xJ0ohh#;IH&J&)nAa+7NGFvrecn zh(9)(AZCRgH|sz{S$FnDE}@eu{kdY77CmyKgFIg4FCHc5gZFyS(G*T;(CWe}Cw)I_ zz%|lR#o8hV1V>m;@V}ym3BM}qVd&FNvIToqr_X};*r44Ooo^N1Zb~TqZ?&QHKfQ|e zWUUM2BliIpbg}XoHIp|UDf&1s| zEdeK{AotatWj7ifhfO@e*b>Nou`RIKkDV4D((hC2uS0AL;X}T)?1MIS^HoeCpf~!y z4*fyw1g?>s%#V8^PeA9azy{em0XFD~ImW9)i@;KBgSH$xT8`i14^aB)&ET%`Z;a!L zF1})!H@Xb{oTCR-a=5Vf6>Y0IXqxfd#x%nJeWp9ChsM=5gth$KB@?KB5jr_kk z>Fcl^7E-5&t0{C*Q2GZvM&VNhR*4Bb1{eaXDqt1hTbkc(Il)1}BWlbEtTf51LPrc~ z8W|DDgOb=w7Vxs5ElY4maLY-Q%w0n3t$R&(*3KyR`BsM?l<*URQ}~D#pT#F8`)iCj zIrg~d6@Q`Ab_gDGoORX%e_=?=Du+zvcOT~Y37!XbK$)+MeaSqEE%rQP65eAnCic%r ze~f89eMv51`yqUjIr`EK@1lFi$8(w-$^B$cual;)WE11L9)8@9-Dmy_KIxwbfA*pI z(B^@^%kP99{+4}l{N7yt9S>?Ws63r-E4)Z|fos@__h4Tm6DzfaT=Cl)|7>(Y8&Q0q z(da6vDUgW{f}fm$%{{-j_qI&WAm8(C4?L-dvu}S(`Fn+zfe%yREd}&}`;q{dV znMdTQn{c&mw8!9e3)u^oqh|MR?H=H+q+m>`ljZZ=+)?;zybS2?R(3gkl!jcFSMraW&e{oDY;U{WrMK; zBlZwqjb5-88>)}?nP=-l;$gt4S&viiSYQ0UUrwa-r1JgWh-+?6uqBT^%#w zm(*G!Mop~;@pC%n!a9lT812u(%VzTYI^eY040uTX2`7=OaU#-|&U4yQaLxav(e=wI z;3T<0`1|XvPgUBJ_tp52ec1l$o3E+Z%d`uxMRA7F6>F@tWnQc;bOPyLwZ$I8)P>en zYvK&)82rC7Ki0)4^FVxsz(Zt(MvOybMRp4Q-QO2k;aktKH< z)|9??K2D*xbUjz|`uomTp_hIl==*2n?v?w_Zk*h==%3}jvlqi>)9CtH-RtkWc$R%Y z9}D{aW!-q+`7ccFyELKi{4XyI^Wv-C+-D<3``QR~#3SyW*sW!FD_D~gs^m!k?^D?1 zHw%3Uy{PkMdn7(5d0AzdlkIg9;CCx@q;R-UHDUh8FFc0)38QN!Hem%HmtGhjbJ)OT zSmu9m;kJtZVRX%HuC!%Z7imkEJ?CY7L_S;)AAeqkg&o!gv^g(0z`gwQtp8H@TD2V; zk$vgpoya)?3jgk!xDL{f@+m6Z*ABr?@f%NsYyL321Adx=pX$i4e)uc0seEoO{-a>; zK~6W)1@s=Jd%^qqkzXUct0T+QJ^X0}WNp9ba_DQwEcQY%H)5~q9()Mdr}ovB(1p;4 zJ4Sd{$4-%bwMs^!*Y}(BkM74lp0*L>bOBvb-BWTM-H&@YsUv{SH^RFG><4uZ`$0!{ z=ok6Uo-Fd66C+XjN0*R$C3#Mc@(%8m&~N+YIX=Mx_L;heeNw=7R^MZb@4!YGsiuEy zoPNovj`2PE`i^QlK7!otr>zn8KsF(#3bGF!9s`e7Ymoi0=zdB*`=xuxu^t7!@aT4)cko>7@>U(&Td$RM^rJsf^q}^hu2y_; zo0l>xNo3KACcs4TOS^k-@zi8MWH5JO=6~7Vo z7e4ExE^PUk_EgwkRoGwE__OS;u)knGR%&Fzv;5AmzgXBGK9X{q#bJ3C-0y_0%J;K> zCHh9#&jekd_%$CL1^NRA(BlKy{+Av;4+A~NOXeEUzZ=oNr=ovPMgN{^%+sf$3)!M; zjnntJvL(M2`mPOlY^*`?*Z{BIL9XS!7ynKhL}#cDzMI)N{$243;vZkU_;>k7&{^2i zBeHBRelz4r(4W*e{>zJhr+r1$08!t)6JJ{SyW-{aHx%fa+zWK}Rq!#|&&Pw`*~^3H z@U-ALGDTDPt!nKBHqote-h$Kt_C?oG_wu&@KXNpt;_rtyg!T8(B@Mefh)MbAh}7*S z=abl!*f<*pOuHwE9u?X+YHoQ)`r88SRA}fSD=t0+`OS9?&VBu|=IF>0<5G2_<5JI0 z@(&zM;@$8|;v7DHT(LiPjqh!U?1KK;=fJ*lo{O%OSZFxx@xz7*b5SH-Thcc*D0}8l z;V&YeInx2YxLNi#lo(e5o}5F+rJt|DZy(=Lsm~XT`3gnbGB(BI1N^%O{F_vx5B!r{ z3QKT~tI8WN7F%MsqJu@r)r9wudtf-biS44t_jG*>TTbEtLB4@z(0)Pm?8u^&#BHq` z_%_Ui=vwKd`?!}7UmaI?|7+zks922l$x7S7n9i#qB;#|*(}MreCh%jd4sc+7ka^%K zYpw2^edx%V>GRH}pC}vtPti~6#ZIuJ)TOm_?AAiWm$k1VPFV$=Djyg=sxDopW-&Gr z1gT<}(hkq_${xr6$Mef9a?4uK$C-b+MHf4pIm&p-u(*-=kJn@r7^w9?7NT>Pb2{MZ z;DD~|KJ@p{{>tCvA$O&YorjIDzLRldHwAMkenR*PurlB$hKCOUep1Pc3FwEoXh1*n zjjpMxc4Xi~z4L0dmc3m|<%&IbeUPJ)qt3C+FE2hia4v_;VSeq*uY;@dHwsJ{<7TmG z@}G06iCsz?)_HBZL7Tj*+RWYyeqA(Xj9!L(Uy1C#1AC-^4sbvEKp%85WXPF7-nK4X z&O^7QuAI>Dmwte(Ux$vdhuq>gdg79Zm&ERydo}RiCpCW*%))iQLG13~BU?51;ei?M zpP94pjj|t*Jh6G}$UQS7?r!t4GA|Q+kv&Js@1^i2`w?{D*}?;reyQv=$zx;RkL3La z{O~8<g};$6r^b>0kh{J%ye~Pf{ z)I2{~qS$T4d}e@Ty^uSQdal3^`~YY4$-WVpFM5ga^I*R3InR$3jQ`!>{RQ(&kfXo$+%|PaPmjQrwF~Iu zRdDm7^@qUCDd6T5aI+5FtW)_7&stUBq^gB%aNd%!eH5D}5#VM$`Fh)_b=bpMO4fDg z5ZJv62HM{kqnt&=J`8FTvR{Eoj~>>&4I|_$vKMWzQ+I0mYMoiczod>%n%G!RH!y*Q z)Ht*2oLcd};$KVx%l4J{T%ng}3%LOj1DM!Xb{Ff8ywdB8=3Je(cqRF-eWGJVoW@eb zG4@8b7zN}EyahfI+P{AdTrXIE1-RCupVWKvN_7S>0A3BD%-HA5pV|&w+M(HY_{BVY zpz|2tJm5ADxXlA@b9p|O=X0UyxzNJgKptB)i=b&GlQ)hM3sp5UXB(;RT5^k+KXJEY ziJUEy-y_se>aH>7bc!ED_Cz<6k4Mao*j@V&u_8T*{G1k^efpGlxt=tx&T;R$Bs_Vx zoLv>HL20dmAKhc1(`a!pk9L*P3>KLnr9ZxTbZ z9QG{}&rASY+2_nY*wV~UKl~9eQ|kn6C832RxXf?8vQHhklSFnWokS^(pF3UI_g%&> z#Z!w%!g(|p%W_F?SxeIU(A1Rcf7P#FSpZ+9d7R zN_d9EQ=v7rmf4R5^p}OtmhWjRl|LUEn?PR+ps$6tkw6#eH2n8aC$KY?q``8nz&kk{j8kDR_ z!2f0kI8l5W9GD3XfH$m9o8W}(OAq#=11s5oo`kNzixPOTm%SV#=)yYqo5hEz_T2tf zd2WhtY_wX@eVqR@I9&YNe+>@jpDM3$8HbJczol`Q_{MSaRt`0Q!wn%0lP@9pD}Cg# z>}@FH(Ac%Hf0i{4YCGrqS>Gh5mT%1h@`PQUok3MohG13k76e_JW#Y?FJ?P`Z$G z9v|UeE{UzE@}-?e_F+qg_2j@`wZ;!v!KOU#O?<+mG9+)SM_FU3vDe?# z$z@8To3xc0-Rc+6J93wKDg83m`cl^TQnj{^<6GS}65v28cPYO&`u}& zkW9nrZ!%Qd_%~h)kH%)#{xj|WaKb!F!8~-ChtNopc|adK=wpO&mzc|8#-XRx{M1~S z6Jr~n3*!M^<#~*0@l%4ItP6TGHre-8tmpUX_oR_3O@R+L@r>G&xhb?e#iL%7la~A? z^2sFEjJz|RQ+EwrTGhSm#@=O3J4D|s5vwvS_y9RNLlO7xDEb2QeoXo8{}F#g61*YK zfDTcXO`-=XUY$Qxq0P#@?91hG3+@bezM#=B_*XD0wsA22+cWRIFR*uoCPh~i8iiH` z-flx}hg{{iy3ccU-s!O)kBB^Th>s)h>MHzp@l??>sM-G()f>|KbSHVd*=aq54Y8LR zDCiCIS(^^lsGYTH+ly{CVvWN-`?SCwdNdsTI`~kd!5Z8#UFiqo@czm9YoPtOyav?y zRd&0;e;ju>ulXFWiwLO%_mOxAwjTiwy|vE_$kY~YZb!4-~6>zX*O@|d7ma(#>F^fE5d>&xTHf8Vz{tH#HrJ*LKmzXRVf@iW2M zI|6;GGOq0R&L5Zd-Payh{@vwqO&k+^L?3?V_qE}76~SXov)?;S%e?z*+L&4U<*|mk zhsGYNd1$P<=3!)97%LbF5{=xGr+%ItEW@;pSh8`(0 zNki`u5^pO%D=u)qVDhXp%oFGiVgu?s?Z0`6(mW$snCD?98*}w}-rQ2V z(Ozix+H>v3JiXnUSDI^JGkYDmxyI%CT<`Ky8#Z@`*xVsr0M82izmAN;m(&Mu>Lm6g zSCjZrH$EKkL3hXCL&&xvk#*#=mHA5k-jJ_^xN|5m8F#ed^Vg_2R9++aNyWzuuf@-& z_+iV1alQC9sh>~I%i)l3Aa~B=8=OUP4&M-+_*{Df8)=fgfjxRbdjlJ_VsFeplz83t zM&dX&tnO6ojpS79OufZP98Wm&4`Gk)y$qbgHpO;p!!}L#VS9*eIwCM9f3H*GbFJ_c zd8bw24GlO!ea`Hk0Jo&bCPVZxY(GzQIrKQ>dO~CsHk`7rcZvL*UrLadMBAknWGTM5 z0`_sP#lUt(z9i7`s*%mr=zY~rKmIz-eij}hGK^~@Z8!3+P5abY5c%4VoJ9sAZ|$BY z)5rEzHf~_AK4AA;4=yZ3*TU{q_ljS_58A-^sRNEp9mt#e`4)MVn>Kzgdmp$0Z89!mkDn; zM}JjxP&`K8*qg+fhocpP1CHu=w|3o;D+cekF&n$G|pou&}+bxG|)WO6f@e>c806Mg?l@$G4u=#!c+ zIp^8|{IHyVLEffMj9kU9RZXPgqjF9pHGHG$+mxw%`>wWA#oVM0gdI)jjy78PUi|fw z+sJRhKf^doO`R3_sSQ#0Q*u@${c~2N*zwAL{}W~Jt_seJd_ZC-K${1M}YC?z)8-J>LmfaiNf7?rPPyBYOKlLpC_Y=o9cGrfJ=f9Kv zp1ec6^d;aN?CDJw&=2n?m!gGzVGG%B1l_db4{lqji(gvK-%;_Ac&y1@CVqykn!k)( zJp4EQvaayj6J9NK*1gmV@|R817A;@4%#JQ!HvAIncIT0^z&N|>%1p-Z;lI0px3qI7 z^*5}+pe@#5*R&~9*gtek?(f1+&003_9eZ7RblTN@>iDp437Bj!?Pa&|t>lPJqaI+8 zW9?qH9X(g0PAF?a4vSkKZ*!N#mrjbsh|XEjxARYdPfKK-omS=^#{TeWr30MU3{HhO zq4w(M_*VR=`%@nGSadtJ3A)9Ws}|S=@C80^5je}#1G^40mgR}m@H3gncJba<%`2> zZ+K;&8TakQC(ruqV_LKVJg8c+Z1^PmlkPftHWNLN-E|ds(93_H;XP^Rt^?5Uw}Q5! z2ee(y;6d-nV{(5NF-*U=xqwNwp5f0X^$%w-pN>h~^RCVlxY9XU%|*+mS^j$V}+K1sX#X$Kr0 z?s+n3i@p{yKK8dAllzMpAN#r+~VzEFrp(8`+NkE4M!}IUo9YXF0-G4biD>+7r7>(f+lve)&5m z@`)g;b`lXgo5PFntwH*@akZ*m@~oXaX>AL}+x{MvI_o8xclywo=iQ;qXq-}pJX zzX=?K*Qs+^d*g>E%3hV1UR1d=@57cS-$i22eZhKG*ANTQ0$!HdnM+TqNT_uR108sq!ln zP3B*@m_F;E3;I`KJMRKccO6tZp!-l19h{nr)L!>jS*P6S!DeF)bqcGfqnY2to`+_5 z5i)AUoz(Q)pxZYd(K0_x>BEONk=tI~>dAM9%~Njo!RGV6*_6`#8fsqnP0X4oNu}``#I#^suv_4 zN)6@keeGa^vnY6XgPMcCZ$Qn1T#S1AwpjHRqc1q`+`0q$CLc$1UUcH1)=sup>039> z#5aHrdc;)k69W(46Wv(J$09LSbgdiL>YNEu?;nwNB_GaW-Gg`kAKKnLzKSZ%|F6o; zO~PVODq%N?+$4k$f?9-2LI^~5?SY;qAc(?Dv$!_c0Kxm+)LMxlxXO`IZ;9r?4E@JXK-y6QO719rBEm z6BBx7Q9H+8r4MkP@pKz3zWapx&X~~iGPe1V=i53s^9Rp2T17(hqR6J_<=t1)8*7Oy z-1pL-G;Z?T!uTXiW{;{q=}}cCMfUk*FQnF68C#-P+K|$f8b@vW(eVqhCG{N>)z^h& zC$e?qMLaAthDqcbe6DP{uf7q}B-eqF;WCwR6!Q7xr`n8+lRVvrK&uy=nZiE1jDcH6 zHID^jw~<%b{bZ^yRLe-8r`lVjs?Uu7PznVdFq0!$p4!8wY+PYoTOM8C93ApY>(l z#QaYo-xPVC`Mz6j^6@P$+6Pq-E00V0=thK*|^*F)UHGfrWm}(g}F@K>`$7aT$Z()By_d6Tp7^U)# zOt4o5xv1=iA?q<^4G`~!kHP3fYwggu=vNX8^d%+h=-?*s*-e4u{F}gMHxUQD5qoN@ zSu)3hpL(9YiCnu5y5?&k_=B9rp9}3fhd7uJ`jW36 z<5O>htEaDhsW-8XU1aoptS?DqA#%)DIbXbw*!`_;j@LHYdlK=~mzk51d6I2>3t+I? z)5dJvBJp_kk&D!c|L`51BCa#uZ8v=}YvZ0Xhg4}+Rs0nhD{?=>v!ybE^+I_ey&En6 z9AS9>Oy4Rt7}C4;!LbO|xM7oy-m~xpe`cOwXNr10(wpGNH02LT?F!Cj}R4aBoC2wpR(Q*9d4xU3a-}q{v!El zzo{hNfbaJXRJov&yZn~*SwZ551JSRWx2J4y(J1x*7N2E?B7qdX#`W_zdZ zO2!$5$d319Y!>+vgQ-;ZZeSliZ8Q6Qd%Hjv-;o#$|IbB`^Aky%;#qlz(Dg>^rZ(7> z^H3Yic!T&WnE6L&qYr6XH)ym>l6(^EG2BLWzJiaO-)tjW9wJ8O;W3HrM+oHv8x`HoJ2J`kfV4 z@2?ELAJkm0*7Jw;{``L>E7~VHkg^Af=#V`~y52?%I;6va&xCZ?tUn!{2C;uvf7ke{ zkp4ucYE8$MO2+k}Hn_+lrs95Yw8&Ze;$Y*I0rtS~;5P!v%vW@r_ zpBAa?oz@%VvQzw9KZ z{Rh4$65kW)d$IBmm?Zk9ZS%b>Uz)7j5}iXY z-^z0M(px)v+ℜ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≥y1V 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