Глоссарий / Справочник разработчика
Функция точки
- Что такое функция точки?
- Функция точки превращает приватный ключ в публичный, умножая генераторную точку secp256k1 на это число, и представляет собой односторонний шаг, на котором строится каждый адрес биткоина.
Определено в BIP-32.
BIP32 дает этой операции имя point(p), потому что иерархическое порождение ключей ссылается на нее почти в каждой строке. Умножьте фиксированный генератор кривой на секрет из 256 бит, и результатом станет пара координат, которую можно безопасно публиковать; восстановление секрета из этой пары означает решение задачи дискретного логарифма в пространстве из 78 цифр. Ваш кошелек выполняет эту функцию один раз на каждый адрес и никогда не должен выполнять ее в обратную сторону.
Как это работает
Функция точки представляет собой умножение на эллиптической кривой, один из двух входов которого зафиксирован навсегда.
Биткоин использует кривую secp256k1, заданную уравнением y в квадрате равно x в кубе плюс 7 над большим простым полем и стандартизованную в документе SEC 2, а не NIST. Кривая поставляется с генераторной точкой G, которую каждая реализация жестко прописывает в коде, и с порядком группы n, значение которого лежит чуть ниже 2 в 256-й степени. Приватный ключ представляет собой любое целое число от 1 до n минус 1. Функция складывает G с самой собой столько раз с помощью лестницы удвоений и сложений, и это завершается намного быстрее миллисекунды, а не за возраст вселенной.
Обратный путь и есть все допущение безопасности. По полученной точке ни один опубликованный метод не восстанавливает множитель быстрее, чем примерно за квадратный корень из размера группы, что дает около 2 в 128-й степени операций. Ничего из этого не меняется, если адрес используется повторно, публикуется или хранится десятилетиями.
Одно свойство делает возможными иерархические кошельки. Умножение точки дистрибутивно относительно сложения, поэтому точка от a плюс b равна точке от a, сложенной с точкой от b. Добавьте к приватному ключу поправку, и соответствующий публичный ключ сдвинется на точку этой поправки, величину, которую может вычислить любой, не имея ключа. На этом тождестве держится неусиленное порождение по BIP32, и на нем же держится ключ выхода Taproot, который представляет собой внутренний ключ, сдвинутый на обязательство к дереву скриптов.
Где это видно
Функция точки выполняется каждый раз, когда кошелек показывает вам новый адрес для получения.
Она же объясняет, почему расширенный публичный ключ полезен сам по себе. Передайте xpub интернет-магазину или телефону с режимом только для просмотра, и эта машина сможет генерировать новый адрес на каждый платеж, изменяя публичный ключ, без приватного ключа где-либо на ней. Аппаратные кошельки используют ту же асимметрию с другой стороны: секрет никогда не покидает чип, и обратно по кабелю возвращается только полученная точка.
У этого свойства есть опасная грань. Поскольку связь аддитивна и публична, расширенный публичный ключ в сочетании с одним утекшим неусиленным дочерним приватным ключом позволяет любому восстановить родительский приватный ключ и вместе с ним всю ветвь. Поэтому порождение на уровне счета является усиленным, и поэтому утекший xpub представляет собой катастрофу для приватности, а не немедленную кражу.
Функция точки vs сжатый публичный ключ
Функция точки создает математический объект; сжатый публичный ключ представляет собой один из способов записи этого объекта. Точка является парой координат по 32 байта каждая. Сжатая форма отбрасывает координату y и сохраняет однобайтовый префикс, фиксирующий, была ли она четной или нечетной, что дает 33 байта. Несжатая форма выписывает обе координаты полностью в 65 байтах. Форма Taproot только с координатой x сохраняет 32 байта и вообще без префикса. Каждая из них описывает одну и ту же точку, и тем не менее каждая кодировка хешируется в другой адрес, поэтому импорт старого ключа с неверным флагом сжатия показывает нулевой баланс, тогда как средства остаются нетронутыми на другом адресе.