Skip to content

[CI] Backporting fixes from 0.5.0 to 0.4#889

Open
dannywillems wants to merge 3 commits into
halo2_gadgets-0.4from
dw/halo2_gadgets-0.4.1
Open

[CI] Backporting fixes from 0.5.0 to 0.4#889
dannywillems wants to merge 3 commits into
halo2_gadgets-0.4from
dw/halo2_gadgets-0.4.1

Conversation

@dannywillems

@dannywillems dannywillems commented Jun 3, 2026

Copy link
Copy Markdown

Opening for CI.

As discussed on Slack:

For each version x.y.z, I'm creating a branch x.y forked from the tag x.y.0 , I push the branch, cherry-pick the fixes on a new branch dw/halo2_gadgets-x.y.1, and create a (maybe temporary) pull request for dw/halo2_gadgets-x.y.1 targeting halo2_gadgets-x.y.

From there, we can release and create tags from halo2_gadgets-x.y.
If we decide to keep the branch halo2_gadgets-x.y, the branch could be the one we always start from if we have to backport more changes in 0.x.

daira and others added 3 commits June 3, 2026 17:21
The incomplete double-and-add loop in `ecc::chip::mul` kept the
per-iteration base `(x_p, y_p)` constant across loop rows via `q_mul_2`,
but never tied it to the real base: the coordinates were written with
`assign_advice`, and the constancy chain reached neither the doubling-row
nor the complete-addition base anchors. A prover could therefore run the
incomplete loop against a free constant `B' != base`, making the gadget
output `[a] base + [b] B'` rather than `[scalar] base`. Anchor the base by
`copy_advice`-ing it into the first incomplete row; `q_mul_2` then
propagates the equality to every loop row. The `hi` and `lo` halves share
the `x_p`/`y_p` columns and run on the same rows, so the single anchor
covers both.

The fix changes the verifying key, so introduce `CircuitVersion`
(`AnchoredBase` / `InsecureUnanchoredBase`): one binary can build both the fixed
VK and the prior unanchored VK, the latter only to verify proofs created
before the fix. `EccChip::construct` now takes the version explicitly.

Add a regression test that drives the real `mul::Config` synthesis through
a copy-recording `Assignment`: the fixed circuit's equality constraints are
a superset of the prior version's, and the only additions are the two base
anchors at the first incomplete-addition row.

Rename the stored ECC-chip vk/proof fixtures to `*_insecure` and check them
against the `InsecureUnanchoredBase` circuit, which reproduces the historical
(deployed) verifying key exactly and still verifies the pre-fix proof under
it — so a node can sync from before the fix.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pin the verifying key and a proof for the fixed (anchored) ECC-chip circuit
as `*_fixed`, checked by `test_ecc_chip_fixed_against_stored_circuit` and
`test_against_stored_ecc_chip_4_5b_fixed`. With the `*_insecure` fixtures from
the previous commit this covers both directions: a proof for the fixed
circuit verifies under the new verifying key, and the deployed pre-fix proof
verifies under the old one.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dannywillems dannywillems changed the title [WIP] Backporting fixes from 0.5.0 to 0.4 [CI] Backporting fixes from 0.5.0 to 0.4 Jun 3, 2026
@dannywillems dannywillems self-assigned this Jun 3, 2026
@dannywillems dannywillems requested review from daira and nuttycom June 3, 2026 19:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backport bugfixes from halo2_gadgets-0.5.0 to halo2_gadgets-0.4.0

2 participants