Перейти к содержимому
ecdsa.com

Восстановление открытого ключа ECDSA

Вычисление открытого ключа подписанта по подписи ECDSA и хешу сообщения (SEC 1, § 4.1.6): так подпись сообщений в Ethereum и Bitcoin обходится без передачи самого ключа.
Другие написанияkey recoveryrecovery idrecid

По значению r проверяющая сторона восстанавливает точки-кандидаты R с координатой x, равной r (два значения y, а изредка ещё и координата x, равная r + n), и вычисляет Q = r⁻¹·(s·R − z·G). Нужного кандидата выбирает идентификатор восстановления (recovery id), обычно 0 или 1 по чётности координаты y точки R. Ethereum помещает его в v: 27 или 28 для personal_sign и сообщений устаревших форматов, chainId × 2 + 35 или + 36 для транзакций EIP-155 и 0 или 1 в типизированных транзакциях. Формат подписанных сообщений Bitcoin хранит его в байте заголовка (27–42 в зависимости от типа адреса, BIP-137).

Предкомпилированный контракт ecrecover по адресу 0x01 возвращает 20-байтный адрес восстановленного ключа; так контракты проверяют подписи personal_sign, EIP-712 и permit, не храня открытые ключи. Для корректно сформированной подписи восстановление всегда даёт какой-нибудь ключ, поэтому оно ничего не доказывает, пока результат не сравнят с ожидаемым адресом. При ошибке ecrecover возвращает нулевой адрес, и контракты обязаны его отклонять.

Восстановление работает для ECDSA на любой кривой, включая P-256. Подписи Schnorr (BIP-340) и EdDSA его не допускают, потому что в их хеш challenge входит открытый ключ.

Стандарты и ссылки

Все термины