Bitcoinlib se refiere al requisito de que si s > ORDER / 2
, entonces se debe usar el complemento de en su lugar, ya que es un byte más cortos
Parece que se refiere al s
valor inverso o negativo, pero también sé que el complemento puede ser un término informático.
El código relevante se puede encontrar aquí (quizás alguien experto en el código Bitcoin Core pueda intervenir sobre lo que está haciendo el código), entonces, ¿a qué se refiere el complemento de s ?
En ECDSA s
puede estar en cualquier lado de la curva y la firma seguirá siendo válida. El término "bajo s
" se refiere a que el valor está literalmente por debajo del orden de la curva ( 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ). El requisito de low- s
es arbitrario (high s
también habría funcionado bien) y es una de las nuevas reglas de validez de BIP62 que pretenden combatir la maleabilidad de las transacciones.
En ausencia de esta regla, cualquier persona puede realizar una transacción de Bitcoin, ingresar s
cualquiera de sus firmas y enviar la transacción nuevamente con un TXID diferente. Poder hacer esto solo cambia el hash de la transacción y no altera su validez de ninguna manera. Ser capaz de mutar transacciones rompe una serie de tipos de transacciones potencialmente interesantes en Bitcoin, como los canales de pago, donde las cadenas de transacciones se invalidarán repentinamente por la mutación de un padre y la inclusión de una forma alternativa en un bloque.
Al forzar que las transacciones válidas siempre tengan un valor bajo, s
esta capacidad se elimina, aunque una persona con la clave privada para una transacción aún puede mutar sus propias transacciones renunciándolas con un nuevo nonce.
¿A qué se refiere el complemento de s?
No he escuchado ese término usado así antes, pero al leer el código, parece comparar s
para ver si está más que n/2
redondeado hacia abajo (dónde n
está el orden de la curva, FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
.)
Si es así, lo calcula n - s
y lo usa como s
.
mago de ozzie
amaclin
s2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1;
mago de ozzie
claris
python-bitcoinlib
no es pitónico porque emula todas las estructuras que se encuentran en el código base CPP de Bitcoin Cores. Podrías hacerlo más pitónico pero no sería tan útil de esa manera.