Da habe ich eine zentralisierte Kryptowährung in PHP geschrieben. (Teil 1 - Grundlegende Zusammenfassungen + Schnellstart)

Vorwort


Ja, Sie müssen nur darüber nachdenken, eine zentralisierte Kryptowährung in PHP, das ist nicht richtig. Aber meine Grenzen für Ideen haben sich trotzdem durchgesetzt, und deshalb habe ich, wie Sie vielleicht vermutet haben, beschlossen, darüber zu schreiben. Im allerersten Teil erklären wir Ihnen, was Kryptowährung ist, besprechen die ersten Hinweise und erstellen ein Brieftaschensystem. Jetzt fangen wir an.

Kryptowährung, wie ist das?


Informationen stammen aus Wikipedia

Kryptowährung ist eine Art digitaler Währung, deren Abrechnung von internen Abrechnungseinheiten durch ein dezentrales Zahlungssystem (es gibt keinen internen oder externen Administrator oder ein ähnliches System) im vollautomatischen Modus sichergestellt wird.

Die Kryptowährung selbst hat kein spezielles Material oder keine spezielle elektronische Form - es handelt sich lediglich um eine Zahl, die die Datenmenge von Abrechnungseinheiten angibt, die an der entsprechenden Stelle im Informationspaket des Datenübertragungsprotokolls steht und oftmals nicht einmal verschlüsselt ist, wie alle anderen Informationen über Transaktionen zwischen Systemadressen.

Kurz gesagt, Kryptowährung funktioniert folgendermaßen:

  1. Ein Netzwerkbenutzer mit einem Guthaben sendet eine Transaktion an einen anderen anonymen Benutzer.
  2. Die Transaktion tritt in das Netzwerk ein.
  3. Miner (oder Benutzer, die Blöcke erstellen) lösen ein Problem, das von einem speziellen Algorithmus mit Bedingungen generiert wird (z. B. für das Vorhandensein der vorherigen 10-30 Nullen im Hash oder umgekehrt).
  4. Wenn in einem Hash eine Bedingung (oder Bedingungen) erfüllt ist, sendet der Miner dank dieser eine Nachricht an das Netzwerk, in der er über die Erstellung eines neuen Blocks und die Transaktion informiert.
  5. Der Empfänger erhält das Geld und der Bergmann die Vergütung in Form einer Provision, die bei der Vorbereitung der Aufgabe berechnet wird.

Ist es sinnvoll, eine zentralisierte Kryptowährung und auch in PHP zu schreiben?


Ich denke nicht sehr. Aber versuchen Sie es noch einmal, wie es sollte.

Wir betrachten Notizen vor der Entwicklung


Wir werden ein doppeltes Hash-Verifizierungssystem verwenden, das Proof-of-Work verwendet. Es ist sinnvoll, die Hashes auf Software- und Netzwerkanwendungsebene zu überprüfen. Dies liegt an der Optimierung der Serverauslastung. Denn wenn wir zum Server gehen, um den Hash mehrmals zu überprüfen, erscheint eine solche Last. Daher schlage ich folgende Methode vor:

  1. Überprüfen Sie auf einem Software Miner lokal den Hash, um die Bedingungen zu erfüllen.
  2. Wenn die Bedingungen auf dem Software Miner mit den erforderlichen Bedingungen übereinstimmen, führen wir eine Überprüfung auf der Netzwerkebene der Anwendung (auf der Serverebene) durch.

Dies ist meiner Meinung nach der beste Weg, um die Last zu verteilen. Es ist einfacher, mehrere Male lokal auf dem Computer zu überprüfen, als mehrere Male Spam-Anfragen an den Server zu senden.

Der Name - ich hatte einen einfachen und vielleicht einprägsamen Namen - FlyCoin mit einem dreistelligen FLC-Währungscode.

Datenbank - Ich verwende eine einfache und bequeme Option, PDO.

Crypto-Wallets - werden mit der GUID und mt_rand generiert und die POSIX-Zeit wird als Seed verwendet.

Sind Sie zu faul, um eine Hash-Check-Funktion zu haben? - Ja, also habe ich beschlossen, den Code von einem alten (Open Source) Miner für eine solche (bereits verstorbene) Kryptowährung Entropy zu nehmen, meinem Freund Nikita.

Ich kann nicht glauben, dass er nur eine Kryptowährung erstellt hat. Gibt es noch etwas anderes?
Im Allgemeinen sind alle seine Kreationen (die ich manchmal sogar benutze) in seiner VKontakte- Gruppe zu finden. Ich hoffe, dass sie auch nützlich sind.

Lass uns gehen!


Beginnen wir damit, den Rahmen für unser zukünftiges System festzulegen. Beginnen wir mit der Entwicklung der Anwendungs-API für unsere Kryptowährung. Und der Rahmen sieht soweit so leer aus.

