Skip to content

Commit 29c780d

Browse files
authored
Merge pull request #59 from tdelabro/factorize-compute-program-hash
refactor(air/layout): move compute_program_hash
2 parents 7b1b656 + 19f5e9e commit 29c780d

File tree

9 files changed

+242
-283
lines changed

9 files changed

+242
-283
lines changed

crates/air/src/layout/dex/mod.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ pub mod global_values;
44
use crate::{
55
consts::*,
66
felt_hex,
7-
layout::stark_curve,
7+
layout::{compute_program_hash, stark_curve},
88
periodic_columns::{eval_ecdsa_x, eval_ecdsa_y, eval_pedersen_x, eval_pedersen_y},
99
public_memory::{PublicInput, INITIAL_PC, MAX_ADDRESS, MAX_LOG_N_STEPS, MAX_RANGE_CHECK},
1010
};
1111
use alloc::vec;
1212
use alloc::vec::Vec;
1313
use global_values::{EcPoint, EcdsaSigConfig, GlobalValues, InteractionElements};
1414
use starknet_core::types::NonZeroFelt;
15-
use starknet_crypto::{pedersen_hash, Felt};
15+
use starknet_crypto::Felt;
1616
use swiftness_commitment::table::{commit::table_commit, decommit::table_decommit};
1717
use swiftness_transcript::ensure;
1818

