Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Verify PVSS transcript correctness #44

Closed
piotr-roslaniec opened this issue Jan 23, 2023 · 5 comments
Closed

Verify PVSS transcript correctness #44

piotr-roslaniec opened this issue Jan 23, 2023 · 5 comments

Comments

@piotr-roslaniec
Copy link
Member

piotr-roslaniec commented Jan 23, 2023

Screenshot 2023-01-16 at 10 17 16

@piotr-roslaniec
Copy link
Member Author

piotr-roslaniec commented Apr 14, 2023

Reopening since check #3 of 4.2.3 is not yet implemented. Check #4 is implemented as verify_full.

@piotr-roslaniec
Copy link
Member Author

piotr-roslaniec commented Apr 18, 2023

The current Ferveo implementation doesn't use A directly. Instead, the pairing in check #4 uses A indirectly. Ferveo uses F to compute A. So implementing #3 is not feasible without rewriting the whole thing.

The #3 check is supposed to be fixed by the KZG research.

@KPrasch
Copy link
Member

KPrasch commented Jun 14, 2023

Is this done?

@piotr-roslaniec
Copy link
Member Author

No. As per my previous comment, it may be at least partially fixed by using KZG (which is firmly in the research stage):

The #3 check is supposed to be fixed by the KZG research.

@cygnusv
Copy link
Member

cygnusv commented Sep 15, 2023

The current Ferveo implementation doesn't use A directly. Instead, the pairing in check #4 uses A indirectly. Ferveo uses F to compute A. So implementing #3 is not feasible without rewriting the whole thing.

The #3 check is supposed to be fixed by the KZG research.

In the Ferveo paper they take the approach of:

  • Generating A_i and F_i components independently
  • Performing check#3 to verify that A_i and F_i are consistent with each other

In the original Ferveo implementation, we found the approach of:

  • Only generating F_i components
  • Using F_i to generate A_i when needed, so they're automatically consistent with F_i

Since A_i were used mainly for check#4, we can continue with existing approach. It's equivalent to simply rewriting check#4 to use F_i directly instead of A_i.


Let me explain better how each A_i can be reconstructed from F_i components:

$F_i$ components have the form $F_i = [a_i] G$, for $a_i$ a coefficient of polynomial $f$.
$A_i$ components have the form $A_i = \left[f(\omega_i \right] G$, with $\omega_i$ being the domain point (aka x coordinate) of participant $i$.

Let's recall basic polynomial evaluation: $$f(x) = \sum_{j=0}^k a_j \cdot x^j$$

We can use this to redefine $A_i$ as $\sum \left[ a_j \cdot {\omega_i}^j \right] G$, and with some math golfing we arrive at $A_i = \sum \omega_i^j F_j$


So, unless we find another reason to explicitly store A_i components, I'd say let's go with current approach and close this issue.

@cygnusv cygnusv closed this as completed Sep 15, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants