BN254G2.sol

Обзор

Данный Solidity-файл реализует библиотеку BN254G2, предназначенную для выполнения операций над точками на эллиптической кривой в подклассе "twist points" для кривой alt_bn128 (также известной как BN254). Основная функциональность включает операции сложения и умножения точек на кривой, а также вспомогательные арифметические операции в расширенном поле FQ2 (двойственные коэффициенты).

Важно: эта реализация предназначена ТОЛЬКО для тестирования и не должна использоваться в продуктивных системах из-за возможных проблем с безопасностью и эффективностью.


Описание библиотеки BN254G2

Константы


Основные функции

ECTwistAdd

function ECTwistAdd(
    uint256 pt1xx,
    uint256 pt1xy,
    uint256 pt1yx,
    uint256 pt1yy,
    uint256 pt2xx,
    uint256 pt2xy,
    uint256 pt2yx,
    uint256 pt2yy
) internal view returns (uint256, uint256, uint256, uint256)

Описание:
Складывает две точки на кривой twist, заданные парами коэффициентов по x и y в расширенном поле FQ2.

Параметры:

Возвращает:
Координаты результирующей точки (pt3xx, pt3xy, pt3yx, pt3yy).

Пример использования:

(uint256 rx1, uint256 ry1, uint256 rx2, uint256 ry2) = BN254G2.ECTwistAdd(
    pt1xx, pt1xy, pt1yx, pt1yy,
    pt2xx, pt2xy, pt2yx, pt2yy
);

Особенности:


ECTwistMul

function ECTwistMul(
    uint256 s,
    uint256 pt1xx,
    uint256 pt1xy,
    uint256 pt1yx,
    uint256 pt1yy
) internal view returns (uint256, uint256, uint256, uint256)

Описание:
Выполняет умножение точки на кривой twist на скаляр s.

Параметры:

Возвращает:
Новые координаты точки после умножения.

Пример использования:

(uint256 rx, uint256 ry, uint256 rz, uint256 rw) = BN254G2.ECTwistMul(
    scalar, ptxx, ptxy, ptyx, ptyy
);

Особенности:


GetFieldModulus

function GetFieldModulus() internal pure returns (uint256)

Описание:
Возвращает модуль конечного поля, используемого для вычислений.


Вспомогательные функции и реализация арифметики в FQ2

В библиотеке определены функции для операций в расширенном поле FQ2, где элементы представлены как пары коэффициентов (xx, xy):


Проверка принадлежности точки кривой

function _isOnCurve(uint256 xx, uint256 xy, uint256 yx, uint256 yy) internal pure returns (bool)

Проверяет, удовлетворяет ли точка уравнению эллиптической кривой twist:

[ y^2 = x^3 + b ]

где ( b = (TWISTBX, TWISTBY) ) в FQ2.


Работа с координатами Якоби

Для повышения эффективности операций сложения и умножения, библиотека использует координаты Якоби (расширенные координаты с дополнительными параметрами z для избежания деления):

Функция _fromJacobian преобразует точку из координат Якоби обратно в аффинные координаты.


Важные детали реализации


Взаимодействие с другими частями системы


Визуальное представление структуры библиотеки BN254G2

classDiagram
    class BN254G2 {
        -uint256 FIELD_MODULUS
        -uint256 TWISTBX
        -uint256 TWISTBY
        +function ECTwistAdd(...)
        +function ECTwistMul(...)
        +function GetFieldModulus()
        +function submod(uint256,uint256,uint256)
        -function _FQ2Mul(uint256,uint256,uint256,uint256)
        -function _FQ2Muc(uint256,uint256,uint256)
        -function _FQ2Add(uint256,uint256,uint256,uint256)
        -function _FQ2Sub(uint256,uint256,uint256,uint256)
        -function _FQ2Div(uint256,uint256,uint256,uint256)
        -function _FQ2Inv(uint256,uint256)
        -function _isOnCurve(uint256,uint256,uint256,uint256)
        -function _modInv(uint256,uint256)
        -function _fromJacobian(uint256,uint256,uint256,uint256,uint256,uint256)
        -function _ECTwistAddJacobian(_ECTwistAddJacobianArgs)
        -function _ECTwistDoubleJacobian(uint256,uint256,uint256,uint256,uint256,uint256)
        -function _ECTwistMulJacobian(uint256,uint256,uint256,uint256,uint256,uint256,uint256)
    }
    class _ECTwistAddJacobianArgs {
        +uint256 pt1xx
        +uint256 pt1xy
        +uint256 pt1yx
        +uint256 pt1yy
        +uint256 pt1zx
        +uint256 pt1zy
        +uint256 pt2xx
        +uint256 pt2xy
        +uint256 pt2yx
        +uint256 pt2yy
        +uint256 pt2zx
        +uint256 pt2zy
    }
    BN254G2 --> _ECTwistAddJacobianArgs : uses

Резюме

Файл BN254G2.sol — это специализированная библиотека для операций с twist-точками эллиптической кривой alt_bn128 в Solidity. Она реализует базовые криптографические операции (сложение, умножение) и расширенную арифметику в поле FQ2, используя координаты Якоби для оптимизации. Библиотека подходит для тестовых целей и может быть встроена в более сложные системы, работающие с криптографией на Ethereum, включая zk-SNARK и другие протоколы.