Scripts de Bitcoin que fuerzan la divulgación de la clave privada

Contexto: estoy creando un código de ejemplo que demostraría un intercambio atómico entre Elements y Bitcoin, con el objetivo de que las transacciones de intercambio no se puedan vincular de manera trivial, como lo sería con HTLC simple, donde puede buscar el mismo hash/ preimagen en ambas cadenas. Esto se debe a que la clave para revelar es en realidad una suma de claves, (A+B), y para reclamar el otro lado del intercambio, se usa otra clave de suma, (A+C). A, B y C solo son conocidos por (uno o ambos) participantes.

Uso CHECKSIGFROMSTACK en el lado de Elements para obligar a la contraparte a crear una firma con un valor R fijo (la k sería conocida y, por lo tanto, la otra parte puede recuperar la clave)

Me señalaron https://bitcointalk.org/index.php?topic=321228.msg13072047#msg13072047 , donde gmaxwell dice que puede lograr el mismo efecto forzando la divulgación de la clave privada en Bitcoin sin modificar.

Dice que conoce dos formas de lograr esto en Bitcoin sin modificar, una de ellas es:

OP_SIZE 57 OP_LESSTHANOREQUAL OP_VERIFY <P> OP_CHECKSIGVERIFY

Mis preguntas:

  • en el script mencionado anteriormente, se fuerza que la firma tenga una longitud menor o igual a 57. Esto parece depender de un valor R pequeño conocido, y la suposición de que otros valores R de igual o menor tamaño para algún k conocido no es computacionalmente posible encontrar.

    en esta publicación https://crypto.stackexchange.com/questions/60420/what-does-the-special-form-of-the-base-point-of-secp256k1-allow se proporciona un valor R con 90 bits cero iniciales . S tendría que tener un tamaño <= 29 bytes con una longitud R de 21 bytes (166 bits), para que la firma se ajuste al límite de 57 bytes (29+21+6+1=57). Para cumplir con este script utilizando esta pequeña R conocida, el creador de la firma necesitaría buscar el mensaje para firmar que daría como resultado una firma con len(S) <= 29. ¿Se eligió este límite estricto para reducir el 'margen de maniobra'? para fuerza bruta R ?

  • ¿Cuál es el segundo método para lograr esto en Bitcoin sin modificar?

  • Si estos métodos funcionan, ¿por qué no se han utilizado ampliamente en lugar de las construcciones HTLC, dado que estos métodos (o al menos el presentado) no son mucho más complejos en cuanto a la implementación, pero son más privados (porque no hay un hash público compartido)? /preimagen) ? ¿Cuáles son las desventajas de estos métodos, en comparación con HTLC?

(Nota: las preguntas anteriores son más por curiosidad intelectual que por un propósito práctico concreto, porque cuando las firmas de Schnorr se habilitarán en Bitcoin (espero que no sea demasiado largo), las firmas del adaptador https://github.com/apoelstra /scriptless-scripts/blob/master/md/atomic-swap.md sería una forma mucho mejor de crear intercambios atómicos sin un enlace trivial entre transacciones)

Además de las firmas de adaptadores a través de firmas Schnorr, ahora hay una manera más fácil (que antes) de hacer firmas de adaptadores con ECDSA: joinmarket.me/blog/blog/schnorrless-scriptless-scripts

Respuestas (1)

Hice algunas búsquedas e investigaciones, y también obtuve información sobre el canal #elements en bitcoincore slack, así que siento que puedo responderlas ahora (EDITAR: al principio me confundí con el método CODESEPARATOR, pero después de un tiempo más, preguntó Anthony Towns y proporcionó los enlaces a sus mensajes en la lista de desarrolladores de iluminación para explicarlo).

Resulta que cometí un error al pensar que CODESEPARATOR se puede usar solo para este propósito: si hay dos firmas para una clave pública y dos sighashes diferentes, el lado que crea las firmas no está restringido en la elección de nonces: no hay forma de secuencia de comandos para comprobar que los signos tienen la misma r. Por lo tanto, debe haber una manera de obligar a estas firmas a reutilizar el nonce, y el único truco que conozco hasta ahora en bitcoin no modificado es el truco del tamaño. Desafortunadamente, la segunda pregunta sigue sin respuesta.
Le pregunté a Anthony Towns sobre esto y obtuve una respuesta. Hay una técnica que usa dos separadores de código y tres checkmultisigs, de tal manera que obliga a reutilizar R. Ver Lists.linuxfoundation.org/pipermail/lightning-dev/2015-November/… y Lists.linuxfoundation.org/pipermail/lightning- dev/2015-noviembre/…