Siete horas de agosto de 2010
Seis palabras para este caso
De 0,5 BTC a 184 mil millones
La suma da la vuelta
- Una salida sola pasaEl programa revisaba que ninguna salida fuera negativa. Las dos eran positivas.
- La suma no entraLas dos juntas suman 18.446.744.073.708.551.616 satoshis. El programa sumaba en un lugar que llega hasta 9.223.372.036.854.775.807.
- Queda en −0,01 BTCPasado el máximo, el número da la vuelta y aparece negativo, como un cuentakilómetros que pasa de 99999 a 00000.
- La regla la deja pasarLo que sale (−0,01) no es más que lo que entra (0,5). La comisión da 0,5 − (−0,01) = 0,51.
2⁶³ − 500.000 sats
LAS DOS JUNTAS2⁶⁴ − 1.000.000 sats
LO QUE VIO EL PROGRAMA−1.000.000 sats
Una hora después, en el foro
«El "valor de salida" de este bloque #74638 es bastante raro […] ¿92233720368.54277039 BTC?»
«The "value out" in this block #74638 is quite strange […] 92233720368.54277039 BTC?»
Publica el bloque entero, en texto, una hora después de la hora que le puso el minero.
«La suma de las dos salidas desborda a un negativo. Es un error en los chequeos de las transacciones, que no la rechazaron.»
«The sum of the two outputs overflows to a negative. Its a bug in the transaction checks which did not reject it […]»
Y pide apagar lo que se pueda y no mandar ni aceptar pagos.
Cómo se comprueba
una transacción borrada
- Hoy no se puede consultarEn la cadena actual, la transacción y su bloque no existen. Si se la busca en mempool.space, responde que no la encuentra.
- En el foro quedó enterajgarzik publicó la firma, la clave, la moneda que gasta y las dos salidas.
- Se arma de nuevo, byte por byteCon esos datos, su huella (el TXID) da exactamente 1d5e512a…65333c9. Un byte distinto cambiaría la huella entera.
- La clave es la dueña de la monedaLa clave que firma es la de la moneda de 0,5 BTC que gasta, que sí está en la cadena.
Una regla nueva
en 4 horas y media
MAX_MONEY = 21000000 * COIN; foreach (txout in vout) { if (txout.nValue < 0) error("negative"); if (txout.nValue > MAX_MONEY) error("txout.nValue too high"); nValueOut += txout.nValue; if (nValueOut > MAX_MONEY) error("txout total too high"); }
En verde, lo nuevo, resumido. Ninguna salida, y ninguna suma de salidas, puede pasar los 21 millones de bitcoin.
| UTC | Qué pasó |
|---|---|
| 17:05 | El bloque con el desborde |
| 18:08 | El aviso en el foro |
| 20:39 | Gavin Andresen publica un primer parche |
| 21:06 | Satoshi pide dejar de minar: «probablemente haya que rehacer una rama» |
| 21:35 | El arreglo entra al código (SVN 132) |
| 23:48 | Satoshi anuncia la versión 0.3.10 |
6 h 51 min sin bloques
Satsumap dice que no existe
- Lo que se buscaEl TXID de la transacción del desborde, escrito en el buscador.
- Lo que respondeQue no existe. Lo contesta mempool.space, que guarda la cadena de hoy.
La moneda del ataque
sigue sin gastar
- Arriba a la derecha, los 0,5 BTCLa moneda que gastó la transacción del desborde, en 17TASsYP…FwVZSW. Satsumap la marca UTXO: sin gastar.
- Por qué sigue sin gastarSu gasto estaba en el bloque borrado. Desde 2010 nadie la volvió a mover.
183 pagos de 0,5 BTC
Un pago a una salida del desborde

