feat: map-to-curve relations#1746
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
Pull request overview
Adds increment-and-check map-to-curve gadgets (from the referenced paper) for short Weierstrass curves, with both emulated and native implementations, plus tests/benchmarks and a dependency bump to support required crypto primitives.
Changes:
- Introduces a generic emulated
maptocurvepackage supporting X-increment and Y-increment for BN254, secp256k1, and P-256 (incl. Cardano solver path). - Adds native Y-increment gadgets for Grumpkin (over BN254) and BLS12-377 (over BW6-761), including hint plumbing and basic tests/benchmarks.
- Updates
go.mod/go.sum(notablygnark-crypto) to pull in required functionality.
Reviewed changes
Copilot reviewed 13 out of 14 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| std/algebra/native/maptocurve_grumpkin/maptocurve.go | Native Grumpkin Y-increment gadget (constraints: curve equation + k range). |
| std/algebra/native/maptocurve_grumpkin/hints.go | Hint to search k ∈ [0,256) and compute cube root witness. |
| std/algebra/native/maptocurve_grumpkin/maptocurve_test.go | Satisfiability + benchmark harness for the native gadget. |
| std/algebra/native/maptocurve_grumpkin/doc.go | Package documentation / compilation curve notes. |
| std/algebra/native/maptocurve_bls12377/maptocurve.go | Native BLS12-377 Y-increment gadget (over BW6-761 scalar field). |
| std/algebra/native/maptocurve_bls12377/hints.go | Hint to search k ∈ [0,256) and compute cube root witness. |
| std/algebra/native/maptocurve_bls12377/maptocurve_test.go | Satisfiability + benchmark harness for the native gadget. |
| std/algebra/native/maptocurve_bls12377/doc.go | Package documentation / compilation curve notes. |
| std/algebra/emulated/maptocurve/maptocurve.go | Generic emulated Mapper implementing X-increment and Y-increment gadgets. |
| std/algebra/emulated/maptocurve/hints.go | Emulated hints for BN254, secp256k1, and P-256 (x/y increment). |
| std/algebra/emulated/maptocurve/maptocurve_test.go | Satisfiability tests + benchmarks for emulated gadgets. |
| std/algebra/emulated/maptocurve/doc.go | Package-level documentation describing both methods and tradeoffs. |
| go.mod | Bumps deps (incl. gnark-crypto) needed for curve operations/solvers. |
| go.sum | Corresponding checksum updates. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Review pass from 2026-05-07. I did not find blocking issues in this pass. The gnark-crypto dependency PR #831 is already merged, and the map-to-curve gadgets compile and solve in the targeted native/emulated packages I checked. Verification run locally:
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 820d389. Configure here.
ivokub
left a comment
There was a problem hiding this comment.
Please see comments. I currently reviewed only emulated/maptocurve, not bls12377/grumpkin.
Imo we should also reconsider the package structure - for BLS12-381 curve we already have the MapToCurve (and also MapToG1/MapToG2) implemented. Imo having a separate package maptocurve is confusing.
I'd recommend instead:
- std/algebra/emulated/sw_emulated/maptocurve_increment
- std/algebra/native/sw_bls12377/maptocurve_increment
- std/algebra/native/sw_grumpkin/maptocurve_increment
And we should be clear in the documentation that these are very fast non-unique algorithm.
|
Warning Review the following alerts detected in dependencies. According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 17 out of 22 changed files in this pull request and generated 4 comments.
Files not reviewed (4)
- internal/smallfields/tinyfield/element.go: Generated file
- internal/smallfields/tinyfield/element_test.go: Generated file
- internal/smallfields/tinyfield/vector.go: Generated file
- internal/smallfields/tinyfield/vector_test.go: Generated file
| // - The 256-element search is NOT guaranteed to converge. For | ||
| // well-distributed inputs the probability that every K ∈ [0,256) yields | ||
| // a quadratic non-residue (XIncrement) or a non-cube (YIncrement) is | ||
| // bounded by ≈ 2^-256 (independent quadratic-residue heuristic), but | ||
| // adversarial inputs could in principle push this higher. Treat the | ||
| // probabilistic failure as part of the protocol's soundness budget. |
| // - The 256-element search is NOT guaranteed to converge; the failure | ||
| // probability is bounded by ≈ 2^-256 for well-distributed inputs but | ||
| // adversarial inputs may have a worse bound. |
| // - The 256-element search is NOT guaranteed to converge; the failure | ||
| // probability is bounded by ≈ 2^-256 for well-distributed inputs but | ||
| // adversarial inputs may have a worse bound. |
| // Cbrt z = ∛x (mod q) | ||
| // if the cube root doesn't exist (x is not a cube mod q) | ||
| // Cbrt leaves z unchanged and returns nil | ||
| func (z *Element) Cbrt(x *Element) *Element { |

Description
Add increment-and-check map-to-curve gadgets for short Weierstrass curves, implementing the constructions from https://eprint.iacr.org/2026/590.pdf.
Two methods are provided:
Packages
std/algebra/emulated/sw_emulated/maptocurve_increment/Generic emulated map-to-curve for any supported curve;
std/algebra/native/sw_grumpkin/maptocurve_increment/Native y-increment for Grumpkin (y² = x³ − 17), compiled over BN254.
std/algebra/native/sw_bls12377/maptocurve_increment/Native y-increment for BLS12-377 (y² = x³ + 1), compiled over BW6-761.
Constraint counts
Type of change
How has this been tested?
All tests verify circuit satisfiability via
test.CheckCircuit(both Groth16 and PLONK backends):TestXIncrementEmulatedBN254— x-increment on BN254TestXIncrementEmulatedSecp256k1— x-increment on secp256k1TestXIncrementEmulatedP256— x-increment on P-256TestYIncrementEmulatedBN254— y-increment on BN254TestYIncrementEmulatedSecp256k1— y-increment on secp256k1TestYIncrementEmulatedP256— y-increment on P-256 (Cardano solver)TestYIncrement(maptocurve_grumpkin) — native y-increment on GrumpkinTestYIncrement(maptocurve_bls12377) — native y-increment on BLS12-377How has this been benchmarked?
Checklist:
golangci-lintdoes not output errors locallyNote
Medium Risk
New curve-mapping gadgets rely on hints and documented non-uniqueness/cofactor caveats; misuse as hash-to-curve could break protocol assumptions, though changes are additive with extensive tests.
Overview
Adds increment-and-check map-to-curve circuits (eprint 2026/590): search
K ∈ [0,256)so a message maps to an on-curve point via X-increment (curve eq + optional 2^S root witness) or Y-increment (curve eq + cubic root witness).Emulated
Mappercovers BN254, secp256k1, and P-256 (XIncrement/YIncrement/Incrementdispatch). NativeYIncrementcovers Grumpkin and BLS12-377. Hints are wired throughstd/hints.go; constraint stats/snippets record per-curve costs.gnark-crypto is bumped (pre-release) for field
Cbrtused in y-increment witnesses; tinyfield gainsCbrt/Cube, usesparallel.Execute, and picks up minor Go style fixes. Package docs stress this is not a canonical hash-to-curve and points are not cofactor-cleared.Reviewed by Cursor Bugbot for commit 33c50e4. Bugbot is set up for automated code reviews on this repo. Configure here.