ae^((-(x-b)^2)/(2c^2)) Profile picture
Profe @UCEMA_edu, empresario pyme, programador, matemático, ingeniero UTN FRBA, Autor de libros: Python para finanzas Quant. ♥ @belo_app

Feb 17, 2022, 23 tweets

Estoy nostálgico, asi que va 🧵 nerd bitcoinero dedicado a este falso Bolsonaro que me inspiró, como a tantos otros, a estudiar ciencias cuando era pibe

Y de yapa juego de lotería crypto gratuita para adivinar seeds en python

Empecemos por imaginar un número muy grande
- no, mas grande

Carl Sagan decía "Hay mas estrellas en el universo que granos de arena en todas las playas del planeta"

Como la cantidad de estrellas es medio abstracta, imaginen la cantidad de granos de arena

Se estima 28.000.000 de Km^2 de arena, con una media de 25m de profundidad, o sea 7*10^11 m^3 de arena

Luego como hay unos 10.000 millones de granos de arena por m^3, tenemos 7*10^21 granos de arena en el planeta

O sea un 7 seguido de 21 ceros, muy grande pero no infinito

Guarden ese número en su memoria un rato, ya volveremos

Vamos ahora al bitcoin y sus wallets

¿Cuántas posibles wallets se pueden formar con 24 palabras semilla?

- Pero, ¿24 palabras de una lista de cuantas?

Buen punto, para explicar eso tengo que decirles que lo de las 24 palabras es solo una representación de la verdadera seed

La verdadera seed son 256 "0" y "1" en cualquier orden, eso da 2^256 = 1.15 * 10^77 posibilidades

Y las 24 palabras?
Bueno, imaginate anotando 256 "0" y "1" en un papel
¿Incomodo no?

Veamos la solución, imaginen 24 grupos de 11 ceros o unos

Tendríamos 11*24 = 264 "0" o "1", en realidad necesitamos 256 pero podemos usar los 8 que sobran para verificar (digitos verificadores)

-Y que hago con 11 ceros o unos?

Tenemos 2 elementos tomados de a 11 y el orden importa, o sea 2^11=2048

Es decir que puedo asignar cada permutación de 11 ceros y unos, a una de 2048 posibles palabras

Pero tenemos que fijar 2048 palabras, bueno, eso sería una convención, y de hecho está en la BIP39 (propuesta de mejora del codigo abierto de bitcoin)

Curiosidad, está "satoshi" y no está "bank" en la lista
Dejo link a la lista en github

github.com/bitcoin/bips/b…

Entonces, por ejemplo la palabra "abandon" que es la 1ra de la lista, es el número 0 pasado a binario que serían 11 ceros (completando los 11 lugares con 0 a la izq)

Y la palabra "zoo" que es la ultima es 2047 pasado a binario que serían 11 unos

Recopilando, esos 24 grupos de 11 ceros y unos, alternados los podemos pasar a la representacion decimal para obtener numeros desde el 0 al 2047 y luego transformamos cada uno de esos 24 números en una palabra según su numero de orden

O sea, adivinar una seed frase de 24 de esas 2048 palabras, es ∼ adivinar una secuencia de 256 unos y ceros

o sea que tirar 24 palabras al azar es como inventar una clave privada

Bueno, con eso, vamos a jugar a la lotería con #python

Empecemos generando una seed cualquiera, recordemos que esas 24 palabras corresponden a 256 ceros y unos, esa es la clave privada que generamos y con ella vamos a cear "varias direcciones"

Y ahora veamos las direcciones que se asocian a esa seed

-Momento por qué "VARIAS direcciones"?

Si, una sola seed puede generar de modo determinístico muchas direcciones, por eso en la met*m*sk 🦊 tienen una sola seed frase y con ella puede crear muchas addresses diferentes

En realidad las wallets implementan un derivation path para crear las wallets secundarias que implementan el BIP32 del código de bitcoin, tema medio técnico que explica mejor que nadie @bourbonni en este hilo

Aca dejo ejemplo de codigo con el derivation que usa met*m*sk 🦊

Pero me empecé a ir a la banquina y no quería, perdón, vuelvo en el proximo tweet

Vamos a generar con #python unas 1000 wallets, por ahora solo la primaria, pero bien podría aprovechar y generar muchas mas por cada seed

Como ven, tardé 5 seg en generar 1000 seeds y sus respectivas wallets, o sea que en un día puedo generar unas 17 Millones con una simple PC

Ahora podriamos pensar que podria intentar generar alguna de la lista de las wallets con mas BTC de casualidad

Recordemos el cálculo que hicimos que hay 2^256 = 1.15 * 10^77 seeds diferentes, alguna es la de satoshi

Si sr, es así de "endeble" el sistema, con este jueguito de lotería gratis, cualquiera puede volverse multimillonario de un día para el otro sin necesidad de saber los secretos del doctor en treidin

Ahora volviendo al amigo Carl Sagan, ¿Qué tanta suerte tengo que tener?

Bueno 1.15*10^77 no parecen tantas..

Veamos, habíamos dicho que hay 7*10^21 granitos de arena en todo el planeta

Pensar que si alguien esconde 1 grano de arena en alguna playa del planeta

Y lo encontramos eligiendo 1 (UN) grano de arena al azar.. (alta suerte)

Y luego repetimos el proceso y la pegamos 3 veces seguidas

Es un suceso en... (7*10^21)^3, o sea, 3.43*10^65

Entienden que tan poco probable es el 1.15*10^77?

Encontrar al azar 3 veces seguidas el grano de arena escondido en el planeta, aun es (real) 298mil millones de veces mas probable que acertar la wallet de satoshi probando al azar

Bueno, yo nunca prometí que sea fácil, solo dije que es gratis jugar a esta lotería

Les dejo código, en este quini solo tienen que encontrar 34 caracteres, desde como dijimos, una lista de 256 ceros y unos, parece "no tan dificil" pero es literalmente imposible

Como siempre el código #python de todo esto obvio

colab.research.google.com/drive/152u9rlx…

Share this Scrolly Tale with your friends.

A Scrolly Tale is a new way to read Twitter threads with a more visually immersive experience.
Discover more beautiful Scrolly Tales like this.

Keep scrolling