<?php /* * The API for FlyCoin */ function checkHash ($hash, $exp) //  $hash -     ,  $exp - .    Entropy Miner,   . { $sum = 0; //    . $len = strlen ($hash); // C  . for ($i = 0; $i < $len; ++$i) $sum += 2 * base_convert ($hash[$i], 16, 10); //        return $sum % 10 == 0 && substr ($hash, -$exp) === str_repeat ('0', $exp); //  false       true,         . } class Block { public $id; // ID  public $prev_hash; //    public $from; //   public $to; //  public $ammount; //  public $difficult; //   } class API { protected $db; public function __construct () { $dsn = "mysql:host=localhost;dbname=flc"; // DSN   $this->db = new PDO ($dsn, $username, $password); //     try { return true; //  . } catch (PDOException $exception) { return false; //  . } } } 

Hier ist der Rahmen unseres Wunders. Zunächst implementieren wir die Registrierung und Generierung von GUIDs für unsere Geldbörsen. Ich habe sofort eine leere API-Funktionsdefinition erstellt und auch eine GUID-Generierungsfunktion in Google gefunden. Saatgut nicht vergessen. Ich habe gerade eine Funktion gefunden, um einen Startwert zu erhalten, um eine eindeutige GUID zu erhalten.

  function make_seed () //      PHP { list ($usec, $sec) = explode (' ', microtime ()); return $sec + $usec * 1000000; } mt_srand (make_seed ()); 

Großartig. Und die Funktion zum Generieren der GUID für die Brieftasche sieht dementsprechend so aus (wie auch der Stub selbst):

  public function register () //    { } protected function genGUID4 () //  Google { return sprintf ('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand (0, 0xffff), mt_rand (0, 0xffff), mt_rand (0, 0xffff), mt_rand (0, 0x0fff) | 0x4000, mt_rand (0, 0x3fff) | 0x8000, mt_rand (0, 0xffff), mt_rand (0, 0xffff), mt_rand (0, 0xffff)); //     ,   . } 

Da wir alles anonym machen, speichern wir keine IP oder E-Mail. Keine Bestätigung. Wir werden genug sein. In ~ 25 Minuten habe ich eine Registrierungsfunktion geschrieben. Es wird nur ein Passwort von uns benötigt. Die API-Funktion sendet die Brieftasche an uns zurück.

  public function register ($password) //  $password -    { if ($this->db) //    { $walletId = 'FLC@' . $this->genGUID4 (); //      $hash = crc32 ($walletId) . $walletId . hash_hmac ('sha512', str_rot13 ($password), 'FLC'); //     . $hash = hash_hmac ('sha512', $hash, 'FLC2'); //     . $newUser = $this->db->prepare (" INSERT INTO `wallets` (walletId, loginHash, balance) VALUES (:walletId, :hash, :startBalance) "); //    . $newUser->bindParam (':walletId', $walletId, PDO::PARAM_STR); //     $newUser->bindParam (':hash', $hash, PDO::PARAM_STR); //     $newUser->bindParam (':startBalance', 0, PDO::PARAM_INT); //    (   ,   0!)   $newUser->execute (); //  . return ['walletId' => $walletId]; //     ( ) } else return false; //      . } 

Hier habe ich kurz beschrieben, was diese oder jene Zeile macht.

Faire Botschaft für faire Leute und Programmierer.
Wenn Sie Ihre Kontakte auf der Site belassen haben (auf der sich möglicherweise diese Kryptowährung befindet) und sie Ihnen so etwas schreiben:

"Hallo, kannst du helfen?" Ich habe Mani in Ihrer Blockchain behalten und plötzlich habe ich mein Passwort verloren, bitte helfen Sie, und Sie werden es gut haben. “- Sie können dieses Angebot jederzeit ablehnen. Die Essenz der Kryptowährung ist die sichere Speicherung von Zahlen. Niemand kann beweisen, dass er oder sie ein Konto besitzt. Somit kann jeder Angreifer auch ohne Beteiligung des Opfers die Gelder anderer Personen stehlen ! Es spielt keine Rolle, obwohl diese Person wirklich der Eigentümer des Kontos ist, ist es besser, dies abzulehnen. Wenn Sie Geld verloren haben, bedeutet dies, dass Sie die Daten vom Konto nicht richtig gespeichert haben. Aus Sicherheitsgründen wird die Kennwortwiederherstellung nicht mehr implementiert.

Die hier vorgestellte Hash-Funktion kann wie folgt dargestellt werden:
hash(w,pw)=crc32(w).w.hmac(pw)

Die Funktion funktioniert so:

Ein Passwort wird eingegeben, wir prüfen, ob die Datenbank verbunden ist:

Ja, verbunden. (Machen wir ein Passwort 12345)
Wir generieren die Brieftaschenadresse und schreiben $ walletId - wir erhalten so etwas: FLC @ c1cbe61d-a19d-4c82-ba17-3a577df0aeb5 (diese GUID wurde von einer anderen Site generiert und ich habe ihr dann das FLC @ -Präfix hinzugefügt).

