Tratando de obtener una comprensión más profunda de los intercambios atómicos

Soy estudiante de TI y estoy escribiendo una tesis sobre intercambios atómicos en BTC y cadenas de bloques similares a BTC. Para la tesis decidí usar BTC, LTC, BCH y DCR. Estas cadenas tienen una base de código similar y el mismo lenguaje de programación (no soy un profesional, por lo que puede haber diferencias, pero no son tan graves). Y todos tienen una capitalización de mercado lo suficientemente alta como para ser relevantes para los intercambios atómicos.

Entonces, el objetivo de la tesis es encontrar contratos de bloqueo de tiempo hash (HTLC) y conectar HTLC coincidentes de diferentes cadenas para obtener el intercambio atómico. Por lo tanto, primero busqué en la web algo sobre intercambios atómicos [1] y analicé el script de entrada de esta transacción [2] para obtener una comprensión básica de cómo funcionan los intercambios atómicos y cómo se ven.

Luego escribí un programa go para buscar cualquier secuencia de comandos más larga que las simples secuencias de comandos P2PKH. Esto me dio una lista de muchos scripts diferentes que analicé a mano para tomar solo los HTLC. (Además de muchos scripts multisig, no hay mucho que encontrar en BTC^^)

En este punto, encontré varios tipos diferentes de HTLC, como se indica a continuación. Luego rastreé * BTC nuevamente guardando todas las transacciones con scripts HTLC, almacenando los datos interesantes como tx-id, valor de entrada, pubKeyHashes, los secretos y sus hashes. Encontré alrededor de cien HTLC en BTC hasta ahora.

Hice lo mismo para LTC y encontré alrededor de 400 HTLC.

Por lo que entendí, los secretos de los HTLC tienen que ser los mismos en ambas cadenas. Así que escribí otro programa Go para hacer coincidir los HTLC encontrados de BTC y LTC y obtuve alrededor de 30 coincidencias. Los siguientes pasos serían rastrear BCH y DCR y también hacer coincidir los HTLC que se encuentran allí.

*En este caso, rastrear significa que empiezo a buscar en la cadena de bloques hacia atrás (para obtener primero lo más nuevo, los primeros años no son tan interesantes en este caso^^) hasta principios de 2017. Entonces, unos 18 meses. Como se indica en [1], el primer intercambio atómico conocido entre BTC y LTC se realizó el 19 de abril de 2017 (o el 19 de abril de 2017 o el 19.4.2017 o lo que quieras). Así que no tiene mucho sentido seguir arrastrándose.

Mis preguntas ahora son las siguientes:

  • ¿Por qué hay tantos tipos diferentes? ¿Es compatibilidad con otras cadenas? ¿O que?
  • ¿Cuáles son las diferencias entre estos tipos (además de la longitud y el algoritmo hash)?
  • ¿Cuáles son las ventajas y desventajas de estos tipos?
  • ¿Por qué hay tantos HTLC en LTC y tan pocos en BTC?
  • ¿Conoces otros scripts HTLC similares?
  • ¿Puede proporcionar recursos interesantes sobre este tema?

Estoy abierto a cualquier aporte constructivo y espero que tenga algunas respuestas para mí. Gracias de antemano.

Tipo 1: secreto sha256, longitud = 97 bytes

63  if
82  size
01  data1
    20
88  equalverify
a8  sha256
20  data32
    <secret_hash 32byte>
88  equalverify
76  dup
a9  hash160
14  data20
    <pubkey_hash1 20byte>
67  else
04  data4
    <timelock 4byte>
b1  checklocktimeverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
68  endif
88  equalverify
ac  checksig

Tipo 2a: secreto sha256, longitud = 94 bytes

63  if
a8  sha256
20  data32
    <secret_hash 32byte>
76  dup
a9  hash160
14  data20
    <pubkey_hash1 20byte>
88  equalverify
ac  checksig
67  else
04  data4
    <timelock 4byte>
b1  checklocktimeverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
88  equalverify
ac  checksig
68  endif

Tipo 2b: secreto sha256, longitud = 93 bytes

63  if
a8  sha256
20  data32
    <secret_hash 32byte>
88  equalverify
76  dup
a9  hash160
14  data20
    <pubkey_hash1 20byte>
67  else
04  data4
    <timelock 4byte>
b1  checklocktimeverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
68  endif
88  equalverify
ac  checksig

Tipo 3: secreto ripemd160, longitud = 81 bytes

63  if
a6  ripemd160
14  data20
    <secret_hash 20byte>
88  equalverify
76  dup
a9  hash160
14  data20
    <pubkey_hash1 20byte>
67  else
04  data4
    <timelock 4byte>
b1  checklocktimeverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
68  endif
88  equalverify
ac  checksig

Tipo 4a: secreto hash160, longitud = 86 bytes

63  if
03  data3
    <timelock 3byte>
b1  checklocktimeverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
88  equalverify
ac  checksig
67  else
76  dup
a9  hash160
14  data20
    <secret_hash 20byte>
88  equalverify
ad  checksigverify
82  size
01  data1
    21 -> 33
88  equalverify
a9  hash160
14  data20
    <pubkey_hash1 20byte>
87  equal
68  endif

Tipo 4b: secreto hash160, longitud = 82 bytes

63  if
03  data3
    <timelock 3byte>
b1  checklocktimeverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
88  equalverify
ac  checksig
67  else
76  dup
a9  hash160
14  data20
    <secret_hash 20byte>
88  equalverify
ad  checksigverify
a9  hash160
14  data20
    <pubkey_hash1 20byte>
87  equal
68  endif

Tipo 5a: secreto hash160, longitud = 81 bytes

63  if
a9  hash160
14  data20
    <secret_hash 20byte>
88  equalverify
76  dup
a9  hash160
14  data20
    <pubkey_hash1 20byte>
67  else
04  data4
    <timelock 4byte>
b2  checksequenceverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
68  endif
88  equalverify
ac  checksig

Tipo 5b: secreto hash160, longitud = 78 bytes

63  if
a9  hash160
14  data20
    <secret_hash 20byte>
88  equalverify
76  dup
a9  hash160
14  data20
    <pubkey_hash1 20byte>
67  else
01  data1
    <timelock 1byte>
b2  checksequenceverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
68  endif
88  equalverify
ac  checksig

Tipo 6: secreto hash160, longitud = 79 bytes

63  if
54  <timelock op>
b1  checklocktimeverify
75  drop
76  dup
a9  hash160
14  data20
    <pubkey_hash2 20byte>
88  equalverify
ac  checksig
67  else
76  dup
a9  hash160
14  data20
    <secret_hash 20byte>
88  equalverify
ad  checksigverify
a9  hash160
14  data20
    <pubkey_hash1 20byte>
87  equal
68  endif

Tipo 7: varios secretos de ripemd160, longitud = 80 + n * 23 bytes

63  if
a6  ripemd160
14  data20
    <secret_hash1 20byte>
88  equalverify
a6  ripemd160
14  data20
    <secret_hash2 20byte>
...
88  equalverify
a6  ripemd160
14  data20
    <secret_hash_n 20byte>
88  equalverify
21  data33
    <signature1 33byte>
ac  checksig
67  else
04  data4
    <timelock 4byte>
b1  checklocktimeverify
75  drop
21  data33
    <signature2 33byte>
ac  checksig
68  endif

Tipo 8: varios secretos de ripemd160, longitud = 81 + n * 23 bytes

74  depth
60  16
87  equal
63  if
a6  ripemd160
14  data20
    <secret_hash1 20byte>
88  equalverify
a6  ripemd160
14  data20
    <secret_hash2 20byte>
...
88  equalverify
a6  ripemd160
14  data20
    <secret_hash15 20byte>
88  equalverify
21  data33
    <signature1>
67  else
03  data3
    <timelock 3byte>
b1  checklocktimeverify
75  drop
21  data33
    <signature2>
68  endif
ac  checksig

[1] http://www.cryptovibes.com/crypto-news/charlie-lees-atomic-swap- between-litecoin-and-bitcoin-was-a-success/

[2] https://insight.bitpay.com/tx/0bb5a53a9c7e84e2c45d6a46a7b72afc2feffb8826b9aeb3848699c6fd856480

Si está interesado en cómo funcionan los intercambios atómicos en proyectos reales, puede consultar este artículo wiki.swap.online/atomic-swap-on-tether . Estos muchachos implementaron el primer intercambio atómico de BTC a USDT en su cartera de proyecto swap.online. Mira esto para tener una mejor comprensión de cómo funciona.

Respuestas (1)

Me gusta la pregunta, pero quizás este no sea el foro adecuado para obtener las mejores respuestas. Es más o menos un área de estilo de preguntas y respuestas, donde debe plantear una sola pregunta, que puede responderse fácilmente. Ver la ayuda del foro. Como tal, creo que bitcointalk.org podría ser mejor para discutir esto...

De todos modos, me gusta la forma en que mostraste lo que se hizo y lo que estás buscando. No tendré respuestas completas a los 6 puntos. Parece que entiendo que la lógica de los siguientes scripts es clave para comprender lo que está sucediendo y ayuda a responder parcialmente sus preguntas.

¿Por qué hay tantos tipos diferentes? ¿Es compatibilidad con otras cadenas? ¿O que?

