Tabla de contenido:

ESP8266 Bitcoin Miner: 3 pasos
ESP8266 Bitcoin Miner: 3 pasos

Video: ESP8266 Bitcoin Miner: 3 pasos

Video: ESP8266 Bitcoin Miner: 3 pasos
Video: Bitcoin Lottery Miners With ESP32 2024, Mes de julio
Anonim
Minero de Bitcoin ESP8266
Minero de Bitcoin ESP8266

Con el precio de Bitcoin continuando subiendo y con un par de ESP8266 siempre enchufados pero sin hacer mucho, pensé por qué no intentar implementar un Solo Bitcoin Miner. Después de experimentar un poco, obtuve el ESP8266 hasta ~ 1200 hashes / seg y, en diciembre de 2017, la red de Bitcoin estaba funcionando alrededor de 12, 000, 000 tera hashes por segundo (puedes consultar blockchaininfo para obtener los últimos números).

Entonces, según esos números, tendríamos una probabilidad de 1 en 1e16 de extraer con éxito un bloque cada diez minutos donde un bloque actualmente vale $ 212, 000. Seguro que es muy parecido a comprar un boleto de lotería, solo que con una probabilidad mucho menor de ganar., pero ya conoces el viejo dicho, alguien tiene que ganarlo. Con los proyectos Gate Mate y Super Squirter ESP8266 la mayor parte del tiempo no están haciendo ningún trabajo, simplemente están enchufados y esperando solicitudes o entradas, así que ¿por qué no ponerlos a trabajar y tal vez ganar algunas monedas? El primer paso fue intentar averiguar si era posible realizar un doble SHA256 en el Blockheader en un ESP8266. En el mundo de Bitcoin, el 'hash' es en realidad un doble SHA256, pero nos referiremos a él como el hash. De todos modos, después de buscar un poco en Google, encontré estas dos páginas que proporcionaban toda la información necesaria para obtener el hash.

1. Bloquear algoritmo de hash

2. Bitcoin Mining de la manera difícil: los algoritmos, protocolos y bytes

Vale la pena señalar que el protocolo getwork, como se detalla en los enlaces anteriores, ha quedado obsoleto. Ha sido reemplazado por el protocolo getblocktemplate que hace que sea un poco más complicado construir un encabezado de bloque, específicamente tienes que construir tu propia raíz merkle. Para conocer todos los detalles, echa un vistazo a la wiki de getblocktemplate.

Paso 1: el algoritmo

El algoritmo
El algoritmo

Saltemos directamente, el código ESP8266 está en el repositorio ESP8266BitcoinMiner GitHub. No voy a repetir toda la información de los enlaces anteriores, sino que solo resaltaré los puntos principales.

char header_hex = 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc88512d2b042adf;

char header_hex es el encabezado del bloque y se construye a partir de seis campos, Version, hashPrevBlock, hashMerkleRoot, Time, Bits y Nonce, todos concatenados juntos como pequeños valores endian en notación hexadecimal. Eso se acaba de copiar del enlace anterior, pero en un minero de pleno derecho recibiría cada uno de esos campos en un objeto json y luego tendría que clasificar el endianness y armarlo sobre la marcha cada 10 minutos.

uint8_t * hex_decode (const char * in, size_t len, uint8_t * out) {

unsigned int i, mg, ng, rg; para (mg = 0, i = 0; i '9'? en - 'a' + 10: en - '0'; rg = en [i + 1]> '9'? en [i + 1] - 'a' + 10: in [i + 1] - '0'; out [mg] = (ng << 4) | rg;} return out;}

hex_decode toma la cadena header_hex, que contiene caracteres ascii hexadecimales, y llena los hashbytes uint8_t [80] con sus respectivos valores de bytes listos para el hash SHA256.

