1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
//! Hasher chiplet trace constants and types.
//!
//! This module defines the structure of the hasher chiplet's execution trace, including:
//! - Trace selectors that determine which hash operation is being performed
//! - State layout for the Poseidon2 permutation (12 field elements: 8 rate + 4 capacity)
//! - Column ranges and indices for accessing trace data
//!
//! The hasher chiplet supports several operations:
//! - Linear hashing (absorbing arbitrary-length inputs)
//! - 2-to-1 hashing (Merkle tree node computation)
//! - Merkle path verification
//! - Merkle root updates (for authenticated data structure modifications)
use Range;
pub use ;
use ;
// TYPES ALIASES
// ================================================================================================
/// Type for Hasher trace selector. These selectors are used to define which transition function
/// is to be applied at a specific row of the hasher execution trace.
pub type Selectors = ;
/// Type for the Hasher's state.
pub type HasherState = ;
// CONSTANTS
// ================================================================================================
/// Number of field element needed to represent the sponge state for the hash function.
///
/// This value is set to 12: 8 elements are reserved for rate and the remaining 4 elements are
/// reserved for capacity. This configuration enables computation of 2-to-1 hash in a single
/// permutation.
/// The sponge state is `[RATE0(4), RATE1(4), CAPACITY(4)]`.
pub const STATE_WIDTH: usize = STATE_WIDTH;
/// The hasher state portion of the execution trace, located in columns 3..15.
pub const STATE_COL_RANGE: = create_range;
/// Number of field elements in the capacity portion of the hasher's state.
pub const CAPACITY_LEN: usize = STATE_WIDTH - RATE_LEN;
/// The index in the hasher state where the domain is set when initializing the hasher.
///
/// The domain is stored in the second element of the capacity word.
/// With LE sponge state layout [RATE0, RATE1, CAP], this is at index 9 (= CAPACITY_RANGE.start +
/// 1).
pub const CAPACITY_DOMAIN_IDX: usize = 9;
/// Number of field elements in the rate portion of the hasher's state.
pub const RATE_LEN: usize = 8;
/// The rate portion of the hasher state in the execution trace, located in columns 3..11.
/// With LE sponge state layout [RATE0, RATE1, CAP], rate comes first.
pub const RATE_COL_RANGE: = Range ;
/// The capacity portion of the hasher state in the execution trace, located in columns 11..15.
/// With LE sponge state layout [RATE0, RATE1, CAP], capacity comes last.
pub const CAPACITY_COL_RANGE: = Range ;
// The length of the output portion of the hash state.
pub const DIGEST_LEN: usize = 4;
/// The output portion of the hash state, located in the first rate word (RATE0).
pub const DIGEST_RANGE: = DIGEST_RANGE;
/// Number of round steps used to complete a single permutation.
///
/// For Poseidon2, we model a permutation as 31 step transitions, resulting in a 32-row cycle.
pub const NUM_ROUNDS: usize = NUM_ROUNDS;
/// Index of the last row in a permutation cycle (0-based).
pub const LAST_CYCLE_ROW: usize = NUM_ROUNDS;
pub const LAST_CYCLE_ROW_FELT: Felt = new;
/// Number of selector columns in the trace.
pub const NUM_SELECTORS: usize = 3;
/// The number of rows in the execution trace required to compute a permutation of Poseidon2.
/// This is equal to 32.
pub const HASH_CYCLE_LEN: usize = NUM_ROUNDS.next_power_of_two;
pub const HASH_CYCLE_LEN_FELT: Felt = new;
/// Number of columns in Hasher execution trace. There is one additional column for the node index.
pub const TRACE_WIDTH: usize = NUM_SELECTORS + STATE_WIDTH + 1;
// --- Transition selectors -----------------------------------------------------------------------
/// Specifies a start of a new linear hash computation or absorption of new elements into an
/// executing linear hash computation. These selectors can also be used for a simple 2-to-1 hash
/// computation.
pub const LINEAR_HASH: Selectors = ;
/// Unique label computed as 1 plus the full chiplet selector with the bits reversed.
/// `selector = [0 | 1, 0, 0]`, `flag = rev(selector) + 1 = [0, 0, 1 | 0] + 1 = 3`
pub const LINEAR_HASH_LABEL: u8 = 0b0010 + 1;
/// Specifies a start of Merkle path verification computation or absorption of a new path node
/// into the hasher state.
pub const MP_VERIFY: Selectors = ;
/// Unique label computed as 1 plus the full chiplet selector with the bits reversed.
/// `selector = [0 | 1, 0, 1]`, `flag = rev(selector) + 1 = [1, 0, 1 | 0] + 1 = 11`
pub const MP_VERIFY_LABEL: u8 = 0b1010 + 1;
/// Specifies a start of Merkle path verification or absorption of a new path node into the hasher
/// state for the "old" node value during Merkle root update computation.
pub const MR_UPDATE_OLD: Selectors = ;
/// Unique label computed as 1 plus the full chiplet selector with the bits reversed.
/// `selector = [0 | 1, 1, 0]`, `flag = rev(selector) + 1 = [0, 1, 1 | 0] + 1 = 7`
pub const MR_UPDATE_OLD_LABEL: u8 = 0b0110 + 1;
/// Specifies a start of Merkle path verification or absorption of a new path node into the hasher
/// state for the "new" node value during Merkle root update computation.
pub const MR_UPDATE_NEW: Selectors = ;
/// Unique label computed as 1 plus the full chiplet selector with the bits reversed.
/// `selector = [0 | 1, 1, 1]`, `flag = rev(selector) + 1 = [1, 1, 1 | 0] + 1 = 15`
pub const MR_UPDATE_NEW_LABEL: u8 = 0b1110 + 1;
/// Specifies a completion of a computation such that only the hash result (values in h0, h1, h2
/// h3) is returned.
pub const RETURN_HASH: Selectors = ;
/// Unique label computed as 1 plus the full chiplet selector with the bits reversed.
/// `selector = [0 | 0, 0, 0]`, `flag = rev(selector) + 1 = [0, 0, 0 | 0] + 1 = 1`
pub const RETURN_HASH_LABEL: u8 = 0b0000 + 1;
/// Specifies a completion of a computation such that the entire hasher state (values in h0 through
/// h11) is returned.
pub const RETURN_STATE: Selectors = ;
/// Unique label computed as 1 plus the full chiplet selector with the bits reversed.
/// `selector = [0 | 0, 0, 1]`, `flag = rev(selector) + 1 = [1, 0, 0 | 0] + 1 = 9`
pub const RETURN_STATE_LABEL: u8 = 0b1000 + 1;
// --- Column accessors in the auxiliary trace ----------------------------------------------------
/// Index of the auxiliary trace column tracking the state of the sibling table.
pub const P1_COL_IDX: usize = HASH_KERNEL_VTABLE_AUX_TRACE_OFFSET;