La firma determinista de un Tx con RFC6979 devuelve v, r, s
, donde r
y s
son los 2 valores utilizados en las firmas ECDSA estándar. v = 27 + (y % 2)
, entonces 27 + la paridad de r
, como indica pybitcointools .
Entonces, para pares , r
obtenemos v = 27
impares r
.v = 28
¿Qué importancia tiene el valor de v
(27 o 28)? ¿Por qué es necesario tener un v
valor? Además, ¿por qué es 27
?
Esto no tiene nada que ver con RFC6979, sino con la firma ECDSA y la recuperación de clave pública.
La (r, s) es la salida normal de una firma ECDSA, donde r se calcula como la coordenada X de un punto R, módulo el orden de la curva n.
En Bitcoin, para las firmas de mensajes, usamos un truco llamado recuperación de clave pública. El hecho es que si tiene el punto R completo (no solo su coordenada X) y s, y un mensaje, puede calcular para qué clave pública sería una firma válida. Lo que esto permite es 'verificar' un mensaje con una dirección, sin necesidad de conocer la clave completa (simplemente recuperamos la clave pública en la firma y luego procesamos la clave recuperada y la comparamos con la dirección).
Sin embargo, esto significa que necesitamos las coordenadas R completas. Puede haber hasta 4 puntos diferentes con un "módulo n de coordenadas X" dado. (2 porque cada coordenada X tiene dos coordenadas Y posibles, y 2 porque r+n aún puede ser una coordenada X válida). A ese número entre 0 y 3 lo llamamos ID de recuperación o recid. Por lo tanto, devolvemos un byte adicional, que también funciona como un byte de encabezado, usando 27+recid (para claves públicas recuperadas sin comprimir) o 31+recid (para claves públicas recuperadas comprimidas).
Estrictamente hablando, el recid no es necesario, ya que podemos recorrer todos los pares de coordenadas posibles y verificar si alguno de ellos coincide con la firma. El recid simplemente acelera esta verificación.
En general, si h es el cofactor, el número máximo de puntos diferentes con el "módulo n de coordenadas X" dado será 2 (h + 1). En el caso de secp256k1, que tiene el cofactor 1, obtenemos 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).
Entiendo lo primero (2 valores y para cada x, debido a la simetría)... Pero, ¿cómo funciona lo último? es decir r+n may still be a valid X coordinate
??No creo que la v que describe sea parte de RFC6979 porque no puedo encontrarla en ese documento. Esta v es parte de la ecdsa_raw_sign
función de signo sin formato en pybitcointools, que llama a deterministic_generate_k
, que es una implementación de RFC6979.
RFC6979 solo lo ayuda a generar un valor k determinista para firmar. No te ayuda a generar r y s . Para generar r y s , solo usa el algoritmo ECDSA normal; no tiene que consultar RFC6979 después de haberlo usado para generar k . RFC6979 genera k , que es una entrada al algoritmo de firma que puede generar r y s .
v
aparece en todas las implementaciones? Pybitcointools no es la única implementación que lo usa, creo.secp256k1_nonce_function_rfc6979
cuya única salida es un búfer de datos de 32 bytes.v
tiene que ver con la firma, no con RFC6979.Como ya se describe en todas las demás respuestas: v
se requiere recuperar la clave pública correcta para una firma porque a veces (incluso con baja probabilidad) hay más de una clave pública válida para ser recuperada por una firma.
Aquí hay una hoja de trucos:
27
clave pública sin comprimir, paridad y 0
, magnitud x
inferior al orden de la curva28
clave pública sin comprimir, paridad y 1
, magnitud x
inferior al orden de la curva29
clave pública sin comprimir, paridad y 0
, magnitud x
mayor que el orden de la curva30
clave pública sin comprimir, paridad y 1
, magnitud x
mayor que el orden de la curva31
clave pública comprimida0
, paridad y , magnitud x
inferior al orden de la curva32
clave pública comprimida1
, paridad y , magnitud x
inferior al orden de la curva33
clave pública comprimida0
, paridad y , magnitud x
mayor que el orden de la curva34
clave pública comprimida1
, paridad y , magnitud x
mayor que el orden de la curvaPara cualquiera v >= 35
que pueda estar tratando con firmas de Ethereum según EIP-155 :
v = recovery_id + CHAIN_ID * 2 + 35
v
es necesario para recuperar la clave pública. Como resultado de recuperar la clave pública de la firma ECDSA, se pueden devolver 0, 1 o 2 puntos. Para indicar estrictamente qué punto corresponde a la clave pública "original", se utiliza un byte adicional
codificador morse
David Grayson
mago de ozzie
pieter wuille