Изображение, которое все уже видели — та самая гладкая и симметричная кривая, плавно поднимающаяся вправо — это не кривая Биткоина. Это график того же уравнения на действительных числах, и он служит для объяснения. На конечном поле из предыдущего урока существует облако разбросанных точек, без какой-либо кривой, и тем не менее все правила продолжают действовать.
Уравнение имеет вид y² = x³ + 7. В общих терминах, в которых записываются эти кривые, коэффициент a равен нулю, а b равен семи — и этот ноль не является мелочью: он сокращает формулы, которые следуют далее, и является одной из причин, почему secp256k1 работает быстро.
Пара чисел является точкой на кривой, если, произведя вычисление по модулю p, обе стороны уравнения дают одинаковый остаток. Поскольку каждый x, который подходит, производит два корня y, один четный и другой нечетный, облако симметрично: для каждой точки существует ее отражение, которое называют ее отрицанием.
Сумма двух точек имеет геометрическое определение, которое пришло из действительных чисел и пережило смену области. Проведите прямую через две точки, найдите, где она пересекает кривую в третий раз, отразите это пересечение. Результат — это сумма. На конечном поле нет прямой, которую можно нарисовать, но есть формула, которую она производит, и она работает так же.

Стоит записать формулу, потому что она короткая. Для двух разных точек вычислите наклон s как разность y, деленную на разность x — и помните, что деление здесь — это умножение на обратное, точно так же, как показано в предыдущем уроке. Тогда x результата равен s в квадрате минус два исходных x, а y результата равен s, умноженное на разность между старым и новым x, минус исходное y. Три строки, и ни одна из них не выходит за пределы поля.
Сложение точки с самой собой — это отдельный случай, потому что не существует прямой, которая проходит только через одну точку. Используется касательная, и наклон становится равным трем x в квадрате, деленному на два y. Здесь появляется a, равное нулю: в общей формуле был бы еще один член, который в secp256k1 просто отсутствует.
Остался один случай, и он требует изобретения чего-то нового. Сложите точку с ее отражением. Прямая, проходящая через них, вертикальна, и вертикальная прямая не пересекает кривую в третий раз. Нет ответа внутри облака. Решением стало объявить, что существует точка там, куда указывает вертикаль: точка на бесконечности.

Это не заплатка. С этим дополнительным элементом множество начинает удовлетворять четырем свойствам, которые определяют группу: сумма двух точек всегда дает точку из множества, порядок скобок не имеет значения, существует нейтральный элемент, который, будучи сложенным с любой точкой, возвращает ее в неизменном виде, и у каждой точки есть противоположная, которая ее аннулирует. Точка на бесконечности — это нейтральный элемент — ноль этой арифметики. Благодаря ее существованию имеет смысл говорить о умножении точки на число.
Точные параметры secp256k1 опубликованы с 2000 года и не изменяются: простое число p, ноль, семь, две координаты генератора G, записанные с шестьюдесятью четырьмя символами каждая, и число n, которое показывает, сколько точек G достигает, прежде чем вернуться к точке на бесконечности.

О n стоит сделать замечание, имеющее практическое значение. Оно является простым числом, и общее количество точек на кривой точно равно n — что математики записывают, говоря, что кофактор равен единице. На кривых, где это не так, существуют скрытые маленькие подгруппы, и с ними целая семья атак, в которых реализацию обманывают, чтобы работать на крошечной части пространства. В secp256k1 такой атаке негде начать.
Вы уже знаете, как складывать точки и удваивать точки. Умножение точки на число из 256 бит — это повторение этих двух операций, и следующий урок покажет, как это делается менее чем за триста шагов — и почему обратное действие продолжает стоить 2^128.