El complemento de s (cuando s < orden de la curva / 2)

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 svalor 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 ?

Respuestas (2)

En ECDSA spuede 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- ses arbitrario (high stambié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 scualquiera 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, sesta 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.

¡Fantástico! ¿Puedes escribir algún pseudocódigo (o Python) que muestre cómo cambiar el valor de s? No es solo el valor negativo, ¿verdad?
El pseudocódigo es muy simple:s2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1;
@amaclin oh wow, entonces estaba pensando demasiado en esto. Por supuesto, ahora veo la lógica. Tangencialmente, ¿por qué este código es tan poco Pythonic ? ¿Es básicamente un "puerto" de Python del código C++?
python-bitcoinlibno 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.

¿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 spara ver si está más que n/2redondeado hacia abajo (dónde nestá el orden de la curva, FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141.)

Si es así, lo calcula n - sy lo usa como s.