Es un entorno abierto, y cualquiera puede crear el tipo de scripts que cree que satisfacen las necesidades. Y hay muchos caminos que conducen a Roma... Como la operación de pila proporcionará verdadero o falso, la transacción es válida o no válida. Así que no se puede decir con certeza cuál era la intención de todos los guiones. ¿Prueba y error? ¿Diferentes bibliotecas? ¿Composición de Manullay?

¿Cuáles son las diferencias entre estos tipos (además de la longitud y el algoritmo hash)?

ugh, tendría que pasar por la explicación de todos los guiones - soy demasiado perezoso. Pero por el bien de los futuros lectores, revisaré un ejemplo a continuación...

¿Cuáles son las ventajas y desventajas de estos tipos?

¿Por qué hay tantos HTLC en LTC y tan pocos en BTC?

¿Conoces otros scripts HTLC similares?

Lo dejo a la audiencia, para (tal vez) proporcionar mejores respuestas, de lo que yo podría hacer

¿Puede proporcionar recursos interesantes sobre este tema?

Buscar "HTLC" en este foro y bitcointalk ya proporciona la base de información necesaria. Dentro de los hilos, siempre hay enlaces a una descripción más detallada, y tarde o temprano terminarás entendiendo el relámpago :-)

Junto a la wiki del script , trato de dar una breve explicación de lo que sucede en la pila, mientras se ejecuta este script. Es importante saber que ya hay algunos datos en la pila antes de que se ejecuten los scripts que se muestran. En mi ejemplo elegido, lo más probable es que haya una firma, algunos datos y un "verdadero" para las declaraciones que siguen a la sección "si". Para la sección "else", probablemente haya una firma, una clave pública y un "falso". Tenga en cuenta que la declaración if "come" el elemento de la pila superior ("verdadero" o "falso").

63  if                    if previous element on stack=1, then run the code here (if 0, then go to the else section)
a8  sha256                do a sha256 on the last element on the stack
20  data32                push the next 32 bytes on stack
    <secret_hash 32byte>
76  dup                   duplicate the last item on the stack (so you have twice the secret hash on stack)
a9  hash160               hash the last value from stack with sha256 and ripemd160
14  data20                push the next 20 bytes on stack
    <pubkey_hash1 20byte>
88  equalverify           see if top stack items are the same, if not stop execution (tx = invalid)
ac  checksig              check the remaining signature on the stack
67  else
04  data4                 push 4 bytes on stack
    <timelock 4byte>
b1  checklocktimeverify   tx is invalid if timelock is greater than nLocktime field ...
75  drop                  remove top stack item (whatever CLTV left on the stack)
76  dup                   duplicate the
a9  hash160               sha256 and ripemed (probably the pubkey, leaving a pubkey hash on the stack)
14  data20                push next 20 bytes on stack
    <pubkey_hash2 20byte>
88  equalverify           verify top two stack elements (both hashes), if not equal, tx = invalid)
ac  checksig              check the remaining signature on the stack
68  endif

El ejemplo es quizás una prueba simple, porque no puedo ver cómo la sección "if" con sig, data y "true" en la pila podría llegar a un resultado válido (aunque puedo estar equivocado). Después de la firma en la pila, tendríamos una estructura de datos, que está sha256. Le siguen 32 bytes, y luego se duplican. Estos son tres elementos de datos en la pila. El elemento superior se elimina de la pila, se procesa y el hash vuelve a la pila. Todavía hay tres elementos de datos en la pila. Sigue otro elemento de datos (20 bytes), antes de que equalverify (come y) comprueba los dos elementos principales. Si es verdadero, seguiría un checksig, pero todavía hay dos estructuras de datos de la operación anterior en la pila. Y no veo ningún multisig aquí (lo que verificaría las claves públicas, pero no los hashes). Entonces checksig fallaría ... Por lo tanto, asumo que se trata de un script de prueba.

gracias por tu extensa respuesta. También comencé un hilo en bitcointalk.org.
Lo siento por la publicación doble, pero no puedo editar mi comentario porque tiene más de 5 minutos -.- De todos modos: analizaré más a fondo los intercambios atómicos y los HTLC en los próximos días. tal vez fui un poco estrecho de miras con la pregunta sobre la variedad de scripts ^^ Una cosa interesante es que revisé algunas de las transacciones HTLC que encontré con hashmal , que es una herramienta para probar transacciones de bitcoin. Y decía, este guión era válido. Pero también estaba confundido cuando traté de verificarlo a mano.
Oh, genial, necesito echar un vistazo a este hashmal. Nunca lo pasó por encima. Gracias por el enlace.