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:
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
[2] https://insight.bitpay.com/tx/0bb5a53a9c7e84e2c45d6a46a7b72afc2feffb8826b9aeb3848699c6fd856480
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.
Intercambio atómico