Logramos restaurar la computadora de control a bordo de la nave espacial Apollo. Y ahora, cuando tenemos en nuestras manos la única instancia de trabajo en el mundo, se me ocurrió escribir código para ello. Aunque la idea de extraer bitcoins usando una computadora de los lejanos años 60 parecía no tener sentido, valió la pena intentarlo. Implementar el algoritmo de cifrado de Bitcoin en el código del ensamblador usando una computadora de 15 bits fue difícil, pero aún así logré que funcionara. Desafortunadamente, la computadora resultó ser tan lenta que tomaría una eternidad formar un bloque de bitcoin.

La computadora de control a bordo (AGC) Apollo / Apollo se desarrolló en la década de 1960, realizó cálculos y movimientos controlados, navegación y comandos controlados y módulos lunares durante los vuelos bajo el programa Apollo. En una era en la que el tamaño de las computadoras podía variar del tamaño del refrigerador al tamaño de la habitación, la guía Apollo era lo suficientemente pequeña como para volar al espacio. Esta computadora histórica fue una de las primeras en utilizar circuitos integrados. Tal máquina pesaba casi 32 kg.

La computadora de control a bordo de la nave espacial Apollo desempeñó un papel importante en el desarrollo del desarrollo de software, dirigido por Margaret Hamilton.
Margaret Hamilton dirigió el departamento de desarrollo de software en el Instituto de Tecnología de Massachusetts (MIT). El departamento desarrolló un software a bordo para el programa espacial Apollo de la NASA.
Apollo (AGC) estaba equipado con un sistema operativo en tiempo real con multitarea cooperativa, se podían realizar varias tareas prioritarias simultáneamente, había una función de solución de problemas. La mayor parte del software estaba en ensamblador, se desarrolló un intérprete para AGC, que permitía ejecutar 5-7 máquinas virtuales simultáneamente en dos kilobytes de memoria.
Cómo funciona la minería de Bitcoin
En absoluto: como la moneda digital líder, Bitcoin ha estado a la vanguardia en los últimos años. El sistema Bitcoin se puede considerar como un libro de cuentas en el que se mantiene a quién pertenecen los bitcoins, esto le permite transferirlos de un usuario a otro. La característica revolucionaria de Bitcoin es la descentralización completa, no hay un administrador central ni ningún análogo. En cambio, los registros se distribuyen a miles de máquinas en Internet, y el sistema funciona sin asistencia.
Este es un tipo de diario en el que todas las transacciones se registran sin la posibilidad de cambiar ningún dato, pero solo su adición. Un tipo de copia de dicha revista se encuentra en los sistemas de todos los participantes en esta red, y todas las transacciones e información sobre circulación y acumulación de fondos también se encuentran en todas estas revistas.
Para asegurarse de que todos estén de acuerdo con qué transacciones son válidas, Bitcoin utiliza un proceso llamado minería: aproximadamente cada 10 minutos se extrae un bloque de transacciones pendientes, esto hace que este bloque sea "oficial". El sistema Bitcoin está diseñado de tal manera que la minería de bloques requiere una gran cantidad de poder de cómputo, y esto elimina la "toma de poder" por parte de un minero. Los mineros (mineros de bitcoin) compiten entre sí, generando billones de billones de "hashes" aleatorios, hasta que alguien tenga la suerte de encontrar uno a partir de 18 ceros. Este hash forma un bloque generado con éxito, después de lo cual todos proceden a extraer el siguiente bloque. Idea: es extremadamente improbable obtener 18 ceros seguidos por accidente, por lo que se necesitan muchos intentos antes de que alguien tenga éxito. Bueno, esto es similar a una lotería, donde los mineros continúan intentando hasta que alguien "gana", buscar un código hash es comparable a encontrar un grano de arena en particular en toda la arena de la Tierra.
Cada vez, después de extraer el bloque, se crean nuevos Bitcoins; Actualmente, un minero exitoso puede recibir 12.5 nuevos Bitcoins (con un valor de $ 140,000), así como tarifas de transacción. La idea misma de la oportunidad de obtener $ 140,000 cada 10 minutos hace que los mineros construyan centros de datos llenos de equipos especializados que utilizan una gran cantidad de electricidad.

El diagrama anterior muestra lo que realmente se incluye en el bloque minado. La parte amarilla es el encabezado del bloque (que está en hash), seguido de las transacciones que ingresan al bloque. Cada bloque contiene un hash del bloque anterior, como resultado de lo cual todos los bloques se unen, formando una cadena de bloques. A la derecha, el hash es exitoso, ya que comienza con una gran cantidad de ceros.
Para resumir el proceso de minería: recopila nuevas transacciones de bitcoin y crea un encabezado, como se muestra en el diagrama anterior. Generas un hash de bloque criptográfico. Si, por alguna increíble oportunidad, el resultado comienza con 18 ceros, envía el bloque a la red de Bitcoin y "gana" $ 140,000 en bitcoins. De lo contrario, cambia ligeramente el título e intenta nuevamente. Si alguien más logra obtener un bloqueo, comienza de nuevo con un nuevo bloque y nuevas transacciones.
Algoritmo hash de Bitcoin SHA-256
¿De dónde vienen estos hashes? El proceso de minería de Bitcoin se basa en la criptografía con una "función hash", que convierte el bloque de datos en un valor hash casi aleatorio. El algoritmo de hash está diseñado para que pueda implementarse fácilmente, pero es criptográficamente confiable: no se conoce una forma rápida de encontrar un hash exitoso, excepto probar millones de hash utilizando la fuerza bruta. En particular, Bitcoin utiliza una función hash criptográfica estándar llamada SHA-256. Este algoritmo es simple, pero se puede usar para cifrar datos de forma completamente impredecible.
SHA-256 es una función unidireccional para crear huellas digitales digitales de longitud fija (256 bits, 32 bytes) a partir de datos de entrada de hasta 2,31 exabytes (2 (bits) de tamaño y es un caso especial de un algoritmo de la familia de algoritmos criptográficos SHA-2
El algoritmo SHA-256 se describe aproximadamente en la página de
pseudocódigoLas funciones hash de la familia SHA-2 se basan en la estructura Merkle - Damgard. Después de la adición, el mensaje original se divide en bloques, cada bloque en 16 palabras. El algoritmo pasa cada bloque de mensajes a través de un bucle con 64 iteraciones. En cada iteración se transforman 2 palabras, las palabras restantes establecen la función de conversión. Se suman los resultados de procesamiento de cada bloque, la suma es el valor de la función hash. Dado que la inicialización del estado interno se realiza procesando el bloque anterior, no hay forma de procesar bloques en paralelo.

El paso de codificación de información, también llamado "ronda", se repite 64 veces. El diagrama anterior muestra una ronda que toma ocho valores hash de 4 bytes, de A a H, realiza varias operaciones y genera nuevos valores para AH. Como puede ver en el diagrama, solo A y E cambian por ronda, mientras que otros simplemente cambian. Sin embargo, después de 64 rondas, los datos de entrada están completamente codificados, lo que conduce a una salida impredecible del hash.
Las operaciones en SHA-256 son operaciones simples a nivel de bits. Los campos rojos anteriores indican la suma de 32 bits, generando nuevos valores para A y E. El bloque "selectivo" Ch selecciona bits de F o G en función del valor de la entrada E. Los bloques "totales" giran y suman los bits. El bloque Ma "Most" evalúa los bits en cada posición A, B y C y selecciona qué valor será mayoritario. Valores Kt es una constante. La entrada va al algoritmo a través del valor de Wt. Estas operaciones se pueden implementar fácilmente en una computadora mediante operaciones aritméticas y lógicas simples.
Procesador de computadora de control de nave espacial Apollo
Apollo (AGC) no tenía un microprocesador, ya que fue construido mucho antes de que los microprocesadores se desarrollaran como tales. En cambio, el procesador constaba de aproximadamente 5600 puertas NOR.
Estas puertas se interconectaron para crear circuitos como disparadores, registros, sumadores binarios, lógica de control, etc. AGC es una de las primeras computadoras en usar circuitos integrados; cada circuito integrado contenía dos válvulas NOR. La computadora tenía 24 módulos lógicos similares al siguiente. Cada módulo lógico tenía 120 circuitos integrados (240 válvulas NOR). Por ejemplo, los registros y las ALU se implementaron con cuatro módulos, cada uno de los cuales implementó 4 bits de procesador.

La arquitectura de la computadora era inusual para los estándares modernos: usaba una palabra de 15 bits junto con paridad (en ese momento las computadoras a menudo tenían un tamaño de palabra que correspondía a la aplicación, y no necesariamente 2). AGC tenía solo 2K palabras en RAM, 36K palabras en ROM. El dispositivo de almacenamiento permanente (ROM) fue una selección lineal de múltiples núcleos cosidos, memoria "tejida". La computadora de control Apollo era lenta incluso para los estándares de la década de 1960; él podría realizar alrededor de 40,000 operaciones por segundo. La principal ventaja de AGC era la E / S: tenía cientos de conexiones de E / S y podía proporcionar control de la nave espacial en tiempo real.
Implementación SHA-256 en la computadora de navegación Apollo
Mi implementación del algoritmo hash SHA-256 sigue muy de cerca el pseudocódigo. Sin embargo, me encontré con algunas dificultades porque el conjunto de instrucciones AGC carece de muchas de las características de las computadoras modernas. Por ejemplo, AGC (como muchas computadoras de la década de 1960) no tenía una pila, por lo que tenía que rastrear la dirección de retorno para cada llamada a la subrutina.
Otra complicación fue que el algoritmo SHA-256 usa números sin signo de 32 bits, mientras que el AGC usa números con signo de 15 bits, unidades obsoletas largas, por lo que incluso la operación de adición requería código complejo. Para ingresar un número de 32 bits en el AGC, divido cada palabra en un fragmento de 4 bits y dos de 14 bits. (Usé fragmentos de 14 bits, no de 15 bits, porque necesitaba usar aritmética sin signo).
El siguiente problema fue la memoria AGC, o más bien su tamaño. La computadora de control, como la mayoría de las computadoras de la década de 1960, usaba memoria en núcleos magnéticos, cada bit se almacenaba en un pequeño anillo de ferrita magnetizado. Como la memoria del núcleo era bastante engorrosa, el AGC tenía aproximadamente 4 KB de RAM. El esquema de direccionamiento AGC hizo la tarea aún más complicada, ya que solo se podía acceder a 256 palabras si no se usaba el inconveniente mecanismo de cambio de bloque de memoria. El problema era que el algoritmo SHA-256 usaba ocho valores hash (32 bits), una tabla de confirmación de 64 palabras y 8 palabras de valores intermedios. Solo estas tres matrices usaron 240 palabras de AGC, dejando aproximadamente 16 palabras para todo lo demás (valores temporales, dirección de retorno del programa, conteos de ciclos, punteros, etc.) Logré reducir todo en un bloque de memoria, reutilizando estas 16 palabras para varios objetivos, pero pasé mucho tiempo depurando el problema mientras la variable ocupaba espacio que todavía estaba en uso.

La mayoría de las computadoras modernas tienen comandos especiales shift / rotate para operar en palabras, pero el AGC usó tres registros especiales en su lugar.
El algoritmo SHA-256 utiliza muchos cambios y rotaciones de 32 bits, que tuve que convertir a bucles utilizando un registro cíclico de 15 bits. Aunque la operación de cambio, como x >> 10, es trivial, necesitaba implementar una subrutina completa para ponerla en marcha en la nave espacial Apollo.

Para preservar el conjunto de instrucciones y el pequeño tamaño del código, hubo varias instrucciones para el AGC con inesperados "efectos secundarios". Por ejemplo, la instrucción TS (transferencia a un dispositivo de almacenamiento) escribió un valor en la memoria, que a primera vista fue un proceso simple. Pero si la adición anterior tuvo un desbordamiento (es decir, una transferencia), TS omitió la siguiente instrucción y cargó el registro acumulativo en +1 o -1. En otras palabras, simplemente escribir un valor en la memoria podría provocar un salto en el flujo de control y un cambio de mayúsculas y minúsculas. Esto hizo posible procesar guiones para
operaciones aritméticas con una precisión mucho mayor , la mayoría de las computadoras simplemente implementan esto usando la instrucción "Agregar con guiones".
Lanzamiento del programa
En el siguiente video: mi programa bitcoin que se ejecuta en una computadora de control de la nave espacial Apollo real, los resultados se muestran en nuestro DSKY (abreviatura de Pantalla / Teclado - pantalla / teclado). DSKY tenía un teclado numérico simple con botones lo suficientemente grandes como para que los astronautas los presionen mientras usan guantes. La computadora mostró los resultados en números; los astronautas deberían haber sabido en qué unidades está la salida: en pies, segundos, grados, etc. Utilizamos una copia de DSKY creada por Karl, ya que nadie nos dejaría trabajar en un DSKY real.
La computadora Apollo tenía una interfaz de usuario muy simple. El astronauta eligió la acción presionando la tecla Verbo (Verbo), ingresando el número del verbo y presionando Entrar. Luego seleccionó el punto de referencia ingresando "Noun" (Sustantivo). (Los astronautas tenían una tarjeta de referencia con una lista de todos los verbos y sustantivos). Agregué la minería de Bitcoin como Verb 65 en un programa llamado Borealis; Puedes ver cómo Mike presenta el verbo 65 al comienzo del video.
Apollo tardó 5,15 segundos en crear un hash SHA-256. Dado que Bitcoin usa un doble hash, la tasa de hash es de 10.3 segundos. Actualmente, la red Bitcoin realiza aproximadamente 65 EH / s (65 quintillones de hashes por segundo). La computadora de control a bordo tardará 4 × 10 ^ 23 segundos en obtener la unidad. Y esto es un millón de veces la edad del universo (4.3 × 10 ^ 17).
Dada la complejidad astronómica del proceso de minería, es posible que se pregunte cómo extraje con éxito el bloque. Es simple: para esta demostración, utilicé un bloque que se extrajo con éxito en el pasado como entrada, en particular, el bloque # 286819. Por lo tanto, el algoritmo funcionó rápidamente, pero como era un bloque antiguo, no gané dinero con él.
Para evaluar el rendimiento de la minería de computadoras Apollo, compárelo con el rendimiento de los mineros USB compactos. Uno de esos dispositivos ejecuta 130 mil millones de hashes por segundo, y su costo es inferior a $ 70. Esto no es comparable a la computadora de control Apollo de $ 150,000. En un momento, Apollo era un sistema extremadamente compacto con bajo consumo de energía, que consumía 55 vatios. El minero USB, sin embargo, consume 12 vatios y se adapta fácilmente a su mano. Una gran diferencia en el rendimiento está asociada con un aumento exponencial en la velocidad de la computadora descrita en la ley de Moore y, al mismo tiempo, con la ventaja de los equipos de usuario actuales para minar bitcoins.
Programación AGC: entonces y ahora
En la década de 1960, el código para la computadora de control a bordo fue escrito en tarjetas perforadas y ensamblado en cinta usando un sistema de software llamado YUL. Este sistema era más avanzado de lo que se esperaba en la década de 1960, incluía un sistema de gestión de código fuente, seguía e incluía cambios. Para el vuelo, el software se instaló en una ROM con una selección lineal de núcleos cosidos repetidamente (en la memoria "tejida"), y los cables pasaron físicamente alrededor de los núcleos por 0 o por los núcleos por 1. En otras palabras, cada uno de esos núcleos se hizo a pedido y los datos se almacenaron en el patrón de tejer alambres. Esto aseguró el almacenamiento confiable de ROM de alta densidad, pero requirió varias semanas para la fabricación.

Como no era práctico producir un nuevo núcleo de cuerda para cada cambio, se utilizó un enfoque diferente durante el desarrollo. El simulador de almacenamiento de núcleo magnético hizo posible cargar el programa en la computadora de a bordo desde un dispositivo de almacenamiento externo. Este simulador es parte de un dispositivo de control del tamaño de un refrigerador (abajo en la imagen) - la interfaz de depuración para el AGC a través del conector de diagnóstico en la computadora de a bordo. El monitor permitió a los programadores establecer puntos de interrupción, verificar registros, etc., utilizando indicadores e interruptores.

En mi caso, escribí software en mi computadora portátil y lo compilé con yaYUL, una versión moderna de YUL escrita por el equipo de Virtual AGC. Probé el software en un AGC simulado usando Code :: Blocks IDE, que proporciona características de depuración algo similares a las de la década de 1960. Para ejecutar el código en AGC real, no produjimos núcleos. Afortunadamente, Mike Stewart construyó una placa para cargar el código en el AGC usando el mismo conector de prueba AGC que el dispositivo de control usó originalmente.

Conclusión
Implementé el algoritmo hash SHA-256 y lo ejecuté en la computadora de control a bordo Apollo, que pudimos recuperar, este proceso tomó 10.3 segundos por hash. Este no es mi primer experimento con la minería absurda de bitcoin. Traté de extraerlos manualmente con un lápiz y papel; la tasa de hash fue de 0.67 hashes por día. El uso de un mainframe de IBM con tarjetas perforadas de principios de la década de 1960 proporcionó una tasa de hash de hasta 80 segundos por hash. Mi implementación más rápida fue en Xerox Alto (la famosa computadora de 1973, la mente maestra de Macintosh), realizó 1.5 hash por segundo. Por lo tanto, la computadora de a bordo Apollo pudo superar la vieja computadora de IBM basada en transistores, pero no Alto.

El costo del programa Apollo en 1973 fue de $ 25.4 mil millones, equivalente a aproximadamente $ 150 mil millones en la actualidad. Actualmente, Bitcoin tiene una capitalización de mercado de $ 200 mil millones, por lo que si la NASA extraía Bitcoins, podrían pagar todo el programa Apollo e incluso ahorrar dinero. Pero hay un inconveniente de dicho plan: el bajo rendimiento de la computadora Apollo, ya que la minería de bloques tomaría mucho más tiempo que la vida del universo.
Mi código está disponible en
Github ; El código de minería está en
BITCOIN.agc . CuriousMarc tiene una
serie de videos AGC que puede ver para obtener más información sobre el proyecto de recuperación.
Gracias por quedarte con nosotros. ¿Te gustan nuestros artículos? ¿Quieres ver más materiales interesantes?
Apóyenos haciendo un pedido o recomendándolo a sus amigos, un
descuento del 30% para los usuarios de Habr en un servidor de nivel de entrada analógico único que inventamos para usted: toda la verdad sobre VPS (KVM) E5-2650 v4 (6 núcleos) 10GB DDR4 240GB SSD 1Gbps desde $ 20 o cómo dividir el servidor? (las opciones están disponibles con RAID1 y RAID10, hasta 24 núcleos y hasta 40GB DDR4).
Dell R730xd 2 veces más barato? ¡Solo tenemos
2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV desde $ 199 en los Países Bajos! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - ¡desde $ 99! Lea sobre
Cómo construir un edificio de infraestructura. clase utilizando servidores Dell R730xd E5-2650 v4 que cuestan 9,000 euros por un centavo?