41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
from typing import Sequence, Optional
|
|
|
|
from eth2spec.deneb.mainnet import BLSFieldElement
|
|
from .common import BLS_MODULUS
|
|
from .poly import Polynomial
|
|
|
|
ExtendedData = Sequence[Optional[BLSFieldElement]]
|
|
|
|
|
|
def encode(polynomial: Polynomial, factor: int, roots_of_unity: Sequence[int]) -> ExtendedData:
|
|
"""
|
|
Encode a polynomial extending to the given factor
|
|
Parameters:
|
|
polynomial: Polynomial to be encoded
|
|
factor: Encoding factor
|
|
roots_of_unity: Powers of 2 sequence
|
|
|
|
Returns:
|
|
list: Extended data set
|
|
"""
|
|
assert factor >= 2
|
|
assert len(polynomial)*factor <= len(roots_of_unity)
|
|
return [polynomial.eval(e) for e in roots_of_unity[:len(polynomial)*factor]]
|
|
|
|
|
|
def decode(encoded: ExtendedData, roots_of_unity: Sequence[BLSFieldElement], original_len: int) -> Polynomial:
|
|
"""
|
|
Decode a polynomial from an extended data-set and the roots of unity, cap to original length
|
|
|
|
Parameters:
|
|
encoded: Extended data set
|
|
roots_of_unity: Powers of 2 sequence
|
|
original_len: Original length of the encoded polynomial
|
|
|
|
Returns:
|
|
Polynomial: original polynomial
|
|
"""
|
|
encoded, roots_of_unity = zip(*((point, root) for point, root in zip(encoded, roots_of_unity) if point is not None))
|
|
coefs = Polynomial.interpolate(list(map(int, encoded)), list(map(int, roots_of_unity)))[:original_len]
|
|
return Polynomial([int(c) for c in coefs], BLS_MODULUS)
|