Wir berechnen den Klartext-Hash. In der ersten Reihe, erhalten wir folgendes: 0087196442FLC @ c1cbe61d-a19d-4c82 -ba17-3a577df0aeb59ee77779db5a44ef3f60044fcb0e1170218e642cb9adc0789ddd08871ad95c7e1d3b1391c6c79774d319b5141bd3b13b717c3d389206ede659cb280949feac66 ( viele Briefe, seien Sie nicht überrascht).
In der zweiten Runde wird der Hash zu einhundert Prozent zu HMAC:

Wir schreiben alles in die Datenbank.

Als Antwort schreiben wir die Brieftaschennummer, über die Sie sich anmelden können.

Nein, nicht verbunden.
In diesem Fall müssen Sie nichts Wertvolles erwarten. Geben Sie FALSE zurück.

So sieht ein ausgeklügeltes Registrierungssystem aus. In der Tat sieht es sehr einfach aus. Und was den Code angeht - viel komplizierter.

Wir werden mehr Zeit aufwenden und die Autorisierung durchführen. Mit der Autorisierung ist die Situation einfacher. Wir suchen ein Konto und versuchen uns anzumelden, da wir die bekannten Algorithmen zur Erzeugung von Passwort-Hashs kennen. Dann überprüfen wir, und wenn die Daten korrekt sind, geben wir dem Client eine wichtige Zeile, in der Daten für die Kommunikation zwischen dem Server und dem Miner gespeichert werden.

Von mir.
Es hört sich so an, als ob wir keine Kryptowährung betreiben, sondern ein Autorisierungssystem zwischen PHP auf dem Server und PHP unter Verwendung von php.exe. Im zweiten Teil werden wir einen zweiten Kuchen zu unserem „Kuchen“ hinzufügen, in dem wir etwas sehen, das mit Bergbau, Blockchain und Transaktionen zu tun hat.

Nach weiteren 15-25 Minuten war die Autorisierungsfunktion fertig. Siehe diesen Code unten:

  public function login ($walletId, $password) //  { if ($this->db) //    { $hash = crc32 ($walletId) . $walletId . hash_hmac ('sha512', str_rot13 ($password), 'FLC'); //     . $hash = hash_hmac ('sha512', $hash, 'FLC2'); //     . $newUser = $this->db->prepare (" SELECT * FROM `wallets` WHERE walletId = :walletId AND loginHash = :hash LIMIT 0, 1 "); //    . $newUser->bindParam (':walletId', $walletId, PDO::PARAM_STR); //     $newUser->bindParam (':hash', $hash, PDO::PARAM_STR); //     $newUser->execute (); //  . $object = $newUser->fetch_object (); //   ,     if ($object AND hash_equals ($object->hash, $hash)) //   ,   . { $loginString = new stdClass; //    stdClass $loginString->hash = $hash; //       . $loginString->wallet = $walletId; return ['token' => serialize ($loginString)]; //      ,   . } else return false; //   / . } else return false; //    } 

Dieser Code entspricht fast der Registrierung, arbeitet jedoch im umgekehrten Algorithmus. Die Arbeit mit Benutzern ist beendet.

Nachbedingung


Während dieser interessanten Zeit beim Lesen des Artikels haben wir Folgendes getan:

  • Wir haben uns kurz mit Cryptocurrency vertraut gemacht und wie es korrekt aufgebaut sein sollte.
  • Sie beantworteten kurz die Frage: "Ist es sinnvoll, eine zentralisierte Kryptowährung zu erstellen, und das auch in PHP?"
  • Besprochen Notizen vor dem Ausführen dieser Aufgabe
  • Implementierte ein System von Kryptokonten.

Und jetzt können Sie lesen, was sich hinter den Jalousien befand:

Unter dem Vorhang
Dieser Artikel wurde ca. 4-5 Stunden (alle Sonnenuntergang und Abend) geschrieben. Während dieser Zeit, wie ich schrieb, entwickelte ich mich, aber wenn ich einen Artikel über Habrahabr schrieb, schwand mein Wunsch, meinen Traum zu erfüllen, nicht dahin. In der Tat war es für mich aufgrund des einfachen Konzepts von OOP einfacher, es zu verwenden als MySQLi oder schlimmer noch gewöhnliche Funktionen mit dem Präfix mysql_, die als veraltet gelten und nicht mehr für die Entwicklung in PHP geeignet sind.

Was wir nächstes Mal machen werden:

  • Machen wir den Bergbau.
  • Betrachten wir, wie Transaktionen und Blöcke angeordnet sind.
  • Wir werden Transaktionen durchführen und der nicht verwendeten Block-Klasse einen Sinn geben.

Danke fürs Lesen! Wir sehen uns noch! Dies ist mein erster Artikel - ich warte auf Kritik.

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


All Articles