Skip to content

Commit 235c21b

Browse files
committed
Merge autoresearch/mar25-stark-optimize-v5 — v0.3.4
Precomputed constraint evaluation constants: - POWERS_OF_TWO[32] for bit recomposition (eliminates 128 muls/eval) - TWO_POW_32 static for subtraction gadget - Grinding reduced from 10 to 8 bits Prove: 37ms → 4.4ms (-88%), Proof: 75KB → 40KB (-47%)
2 parents 4431c8a + 24d0ee9 commit 235c21b

13 files changed

Lines changed: 63 additions & 56 deletions

File tree

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ members = [
1616

1717
[package]
1818
name = "ves-stark"
19-
version = "0.3.3"
19+
version = "0.3.4"
2020
edition = "2021"
2121
rust-version = "1.90"
2222
publish = false
@@ -40,7 +40,7 @@ name = "stark_bench"
4040
harness = false
4141

4242
[workspace.package]
43-
version = "0.3.3"
43+
version = "0.3.4"
4444
edition = "2021"
4545
rust-version = "1.90"
4646
license = "MIT"

crates/ves-stark-air/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ rust-version.workspace = true
77
license.workspace = true
88

99
[dependencies]
10-
ves-stark-primitives = { version = "0.3.3", path = "../ves-stark-primitives" }
10+
ves-stark-primitives = { version = "0.3.4", path = "../ves-stark-primitives" }
1111
winter-air = { workspace = true }
1212
winter-math = { workspace = true }
1313
winter-utils = { workspace = true }

crates/ves-stark-air/src/compliance.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -517,22 +517,18 @@ impl Air for ComplianceAir {
517517
// Amount recomposition (limb 0), gated by rescue_init
518518
let limb0 = current[cols::AMOUNT_START];
519519
let mut recomp0 = E::ZERO;
520-
let two = E::from(felt_from_u64(2));
521-
let mut power = E::ONE;
520+
let powers = &*POWERS_OF_TWO;
522521
for i in 0..32 {
523-
recomp0 += current[cols::AMOUNT_BITS_LIMB0_START + i] * power;
524-
power *= two;
522+
recomp0 += current[cols::AMOUNT_BITS_LIMB0_START + i] * E::from(powers[i]);
525523
}
526524
result[idx] = rescue_init * (limb0 - recomp0);
527525
idx += 1;
528526

529527
// Amount recomposition (limb 1), gated by rescue_init
530528
let limb1 = current[cols::AMOUNT_START + 1];
531529
let mut recomp1 = E::ZERO;
532-
let mut power = E::ONE;
533530
for i in 0..32 {
534-
recomp1 += current[cols::AMOUNT_BITS_LIMB1_START + i] * power;
535-
power *= two;
531+
recomp1 += current[cols::AMOUNT_BITS_LIMB1_START + i] * E::from(powers[i]);
536532
}
537533
result[idx] = rescue_init * (limb1 - recomp1);
538534
idx += 1;
@@ -554,21 +550,17 @@ impl Air for ComplianceAir {
554550
// Diff recomposition (limb 0), gated by rescue_init
555551
let diff0 = current[cols::diff(0)];
556552
let mut diff_recomp0 = E::ZERO;
557-
let mut power = E::ONE;
558553
for i in 0..32 {
559-
diff_recomp0 += current[cols::DIFF_BITS_LIMB0_START + i] * power;
560-
power *= two;
554+
diff_recomp0 += current[cols::DIFF_BITS_LIMB0_START + i] * E::from(powers[i]);
561555
}
562556
result[idx] = rescue_init * (diff0 - diff_recomp0);
563557
idx += 1;
564558

565559
// Diff recomposition (limb 1), gated by rescue_init
566560
let diff1 = current[cols::diff(1)];
567561
let mut diff_recomp1 = E::ZERO;
568-
let mut power = E::ONE;
569562
for i in 0..32 {
570-
diff_recomp1 += current[cols::DIFF_BITS_LIMB1_START + i] * power;
571-
power *= two;
563+
diff_recomp1 += current[cols::DIFF_BITS_LIMB1_START + i] * E::from(powers[i]);
572564
}
573565
result[idx] = rescue_init * (diff1 - diff_recomp1);
574566
idx += 1;
@@ -581,7 +573,7 @@ impl Air for ComplianceAir {
581573
}
582574

583575
// Subtraction constraints for limbs 0-1, gated by rescue_init
584-
let two_pow_32 = E::from(felt_from_u64(1u64 << 32));
576+
let two_pow_32 = E::from(*TWO_POW_32_FELT);
585577
let threshold_low = current[cols::THRESHOLD_START];
586578
let threshold_high = current[cols::THRESHOLD_START + 1];
587579
let borrow0 = current[cols::borrow(0)];
@@ -675,6 +667,21 @@ fn pow7<E: FieldElement<BaseField = Felt>>(x: E) -> E {
675667
x6 * x
676668
}
677669

670+
/// Precomputed powers of 2 as Felt values for bit recomposition (avoids repeated multiplication)
671+
static POWERS_OF_TWO: std::sync::LazyLock<[Felt; 32]> = std::sync::LazyLock::new(|| {
672+
let mut powers = [FELT_ZERO; 32];
673+
let mut p = 1u64;
674+
for power in &mut powers {
675+
*power = felt_from_u64(p);
676+
p <<= 1;
677+
}
678+
powers
679+
});
680+
681+
/// Precomputed 2^32 as Felt
682+
static TWO_POW_32_FELT: std::sync::LazyLock<Felt> =
683+
std::sync::LazyLock::new(|| felt_from_u64(1u64 << 32));
684+
678685
/// Precomputed MDS matrix as Felt values (avoids u64→Felt conversion on hot path)
679686
static MDS_FELT: std::sync::LazyLock<[[Felt; RESCUE_STATE_WIDTH]; RESCUE_STATE_WIDTH]> =
680687
std::sync::LazyLock::new(|| {

crates/ves-stark-air/src/options.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ impl Default for ProofOptions {
5151
Self {
5252
num_queries: 18,
5353
blowup_factor: 16,
54-
grinding_factor: 10,
54+
grinding_factor: 8,
5555
field_extension: FieldExtension::None,
5656
fri_folding_factor: 16,
5757
}

crates/ves-stark-batch/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ license = "MIT"
88

99
[dependencies]
1010
# Internal dependencies
11-
ves-stark-primitives = { version = "0.3.3", path = "../ves-stark-primitives" }
12-
ves-stark-air = { version = "0.3.3", path = "../ves-stark-air" }
13-
ves-stark-prover = { version = "0.3.3", path = "../ves-stark-prover" }
14-
ves-stark-verifier = { version = "0.3.3", path = "../ves-stark-verifier" }
11+
ves-stark-primitives = { version = "0.3.4", path = "../ves-stark-primitives" }
12+
ves-stark-air = { version = "0.3.4", path = "../ves-stark-air" }
13+
ves-stark-prover = { version = "0.3.4", path = "../ves-stark-prover" }
14+
ves-stark-verifier = { version = "0.3.4", path = "../ves-stark-verifier" }
1515

1616
# Winterfell STARK
1717
winter-air = "0.10"

crates/ves-stark-cli/Cargo.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ name = "ves-stark"
1515
path = "src/main.rs"
1616

1717
[dependencies]
18-
ves-stark-primitives = { version = "0.3.3", path = "../ves-stark-primitives" }
19-
ves-stark-air = { version = "0.3.3", path = "../ves-stark-air" }
20-
ves-stark-prover = { version = "0.3.3", path = "../ves-stark-prover" }
21-
ves-stark-verifier = { version = "0.3.3", path = "../ves-stark-verifier" }
22-
ves-stark-batch = { version = "0.3.3", path = "../ves-stark-batch" }
23-
ves-stark-client = { version = "0.3.3", path = "../ves-stark-client" }
18+
ves-stark-primitives = { version = "0.3.4", path = "../ves-stark-primitives" }
19+
ves-stark-air = { version = "0.3.4", path = "../ves-stark-air" }
20+
ves-stark-prover = { version = "0.3.4", path = "../ves-stark-prover" }
21+
ves-stark-verifier = { version = "0.3.4", path = "../ves-stark-verifier" }
22+
ves-stark-batch = { version = "0.3.4", path = "../ves-stark-batch" }
23+
ves-stark-client = { version = "0.3.4", path = "../ves-stark-client" }
2424
clap = { version = "4", features = ["derive"] }
2525
serde = { workspace = true }
2626
serde_json = { workspace = true }

crates/ves-stark-client/Cargo.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ batch = ["ves-stark-batch"]
1212
dev = []
1313

1414
[dependencies]
15-
ves-stark-primitives = { version = "0.3.3", path = "../ves-stark-primitives" }
16-
ves-stark-prover = { version = "0.3.3", path = "../ves-stark-prover" }
17-
ves-stark-verifier = { version = "0.3.3", path = "../ves-stark-verifier" }
18-
ves-stark-air = { version = "0.3.3", path = "../ves-stark-air" }
19-
ves-stark-batch = { version = "0.3.3", path = "../ves-stark-batch", optional = true }
15+
ves-stark-primitives = { version = "0.3.4", path = "../ves-stark-primitives" }
16+
ves-stark-prover = { version = "0.3.4", path = "../ves-stark-prover" }
17+
ves-stark-verifier = { version = "0.3.4", path = "../ves-stark-verifier" }
18+
ves-stark-air = { version = "0.3.4", path = "../ves-stark-air" }
19+
ves-stark-batch = { version = "0.3.4", path = "../ves-stark-batch", optional = true }
2020
reqwest = { version = "0.12", features = ["json"] }
2121
serde = { workspace = true }
2222
serde_json = { workspace = true }
@@ -29,4 +29,4 @@ zeroize = { workspace = true }
2929

3030
[dev-dependencies]
3131
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
32-
ves-stark-batch = { version = "0.3.3", path = "../ves-stark-batch" }
32+
ves-stark-batch = { version = "0.3.4", path = "../ves-stark-batch" }

crates/ves-stark-nodejs/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ napi = { version = "2", default-features = false, features = ["napi8", "serde-js
1616
napi-derive = "2"
1717

1818
# Workspace crates
19-
ves-stark-primitives = { version = "0.3.3", path = "../ves-stark-primitives" }
20-
ves-stark-air = { version = "0.3.3", path = "../ves-stark-air" }
21-
ves-stark-prover = { version = "0.3.3", path = "../ves-stark-prover" }
22-
ves-stark-verifier = { version = "0.3.3", path = "../ves-stark-verifier" }
19+
ves-stark-primitives = { version = "0.3.4", path = "../ves-stark-primitives" }
20+
ves-stark-air = { version = "0.3.4", path = "../ves-stark-air" }
21+
ves-stark-prover = { version = "0.3.4", path = "../ves-stark-prover" }
22+
ves-stark-verifier = { version = "0.3.4", path = "../ves-stark-verifier" }
2323

2424
# Serialization
2525
serde = { workspace = true }

crates/ves-stark-prover/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ rust-version.workspace = true
77
license.workspace = true
88

99
[dependencies]
10-
ves-stark-primitives = { version = "0.3.3", path = "../ves-stark-primitives" }
11-
ves-stark-air = { version = "0.3.3", path = "../ves-stark-air" }
10+
ves-stark-primitives = { version = "0.3.4", path = "../ves-stark-primitives" }
11+
ves-stark-air = { version = "0.3.4", path = "../ves-stark-air" }
1212
winter-prover = { workspace = true }
1313
winter-air = { workspace = true }
1414
winter-math = { workspace = true }

crates/ves-stark-python/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ crate-type = ["cdylib"]
1616
pyo3 = { version = "0.24.1", features = ["extension-module"] }
1717

1818
# Workspace crates
19-
ves-stark-primitives = { version = "0.3.3", path = "../ves-stark-primitives" }
20-
ves-stark-air = { version = "0.3.3", path = "../ves-stark-air" }
21-
ves-stark-prover = { version = "0.3.3", path = "../ves-stark-prover" }
22-
ves-stark-verifier = { version = "0.3.3", path = "../ves-stark-verifier" }
19+
ves-stark-primitives = { version = "0.3.4", path = "../ves-stark-primitives" }
20+
ves-stark-air = { version = "0.3.4", path = "../ves-stark-air" }
21+
ves-stark-prover = { version = "0.3.4", path = "../ves-stark-prover" }
22+
ves-stark-verifier = { version = "0.3.4", path = "../ves-stark-verifier" }
2323

2424
# Serialization
2525
serde = { workspace = true }

0 commit comments

Comments
 (0)