__wf_reserved_heredar
Blog__wf_reserved_heredar
Cómo salvamos un millón robado
__wf_reserved_heredar

Cómo salvamos un millón robado

__wf_reserved_heredar
__wf_reserved_heredar
Daniel Yavorovych
July 16, 2018

Esta historia trata sobre una gran empresa de tecnología financiera que es hackeada. La llamaremos TwinPeaks para preservar el anonimato, o TP para abreviar.
Cuanto más callados nos volvemos, más oímos.
Era una fría noche de viernes de invierno. De repente, recibía una llamada telefónica de los Estados Unidos, se notaba por el código de área.

  • ¡Hola!
  • Daniel, por favor, conéctate a Internet, nos han pirateado...
  • ...

Era el CTO de TP. La mala suerte parecía haberlos invadido ese día: los hackearon. En resumen, su proyecto hot-wallet se vació en monederos externos de Bitcoin.

twin-peaks

¿Qué hay que hacer? Un vistazo rápido a las transacciones me dejó sin aliento de horror: la suma de la transacción equivalía a un poco menos de 1 000 000 USD.

Lo primero que pensé fue: ¿realmente puedes ayudar en eso? Supongo que solo puedes ofrecer tus condolencias.

¡Lo único que descubrió Colón fue que estaba perdido!

Sin embargo, un punto importante es que las transacciones no tuvieron ninguna confirmación. ¿Por qué? Porque la red Bitcoin estaba sobrecargada en ese momento. Y esa situación dio la oportunidad de tomar medidas urgentes.

La cuestión es que, mientras una transacción no tenga confirmación en Blockchain, está aislada en el llamado Mempool, un almacenamiento temporal. Mientras una transacción esté en Mempool, aún existe la posibilidad de influir en su destino: aumentar la tarifa, por ejemplo, o incluso cambiar la dirección del destinatario.

Creo que será útil hablar sobre los aspectos básicos de una transacción de Bitcoin.

Los detalles básicos de una transacción de bitcoins

Muchos tienen la idea errónea de que se trata de un tipo de mensaje que indica cuánto debe recibir un destinatario y, cuando una transacción está en curso, el saldo del remitente baja y el del destinatario aumenta. Pero no es exactamente así.

En realidad, es una lista de transacciones entrantes y salientes que, cuando se juntan, forman la suma que se ha enviado. Y el saldo de un usuario es el resultado de cálculos matemáticos de las transacciones entrantes y salientes.

Déjame mostrarte el gráfico de transacciones:

Diagram_FINAL

El equilibrio de Dale era 10.5 Bitcoins que le envió su amigo, el jefe del FBI.

Decidió enviar a Diane 0,5 btc y realizó una transacción. En ese momento se formó una transacción que decía que 0,5 btc debería ir a Diane, y 9.5 BTC debería volver a otra dirección que pertenezca a Dale. Su saldo completo está bloqueado ahora, pero aún no lo ha gastado, ya que la transacción aún no está confirmada.

Después de eso, comienza el arduo trabajo de los mineros. Un minero de los bosques verdes estadounidenses encuentra esta transacción y la confirma. Luego, cinco mineros más hacen lo mismo y, finalmente, blockchain.info muestra que la transacción tiene seis confirmaciones, lo que significa que puede considerarse válida.

Diane tenía 24,5 btc, que recibió de su amigo, el jefe del Servicio Federal de Seguridad Albert, y del desquiciado Dr. Lawrence. Tan pronto como se haya confirmado la operación, su saldo ha alcanzado una amplia cantidad semicircular 25 btc, y Dale tiene la suya previamente bloqueada 9.5 BTC volver.

Meanwhile

Es un poco confuso, ¿no? Sí, lo es.

Pero imaginemos que Dale ha cometido un error (a mí me cuesta imaginarlo, pero intentémoslo de todos modos) y ha enviado medio Bitcoin a Bob, no a Diane.

¿Qué pasó?

Todos sus 10 btc se bloquearon y la transacción fue a Mempool, donde miles de mineros están a punto de descubrirla.
Si eso sucediera, Dave no se quedaría quieto, ya que, mientras no haya confirmaciones, seguirá siendo el propietario de sus 10 Bitcoins. Hipotéticamente, puede enviar muchas más transacciones, cientos de ellas.

«¡¿Cómo es que?!» puede que te preguntes. «¿No puede Dave enviar 0,5 BTC a Diane cien veces y hacerla 50 BTC más rica?»

