Skip to content
This repository was archived by the owner on Oct 25, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
9ef4635
comments ...
reshmem Mar 6, 2024
c04d848
comments ...
reshmem Mar 7, 2024
fc0101b
comments
reshmem Mar 7, 2024
28ce14c
comments
reshmem Mar 7, 2024
451ade7
WIP
reshmem Mar 10, 2024
fede12c
WIP
reshmem Mar 17, 2024
b704a0e
WIP
reshmem Mar 17, 2024
1e58ec8
WIP - reduce_with_powers does not work
reshmem Mar 18, 2024
558bf34
WIP - fix
reshmem Mar 18, 2024
767f8b9
fix tests
reshmem Mar 18, 2024
553d5d7
pack to 7 - max for 64-b field + clippy
reshmem Mar 18, 2024
2cb1d44
cleanups
reshmem Mar 18, 2024
d762387
refactor...
reshmem Mar 18, 2024
89bf4d2
refactor...
reshmem Mar 18, 2024
99f416d
fix
reshmem Mar 18, 2024
7202f0d
refactor...
reshmem Mar 19, 2024
f953edc
fix - bit-padded-input
reshmem Mar 19, 2024
a4cbd2e
fix input_addr_padding constraint
reshmem Mar 19, 2024
fe41a7f
Merge branch 'main' into roman/poseidon-input-pack
reshmem Mar 19, 2024
9ebd02d
after merge from main
reshmem Mar 19, 2024
1885a88
clippy...
reshmem Mar 19, 2024
8501dfb
Merge branch 'main' into roman/poseidon-input-pack
reshmem Mar 28, 2024
2966a7d
fix after merge from main
reshmem Mar 28, 2024
5fc696d
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 1, 2024
bf3682d
unpack logic in its own place
reshmem Apr 1, 2024
528e59f
fixes...
reshmem Apr 1, 2024
54c001c
fixes...
reshmem Apr 1, 2024
0fd0ab8
fixes...
reshmem Apr 1, 2024
7d9ce7e
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 1, 2024
448d33b
add LE encoding
reshmem Apr 1, 2024
404a5c5
cleanup
reshmem Apr 1, 2024
d81382b
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 2, 2024
8258863
fixes after review
reshmem Apr 2, 2024
28fcfcf
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 2, 2024
3831081
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 2, 2024
700582b
Update runner/src/poseidon2.rs
reshmem Apr 2, 2024
6b41395
fix
reshmem Apr 3, 2024
374e2c3
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 3, 2024
72b4422
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 7, 2024
63c2123
Clippy
matthiasgoergens Apr 12, 2024
eb225d8
Better conditional compilation
matthiasgoergens Apr 12, 2024
45f8a63
pad_trace_with_default
matthiasgoergens Apr 12, 2024
e3e565e
Remove useless trace
matthiasgoergens Apr 12, 2024
9ed5ac2
Clean up
matthiasgoergens Apr 12, 2024
e73298f
Fix typo
matthiasgoergens Apr 12, 2024
eaaa138
CLean up
matthiasgoergens Apr 12, 2024
a705624
Clean up
matthiasgoergens Apr 12, 2024
c0e5f13
Rename
matthiasgoergens Apr 12, 2024
5701875
Further cleanup
matthiasgoergens Apr 12, 2024
c41654d
Clean up
matthiasgoergens Apr 12, 2024
93f5e56
Simpler
matthiasgoergens Apr 12, 2024
cc10dda
Cleaner
matthiasgoergens Apr 12, 2024
cd61733
Remove counter-productive 'debug' option
matthiasgoergens Apr 13, 2024
f823c8b
Merge branch 'matthias/remove-useless-debug' into roman/poseidon-inpu…
matthiasgoergens Apr 13, 2024
3932df1
Remove poseidon2-feature
matthiasgoergens Apr 13, 2024
aec4160
Debug helpers
matthiasgoergens Apr 13, 2024
aaa7346
Merge branch 'matthias/enable-poseidon-always-remove-feature' into ro…
matthiasgoergens Apr 13, 2024
9f04532
Minimise diff
matthiasgoergens Apr 13, 2024
9aa4ac0
Minimise diff
matthiasgoergens Apr 13, 2024
a29c569
Rename
matthiasgoergens Apr 13, 2024
35eb2ce
Clean up
matthiasgoergens Apr 13, 2024
9b7aeb7
Revert "Simpler"
matthiasgoergens Apr 13, 2024
354c567
Revert "Clean up"
matthiasgoergens Apr 13, 2024
bc26da4
Reverted
matthiasgoergens Apr 13, 2024
5f2f78f
Clean up
matthiasgoergens Apr 13, 2024
712a8ed
refactor
matthiasgoergens Apr 13, 2024
f4de7be
Restore
matthiasgoergens Apr 13, 2024
253183d
Fixed!
matthiasgoergens Apr 13, 2024
5fab346
Clean up
matthiasgoergens Apr 13, 2024
de40025
Clean up
matthiasgoergens Apr 13, 2024
4317767
Clippy
matthiasgoergens Apr 13, 2024
0c37937
Keep length in the type system
matthiasgoergens Apr 13, 2024
c53434c
Merge remote-tracking branch 'origin/main' into roman/poseidon-input-…
matthiasgoergens Apr 13, 2024
d9aa994
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 14, 2024
2c07fb9
fix: issue with under-constraint byte-address
reshmem Apr 14, 2024
0ab95e3
fix: after review
reshmem Apr 14, 2024
ec39911
fix: comment ..
reshmem Apr 14, 2024
41c3e77
fix: failed example, refactored cyclic dep
reshmem Apr 15, 2024
72ec4af
taplo
reshmem Apr 15, 2024
6617711
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 15, 2024
5680070
fix...
reshmem Apr 15, 2024
aacb641
Cargo.lock
reshmem Apr 16, 2024
f853513
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 16, 2024
662b827
examples/Cargo.lock
reshmem Apr 16, 2024
2793151
sdk/Cargo.lock
reshmem Apr 16, 2024
c0d9671
clippy
reshmem Apr 16, 2024
09c8a56
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 16, 2024
8f1cbfb
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 18, 2024
0cf3377
fix after merge
reshmem Apr 18, 2024
ae3403a
taplo
reshmem Apr 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ members = [
"signatures",
"state",
"wasm-demo",
"poseidon2",
]
resolver = "2"