hash vacío () {

código_hex (encabezado_hex, strlen (encabezado_hex), hashbytes); inicio largo sin firmar = micros (); hasher.doUpdate (hashbytes, tamaño de (hashbytes)); hash de byte [SHA256_SIZE]; hasher.doFinal (hash); hashagain.doUpdate (hash, sizeof (hash)); byte hash2 [SHA256_SIZE]; hashagain.doFinal (hash2); largo sin firmar = micros (); delta largo sin firmar = finalizado - inicio; Serial.println (delta); Serial.print ("Big Endian:"); para (byte i = 32; i> 0; i -) {if (hash2 [i-1] <0x10) {Serial.print ('0'); } Serial.print (hash2 [i-1], HEX); } Serial.println (); Serial.print ("Little Endian:"); para (byte i = 0; i <SHA256_SIZE; i ++) {if (hash2 <0x10) {Serial.print ('0'); } Serial.print (hash2 , HEX); }}

hash simplemente aplica hash a los hashbytes dos veces (doble SHA256), imprime los segundos de uso que tomó e imprime el hash resultante como big endian y little endian. Si los hash estuvieran anidados en un solo hash SHA256, probablemente sería un poco más rápido, pero de todos modos con el código anterior se necesitan 832 segundos de uso para realizar el doble hash y, como puede ver en la captura de pantalla, obtenemos el hash correcto.

Paso 2: golpear una pared y un bloque realmente grande

Golpear una pared y un bloque realmente grande
Golpear una pared y un bloque realmente grande

Entonces, si se necesitan 832 segundos de uso para hacer un hash, podemos realizar 1 / 0.000834 = 1201 hash / seg.

Para que quede claro, tomamos la información del bloque # 125552 donde sabíamos el nonce, ya se ha extraído y usamos esa información como un caso de prueba para asegurarnos de que podríamos obtener el mismo hash con el ESP8266. Entonces, una vez que obtengas una ganancia con un minero completamente desarrollado, harías una suposición aleatoria en el nonce, apuntaste el encabezado del bloque con él y luego compararías el resultado con la dificultad de ese bloque. Si el hash cumple con la dificultad, se envía a la red para su verificación.

Ok, eso es genial, podemos realizar el hash, seguro que la tasa es terrible, pero cuando lo vemos como una lotería, una conjetura es una conjetura. Aquí está el pero, tras una inspección más cercana, pronto queda claro que necesita estar ejecutando un nodo completo para poder comunicarse con la red, algo obvio cuando se detiene y piensa en lo que realmente es la minería.

Entonces, si miras el diagrama, puedes ver que el demonio de bitcoin que es parte del núcleo de bitcoin se encarga de la comunicación entre la red y el minero. Lo que esto realmente significa es que debe ejecutar el núcleo de Bitcoin en un servidor para que el ESP8266 pueda obtener un nuevo encabezado de bloque cada 10 minutos y luego pueda volver a enviarlo a la red.

No lo he probado, pero parece que tendrías que sincronizar toda la cadena de bloques en alrededor de 130 Gigs antes de que se comunique correctamente con la red, en la wiki mencionan que ciertos pasos deben completarse antes de que todas las funciones estén disponibles, así que estoy bastante seguro. eso es lo que quieren decir.

Así que eso me llevó hasta allí, desde el punto de vista de la investigación, todo fue muy interesante y fue genial ver el pequeño ESP8266 hash con éxito en el caso de prueba, pero prácticamente hablando, no veo a muchas personas descargando el núcleo, sincronizando todo blockchain, manteniendo todo actualizado, manteniéndose al día con los problemas de seguridad, todo por una posibilidad de 1 en 1e16 de ganar el bloque. Un puente demasiado lejos para mí.

Desde el principio, supe que la tasa de hash sería terrible, pero la curiosidad se apoderó de mí y tuve que intentarlo. En lugar de minar en solitario, podría haber un grupo de minería al que se pueda conectar directamente desde el ESP8266 sin un esfuerzo monumental o podría haber otra criptomoneda que sea más adecuada. Si encuentra alguno, hágamelo saber.

Paso 3: referencias

1. Depósito de GitHub de Bitcoin Miner ESP8266

2. Repositorio de cripto GitHub ESP8266

3. Minería de Bitcoin por las malas: algoritmos, protocolos y bytes

4. Bloquear algoritmo de hash

5. Bloque 125552

Recomendado: