10,3 segundos por hash: mineração no computador de controle a bordo da espaçonave Apollo

Conseguimos restaurar o computador de controle a bordo da espaçonave Apollo. E agora, quando temos em nossas mãos a única instância em funcionamento no mundo, ocorreu-me escrever um código para ela. Embora a ideia de minerar bitcoins usando um computador dos anos 60 parecesse sem sentido, valeu a pena tentar. Implementar o algoritmo de criptografia Bitcoin no código do assembler usando um computador de 15 bits foi difícil, mas ainda consegui fazê-lo funcionar. Infelizmente, o computador acabou sendo tão lento que levaria uma eternidade para formar um bloco de bitcoin.



O computador de controle de bordo Apollo / Apollo (AGC) foi desenvolvido na década de 1960, realizou cálculos e movimento controlado, navegação e comando controlado e módulos lunares durante voos no âmbito do programa Apollo. Em uma época em que o tamanho dos computadores podia variar do tamanho da geladeira ao tamanho da sala, o Apollo Guidance era pequeno o suficiente para voar para o espaço. Este computador histórico foi um dos primeiros a usar circuitos integrados. Essa máquina pesava quase 32 kg.



O computador de controle a bordo da espaçonave Apollo teve um papel significativo no desenvolvimento do desenvolvimento de software, liderado por Margaret Hamilton.

Margaret Hamilton liderou o departamento de desenvolvimento de software do Instituto de Tecnologia de Massachusetts (MIT). O departamento desenvolveu software de bordo para o programa espacial Apollo da NASA.
O Apollo (AGC) foi equipado com um sistema operacional em tempo real com multitarefa cooperativa, várias tarefas prioritárias podiam ser executadas simultaneamente, havia uma função de solução de problemas. A maior parte do software estava em assembler; um intérprete foi desenvolvido para o AGC, que permitia executar 5-7 máquinas virtuais simultaneamente em dois kilobytes de memória.

Como funciona a mineração de Bitcoin


Não é novidade: como a principal moeda digital, o Bitcoin tem estado na vanguarda das atenções nos últimos anos. O sistema Bitcoin pode ser considerado como um livro de contas no qual é mantido a quem pertencem os bitcoins, permitindo transferi-los de um usuário para outro. O recurso revolucionário do Bitcoin é a descentralização completa, não há administrador central ou qualquer análogo. Em vez disso, os registros são distribuídos para milhares de máquinas na Internet, e o sistema funciona sem assistência.
Esse é um tipo de diário no qual todas as transações são registradas sem a possibilidade de alterar nenhum dado, mas apenas sua adição. Uma espécie de cópia desse periódico está localizada nos sistemas de todos os participantes desta rede, e todas as transações e informações relacionadas à circulação e acumulação de fundos também estão localizadas em todos esses periódicos.
Para garantir que todos concordem com quais transações são válidas, o Bitcoin usa um processo chamado mineração - aproximadamente a cada 10 minutos um bloco de transações pendentes é extraído, isso torna esse bloco "oficial". O sistema Bitcoin é projetado de tal forma que a mineração em bloco requer uma enorme quantidade de poder de computação, e isso elimina a "apreensão de energia" por um mineiro. Mineiros (mineradores de bitcoin) competem entre si, gerando trilhões de trilhões de “hashes” aleatórios, até que alguém tenha a sorte de encontrar um a partir de 18 zeros. Esse hash forma um bloco gerado com sucesso, após o qual todos prosseguem na mineração do próximo bloco. Idéia: obter acidentalmente 18 zeros consecutivos é extremamente improvável, por isso são necessárias muitas tentativas antes que alguém seja bem-sucedido. Bem, isso é semelhante a uma loteria, onde os mineradores continuam tentando até que alguém "vença", procurando um código de hash é comparável a encontrar um determinado grão de areia em toda a areia da Terra.

A cada vez, após a mineração do bloco, novos Bitcoins são criados; Atualmente, um minerador de sucesso pode receber 12,5 novos Bitcoins (no valor de US $ 140.000), além de taxas de transação. A própria idéia da oportunidade de obter US $ 140.000 a cada 10 minutos leva as mineradoras a construir data centers cheios de equipamentos especializados usando uma enorme quantidade de eletricidade.



O diagrama acima mostra o que realmente está incluído no bloco minado. A parte amarela é o cabeçalho do bloco (com hash), seguido pelas transações que entram no bloco. Cada bloco contém um hash do bloco anterior, como resultado do qual todos os blocos são unidos, formando uma cadeia de blocos. À direita, o hash é bem-sucedido, pois começa com um grande número de zeros.

Para resumir o processo de mineração: colete novas transações de bitcoin e crie um cabeçalho, conforme mostrado no diagrama acima. Você gera um hash de bloco criptográfico. Se, por alguma chance incrível, o resultado começar com 18 zeros, você envia o bloco para a rede Bitcoin e "ganha" US $ 140.000 em bitcoins. Caso contrário, você altera ligeiramente o título e tenta novamente. Se alguém conseguir obter um bloco, você começará novamente com um novo bloco e novas transações.

Algoritmo de hash Bitcoin SHA-256


De onde vieram esses hashes? O processo de mineração do Bitcoin é baseado em criptografia com uma "função de hash", que converte o bloco de dados em um valor de hash quase aleatório. O algoritmo de hash foi projetado para que possa ser facilmente implementado, mas é criptograficamente confiável: não há maneira conhecida de encontrar rapidamente um hash bem-sucedido, exceto para tentar milhões de hashes usando força bruta. Em particular, o Bitcoin usa uma função hash criptográfica padrão chamada SHA-256. Esse algoritmo é simples, mas pode ser usado para criptografar dados completamente imprevisíveis.
O SHA-256 é uma função unidirecional para a criação de impressões digitais digitais de comprimento fixo (256 bits, 32 bytes) a partir de dados de entrada de até 2,31 exabytes (2 (bits) de tamanho) e é um caso especial de um algoritmo da família de algoritmos criptográficos SHA-2
O algoritmo SHA-256 é descrito aproximadamente na página de pseudo-código

As funções de hash da família SHA-2 são baseadas na estrutura Merkle - Damgard. Após a adição, a mensagem original é dividida em blocos, cada bloco em 16 palavras. O algoritmo passa cada bloco de mensagem por um loop com 64 iterações. A cada iteração, 2 palavras são transformadas, as demais palavras definem a função de conversão. Os resultados do processamento de cada bloco são adicionados, a soma é o valor da função hash. Como a inicialização do estado interno é realizada processando o bloco anterior, não há como processar blocos em paralelo.



A etapa de codificação da informação, também chamada de "round", é repetida 64 vezes. O diagrama acima mostra uma rodada que leva oito valores de hash de 4 bytes, de A a H, executa várias operações e gera novos valores para AH. Como você pode ver no diagrama, apenas A e E mudam por rodada, enquanto outros simplesmente mudam. No entanto, após 64 rodadas, os dados de entrada são completamente embaralhados, o que leva a uma saída imprevisível do hash.

Operações no SHA-256 são operações bit a bit simples. Os campos vermelhos acima indicam adição de 32 bits, gerando novos valores para A e E. O bloco "seletivo" Ch seleciona bits de F ou G com base no valor da entrada E. Os blocos "total" Σ giram e somam os bits. O bloco Ma “Most” avalia os bits em cada posição A, B e C e seleciona qual valor será a maioria. Valores Kt é uma constante. A entrada vai para o algoritmo através do valor de Wt. Essas operações podem ser facilmente implementadas em um computador usando operações aritméticas e lógicas simples.

Apollo nave espacial controle processador de computador


O Apollo (AGC) não possuía um microprocessador, pois foi construído muito antes de os microprocessadores serem desenvolvidos como tais. Em vez disso, o processador consistia em aproximadamente 5600 portas NOR.
Esses portões foram interconectados para criar circuitos como gatilhos, registradores, somadores binários, lógica de controle e assim por diante. O AGC é um dos primeiros computadores a usar circuitos integrados; cada circuito integrado continha duas válvulas NOR. O computador tinha 24 módulos lógicos semelhantes ao abaixo. Cada módulo lógico possuía 120 circuitos integrados (240 válvulas NOR). Por exemplo, registradores e ALUs foram implementados com quatro módulos, cada um dos quais implementou 4 bits do processador.



A arquitetura do computador era incomum para os padrões modernos: usava uma palavra de 15 bits junto com a paridade (na época, os computadores geralmente tinham um tamanho de palavra que correspondia ao aplicativo, e não necessariamente 2). O AGC tinha apenas 2K palavras na RAM, 36K na ROM. O dispositivo de armazenamento permanente (ROM) era uma seleção linear de vários núcleos costurados, memória "tricotada". O computador de controle Apollo era lento, mesmo para os padrões da década de 1960; ele poderia realizar cerca de 40.000 operações por segundo. A principal vantagem do AGC era a E / S: tinha centenas de conexões de E / S e podia fornecer controle de espaçonaves em tempo real.

Implementação do SHA-256 no computador de navegação Apollo


Minha implementação do algoritmo de hash SHA-256 segue o pseudo-código muito de perto. No entanto, tive algumas dificuldades porque o conjunto de instruções AGC carece de muitos dos recursos dos computadores modernos. Por exemplo, o AGC (como muitos computadores da década de 1960) não tinha uma pilha; portanto, era necessário rastrear o endereço de retorno de cada chamada para a sub-rotina.

Outra dificuldade foi que o algoritmo SHA-256 usa números não assinados de 32 bits, enquanto o AGC usou números assinados de 15 bits, unidades obsoletas longas, de modo que mesmo a operação de adição exigia código complexo. Para inserir um número de 32 bits no AGC, divido cada palavra em um fragmento de 4 bits e dois de 14 bits. (Usei fragmentos de 14 bits, não de 15 bits, porque precisava usar aritmética sem sinal).

O próximo problema foi a memória AGC, ou melhor, seu tamanho. O computador de controle, como a maioria dos computadores da década de 1960, usava memória em núcleos magnéticos, cada bit era armazenado em um minúsculo anel de ferrite magnetizado. Como a memória do kernel era bastante complicada, o AGC tinha aproximadamente 4 KB de RAM. O esquema de endereçamento AGC tornou a tarefa ainda mais complicada, pois somente 256 palavras poderiam ser acessadas se o inconveniente mecanismo de troca de bloco de memória não fosse usado. O problema era que o algoritmo SHA-256 usava oito valores de hash (32 bits), uma tabela de confirmação de 64 palavras e 8 palavras de valores intermediários. Somente essas três matrizes usaram 240 palavras de AGC, deixando cerca de 16 palavras para todo o resto (valores temporários, endereço de retorno do programa, contagem de ciclos, ponteiros etc.). Consegui reduzir tudo em um bloco de memória, reutilizando essas 16 palavras para vários objetivos, mas passei muito tempo depurando o problema enquanto a variável estava ocupando espaço ainda em uso.



A maioria dos computadores modernos possui comandos especiais shift / rotate para operar com palavras, mas o AGC usou três registros especiais.

O algoritmo SHA-256 usa muitos turnos e rotações de 32 bits, que eu tive que converter em loops usando um registro cíclico de 15 bits. Embora a operação de turno, como x >> 10, seja trivial, eu precisava implementar uma sub-rotina inteira para acioná-la na espaçonave Apollo.



Para preservar o conjunto de instruções e o tamanho pequeno do código, havia várias instruções para o AGC com "efeitos colaterais" inesperados. Por exemplo, a instrução TS (transferência para um dispositivo de armazenamento) gravou um valor na memória, que à primeira vista era um processo simples. Porém, se a adição anterior tiver um estouro (ou seja, uma transferência), o TS ignorará a próxima instrução e cobrará o registro acumulado por +1 ou -1. Em outras palavras, simplesmente escrever um valor na memória pode levar a um salto no fluxo de controle e uma alteração de maiúsculas e minúsculas. Isso tornou possível processar hifenizações para operações aritméticas com uma precisão muito maior ; a maioria dos computadores simplesmente implementa isso usando a instrução "Adicionar com hifenização".

Lançamento do programa


No vídeo abaixo - meu programa de bitcoin em execução em um computador real de controle da espaçonave Apollo, os resultados são exibidos em nosso DSKY (abreviação de Display / Keyboard - display / keyboard). DSKY tinha um teclado numérico simples com botões grandes o suficiente para que os astronautas pressionassem enquanto usavam luvas. O computador exibiu os resultados em números; os astronautas deveriam saber em que unidades a saída é: em pés, segundos, graus, etc. Usamos uma cópia do DSKY criada por Karl, já que ninguém nos permitia trabalhar em um DSKY real.

O computador Apollo tinha uma interface de usuário muito simples. O astronauta escolheu a ação pressionando a tecla Verbo (Verbo), inserindo o número do verbo e pressionando Enter. Em seguida, ele selecionou o ponto de ajuste digitando “Substantivo” (Substantivo). (Os astronautas tinham um cartão de referência com uma lista de todos os verbos e substantivos). Adicionei mineração de Bitcoin como Verb 65 em um programa chamado Borealis; Você pode ver como Mike introduz o Verb 65 no início do vídeo.


A Apollo levou 5,15 segundos para criar um hash SHA-256. Como o Bitcoin usa um hash duplo, a taxa de hash é de 10,3 segundos. Atualmente, a rede Bitcoin executa cerca de 65 EH / s (65 quintilhões de hashes por segundo). O computador de controle a bordo levará 4 × 10 ^ 23 segundos para obter a unidade. E isso é um milhão de vezes a idade do universo (4,3 × 10 ^ 17).

Dada a complexidade astronômica do processo de mineração, você pode se perguntar como eu extraí com sucesso o bloco. É simples - para esta demonstração, usei um bloco que foi extraído com sucesso no passado como entrada, em particular o bloco 286819. Assim, o algoritmo funcionou rapidamente, mas, como era um bloco antigo, eu não ganhei dinheiro com isso.

Para avaliar o desempenho da mineração de computadores Apollo, compare-o com o desempenho de mineradoras USB compactas. Um desses dispositivos executa 130 bilhões de hashes por segundo e seu custo é inferior a US $ 70. Isso não é comparável ao computador de controle Apollo, de US $ 150.000. Ao mesmo tempo, o Apollo era um sistema extremamente compacto com baixo consumo de energia, consumindo 55 watts. O mineiro USB, no entanto, consome 12 watts e cabe facilmente na sua mão. Uma enorme diferença de desempenho está associada a um aumento exponencial da velocidade do computador descrito na lei de Moore e, ao mesmo tempo, com a vantagem do atual equipamento de usuário para mineração de bitcoins.

Programação AGC - antes e agora


Na década de 1960, o código do computador de controle de bordo foi escrito em cartões perfurados e montado em fita usando um sistema de software chamado YUL. Este sistema era mais avançado do que se poderia esperar na década de 1960, incluía um sistema de gerenciamento de código-fonte, acompanhava e incluía alterações. Para o vôo, o software foi instalado em uma ROM com uma seleção linear de núcleos costurados repetidamente (na memória “tricotada”) e os fios passavam fisicamente pelos núcleos para 0 ou pelos núcleos para 1. Em outras palavras, cada um desses núcleos era feito sob encomenda e os dados eram armazenados no padrão de tecelagem de fios. Isso garantiu o armazenamento confiável de ROM de alta densidade, mas levou várias semanas para a fabricação.



Como não era prático produzir um novo núcleo de corda para cada mudança, uma abordagem diferente foi usada durante o desenvolvimento. O simulador de armazenamento do núcleo magnético tornou possível carregar o programa no computador de bordo a partir de um dispositivo de armazenamento externo. Este simulador faz parte de um dispositivo de controle do tamanho de um refrigerador (abaixo na imagem) - a interface de depuração do AGC através do conector de diagnóstico no computador de bordo. O monitor permitiu que os programadores definissem pontos de interrupção, verificassem registros, etc., usando indicadores e chaves.



No meu caso, escrevi software no meu laptop e o compilei com o yaYUL, uma versão moderna do YUL, escrita pela equipe do Virtual AGC. Testei o software em um AGC simulado usando o Code :: Blocks IDE, que fornece recursos de depuração um pouco semelhantes aos da década de 1960. Para executar o código no AGC real, não produzimos núcleos. Felizmente, Mike Stewart construiu uma placa para carregar o código no AGC usando o mesmo conector de teste que o dispositivo de controle usou originalmente.



Conclusão


Eu implementei o algoritmo de hash SHA-256 e executei-o no computador de controle de bordo Apollo, que pudemos recuperar, esse processo levou 10,3 segundos por hash. Esta não é minha primeira experiência com a absurda mineração de bitcoin. Tentei minerá-los manualmente com lápis e papel; a taxa de hash era de 0,67 hashes por dia. O uso de um mainframe IBM com cartões perfurados do início dos anos 60 forneceu uma taxa de hash de até 80 segundos por hash. Minha implementação mais rápida foi no Xerox Alto (o famoso computador de 1973, o cérebro do Macintosh), que executava 1,5 hashes por segundo. Assim, o computador de bordo Apollo conseguiu superar o antigo computador IBM com base em transistores, mas não no Alto.



O custo do programa Apollo em 1973 foi de US $ 25,4 bilhões, o equivalente a cerca de US $ 150 bilhões hoje. Atualmente, o Bitcoin tem uma capitalização de mercado de US $ 200 bilhões, portanto, se a NASA estivesse minerando Bitcoins, eles poderiam pagar por todo o programa Apollo e até economizar dinheiro. Mas há uma desvantagem desse plano - o baixo desempenho do computador Apollo, uma vez que a mineração em bloco levaria muito mais tempo que a vida do universo.

Meu código está disponível no Github ; O código de mineração está em BITCOIN.agc . O CuriousMarc possui uma série de vídeos AGC que você pode assistir para obter mais informações sobre o projeto de recuperação.

Obrigado por ficar conosco. Você gosta dos nossos artigos? Deseja ver materiais mais interessantes? Ajude-nos fazendo um pedido ou recomendando a seus amigos, um desconto de 30% para os usuários da Habr em um servidor analógico exclusivo que inventamos para você: Toda a verdade sobre o VPS (KVM) E5-2650 v4 (6 núcleos) 10GB DDR4 240GB SSD 1Gbps de US $ 20 ou como dividir o servidor? (as opções estão disponíveis com RAID1 e RAID10, até 24 núcleos e até 40GB DDR4).

Dell R730xd 2 vezes mais barato? Somente temos 2 TVs Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV a partir de US $ 199 na Holanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - a partir de US $ 99! Leia sobre Como criar um prédio de infraestrutura. classe usando servidores Dell R730xd E5-2650 v4 custando 9.000 euros por um centavo?

Source: https://habr.com/ru/post/pt466071/


All Articles