mirror of
https://github.com/logos-co/nomos-specs.git
synced 2025-02-12 23:36:29 +00:00
Implement verification and added test
This commit is contained in:
parent
739741df5e
commit
1efe2ae14a
28
da/kzg_rs.py
28
da/kzg_rs.py
@ -4,26 +4,32 @@ from typing import List, Sequence
|
|||||||
import eth2spec.eip7594.mainnet
|
import eth2spec.eip7594.mainnet
|
||||||
from eth2spec.eip7594.mainnet import (
|
from eth2spec.eip7594.mainnet import (
|
||||||
bit_reversal_permutation, KZG_SETUP_G1_LAGRANGE, Polynomial,
|
bit_reversal_permutation, KZG_SETUP_G1_LAGRANGE, Polynomial,
|
||||||
BYTES_PER_FIELD_ELEMENT, bytes_to_bls_field, BLSFieldElement, compute_kzg_proof_impl, KZG_ENDIANNESS,
|
BYTES_PER_FIELD_ELEMENT, bytes_to_bls_field, BLSFieldElement, compute_kzg_proof_impl,
|
||||||
BLS_MODULUS, compute_roots_of_unity, compute_quotient_eval_within_domain,
|
compute_roots_of_unity, verify_kzg_proof_impl
|
||||||
div, bls_modular_inverse,
|
|
||||||
)
|
)
|
||||||
from eth2spec.eip7594.mainnet import KZGCommitment as Commitment, KZGProof as Proof
|
from eth2spec.eip7594.mainnet import KZGCommitment as Commitment, KZGProof as Proof
|
||||||
|
from eth2spec.eip7594.minimal import evaluate_polynomial_in_evaluation_form
|
||||||
from eth2spec.utils import bls
|
from eth2spec.utils import bls
|
||||||
from remerkleable.basic import uint64
|
from remerkleable.basic import uint64
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
from da.common import Chunk
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def setup_field_elements(new_value: int):
|
def setup_field_elements(new_value: int):
|
||||||
"""
|
"""
|
||||||
Override ethspecs setup to fit the variable sizes for our scheme
|
Override ethspecs setup to fit the variable sizes for our scheme
|
||||||
"""
|
"""
|
||||||
field_elements_old_value = eth2spec.eip7594.mainnet.FIELD_ELEMENTS_PER_BLOB
|
field_elements_old_value = eth2spec.eip7594.mainnet.FIELD_ELEMENTS_PER_BLOB
|
||||||
|
minimal_field_elements_old_value = eth2spec.eip7594.minimal.FIELD_ELEMENTS_PER_BLOB
|
||||||
eth2spec.eip7594.mainnet.FIELD_ELEMENTS_PER_BLOB = new_value
|
eth2spec.eip7594.mainnet.FIELD_ELEMENTS_PER_BLOB = new_value
|
||||||
|
eth2spec.eip7594.minimal.FIELD_ELEMENTS_PER_BLOB = new_value
|
||||||
setup_old_value = eth2spec.eip7594.mainnet.KZG_SETUP_G1_LAGRANGE
|
setup_old_value = eth2spec.eip7594.mainnet.KZG_SETUP_G1_LAGRANGE
|
||||||
eth2spec.eip7594.mainnet.KZG_SETUP_G1_LAGRANGE = eth2spec.eip7594.mainnet.KZG_SETUP_G1_LAGRANGE[:new_value]
|
eth2spec.eip7594.mainnet.KZG_SETUP_G1_LAGRANGE = eth2spec.eip7594.mainnet.KZG_SETUP_G1_LAGRANGE[:new_value]
|
||||||
yield
|
yield
|
||||||
eth2spec.eip7594.mainnet.FIELD_ELEMENTS_PER_BLOB = field_elements_old_value
|
eth2spec.eip7594.mainnet.FIELD_ELEMENTS_PER_BLOB = field_elements_old_value
|
||||||
|
eth2spec.eip7594.minimal.FIELD_ELEMENTS_PER_BLOB = minimal_field_elements_old_value
|
||||||
eth2spec.eip7594.mainnet.KZG_SETUP_G1_LAGRANGE = setup_old_value
|
eth2spec.eip7594.mainnet.KZG_SETUP_G1_LAGRANGE = setup_old_value
|
||||||
|
|
||||||
class Polynomial(List[BLSFieldElement]):
|
class Polynomial(List[BLSFieldElement]):
|
||||||
@ -77,3 +83,19 @@ def compute_kzg_proofs(b: bytearray) -> List[Proof]:
|
|||||||
for i in range(len(b)//BYTES_PER_FIELD_ELEMENT)
|
for i in range(len(b)//BYTES_PER_FIELD_ELEMENT)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def __verify_single_proof(polynomial: Polynomial, proof: Proof, commitment: Commitment, index: int, roots_of_unity: Sequence[BLSFieldElement]) -> bool:
|
||||||
|
challenge = roots_of_unity[index]
|
||||||
|
with setup_field_elements(len(polynomial)):
|
||||||
|
y = evaluate_polynomial_in_evaluation_form(polynomial, challenge)
|
||||||
|
return verify_kzg_proof_impl(commitment, challenge, y, proof)
|
||||||
|
|
||||||
|
|
||||||
|
def verify_proofs(b: bytearray, commitment: Commitment, proofs: Sequence[Proof]) -> bool:
|
||||||
|
polynomial = bytes_to_polynomial(b)
|
||||||
|
roots_of_unity_brp = bit_reversal_permutation(compute_roots_of_unity(uint64(len(polynomial))))
|
||||||
|
return all(
|
||||||
|
__verify_single_proof(polynomial, proof, commitment, i, roots_of_unity_brp)
|
||||||
|
for i, proof in enumerate(proofs)
|
||||||
|
)
|
||||||
|
|
||||||
|
@ -1,10 +1,21 @@
|
|||||||
from itertools import chain
|
from itertools import chain
|
||||||
from random import randrange
|
from random import randrange
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from da.kzg_rs import Polynomial, bytes_to_polynomial, bytes_to_kzg_commitment, compute_kzg_proofs, setup_field_elements
|
from da.kzg_rs import (
|
||||||
|
Polynomial,
|
||||||
|
bytes_to_polynomial,
|
||||||
|
bytes_to_kzg_commitment,
|
||||||
|
compute_kzg_proofs,
|
||||||
|
verify_proofs
|
||||||
|
)
|
||||||
from eth2spec.eip7594.mainnet import (
|
from eth2spec.eip7594.mainnet import (
|
||||||
Polynomial as EthPolynomial, blob_to_polynomial, BLS_MODULUS,
|
Polynomial as EthPolynomial,
|
||||||
BYTES_PER_FIELD_ELEMENT, FIELD_ELEMENTS_PER_BLOB, Blob, blob_to_kzg_commitment
|
blob_to_polynomial,
|
||||||
|
BLS_MODULUS,
|
||||||
|
BYTES_PER_FIELD_ELEMENT,
|
||||||
|
FIELD_ELEMENTS_PER_BLOB,
|
||||||
|
Blob,
|
||||||
|
blob_to_kzg_commitment
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -36,6 +47,7 @@ class TestKzgRs(TestCase):
|
|||||||
commitment = bytes_to_kzg_commitment(rand_bytes)
|
commitment = bytes_to_kzg_commitment(rand_bytes)
|
||||||
rand_bytes = self.rand_bytes()
|
rand_bytes = self.rand_bytes()
|
||||||
commitment2 = bytes_to_kzg_commitment(rand_bytes)
|
commitment2 = bytes_to_kzg_commitment(rand_bytes)
|
||||||
|
self.assertEqual(len(commitment), 48)
|
||||||
self.assertEqual(len(commitment), len(commitment2))
|
self.assertEqual(len(commitment), len(commitment2))
|
||||||
|
|
||||||
def test_compute_kzg_proofs(self):
|
def test_compute_kzg_proofs(self):
|
||||||
@ -43,3 +55,10 @@ class TestKzgRs(TestCase):
|
|||||||
rand_bytes = self.rand_bytes(chunk_size)
|
rand_bytes = self.rand_bytes(chunk_size)
|
||||||
proofs = compute_kzg_proofs(rand_bytes)
|
proofs = compute_kzg_proofs(rand_bytes)
|
||||||
self.assertEqual(len(proofs), chunk_size)
|
self.assertEqual(len(proofs), chunk_size)
|
||||||
|
|
||||||
|
def test_verify_kzg_proofs(self):
|
||||||
|
chunk_size = 32
|
||||||
|
rand_bytes = self.rand_bytes(chunk_size)
|
||||||
|
commitment = bytes_to_kzg_commitment(rand_bytes)
|
||||||
|
proofs = compute_kzg_proofs(rand_bytes)
|
||||||
|
self.assertTrue(verify_proofs(rand_bytes, commitment, proofs))
|
Loading…
x
Reference in New Issue
Block a user