- Lo que se lee en la cadenaEl pago 183 de la cadena va a 1542Dgx5…, la salida 1 del desborde, 56 horas después del bloque malo. Es su única transacción, y esos 0,5 BTC siguen sin gastar. La cadena sigue después de ese pago.
- La otra dirección1EDDEGtr…, la salida 0, no tiene transacciones en la cadena de hoy.
Lo que deja el desborde
- Cómo decide un nodoRevisa cada bloque por su cuenta, con las reglas del programa que tiene instalado. Solo suma el trabajo de una rama si sus bloques cumplen esas reglas. Por eso, después de actualizar, la rama del bloque malo dejó de contar para ese nodo, aunque fuera más larga.
- Los nodos sin actualizarPara el programa viejo, las dos ramas eran válidas, y el nodo seguía la más larga. Cuando la rama buena pasó a la mala, el nodo se pasó a la buena sin que nadie lo tocara.
Una regla nueva
y los bloques viejos
- La regla de 2010 no tenía bloque de inicioEl arreglo valía para la cadena entera. Por eso dejó inválido al 74.638, que ya estaba minado.
- Para limpiar había que volver a bajar los bloquesA las 21:40, Satoshi pidió apagar el programa, reemplazar los bloques guardados por una copia anterior al 74.000, actualizar y dejar que baje el resto. Los bloques que faltaban se bajaban con el programa ya actualizado.
- La 0.3.10 traía otro chequeoSe agregó a las 22:21 (SVN 133). Rechazaba un bloque nuevo si su rama pasaba por el 74.638 malo, reconocido por su hash.
- Al otro día alcanzaba con actualizarEl 16/08 la rama buena ya tenía más trabajo. Un nodo actualizado se pasaba a ella solo, sin borrar nada.
- Hoy una regla nueva arranca en un bloque fijoTaproot se activó en el bloque 709.632, el 14/11/2021. Los bloques anteriores se siguen validando con las reglas de su época.
Qué se puede leer en la cadena
y qué no
| Afirmación | De dónde sale |
|---|---|
| La transacción y su bloque no están en la cadena de hoy | Cadena |
| Los montos, la firma y las direcciones de la transacción | El foro, comprobado con la huella reconstruida, que da el TXID |
| La suma da −0,01 y la comisión 0,51 | La cuenta, sobre esos montos |
| El minero cobró 50,51 BTC | El foro (esa transacción tampoco está) |
| El hueco de 6 h 51 min después del bloque 74.637 | Cadena |
| Las horas del aviso, del parche y de la 0.3.10 | El foro y el repositorio de código |
| La rama buena pasó a la mala en el bloque 74.691 | Bitcoin Wiki. No se puede comprobar en la cadena |
| La moneda de 0,5 BTC sigue sin gastar | Cadena |
| Los 183 pagos hasta el que llega a 1542Dgx5…, y que la cadena sigue | Cadena |
| Los pagos que se gastan juntos tenían un mismo dueño | Inferencia por la forma |
| Los pagos eran de una canilla | Inferencia por la forma, y la wiki dice «parece» |
| Quién armó el desborde | No se sabe |
Los datos, a la vista
Bloque 74.421 · la moneda de 0,5 BTC que gastó el desborde (salida 0)237fe8348fc77ace11049931058abb034c99698c7fe99b1cc022b1365a705d39mempool.space
Bloque 74.638 de hoy (23:53 UTC) · su primera transacción2ae30f63b1507761b5541f7a723f566abb0701e5f8a97927980381341b5d8cbdmempool.space
Bloque 74.923 · el pago de 0,5 BTC a una dirección del desborde672495458201c55cdf4fa47cd40ff0bc8cbbd898b5dd564f84b81b0a87423417mempool.space
Dirección de la moneda del ataque17TASsYPbdLrJo3UDxFfCMu5GXmxFwVZSWmempool.space
Salida 1 del desborde · recibió 0,5 BTC el 18/08/20101542Dgx5EeurzHP8cT57fK6hBTQq2dgTEumempool.space
Salida 0 del desborde · sin transacciones hoy1EDDEGtrZ5877WPsLU5o9TwjJDqaUqhvtemempool.space
La transacción del desborde, para buscarla y ver que no está: 1d5e512a9723cbef373b970eb52f1e9598ad67e7408077a82fdac194b65333c9