10,3 Sekunden pro Hash: Mining auf dem Bordsteuerungscomputer des Apollo-Raumfahrzeugs

Wir haben es geschafft, den Bordcomputer des Apollo-Raumfahrzeugs wiederherzustellen. Und jetzt, als wir die einzige funktionierende Instanz der Welt in unseren Händen haben, kam mir der Gedanke, Code dafür zu schreiben. Obwohl die Idee, Bitcoins mit einem Computer aus den fernen 60er Jahren abzubauen, sinnlos schien, war es einen Versuch wert. Die Implementierung des Bitcoin-Verschlüsselungsalgorithmus in Assembler-Code mit einem 15-Bit-Computer war schwierig, aber ich habe es trotzdem geschafft, ihn zum Laufen zu bringen. Leider stellte sich heraus, dass der Computer so langsam war, dass es ewig dauern würde, einen Bitcoin-Block zu bilden.



Der Apollo / Apollo Onboard Control Computer (AGC) wurde in den 1960er Jahren entwickelt und führte während der Flüge im Rahmen des Apollo-Programms Berechnungen und kontrollierte Bewegungen, Navigation sowie kontrollierte Befehls- und Mondmodule durch. In einer Zeit, in der die Größe von Computern von der Größe des Kühlschranks bis zur Größe des Raums variieren konnte, war Apollo Guidance klein genug, um in den Weltraum zu fliegen. Dieser historische Computer war einer der ersten, der integrierte Schaltkreise verwendete. Eine solche Maschine wog fast 32 kg.



Der Bordsteuercomputer des Apollo-Raumfahrzeugs spielte eine wichtige Rolle bei der Entwicklung der Softwareentwicklung unter der Leitung von Margaret Hamilton.

Margaret Hamilton leitete die Abteilung für Softwareentwicklung am Massachusetts Institute of Technology (MIT). Die Abteilung entwickelte On-Board-Software für das Apollo-Weltraumprogramm der NASA.
Apollo (AGC) war mit einem Echtzeitbetriebssystem mit kooperativem Multitasking ausgestattet, mehrere vorrangige Aufgaben konnten gleichzeitig ausgeführt werden, es gab eine Fehlerbehebungsfunktion. Der größte Teil der Software befand sich im Assembler. Für AGC wurde ein Interpreter entwickelt, mit dem 5-7 virtuelle Maschinen gleichzeitig in zwei Kilobyte Speicher ausgeführt werden konnten.

So funktioniert Bitcoin Mining


Überhaupt keine Neuigkeit: Als führende digitale Währung steht Bitcoin seit einigen Jahren im Vordergrund der Aufmerksamkeit. Das Bitcoin-System kann als Kontobuch betrachtet werden, in dem aufbewahrt wird, wem die Bitcoins gehören. Auf diese Weise können Sie sie von einem Benutzer auf einen anderen übertragen. Die revolutionäre Funktion von Bitcoin ist die vollständige Dezentralisierung. Es gibt keinen zentralen Administrator oder ein Analogon dazu. Stattdessen werden Datensätze an Tausende von Computern im Internet verteilt, und das System funktioniert ohne Unterstützung.
Dies ist eine Art Journal, in dem alle Transaktionen aufgezeichnet werden, ohne dass Daten geändert werden können, sondern nur deren Hinzufügung. Eine Art Kopie eines solchen Journals befindet sich in den Systemen aller Teilnehmer dieses Netzwerks, und alle Transaktionen und Informationen bezüglich des Umlaufs und der Anhäufung von Geldern befinden sich auch in all diesen Journalen.
Um sicherzustellen, dass alle damit einverstanden sind, welche Transaktionen gültig sind, verwendet Bitcoin einen Prozess namens Mining. Ungefähr alle 10 Minuten wird ein Block ausstehender Transaktionen extrahiert. Dadurch wird dieser Block „offiziell“. Das Bitcoin-System ist so konzipiert, dass das Block-Mining eine enorme Menge an Rechenleistung erfordert, und dies eliminiert die „Beschlagnahme von Energie“ durch einen Bergmann. Bergleute (Bitcoin-Bergleute) konkurrieren miteinander und erzeugen Billionen von Billionen zufälliger „Hashes“, bis jemand das Glück hat, einen zu finden, der bei 18 Nullen beginnt. Dieser Hash bildet einen erfolgreich generierten Block, nach dem alle mit dem Mining des nächsten Blocks fortfahren. Idee: Es ist äußerst unwahrscheinlich, dass versehentlich 18 Nullen hintereinander angezeigt werden. Daher sind zahlreiche Versuche erforderlich, bis jemand erfolgreich ist. Nun, dies ähnelt einer Lotterie, bei der Bergleute so lange versuchen, bis jemand „gewinnt“. Die Suche nach einem Hash-Code ist vergleichbar mit dem Auffinden eines bestimmten Sandkorns im gesamten Sand der Erde.

Jedes Mal, wenn nach dem Mining des Blocks neue Bitcoins erstellt werden; Derzeit kann ein erfolgreicher Bergmann 12,5 neue Bitcoins (im Wert von 140.000 USD) sowie Transaktionsgebühren erhalten. Die bloße Idee, alle 10 Minuten 140.000 US-Dollar zu erhalten, veranlasst Bergleute, Rechenzentren mit speziellen Geräten zu bauen, die eine große Menge Strom verbrauchen.



Das obige Diagramm zeigt, was tatsächlich im abgebauten Block enthalten ist. Der gelbe Teil ist der Block-Header (der gehasht wird), gefolgt von den Transaktionen, die in den Block eingegeben werden. Jeder Block enthält einen Hash des vorherigen Blocks, wodurch alle Blöcke zu einer Blockkette zusammengefügt werden. Rechts ist der Hash erfolgreich, da er mit einer großen Anzahl von Nullen beginnt.

Um den Mining-Prozess zusammenzufassen: Sie sammeln neue Bitcoin-Transaktionen und erstellen einen Header, wie in der obigen Abbildung gezeigt. Sie generieren einen kryptografischen Block-Hash. Wenn das Ergebnis für eine unglaubliche Chance mit 18 Nullen beginnt, senden Sie den Block an das Bitcoin-Netzwerk und „gewinnen“ Bitcoins im Wert von 140.000 USD. Andernfalls ändern Sie den Titel leicht und versuchen es erneut. Wenn es jemand anderem gelingt, einen Block zu erhalten, beginnen Sie erneut mit einem neuen Block und neuen Transaktionen.

Bitcoin-Hash-Algorithmus SHA-256


Woher kommen diese Hashes? Der Bitcoin-Mining-Prozess basiert auf Kryptografie mit einer „Hash-Funktion“, die den Datenblock in einen fast zufälligen Hash-Wert konvertiert. Der Hash-Algorithmus ist so konzipiert, dass er leicht implementiert werden kann, aber kryptografisch zuverlässig ist: Es ist kein Weg bekannt, schnell einen erfolgreichen Hash zu finden, außer Millionen von Hashes mit Brute Force zu versuchen. Insbesondere verwendet Bitcoin eine standardmäßige kryptografische Hash-Funktion namens SHA-256. Dieser Algorithmus ist einfach, kann jedoch verwendet werden, um Daten völlig unvorhersehbar zu verschlüsseln.
SHA-256 ist eine Einwegfunktion zum Erstellen digitaler Fingerabdrücke fester Länge (256 Bit, 32 Byte) aus Eingabedaten mit einer Größe von bis zu 2,31 Exabyte (2⁶⁴ Bit) und ist ein Sonderfall eines Algorithmus aus der SHA-2-Familie kryptografischer Algorithmen
Der SHA-256-Algorithmus wird ungefähr auf der Pseudocodeseite beschrieben

Die Hash-Funktionen der SHA-2-Familie basieren auf der Merkle-Damgard-Struktur. Nach dem Hinzufügen wird die ursprüngliche Nachricht in Blöcke unterteilt, wobei jeder Block in 16 Wörter unterteilt ist. Der Algorithmus leitet jeden Nachrichtenblock durch eine Schleife mit 64 Iterationen. Bei jeder Iteration werden 2 Wörter transformiert, die verbleibenden Wörter setzen die Konvertierungsfunktion. Die Verarbeitungsergebnisse jedes Blocks werden addiert, die Summe ist der Wert der Hash-Funktion. Da die Initialisierung des internen Zustands durch Verarbeiten des vorherigen Blocks erfolgt, gibt es keine Möglichkeit, Blöcke parallel zu verarbeiten.



Der Informationscodierungsschritt, auch als "Runde" bezeichnet, wird 64 Mal wiederholt. Das obige Diagramm zeigt eine Runde, die acht 4-Byte-Hashwerte von A bis H verwendet, mehrere Operationen ausführt und neue Werte für AH generiert. Wie Sie dem Diagramm entnehmen können, ändern sich nur A und E pro Runde, während andere sich einfach verschieben. Nach 64 Runden werden die Eingabedaten jedoch vollständig verschlüsselt, was zu einer unvorhersehbaren Ausgabe des Hash führt.

Operationen in SHA-256 sind einfache bitweise Operationen. Die roten Felder oben zeigen eine 32-Bit-Addition an, wodurch neue Werte für A und E erzeugt werden. Der "selektive" Block Ch wählt Bits aus F oder G basierend auf dem Wert von Eingang E aus. Die "Gesamt" -Blöcke Σ drehen sich und summieren die Bits. Der Ma-Block "Most" wertet die Bits an jeder Position A, B und C aus und wählt aus, welcher Wert in der Mehrheit sein wird. Werte Kt ist eine Konstante. Die Eingabe geht über den Wert von Wt an den Algorithmus. Diese Operationen können mit einfachen arithmetischen und logischen Operationen einfach auf einem Computer implementiert werden.

Apollo-Prozessor zur Steuerung von Raumfahrzeugen


Apollo (AGC) hatte keinen Mikroprozessor, da er lange vor der Entwicklung von Mikroprozessoren als solche gebaut wurde. Stattdessen bestand der Prozessor aus ungefähr 5600 NOR-Gattern.
Diese Gatter wurden miteinander verbunden, um Schaltungen wie Trigger, Register, binäre Addierer, Steuerlogik usw. zu erzeugen. AGC ist einer der ersten Computer, der integrierte Schaltkreise verwendet. Jede integrierte Schaltung enthielt zwei NOR-Ventile. Der Computer hatte 24 Logikmodule ähnlich dem folgenden. Jedes Logikmodul hatte 120 integrierte Schaltkreise (240 NOR-Ventile). Beispielsweise wurden Register und ALUs mit vier Modulen implementiert, von denen jedes 4 Prozessorbits implementierte.



Die Architektur des Computers war nach modernen Maßstäben ungewöhnlich: Er verwendete ein 15-Bit-Wort zusammen mit der Parität (zu dieser Zeit hatten Computer häufig eine Wortgröße, die der Anwendung entsprach, und nicht unbedingt 2). AGC hatte nur 2K Wörter im RAM, 36K Wörter im ROM. Permanent Storage Device (ROM) war eine lineare Auswahl von mehreren zusammengefügten Kernen, "gestrickter" Speicher. Der Apollo-Steuercomputer war selbst nach den Maßstäben der 1960er Jahre langsam; Er konnte ungefähr 40.000 Operationen pro Sekunde ausführen. Der Hauptvorteil von AGC war die E / A: Es hatte Hunderte von E / A-Verbindungen und konnte Raumsteuerungen in Echtzeit ermöglichen.

SHA-256-Implementierung auf einem Apollo-Navigationscomputer


Meine Implementierung des SHA-256-Hash-Algorithmus folgt dem Pseudocode sehr genau. Ich hatte jedoch einige Schwierigkeiten, weil dem AGC-Befehlssatz viele Funktionen moderner Computer fehlen. Zum Beispiel hatte AGC (wie viele Computer der 1960er Jahre) keinen Stapel, so dass Sie die Rücksprungadresse für jeden Aufruf der Subroutine verfolgen mussten.