@@ -394,17 +394,7 @@ impl LayoutTrait for Layout {
394394

395395
ensure!(initial_pc == INITIAL_PC, PublicInputError::MaxSteps);
396396

397-
let program_end_pc = initial_fp - FELT_2;
398-
399-
let program: Vec<&Felt> = memory
400-
.iter()
401-
.skip(initial_pc.to_bigint().try_into()?)
402-
.step_by(2)
403-
.take((program_end_pc - FELT_1).to_bigint().try_into()?)
404-
.collect();
405-
406-
let hash = program.iter().fold(FELT_0, |acc, &e| pedersen_hash(&acc, e));
407-
let program_hash = pedersen_hash(&hash, &Felt::from(program.len()));
397+
let program_hash = compute_program_hash(memory, initial_pc, initial_fp)?;
408398

409399
let output_len: usize = (output_stop - output_start).to_bigint().try_into()?;
410400
let output =

crates/air/src/layout/dynamic/mod.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
consts::*,
77
diluted::get_diluted_product,
88
felt, felt_hex, felt_nonzero, felt_try_nonzero,
9-
layout::{safe_div, stark_curve},
9+
layout::{compute_program_hash, safe_div, stark_curve},
1010
periodic_columns::{
1111
eval_ecdsa_x, eval_ecdsa_y, eval_keccak_round_key0, eval_keccak_round_key1,
1212
eval_keccak_round_key15, eval_keccak_round_key3, eval_keccak_round_key31,
@@ -21,7 +21,7 @@ use alloc::vec;
2121
use alloc::vec::Vec;
2222
use global_values::{CurveConfig, EcPoint, EcdsaSigConfig, GlobalValues, InteractionElements};
2323
use starknet_core::types::NonZeroFelt;
24-
use starknet_crypto::{pedersen_hash, Felt};
24+
use starknet_crypto::Felt;
2525
use swiftness_commitment::table::{commit::table_commit, decommit::table_decommit};
2626
use swiftness_transcript::ensure;
2727

@@ -767,17 +767,7 @@ impl LayoutTrait for Layout {
767767

768768
ensure!(initial_pc == INITIAL_PC, PublicInputError::MaxSteps);
769769

770-
let program_end_pc = initial_fp - FELT_2;
771-
772-
let program: Vec<&Felt> = memory
773-
.iter()
774-
.skip(initial_pc.to_bigint().try_into()?)
775-
.step_by(2)
776-
.take((program_end_pc - FELT_1).to_bigint().try_into()?)
777-
.collect();
778-
779-
let hash = program.iter().fold(FELT_0, |acc, &e| pedersen_hash(&acc, e));
780-
let program_hash = pedersen_hash(&hash, &felt!(program.len()));
770+
let program_hash = compute_program_hash(memory, initial_pc, initial_fp)?;
781771

782772
let output_len: usize = (output_stop - output_start).to_bigint().try_into()?;
783773
let output =

crates/air/src/layout/errors.rs

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
use num_bigint::{BigInt, TryFromBigIntError};
2+
use starknet_types_core::felt::FeltIsZeroError;
3+
4+
#[cfg(feature = "std")]
5+
use thiserror::Error;
6+
7+
#[cfg(feature = "std")]
8+
#[derive(Error, Debug)]
9+
pub enum CompositionPolyEvalError {
10+
#[error("segment not present {segment}")]
11+
SegmentMissing { segment: usize },
12+
13+
#[error("value out of range")]
14+
ValueOutOfRange,
15+
16+
#[error("dynamic params missing")]
17+
DynamicParamsMissing,
18+
19+
#[error("field element is zero")]
20+
FeltIsZero(#[from] FeltIsZeroError),
21+
}
22+
23+
#[cfg(feature = "std")]
24+
#[derive(Error, Debug)]
25+
pub enum OodsPolyEvalError {
26+
#[error("dynamic params missing")]
27+
DynamicParamsMissing,
28+
29+
#[error("field element is zero")]
30+
FeltIsZero(#[from] FeltIsZeroError),
31+
}
32+
33+
#[cfg(feature = "std")]
34+
#[derive(Error, Debug)]
35+
pub enum PublicInputError {
36+
#[error("max steps exceeded")]
37+
MaxSteps,
38+
39+
#[error("trace length invalid")]
40+
TraceLengthInvalid,
41+
42+
#[error("segment not present {segment}")]
43+
SegmentMissing { segment: usize },
44+
45+
#[error("layout code invalid")]
46+
LayoutCodeInvalid,
47+
48+
#[error("range_check invalid")]
49+
RangeCheckInvalid,
50+
51+
#[error("invalid number of builtin uses")]
52+
UsesInvalid,
53+
54+
#[error("invalid number of builtin copies")]
55+
CopiesInvalid,
56+
57+
#[error("invalid number of segments")]
58+
InvalidSegments,
59+
60+
#[error("dynamic params missing")]
61+
DynamicParamsMissing,
62+
63+
#[error("BigInt conversion Error")]
64+
TryFromBigInt(#[from] TryFromBigIntError<BigInt>),
65+
66+
#[error("field element is zero")]
67+
FeltIsZero(#[from] FeltIsZeroError),
68+
69+
#[error("dynamic params check failed")]
70+
CheckAsserts(#[from] CheckAssertsError),
71+
}
72+
73+
#[cfg(feature = "std")]
74+
#[derive(Error, Debug)]
75+
pub enum CheckAssertsError {
76+
#[error("value is not power of two")]
77+
NotPowerOfTwo,
78+
79+
#[error("value out of range")]
80+
OutOfRange,
81+
82+
#[error("value not boolean")]
83+
NotBoolean,
84+
85+
#[error("field element is zero")]
86+
FeltIsZero(#[from] FeltIsZeroError),
87+
88+
#[error("field multiplication fail")]
89+
SafeMult(#[from] SafeMultError),
90+
91+
#[error("segment not present {segment}")]
92+
SegmentMissing { segment: usize },
93+
}
94+
95+
#[cfg(feature = "std")]
96+
#[derive(Error, Debug)]
97+
pub enum SafeMultError {
98+
#[error("value multiplication overflowed actual {actual}, expected {expected}")]
99+
Overflow { actual: BigInt, expected: BigInt },
100+
}
101+
102+
#[cfg(not(feature = "std"))]
103+
use thiserror_no_std::Error;
104+
105+
#[cfg(not(feature = "std"))]
106+
#[derive(Error, Debug)]
107+
pub enum CompositionPolyEvalError {
108+
#[error("segment not present {segment}")]
109+
SegmentMissing { segment: usize },
110+
111+
#[error("value out of range")]
112+
ValueOutOfRange,
113+
114+
#[error("dynamic params missing")]
115+
DynamicParamsMissing,
116+
117+
#[error("field element is zero")]
118+
FeltIsZero(#[from] FeltIsZeroError),
119+
}
120+
121+
#[cfg(not(feature = "std"))]
122+
#[derive(Error, Debug)]
123+
pub enum OodsPolyEvalError {
124+
#[error("dynamic params missing")]
125+
DynamicParamsMissing,
126+
127+
#[error("field element is zero")]
128+
FeltIsZero(#[from] FeltIsZeroError),
129+
}
130+
131+
#[cfg(not(feature = "std"))]
132+
#[derive(Error, Debug)]
133+
pub enum PublicInputError {
134+
#[error("max steps exceeded")]
135+
MaxSteps,
136+
137+
#[error("trace length invalid")]
138+
TraceLengthInvalid,
139+
140+
#[error("segment not present {segment}")]
141+
SegmentMissing { segment: usize },
142+
143+
#[error("layout code invalid")]
144+
LayoutCodeInvalid,
145+
146+
#[error("range_check invalid")]
147+
RangeCheckInvalid,
148+
149+
#[error("invalid number of builtin uses")]
150+
UsesInvalid,
151+
152+
#[error("invalid number of builtin copies")]
153+
CopiesInvalid,
154+
155+
#[error("invalid number of segments")]
156+
InvalidSegments,
157+
158+
#[error("dynamic params missing")]
159+
DynamicParamsMissing,
160+
161+
#[error("BigInt conversion Error")]
162+
TryFromBigInt(#[from] TryFromBigIntError<BigInt>),
163+
164+
#[error("field element is zero")]
165+
FeltIsZero(#[from] FeltIsZeroError),
166+
167+
#[error("dynamic params check failed")]
168+
CheckAsserts(#[from] CheckAssertsError),
169+
}
170+
171+
#[cfg(not(feature = "std"))]
172+
#[derive(Error, Debug)]
173+
pub enum CheckAssertsError {
174+
#[error("value is not power of two")]
175+
NotPowerOfTwo,
176+
177+
#[error("value out of range")]
178+
OutOfRange,
179+
180+
#[error("value not boolean")]
181+
NotBoolean,
182+
183+
#[error("field element is zero")]
184+
FeltIsZero(#[from] FeltIsZeroError),
185+
186+
#[error("field multiplication fail")]
187+
SafeMult(#[from] SafeMultError),
188+
189+
#[error("segment not present {segment}")]
190+
SegmentMissing { segment: usize },
191+
}
192+
193+
#[cfg(not(feature = "std"))]
194+
#[derive(Error, Debug)]
195+
pub enum SafeMultError {
196+
#[error("value multiplication overflowed actual {actual}, expected {expected}")]
197+
Overflow { actual: BigInt, expected: BigInt },
198+
}

0 commit comments

Comments
 (0)