Expand Down
1 change: 1 addition & 0 deletions circuits/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ mozak-runner = { path = "../runner" }
mozak-sdk = { path = "../sdk" }
plonky2 = { version = "0", default-features = false }
plonky2_maybe_rayon = { version = "0", default-features = false }
poseidon2 = { path = "../poseidon2" }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
starky = { version = "0", default-features = false, features = ["std"] }
Expand Down
5 changes: 5 additions & 0 deletions circuits/src/generation/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ pub mod io_memory;
pub mod memory;
pub mod memory_zeroinit;
pub mod memoryinit;
pub mod poseidon2_preimage_pack;
pub mod xor;
use std::borrow::Borrow;
use std::fmt::Display;
Expand Down Expand Up @@ -49,6 +50,7 @@ use crate::generation::memory_zeroinit::generate_memory_zero_init_trace;
use crate::generation::memoryinit::{
generate_elf_memory_init_trace, generate_mozak_memory_init_trace,
};
use crate::generation::poseidon2_preimage_pack::generate_poseidon2_preimage_pack_trace;
use crate::poseidon2::generation::generate_poseidon2_trace;
use crate::poseidon2_output_bytes::generation::generate_poseidon2_output_bytes_trace;
use crate::poseidon2_sponge::generation::generate_poseidon2_sponge_trace;
Expand Down Expand Up @@ -101,6 +103,8 @@ pub fn generate_traces<F: RichField + Extendable<D>, const D: usize>(
let cast_list_commitment_tape_rows = generate_cast_list_commitment_tape_trace(&record.executed);
let poseiden2_sponge_rows = generate_poseidon2_sponge_trace(&record.executed);
let poseidon2_output_bytes_rows = generate_poseidon2_output_bytes_trace(&poseiden2_sponge_rows);
let poseidon2_preimage_pack_rows =
generate_poseidon2_preimage_pack_trace(&poseiden2_sponge_rows);
let poseidon2_rows = generate_poseidon2_trace(&record.executed);

let memory_rows = generate_memory_trace(
Expand Down Expand Up @@ -166,6 +170,7 @@ pub fn generate_traces<F: RichField + Extendable<D>, const D: usize>(
poseidon2_stark: trace_rows_to_poly_values(poseidon2_rows),
poseidon2_sponge_stark: trace_rows_to_poly_values(poseiden2_sponge_rows),
poseidon2_output_bytes_stark: trace_rows_to_poly_values(poseidon2_output_bytes_rows),
poseidon2_preimage_pack: trace_rows_to_poly_values(poseidon2_preimage_pack_rows),
tape_commitments_stark: trace_rows_to_poly_values(tape_commitments_rows),
}
.build()
Expand Down
55 changes: 55 additions & 0 deletions circuits/src/generation/poseidon2_preimage_pack.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
use plonky2::hash::hash_types::RichField;

use crate::poseidon2_preimage_pack::columns::Poseidon2PreimagePack;
use crate::poseidon2_sponge::columns::Poseidon2Sponge;
use crate::utils::pad_trace_with_default;

pub fn generate_poseidon2_preimage_pack_trace<F: RichField>(
poseidon2_sponge_rows: &[Poseidon2Sponge<F>],
) -> Vec<Poseidon2PreimagePack<F>> {
let trace: Vec<Poseidon2PreimagePack<F>> = poseidon2_sponge_rows
.iter()
.flat_map(Into::<Vec<Poseidon2PreimagePack<F>>>::into)
.collect();
pad_trace_with_default(trace)
}

#[cfg(test)]
mod tests {
use mozak_runner::vm::Row;
use plonky2::plonk::config::{GenericConfig, PoseidonGoldilocksConfig};

use crate::generation::MIN_TRACE_LENGTH;
use crate::poseidon2_sponge::generation::generate_poseidon2_sponge_trace;
use crate::test_utils::{create_poseidon2_test, Poseidon2Test};
const D: usize = 2;
type C = PoseidonGoldilocksConfig;
type F = <C as GenericConfig<D>>::F;
#[test]
fn generate_poseidon2_preimage_pack_trace() {
let data = "😇 Mozak is knowledge arguments based technology".to_string();
let input_start_addr = 1024;
let output_start_addr = 2048;
let (_program, record) = create_poseidon2_test(&[Poseidon2Test {
data,
input_start_addr,
output_start_addr,
}]);

let step_rows = record.executed;

let sponge_trace = generate_poseidon2_sponge_trace(&step_rows);
let trace = super::generate_poseidon2_preimage_pack_trace(&sponge_trace);
// for one sponge construct we have one row with gen_output = 1.
// So we expect other padding data to make trace of len MIN_TRACE_LENGTH.
assert_eq!(trace.len(), MIN_TRACE_LENGTH);
}

#[test]
fn generate_poseidon2_trace_with_dummy() {
let step_rows: Vec<Row<F>> = vec![];
let sponge_trace = generate_poseidon2_sponge_trace(&step_rows);
let trace = super::generate_poseidon2_preimage_pack_trace(&sponge_trace);
assert_eq!(trace.len(), MIN_TRACE_LENGTH);
}
}
1 change: 1 addition & 0 deletions circuits/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ pub mod memory_zeroinit;
pub mod memoryinit;
pub mod poseidon2;
pub mod poseidon2_output_bytes;
pub mod poseidon2_preimage_pack;
pub mod poseidon2_sponge;
pub mod program;
pub mod program_multiplicities;
Expand Down
50 changes: 29 additions & 21 deletions circuits/src/memory/columns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use plonky2::hash::hashing::PlonkyPermutation;
use plonky2::hash::poseidon2::Poseidon2Permutation;
use plonky2::iop::ext_target::ExtensionTarget;
use plonky2::plonk::circuit_builder::CircuitBuilder;
use poseidon2::mozak_poseidon2;

use crate::columns_view::{columns_view_impl, make_col_map};
use crate::cross_table_lookup::Column;
Expand All @@ -14,7 +15,7 @@ use crate::memory_halfword::columns::HalfWordMemory;
use crate::memory_io::columns::InputOutputMemory;
use crate::memory_zeroinit::columns::MemoryZeroInit;
use crate::memoryinit::columns::{MemoryInit, MemoryInitCtl};
use crate::poseidon2_output_bytes::columns::{Poseidon2OutputBytes, BYTES_COUNT};
use crate::poseidon2_output_bytes::columns::Poseidon2OutputBytes;
use crate::poseidon2_sponge::columns::Poseidon2Sponge;
use crate::rangecheck::columns::RangeCheckCtl;
use crate::stark::mozak_stark::{MemoryTable, TableWithTypedOutput};
Expand Down Expand Up @@ -123,36 +124,43 @@ impl<F: RichField> From<&Poseidon2Sponge<F>> for Vec<Memory<F>> {
if (value.ops.is_permute + value.ops.is_init_permute).is_zero() {
vec![]
} else {
let rate = Poseidon2Permutation::<F>::RATE;
// each Field element in preimage represents a byte.
(0..rate)
.map(|i| Memory {
clk: value.clk,
addr: value.input_addr
+ F::from_canonical_u8(u8::try_from(i).expect("i > 255")),
is_load: F::ONE,
value: value.preimage[i],
..Default::default()
// each Field element in preimage represents packed data (packed bytes)
(0..Poseidon2Permutation::<F>::RATE)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO(Matthias): this is all very suspicious.

.flat_map(|fe_index_inside_preimage| {
let base_address = value.input_addr
+ mozak_poseidon2::data_capacity_fe::<F>()
* F::from_canonical_usize(fe_index_inside_preimage);
let unpacked = mozak_poseidon2::unpack_to_field_elements(
&value.preimage[fe_index_inside_preimage],
);

(0..mozak_poseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT)
.map(|byte_index_inside_fe| Memory {
clk: value.clk,
addr: base_address + F::from_canonical_usize(byte_index_inside_fe),
is_load: F::ONE,
value: unpacked[byte_index_inside_fe],
..Default::default()
})
.collect::<Vec<_>>()
})
.collect()
}
}
}

impl<F: RichField> From<&Poseidon2OutputBytes<F>> for Vec<Memory<F>> {
fn from(value: &Poseidon2OutputBytes<F>) -> Self {
if value.is_executed.is_zero() {
fn from(output: &Poseidon2OutputBytes<F>) -> Self {
if output.is_executed.is_zero() {
vec![]
} else {
(0..BYTES_COUNT)
.map(|i| Memory {
clk: value.clk,
addr: value.output_addr
+ F::from_canonical_u8(u8::try_from(i).expect(
"BYTES_COUNT of poseidon output should be representable by a u8",
)),
(0..)
.zip(output.output_bytes)
.map(|(i, value)| Memory {
clk: output.clk,
addr: output.output_addr + F::from_canonical_usize(i),
is_store: F::ONE,
value: value.output_bytes[i],
value,
..Default::default()
})
.collect()
Expand Down
96 changes: 96 additions & 0 deletions circuits/src/poseidon2_preimage_pack/columns.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
use itertools::Itertools;
use plonky2::hash::hash_types::RichField;
use poseidon2::mozak_poseidon2;

use crate::columns_view::{columns_view_impl, make_col_map, NumberOfColumns};
use crate::linear_combination::Column;
use crate::linear_combination_typed::ColumnWithTypedInput;
use crate::memory::columns::MemoryCtl;
use crate::poseidon2::columns::STATE_SIZE;
use crate::poseidon2_sponge::columns::Poseidon2Sponge;
use crate::stark::mozak_stark::{Poseidon2PreimagePackTable, TableWithTypedOutput};

#[repr(C)]
#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
pub struct Poseidon2PreimagePack<F> {
pub clk: F,
pub byte_addr: F,
pub bytes: [F; mozak_poseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT],
pub is_executed: F,
}

columns_view_impl!(Poseidon2PreimagePack);
make_col_map!(PACK, Poseidon2PreimagePack);

pub const NUM_POSEIDON2_PREIMAGE_PACK_COLS: usize = Poseidon2PreimagePack::<()>::NUMBER_OF_COLUMNS;

impl<F: RichField> From<&Poseidon2Sponge<F>> for Vec<Poseidon2PreimagePack<F>> {
// To make it safe for user to change constants
#[allow(clippy::assertions_on_constants)]
fn from(value: &Poseidon2Sponge<F>) -> Self {
if (value.ops.is_init_permute + value.ops.is_permute).is_zero() {
vec![]
} else {
assert!(
mozak_poseidon2::FIELD_ELEMENTS_RATE <= STATE_SIZE,
"Packing RATE (FIELD_ELEMENTS_RATE) should be less or equal than STATE_SIZE"
);
let preimage: [F; mozak_poseidon2::FIELD_ELEMENTS_RATE] = value.preimage
[..mozak_poseidon2::FIELD_ELEMENTS_RATE]
.try_into()
.expect("Should succeed since preimage can't be empty");
// For each FE of preimage we have PACK_CAP bytes
preimage
.iter()
.enumerate()
.map(|(i, fe)| Poseidon2PreimagePack {
clk: value.clk,
byte_addr: value.input_addr
+ F::from_canonical_usize(i) * mozak_poseidon2::data_capacity_fe::<F>(),
bytes: mozak_poseidon2::unpack_to_field_elements(fe),
is_executed: F::ONE,
})
.collect_vec()
}
}
}

columns_view_impl!(Poseidon2SpongePreimagePackCtl);
#[repr(C)]
#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
pub struct Poseidon2SpongePreimagePackCtl<T> {
pub clk: T,
pub value: T,
pub byte_addr: T,
}
#[must_use]
pub fn lookup_for_poseidon2_sponge() -> TableWithTypedOutput<Poseidon2SpongePreimagePackCtl<Column>>
{
Poseidon2PreimagePackTable::new(
Poseidon2SpongePreimagePackCtl {
clk: PACK.clk,
value: ColumnWithTypedInput::reduce_with_powers(PACK.bytes, 1 << 8),
byte_addr: PACK.byte_addr,
},
PACK.is_executed,
)
}

#[must_use]
pub fn lookup_for_input_memory() -> Vec<TableWithTypedOutput<MemoryCtl<Column>>> {
(0..)
.zip(PACK.bytes)
.map(|(index, value)| {
Poseidon2PreimagePackTable::new(
MemoryCtl {
clk: PACK.clk,
is_store: ColumnWithTypedInput::constant(0),
is_load: ColumnWithTypedInput::constant(1),
value,
addr: PACK.byte_addr + index,
},
PACK.is_executed,
)
})
.collect()
}
2 changes: 2 additions & 0 deletions circuits/src/poseidon2_preimage_pack/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub mod columns;
pub mod stark;
Loading