Eine weitere Schwierigkeit bestand darin, dass der SHA-256-Algorithmus vorzeichenlose 32-Bit-Zahlen verwendet, während die AGC vorzeichenlose 15-Bit-Zahlen verwendet, lange veraltete Einheiten, sodass selbst die Additionsoperation komplexen Code erforderte. Um eine 32-Bit-Zahl in die AGC einzugeben, habe ich jedes Wort in ein 4-Bit- und zwei 14-Bit-Fragmente aufgeteilt. (Ich habe 14-Bit-Fragmente verwendet, keine 15-Bit-Fragmente, weil ich vorzeichenlose Arithmetik verwenden musste).

Das nächste Problem war der AGC-Speicher bzw. seine Größe. Der Steuercomputer verwendete, wie die meisten Computer der 1960er Jahre, Speicher auf Magnetkernen, jedes Bit wurde in einem winzigen magnetisierten Ferritring gespeichert. Da der Kernelspeicher ziemlich umständlich war, verfügte die AGC über ungefähr 4 KB RAM. Das AGC-Adressierungsschema machte die Aufgabe noch komplizierter, da nur auf 256 Wörter zugegriffen werden konnte, wenn der unbequeme Speicherblock-Schaltmechanismus nicht verwendet wurde. Das Problem war, dass der SHA-256-Algorithmus acht (32-Bit) Hash-Werte, eine 64-Wort-Bestätigungstabelle und 8 Wörter mit Zwischenwerten verwendete. Nur diese drei Arrays verwendeten 240 Wörter AGC und ließen ungefähr 16 Wörter für alles andere übrig (temporäre Werte, Rücksprungadresse vom Programm, Zykluszahlen, Zeiger usw.). Ich schaffte es, alles in einen Speicherblock zu reduzieren und diese 16 Wörter für wiederzuverwenden verschiedene Ziele, aber ich habe viel Zeit damit verbracht, das Problem zu debuggen, während die Variable Speicherplatz beanspruchte, der noch verwendet wurde.



Die meisten modernen Computer verfügen über spezielle Verschiebungs- / Drehbefehle, um Wörter zu bearbeiten, aber die AGC verwendete stattdessen drei spezielle Register.

Der SHA-256-Algorithmus verwendet viele 32-Bit-Verschiebungen und -Rotationen, die ich mithilfe eines zyklischen 15-Bit-Registers in Schleifen konvertieren musste. Obwohl die Verschiebungsoperation wie x >> 10 trivial ist, musste ich eine ganze Unterroutine implementieren, um sie auf Apollo-Raumfahrzeugen anzukurbeln.



Um den Befehlssatz und die geringe Codegröße beizubehalten, gab es mehrere Anweisungen für die AGC mit unerwarteten „Nebenwirkungen“. Beispielsweise hat der TS-Befehl (Übertragung auf ein Speichergerät) einen Wert in den Speicher geschrieben, was auf den ersten Blick ein einfacher Vorgang war. Wenn die vorherige Addition jedoch einen Überlauf hatte (dh eine Übertragung), übersprang TS den nächsten Befehl und belastete das akkumulierende Register mit +1 oder -1. Mit anderen Worten, das einfache Schreiben eines Werts in den Speicher kann zu einem Sprung im Kontrollfluss und einer Falländerung führen. Dies ermöglichte es, Silbentrennungen für arithmetische Operationen mit stark höherer Genauigkeit zu verarbeiten . Die meisten Computer implementieren dies einfach mithilfe der Anweisung „Mit Silbentrennung hinzufügen“.

Programmstart


Im folgenden Video - meinem Bitcoin-Programm, das auf einem echten Apollo-Steuergerät für Raumfahrzeuge ausgeführt wird - werden die Ergebnisse auf unserem DSKY (kurz für Display / Tastatur - Display / Tastatur) angezeigt. DSKY hatte einen einfachen Ziffernblock mit Tasten, die groß genug waren, damit Astronauten mit Handschuhen drücken konnten. Der Computer zeigte die Ergebnisse in Zahlen an. Astronauten sollten wissen, in welchen Einheiten die Ausgabe erfolgt: in Fuß, Sekunden, Grad usw. Wir haben eine von Karl erstellte Kopie von DSKY verwendet, da uns niemand an einem echten DSKY arbeiten lassen würde.

Der Apollo-Computer hatte eine sehr einfache Benutzeroberfläche. Der Astronaut wählte die Aktion aus, indem er die Verb-Taste (Verb) drückte, die Nummer des Verbs eingab und die Eingabetaste drückte. Dann wählte er den Sollwert durch Eingabe von „Nomen“ (Nomen). (Die Astronauten hatten eine Referenzkarte mit einer Liste aller Verben und Substantive). Ich habe Bitcoin Mining als Verb 65 in einem Programm namens Borealis hinzugefügt. Sie können sehen, wie Mike Verb 65 am Anfang des Videos einführt.


Apollo brauchte 5,15 Sekunden, um einen SHA-256-Hash zu erstellen. Da Bitcoin einen doppelten Hash verwendet, beträgt die Hash-Rate 10,3 Sekunden. Derzeit führt das Bitcoin-Netzwerk etwa 65 EH / s aus (65 Billionen Hashes pro Sekunde). Der Bordsteuerungscomputer benötigt 4 × 10 ^ 23 Sekunden, um das Gerät zu erhalten. Und das ist eine Million Mal so alt wie das Universum (4,3 × 10 ^ 17).

Angesichts der astronomischen Komplexität des Abbauprozesses fragen Sie sich vielleicht, wie ich den Block erfolgreich abgebaut habe. Es ist ganz einfach: Für diese Demonstration habe ich einen Block, der in der Vergangenheit erfolgreich abgebaut wurde, als Eingabe verwendet, insbesondere Block # 286819. Somit funktionierte der Algorithmus schnell, aber da es ein alter Block war, habe ich kein Geld damit verdient.

Vergleichen Sie die Leistung von Apollo Computer Mining mit der Leistung von kompakten USB-Minern. Ein solches Gerät führt 130 Milliarden Hashes pro Sekunde aus und kostet weniger als 70 US-Dollar. Dies ist nicht vergleichbar mit dem Apollo-Steuercomputer für 150.000 US-Dollar. Zu einer Zeit war Apollo ein äußerst kompaktes System mit geringem Stromverbrauch und einem Verbrauch von 55 Watt. Der USB Miner verbraucht jedoch 12 Watt und liegt problemlos in der Hand. Ein großer Leistungsunterschied ist mit einer exponentiellen Erhöhung der Geschwindigkeit des im Moore'schen Gesetz beschriebenen Computers verbunden und gleichzeitig mit dem Vorteil der aktuellen Benutzerausrüstung für den Abbau von Bitcoins.

AGC-Programmierung - damals und heute


In den 1960er Jahren wurde der Code für den Bordsteuerungscomputer auf Lochkarten geschrieben und mit einem Softwaresystem namens YUL auf Band zusammengesetzt. Dieses System war weiter fortgeschritten als in den 1960er Jahren zu erwarten gewesen. Es enthielt ein Quellcode-Verwaltungssystem, das nachverfolgt und geändert wurde. Für den Flug wurde die Software auf einem ROM mit einer linearen Auswahl von wiederholt zusammengenähten Kernen (im "gestrickten" Speicher) installiert, und die Drähte wurden für 0 physisch um die Kerne oder für 1 durch die Kerne geführt. Mit anderen Worten, jeder dieser Kerne wurde auf Bestellung hergestellt und die Daten wurden gespeichert im Muster des Webens von Drähten. Dies stellte eine zuverlässige Lagerung des ROM mit hoher Dichte sicher, erforderte jedoch mehrere Wochen für die Herstellung.



Da es unpraktisch war, für jede Änderung einen neuen Seilkern herzustellen, wurde während der Entwicklung ein anderer Ansatz verwendet. Der Magnetkern-Speichersimulator ermöglichte das Laden des Programms von einem externen Speichergerät in den Bordcomputer. Dieser Simulator ist Teil eines Steuergeräts von der Größe eines Kühlschranks (siehe Abbildung unten) - der Debugging-Schnittstelle zur AGC über den Diagnoseanschluss am Bordcomputer. Der Monitor ermöglichte es Programmierern, Haltepunkte zu setzen, Register zu überprüfen usw., indem sie Anzeigen und Schalter verwendeten.



In meinem Fall habe ich Software auf meinen Laptop geschrieben und sie mit yaYUL kompiliert, einer modernen Version von YUL, die vom Virtual AGC-Team geschrieben wurde. Ich habe die Software auf einer simulierten AGC mit der Code :: Blocks IDE getestet, die Debugging-Funktionen bietet, die denen der 1960er Jahre ähneln. Um den Code auf einer echten AGC auszuführen, haben wir keine Kerne erzeugt. Glücklicherweise baute Mike Stewart eine Karte zum Laden von Code in die AGC mit demselben AGC-Testanschluss, den das Steuergerät ursprünglich verwendet hatte.



Fazit


Ich habe den SHA-256-Hash-Algorithmus implementiert und ihn auf dem integrierten Apollo-Steuercomputer ausgeführt, den wir wiederherstellen konnten. Dieser Vorgang dauerte 10,3 Sekunden pro Hash. Dies ist nicht mein erstes Experiment mit dem absurden Bitcoin-Mining. Ich versuchte sie manuell mit Bleistift und Papier abzubauen. Die Hash-Rate betrug 0,67 Hashes pro Tag. Die Verwendung eines IBM-Mainframes mit Lochkarten aus den frühen 1960er Jahren ergab eine Hash-Rate von bis zu 80 Sekunden pro Hash. Meine schnellste Implementierung war auf Xerox Alto (dem berühmten Computer von 1973, dem Mastermind des Macintosh), der 1,5 Hashes pro Sekunde ausführte. Somit konnte der Apollo-Bordcomputer den alten IBM-Computer auf Basis von Transistoren übertreffen, nicht jedoch Alto.



Die Kosten für das Apollo-Programm beliefen sich 1973 auf 25,4 Milliarden US-Dollar, was heute etwa 150 Milliarden US-Dollar entspricht. Derzeit hat Bitcoin eine Marktkapitalisierung von 200 Milliarden US-Dollar. Wenn die NASA also Bitcoins abbauen würde, könnten sie das gesamte Apollo-Programm bezahlen und sogar Geld sparen. Ein solcher Plan hat jedoch einen Nachteil: die geringe Leistung des Apollo-Computers, da Block Mining viel länger dauern würde als das Leben des Universums.

Mein Code ist auf Github verfügbar. Der Mining-Code befindet sich in BITCOIN.agc . CuriousMarc bietet eine Reihe von AGC-Videos , in denen Sie weitere Informationen zum Wiederherstellungsprojekt anzeigen können.

Vielen Dank für Ihren Aufenthalt bei uns. Gefällt dir unser Artikel? Möchten Sie weitere interessante Materialien sehen? Unterstützen Sie uns, indem Sie eine Bestellung aufgeben oder Ihren Freunden empfehlen, einen Rabatt von 30% für Habr-Benutzer auf einem einzigartigen analogen Einstiegsserver, den wir für Sie erfunden haben: Die ganze Wahrheit über VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s ab 20 $ oder wie teilt man den Server? (Optionen sind mit RAID1 und RAID10, bis zu 24 Kernen und bis zu 40 GB DDR4 verfügbar).

Dell R730xd 2 mal günstiger? Nur wir haben 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2,6 GHz 14C 64 GB DDR4 4 x 960 GB SSD 1 Gbit / s 100 TV von 199 US-Dollar in den Niederlanden! Dell R420 - 2x E5-2430 2,2 GHz 6C 128 GB DDR3 2x960 GB SSD 1 Gbit / s 100 TB - ab 99 US-Dollar! Lesen Sie mehr über den Aufbau eines Infrastrukturgebäudes. Klasse mit Dell R730xd E5-2650 v4 Servern für 9.000 Euro für einen Cent?

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


All Articles