Детерминированное подписание Tx с помощью RFC6979 возвращает v, r, s
, где r
и s
— два значения, используемые в стандартных подписях ECDSA. v = 27 + (y % 2)
, поэтому 27 + паритет r
, как указывает pybitcointools .
Таким образом, для четного r
мы получаем v = 27
, для нечетного r
мы получаем v = 28
.
Насколько важно значение v
(27 или 28)? Почему необходимо иметь v
значение? Кроме того, почему это 27
?
Это не имеет ничего общего с RFC6979, но имеет отношение к подписи ECDSA и восстановлению открытого ключа.
(r, s) — это нормальный вывод подписи ECDSA, где r вычисляется как координата X точки R по модулю порядка кривой n.
В Биткойне для подписи сообщений мы используем трюк, называемый восстановлением открытого ключа. Дело в том, что если у вас есть полная точка R (а не только ее координата X) и s, и сообщение, вы можете вычислить, для какого открытого ключа эта подпись будет валидной. Это позволяет «проверить» сообщение с адресом без необходимости знать полный ключ (мы просто восстанавливаем открытый ключ подписи, а затем хэшируем восстановленный ключ и сравниваем его с адресом).
Однако это означает, что нам нужны полные координаты R. Может быть до 4 разных точек с заданной «координатой X по модулю n». (2, потому что каждая координата X имеет две возможные координаты Y, и 2, потому что r+n все еще может быть допустимой координатой X). Это число от 0 до 3 мы называем идентификатором восстановления или recid. Поэтому мы возвращаем дополнительный байт, который также функционирует как байт заголовка, используя 27+recid (для несжатых восстановленных открытых ключей) или 31+recid (для сжатых восстановленных открытых ключей).
Строго говоря, recid не нужен, так как мы можем просто перебрать все возможные пары координат и проверить, соответствует ли какая-либо из них сигнатуре. Recid просто ускоряет эту проверку.
В общем, если h является кофактором, максимальное количество различных точек с заданной «координатой X по модулю n» будет равно 2 (h + 1). В случае secp256k1, который имеет кофактор 1, мы получаем 2(1+1) = 4.
There can be up to 4 different points with a given "X coordinate modulo n". (2 because each X coordinate has two possible Y coordinates, and 2 because r+n may still be a valid X coordinate).
Я понимаю первое (2 значения y для каждого x из-за симметрии) ... Но как работает последнее? то есть r+n may still be a valid X coordinate
??Я не думаю, что v , который вы описываете, является частью RFC6979, потому что я не могу найти его в этом документе. Этот v является частью ecdsa_raw_sign
необработанной функции знака в pybitcointools, которая вызывает deterministic_generate_k
, что является реализацией RFC6979.
RFC6979 просто помогает вам сгенерировать детерминированное значение k для подписи. Это не поможет вам сгенерировать r и s . Для генерации r и s вы просто используете обычный алгоритм ECDSA; вам не нужно обращаться к RFC6979 после того, как вы использовали его для генерации k . RFC6979 генерирует k , который является входом для алгоритма подписи, который может генерировать r и s .
v
появляется ли в разных реализациях? Я полагаю, что Pybitcointools — не единственная реализация, которая его использует.secp256k1_nonce_function_rfc6979
, единственным выходом которой является 32-байтовый буфер данных.v
связано с подписью, а не с RFC6979.Как уже указано во всех других ответах: v
требуется восстановить правильный открытый ключ для подписи, потому что иногда (даже с низкой вероятностью) с помощью подписи можно получить более одного действительного открытого ключа.
Вот шпаргалка:
27
несжатый открытый ключ, y-четность 0
, величина x
ниже кривого порядка28
несжатый открытый ключ, y-четность 1
, величина x
ниже кривого порядка29
несжатый открытый ключ, y-четность 0
, величина x
больше кривого порядка30
несжатый открытый ключ, y-четность 1
, величина x
больше кривого порядка31
сжатый открытый ключ, четность по оси Y 0
, величина x
ниже кривого порядка32
сжатый открытый ключ, четность по оси Y 1
, величина x
ниже кривого порядка33
сжатый открытый ключ, y-четность 0
, величина x
больше порядка кривой34
сжатый открытый ключ, y-четность 1
, величина x
больше порядка кривойДля любого v >= 35
, кто может иметь дело с подписями Ethereum в соответствии с EIP-155 :
v = recovery_id + CHAIN_ID * 2 + 35
v
необходим для восстановления открытого ключа. В результате восстановления открытого ключа из подписи ECDSA может быть возвращено 0, 1 или 2 балла. Для того, чтобы строго указать, какая точка соответствует «оригинальному» открытому ключу, используется дополнительный байт
морсекодер
Дэвид Грейсон
Волшебник Оззи
Питер Уилле