Índice:

ESP8266 Bitcoin Miner: 3 etapas
ESP8266 Bitcoin Miner: 3 etapas

Vídeo: ESP8266 Bitcoin Miner: 3 etapas

Vídeo: ESP8266 Bitcoin Miner: 3 etapas
Vídeo: I Mined Bitcoin on a Raspberry Pi with an AntMiner USB for 24 Hours 2024, Novembro
Anonim
ESP8266 Bitcoin Miner
ESP8266 Bitcoin Miner

Com o preço do Bitcoin subindo continuamente e com alguns ESP8266 sempre conectados, mas sem fazer muito, pensei, por que não tentar implementar um Bitcoin Miner Solo. Depois de um pouco de experiência, obtive o ESP8266 até ~ 1200 hashes / seg e em dezembro de 2017 a rede Bitcoin estava executando cerca de 12.000.000 tera hashes por segundo (você pode verificar o blockchaininfo para os números mais recentes).

Portanto, com base nesses números, teríamos uma chance de 1 em 16 de extrair com sucesso um bloco a cada dez minutos, onde um bloco vale atualmente $ 212.000. Claro, é muito parecido com comprar um bilhete de loteria, só que com uma chance muito menor de ganhar, mas você conhece o velho ditado, alguém tem que ganhar. Com os projetos Gate Mate e Super Squirter ESP8266, na maioria das vezes eles não estão fazendo nenhum trabalho, estão apenas conectados e aguardando solicitações ou entradas, então por que não colocá-los nisso e talvez ganhar algumas moedas. O primeiro passo foi tentar descobrir se era mesmo possível realizar um SHA256 duplo no Blockheader em um ESP8266. No mundo do Bitcoin, o 'hash' é, na verdade, um SHA256 duplo, mas vamos nos referir a ele apenas como hash. De qualquer forma, depois de pesquisar um pouco no Google, encontrei essas duas páginas que forneciam todas as informações necessárias para obter o hash.

1. Algoritmo de hash de bloco

2. Bitcoin Mining da maneira mais difícil: os algoritmos, protocolos e bytes

É importante notar que o protocolo getwork, conforme detalhado nos links acima, foi descontinuado. Ele foi substituído pelo protocolo getblocktemplate, o que torna um pouco mais complicado construir um cabeçalho de bloco, especificamente você precisa construir sua própria raiz merkle. Para todos os detalhes, verifique o wiki getblocktemplate.

Etapa 1: o algoritmo

O Algoritmo
O Algoritmo

Vamos começar, o código ESP8266 está no repositório ESP8266BitcoinMiner GitHub. Não vou repetir todas as informações dos links acima, mas apenas destacar os pontos principais.

char header_hex = 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892ddf0f1fc14214a

char header_hex é o cabeçalho do bloco e é construído a partir de seis campos, Version, hashPrevBlock, hashMerkleRoot, Time, Bits e o Nonce, todos concatenados juntos como pequenos valores endian em notação hexadecimal. Isso foi apenas copiado do link acima, mas em um minerador totalmente desenvolvido, você receberia cada um desses campos em um objeto json e, em seguida, teria que separar o endianness e colocá-lo junto em tempo real a cada 10 minutos.

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

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

hex_decode pega a string header_hex, que contém caracteres ascii hexadecimais, e preenche os hashbytes uint8_t [80] com seus respectivos valores de byte prontos para o hasher SHA256.

void hash () {

hex_decode (header_hex, strlen (header_hex), hashbytes); início longo sem sinal = micros (); hasher.doUpdate (hashbytes, sizeof (hashbytes)); hash de byte [SHA256_SIZE]; hasher.doFinal (hash); hashagain.doUpdate (hash, sizeof (hash)); byte hash2 [SHA256_SIZE]; hashagain.doFinal (hash2); sem sinal finalizado longo = micros (); delta longo sem sinal = finalizado - início; 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); }}

o hash simplesmente faz o hash dos hashbytes duas vezes (duplo SHA256), imprime os usegundos que levou e imprime o hash resultante como um big endian e little endian. Se os hashes estivessem aninhados em apenas um hasher SHA256, provavelmente seria um pouco mais rápido, mas de qualquer forma com o código acima, leva 832 usegundos para executar o hash duplo e você pode ver na imagem que obtemos o hash correto.

Etapa 2: acertar uma parede e um bloco realmente grande

Atingindo uma parede e um bloco realmente grande
Atingindo uma parede e um bloco realmente grande

Portanto, se levar 832 usegundos para fazer um hash, podemos executar 1 / 0,000834 = 1201 hashes / s.

Só para ficar claro, pegamos as informações do bloco # 125552 onde conhecíamos o nonce, ele já foi extraído e usamos essas informações como um caso de teste para ter certeza de que poderíamos obter o mesmo hash com o ESP8266. Assim, uma vez que ganhasse com um minerador totalmente desenvolvido, você faria uma estimativa aleatória do nonce, misturaria o blockheader com ele e, em seguida, compararia o resultado com a dificuldade para aquele bloco. Se o hash atender à dificuldade, ele será enviado à rede para verificação.

Ok, isso é ótimo, podemos executar o hash, com certeza a taxa é péssima, mas quando olhamos para isso como uma loteria, um palpite é um palpite. Aqui está o mas, após uma inspeção mais detalhada, logo fica claro que você precisa estar executando um nó completo para poder se comunicar com a rede, meio que óbvio quando você para e pensa sobre o que a mineração realmente é.

Portanto, se você olhar o diagrama, verá que o daemon bitcoin, que faz parte do núcleo do bitcoin, cuida da comunicação entre a rede e o minerador. O que isso realmente significa é que você precisa executar o núcleo do Bitcoin em um servidor para que o ESP8266 possa obter um novo blockheader a cada 10 minutos e, então, ser capaz de enviar de volta à rede.

Eu não tentei, mas parece que você teria que sincronizar todo o blockchain em cerca de 130 Gigs antes de se comunicar corretamente com a rede, no wiki eles mencionam que certas etapas devem ser concluídas antes que todas as funcionalidades estejam disponíveis, então com certeza isso é o que eles significam.

Então isso me puxou até lá, do ponto de vista de pesquisa foi tudo muito interessante e foi muito legal ver o pequeno ESP8266 hash com sucesso o caso de teste, mas na prática não vejo muitas pessoas baixando o núcleo, sincronizando todo o blockchain, mantendo tudo atualizado, mantendo-se atualizado com os problemas de segurança, tudo por uma chance de 1 em 1e16 de ganhar o bloqueio. Uma ponte muito longe para mim.

Desde o início, eu sabia que a taxa de hash seria terrível, mas a curiosidade levou o melhor sobre mim e eu tive que tentar. Em vez de mineração solo, pode haver uma piscina de mineração que pode ser conectada diretamente do ESP8266 sem um esforço monumental ou pode haver outra criptomoeda que seja mais adequada. Se você encontrar algum, por favor me avise.

Etapa 3: Referências

1. Repositório GitHub ESP8266 Bitcoin Miner

2. ESP8266 Crypto GitHub Repository

3. Mineração de bitcoin da maneira mais difícil: os algoritmos, protocolos e bytes

4. Algoritmo de hash de bloco

5. Bloco 125552

Recomendado: