Skip to content

chore: turn on masking in eccvm#12467

Merged
iakovenkos merged 56 commits intomasterfrom
si/eccvm-zk-on
Mar 7, 2025
Merged

chore: turn on masking in eccvm#12467
iakovenkos merged 56 commits intomasterfrom
si/eccvm-zk-on

Conversation

@iakovenkos
Copy link
Contributor

@iakovenkos iakovenkos commented Mar 5, 2025

  • All ECCVM wires are masked now.
  • Redefined lagrange_last in ECCVM to keep it sound.
  • Used commit_structured with active ranges to commit to randomized wires, as they have a huge 0 region from real_size to circuit_size - MASKING_OFFSET.

It closes the translation evaluations arc:

  • Goblin: verify_translation passes when ECCVM wires are masked thanks to ECCVMVerifier propagating the translation_masking_term_eval to TranslatorVerifier

Closes AztecProtocol/barretenberg#1238

iakovenkos and others added 30 commits February 17, 2025 17:03
@iakovenkos iakovenkos marked this pull request as ready for review March 6, 2025 11:20
Base automatically changed from si/fix-translation-evaluations-pt2 to master March 6, 2025 13:21
@iakovenkos iakovenkos self-assigned this Mar 6, 2025
Fr& operator[](size_t index)
{
ASSERT(index >= start_index && index < end_index());
ASSERT(index >= start_index && index <= end_index());
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was hitting this assert in commit_structured with active_regions. I think the inequality should be non-strict

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's meant to be [start, end) so I'm suspicious this is a bug

Copy link
Contributor Author

@iakovenkos iakovenkos Mar 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as far as i understand, it's consistent with this

  auto poly_end = &polynomial[second];
  scalars.insert(scalars.end(), poly_start, poly_end);

so the pointer is to the the element at position circuit_size, and the insertion excludes the poly_end

Copy link
Contributor Author

@iakovenkos iakovenkos Mar 7, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed back to strict inequalities

template <typename Flavor>
void compute_grand_products(typename Flavor::ProverPolynomials& full_polynomials,
bb::RelationParameters<typename Flavor::FF>& relation_parameters)
bb::RelationParameters<typename Flavor::FF>& relation_parameters,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

needed to modify the computation of z_perm in ECCVMProver

@iakovenkos iakovenkos requested a review from maramihali March 6, 2025 14:00
Copy link

@maramihali maramihali left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, thanks, some nits and waiting to review the update to active_ranges that would remove the changes from Polynomial class in this PR.

*/
void ECCVMProver::execute_wire_commitments_round()
{
// We mask the last MASKING_OFFSET coefficients of each wire polynomial. To commit to the masked wires when

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a good idea! do you have plans to integrate it in Mega as a follow-up? if not, it would be good to add an issue or detail in the existing issues the approach taken in ECCVM

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll expand some of the existing issues

// The accumulators are populated until the 2^{CONST_ECCVM_LOG_N}, therefore we commit to a full-sized polynomial
for (const auto& [wire, label] :
zip_view(key->polynomials.get_accumulators(), commitment_labels.get_accumulators())) {
wire.mask();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in oink you introduced a function commit_to_witness_polynomials, it would be probably nice to mirror it here as well

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd keep it as is, cause the commitment logic here is waaaay less involved than in Oink

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kinda like having the masking functionality abstracted in a function so noone in the future forgets to call mask() but not feeling very strongly about it

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree, added this method

EXPECT_EQ(result, expected_result);
}

/**
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

here's a test to catch the edge case when the last active region contains the last coeff of a poly

// Pointer to the first element past the active range. Accessing `&polynomial[second]` directly can trigger
// an assertion when `second == polynomial_size`, so we compute the pointer using `polynomial.data()`
// to ensure safe range handling.
auto poly_end = polynomial.data() + (second - polynomial.start_index);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not beautiful, but don't have to do &polynomial[circuit_size]

*/
void ECCVMProver::execute_wire_commitments_round()
{
// We mask the last MASKING_OFFSET coefficients of each wire polynomial. To commit to the masked wires when

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe: We add MASKING_OFFSET random values to the coefficients of each wire polynomial to not leak information via the commitment and evaluation.

.. or something along these lines

Copy link

@maramihali maramihali left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thank you for making the changes!

// The accumulators are populated until the 2^{CONST_ECCVM_LOG_N}, therefore we commit to a full-sized polynomial
for (const auto& [wire, label] :
zip_view(key->polynomials.get_accumulators(), commitment_labels.get_accumulators())) {
wire.mask();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kinda like having the masking functionality abstracted in a function so noone in the future forgets to call mask() but not feeling very strongly about it

@iakovenkos iakovenkos merged commit aacb91a into master Mar 7, 2025
7 checks passed
@iakovenkos iakovenkos deleted the si/eccvm-zk-on branch March 7, 2025 18:26
sklppy88 pushed a commit that referenced this pull request Mar 11, 2025
🤖 I have created a new Aztec Packages release
---


##
[0.79.0](v0.78.1...v0.79.0)
(2025-03-11)


### ⚠ BREAKING CHANGES

* aggregate data for batch calls
([#12562](#12562))

### Features

* add extra attributes to target_info
([#12583](#12583))
([c296422](c296422))
* add optional oracle resolver url in `acvm_cli`
(noir-lang/noir#7630)
([cc6cdbb](cc6cdbb))
* allow to pay via sponsored fpc from cli
([#12598](#12598))
([877de5c](877de5c))
* array concat method (noir-lang/noir#7199)
([cc6cdbb](cc6cdbb))
* **avm:** ToRadix gadget
([#12528](#12528))
([02a7171](02a7171))
* aztec-up -v flag
([#12590](#12590))
([6a41565](6a41565))
* **bb:** consider polynomial end_index when constructing partially
evaluated multivariates
([#12530](#12530))
([abd22cd](abd22cd))
* **config:** add fallbacks
([#12593](#12593))
([f2f9ef3](f2f9ef3))
* **p2p:** add trusted peers mechanics
([#12447](#12447))
([d67f7e8](d67f7e8))
* **p2p:** peer manager peer count metrics
([#12575](#12575))
([b4891c1](b4891c1))
* provision alerts
([#12561](#12561))
([2ea1767](2ea1767))
* Resolve callstacks in protocol circuit errors on wasm
([#12573](#12573))
([657299b](657299b))


### Bug Fixes

* aggregate data for batch calls
([#12562](#12562))
([bd0b3b6](bd0b3b6))
* broken kind transfer test
([#12611](#12611))
([6e91934](6e91934))
* Cl/release fixes 2
([#12595](#12595))
([fc597f4](fc597f4))
* Cl/release noir refs
([#12597](#12597))
([fdcfcaf](fdcfcaf))
* demote log
([#12626](#12626))
([bec8953](bec8953))
* deploy method test
([#12609](#12609))
([f2c06c2](f2c06c2))
* Do not report epoch as complete until blocks have synced
([#12638](#12638))
([2ddfa76](2ddfa76)),
closes
[#12625](#12625)
* Error on infinitely recursive types
(noir-lang/noir#7579)
([cc6cdbb](cc6cdbb))
* get L1 tx utils config from env
([#12620](#12620))
([d930c01](d930c01))
* Log overflow handling in reset
([#12579](#12579))
([283b624](283b624))
* metrics update
([#12571](#12571))
([80a5df2](80a5df2))
* **sandbox:** query release please manifest for version if in a docker
container
([#12591](#12591))
([db8ebc6](db8ebc6))
* **spartan:** setup needs kubectl
([#12580](#12580))
([753cb33](753cb33))
* update dead partial notes link
([#12629](#12629))
([5a1dc4c](5a1dc4c))
* update error message to display 128 bits as valid bit size
(noir-lang/noir#7626)
([cc6cdbb](cc6cdbb))
* update fallback transport
([#12470](#12470))
([88f0711](88f0711))


### Miscellaneous

* bump external pinned commits
(noir-lang/noir#7640)
([cc6cdbb](cc6cdbb))
* **ci3:** add helper for uncached test introspection
([#12618](#12618))
([9ac518b](9ac518b))
* **ci3:** better memsuspend_limit comment
([#12622](#12622))
([de84187](de84187))
* clean up upgrade test and other small things
([#12558](#12558))
([c28abe1](c28abe1))
* cleanup eth artifacts + misc aztec.js reorg
([#12563](#12563))
([6623244](6623244))
* **docs:** Updated accounts page
([#12019](#12019))
([d45dac9](d45dac9))
* Fix mac build
([#12610](#12610))
([adceed6](adceed6))
* gemini soundness regression test
([#12570](#12570))
([c654106](c654106))
* more sane e2e_prover/full timeout
([#12619](#12619))
([add9d35](add9d35))
* reactivate acir_test for `regression_5045`
([#12548](#12548))
([c89f89c](c89f89c))
* remove unnecessary trait bounds
(noir-lang/noir#7635)
([cc6cdbb](cc6cdbb))
* Rename `StructDefinition` to `TypeDefinition`
(noir-lang/noir#7614)
([cc6cdbb](cc6cdbb))
* replace relative paths to noir-protocol-circuits
([4f7f5c3](4f7f5c3))
* replace relative paths to noir-protocol-circuits
([0f68d11](0f68d11))
* replace relative paths to noir-protocol-circuits
([8f593ce](8f593ce))
* replace relative paths to noir-protocol-circuits
([251ae38](251ae38))
* rollup library cleanup
([#12621](#12621))
([361fc59](361fc59))
* **sandbox:** drop cheat-codes log level
([#12586](#12586))
([24f04c7](24f04c7))
* **sandbox:** expose anvil port
([#12599](#12599))
([955f1b0](955f1b0))
* **testnet:** updating script for ignition, change naming
([#12566](#12566))
([2d7b69d](2d7b69d))
* turn on masking in eccvm
([#12467](#12467))
([aacb91a](aacb91a))
* Update Bb line counting script
([#12350](#12350))
([7a41843](7a41843))
* update docs to reflect u128 type
(noir-lang/noir#7623)
([cc6cdbb](cc6cdbb))
* Validate blobs posted to sink belong to our L2
([#12587](#12587))
([9578f1e](9578f1e)),
closes
[#12497](#12497)


### Documentation

* update cli-wallet commands in profiler doc
([#12568](#12568))
([239a4fb](239a4fb))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
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.

eccvm zero knowledge: randomise witness polynomials

2 participants