BN254G2.sol
Обзор
Данный Solidity-файл реализует библиотеку BN254G2, предназначенную для выполнения операций над точками на эллиптической кривой в подклассе "twist points" для кривой alt_bn128 (также известной как BN254). Основная функциональность включает операции сложения и умножения точек на кривой, а также вспомогательные арифметические операции в расширенном поле FQ2 (двойственные коэффициенты).
Важно: эта реализация предназначена ТОЛЬКО для тестирования и не должна использоваться в продуктивных системах из-за возможных проблем с безопасностью и эффективностью.
Описание библиотеки BN254G2
Константы
FIELD_MODULUS— модуль поля, используемого в вычислениях.TWISTBX,TWISTBY— константы, задающие параметры кривой twist.PTXX,PTXY,PTYX,PTYY,PTZX,PTZY— индексы для доступа к координатам точек в массиве (используется для удобства обращения).
Основные функции
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.
Параметры:
pt1xx,pt1xy— коэффициенты x первой точки (x = pt1xx + pt1xy * i).pt1yx,pt1yy— коэффициенты y первой точки.pt2xx,pt2xy— коэффициенты x второй точки.pt2yx,pt2yy— коэффициенты y второй точки.
Возвращает:
Координаты результирующей точки (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.
Параметры:
s— скаляр множитель.pt1xx,pt1xy— коэффициенты x точки.pt1yx,pt1yy— коэффициенты y точки.
Возвращает:
Новые координаты точки после умножения.
Пример использования:
(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):
_FQ2Mul— умножение элементов FQ2._FQ2Muc— умножение элемента FQ2 на скаляр._FQ2Add— сложение в FQ2._FQ2Sub— вычитание в FQ2._FQ2Div— деление в FQ2 (через обращение)._FQ2Inv— вычисление обратного элемента в FQ2.
Проверка принадлежности точки кривой
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 для избежания деления):
_ECTwistAddJacobian— сложение двух точек в координатах Якоби._ECTwistDoubleJacobian— удвоение точки в координатах Якоби._ECTwistMulJacobian— умножение точки на скаляр с помощью повторяющегося удвоения и сложения.
Функция _fromJacobian преобразует точку из координат Якоби обратно в аффинные координаты.
Важные детали реализации
Используется встроенная функция
staticcallв ассемблере для вычисления обратного элемента по модулю (_modInv), что обеспечивает эффективность и безопасность.Для операций в FQ2 все арифметические операции выполняются по модулю
FIELD_MODULUS.При сложении и умножении точек реализован полный набор проверок на корректность входных данных — точки должны лежать на кривой.
Использование структур для группировки аргументов функции сложения в координатах Якоби повышает читаемость и упрощает передачу множества параметров.
Взаимодействие с другими частями системы
Данная библиотека представляет собой низкоуровневый модуль для работы с эллиптической кривой alt_bn128.
Может использоваться в смарт-контрактах, реализующих zk-SNARK валидацию, криптографические протоколы на основе BN254, а также другие приложения, требующие операций с точками twist.
Взаимодействует с другими библиотеками или контрактами, которые предоставляют более высокоуровневую логику, например, проверку подписей или построение криптографических доказательств.
Не содержит доступа к состоянию блокчейна — все функции
internalиpure/viewпредназначены для встраивания в другие контракты.
Визуальное представление структуры библиотеки 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 и другие протоколы.