Lamentablemente, no.

Tan pronto como se confirme alguna de esas transacciones, el resto no tendrá ninguna posibilidad. Sí, los mineros también las contactarán, pero simplemente cancelarán el resto de las transacciones una vez que vean que esos Bitcoins ya se han gastado.

Entonces, ¿cómo puede Dale salvar sus 0,5 BTC y cómo podría yo recuperar un millón de dólares de las garras de los matones esa noche?

HOW WE SAVED A STOLEN MILLION

La respuesta es muy simple: tuve que enviar una transacción más que un minero descubriría antes que la inicial. ¿Cómo se puede hacer? Déjame contarte un poco sobre...

Cómo trabajan los mineros

La tarea de un minero es hacer que la electricidad genere los mayores ingresos posibles. Una de sus tareas es confirmar una transacción en línea. Cuando confirman una transacción, reciben una recompensa. ¿Qué tan grande es la recompensa? Depende del costo de la tarifa de transacción. Cuanto mayor sea el importe de la tarifa asignada por un usuario, mayor será la recompensa que recibirá el minero. Por eso es más lucrativo para un minero trabajar con transacciones que tienen una recompensa mayor. Naturalmente, su prioridad será trabajar con este tipo de transacciones. Cuanto mayor sea la tarifa, más rápido se procesará la transacción.
Por lo tanto, la tarea se redujo a enviar una transacción a Mempool idéntica a la que se había enviado anteriormente (con la misma «entrada», lo que significa que debería basarse en las mismas transacciones entrantes), pero con una dirección de destinatario diferente y una tarifa mayor.
Intentando ahorrar el dinero robado, creé una transacción con una comisión enorme (más de 100 dólares en lugar de los 7 dólares iniciales) y cambié la dirección del destinatario, poniendo la dirección que pertenecía a TwinPeaks. Firmé la transacción con una clave privada y la retransmití desde varios puntos diferentes de forma simultánea, con grandes recursos (como blockchain.info y otros recursos similares).

Y empecé a esperar.

HOW WE SAVED A STOLEN MILLION

Parecía que había estado esperando durante años.

Caminé nerviosamente por la cocina de un lado a otro fumando y mirando el monitor.

También estaba chateando por mensaje de texto con el CTO de TP, aunque debo admitir que sus respuestas fueron bastante bruscas.

Un día la tristeza se acabará.

Habían pasado 30 minutos y... vi la primera confirmación de mi transacción. En algún momento, recibí las seis confirmaciones de mi transacción y la transacción del malhechor se canceló pronto, ya que el dinero ya se había gastado.

Creo que no hay necesidad de describir cómo me sentí en ese momento; muchos de ustedes se han sentido así en algún momento. El logro es su propia recompensa, el orgullo lo oculta.

Parecía que era hora de irme a dormir, pero decidí describir todo el algoritmo en un simple script de Python, para que cualquiera pudiera usar esta solución si, Dios no lo quiera, se encontrara con un problema similar. O, lo que parece ser un caso más frecuente, alguien simplemente se cansará de esperar hasta que se confirme su transacción y decidirá pagar un poco más por su procesamiento después de haber aumentado la tarifa. Por eso llamé al script upmyfee y lo subí a Github: https://github.com/dysnix/upmyfee

El script es muy simple de usar y tiene un README con casos de uso.

Recién hecho el último esfuerzo, me fui a dormir pensando que, debido al desarrollo del mercado de criptomonedas y a la popularización de los criptoactivos, el precio de los valores está creciendo exponencialmente. Es por eso que nunca intentes reducir la seguridad de tu producto y, si resulta que te metes en problemas, siempre hay una salida.

Los búhos no son lo que parecen.

__wf_reserved_heredar
Daniel Yavorovych
CTO and Co-founder at Dysnix
Brainpower and problem-solver, meditating and mountain hiking.
Tabla de contenido
Artículos relacionados
Suscríbete al blog
La mejor fuente de información para el servicio al cliente, consejos de ventas, guías y mejores prácticas de la industria. Únase a nosotros.
Gracias por suscribirte al blog de Dysnix
Ahora serás el primero en enterarte cuando publiquemos un nuevo post
Lo tengo
¡Uy! Algo salió mal al enviar el formulario.
__wf_reserved_heredar
Copiado al portapapeles
Pégalo donde quieras