Da habe ich eine semi-dezentrale Kryptowährung in PHP geschrieben. (Teil 2 - Entwicklung)

Vorwort


In einem der vorherigen Artikel habe ich darüber gesprochen, welche Bibliotheken für uns nützlich sind, und diese Idee mit der erfolglosen verglichen. In diesem Teil werden wir die Kryptowährung selbst entwickeln und den Tracker konfigurieren. Lass uns nicht zögern, lass uns gehen.

Liste der Artikel


  1. Da habe ich eine semi-dezentrale Kryptowährung in PHP geschrieben. (Teil 1 - Sammeln von Bibliotheken)
  2. Da habe ich eine semi-dezentrale Kryptowährung in PHP geschrieben. (Teil 2 - Entwicklung)

Tracker-Installation


Bevor wir mit der Installation des Web-Trackers beginnen, möchte ich Ihnen sagen, dass die Bibliothek zwei Arten von Trackern unterstützt - Native und Web. Native-Tracker kann auf verschiedenen VDS verwendet werden und verwaltet problemlos Benutzerlisten im Netzwerk.
Hier werde ich einen Web-Tracker verwenden, der einfach auf der Site installiert werden kann.
Wir gehen zum GitHub-Repository über, über das ich im vorherigen Teil gesprochen habe. Die Hauptniederlassung interessiert uns nicht, wir wählen Web. Laden Sie das Archiv mit diesem Thread herunter, entpacken Sie es und öffnen Sie die Datei index.php im Indexblock oder an einer anderen Stelle, wo Sie es bevorzugen. Hier ist der Inhalt der Datei:

index.php
<?php

/**
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * @package     Bit Points Network
 * @copyright   2020 Podvirnyy Nikita (Observer KRypt0n_)
 * @license     GNU GPLv3 <https://www.gnu.org/licenses/gpl-3.0.html>
 * @author      Podvirnyy Nikita (Observer KRypt0n_)
 * 
 * Contacts:
 *
 * Email: <suimin.tu.mu.ga.mi@gmail.com>
 * VK:    <https://vk.com/technomindlp>
 *        <https://vk.com/hphp_convertation>
 * 
 */

namespace BPN;

const TRACKER_KEY = 'EFJI#*$&(*#WEF(@Q#)(DFJSAO(@#*$)REFSKE)UJ*#@(&$';

require 'ext/DH-Generator/Generator.php';
require 'php/User.php';
require 'php/Tracker.php';

$tracker = new Tracker;
$tracker->update ();

if (isset ($_GET['r']))
    $tracker->processRequest ($_GET['r']);

Sie müssen die TRACKER_KEY-Konstante in viele verschiedene Zeichen ändern, damit sie nicht mit der Originaldatei übereinstimmt.

Sagen wir Folgendes:


const TRACKER_KEY = 'sdT*&Y&*YO*&T*OGTGYFIYYUFGKUHLIYIj9sfhysdphphdpsfhBLABLABLAhsidlfhlisd';

Dies ist nur ein Beispiel. Sie müssen sich auf Ihre eigene Weise ändern. Wir veröffentlichen alles auf dem Hosting. Das Web-Tracker-Setup ist abgeschlossen.

Wofür ist dieser Tracker?

Entwicklung


Allgemeines


Da dies unsere Anwendung ist, müssen Sie alle Pakete und Komponenten, nämlich die Composer- und Nicht-Composer-Pakete, verbinden, die Kontenstruktur und die lokale Kontodatenbank festlegen, die Interaktion zwischen der Anwendung und den Strukturen herstellen und die Anwendung selbst initialisieren.

General.php
<?php

declare (strict_types=1);

require_once __DIR__ . '/vendor/autoload.php'; #   

require_once 'PHP/Structure.php';              # 
require_once 'PHP/UserAPI.php';                # 

require_once 'NotComposer/vendor/autoload.php';#  - 

require_once 'PHP/App.php';                    # 


Die Bibliothek für BIP39 erfordert eine strikte Eingabe, die wir in den ersten Codezeilen deklarieren.
Die Bibliotheken BIP39 und BIP44 selbst werden mit der Datei autoload.php geladen, die für Composer Standard ist.
Wir werden die Datenstruktur in Structure.php deklarieren.

Funktionen zum Arbeiten mit Brieftaschen befinden sich in der Datei UserAPI.php.

Die BPN- und phpblockchain-Bibliotheken sind nicht mit Composer kompatibel. Wir erstellen eine Datei mit einem ähnlichen Namen wie Composer.

Wir nehmen die Anwendung selbst in App.php heraus - es wird die letzte verbundene Datei dort sein, da wir zuerst alles von oben laden müssen.

NotComposer / vendor / autoload.php


Ich habe bereits gesagt, dass diese beiden Bibliotheken nicht mit Composer kompatibel sind, dass es Dateien gibt, die ihnen nicht eigen sind, oder dass sie überhaupt nicht existieren und dass sie auch in Packagist fehlen. Sie müssen sie manuell herunterladen und verbinden. Diese Datei ist dafür ausgelegt.

Struktur


Die Datenstrukturen hier sollen die Handhabung von Brieftaschen erleichtern. Die Bibliothek wird benötigt, damit UserAPI.php die Arbeit mit Brieftaschen erledigt, nämlich das Registrieren und Wiederherstellen der Brieftasche, und damit App.php diese Brieftaschen verwendet.
Structure.php
<?php

class Account
{
	public $address;
	public $publicKey;
	protected $privateKey;

	public function getPrivateKey ()
	{
		return $this->privateKey;
	}

	public function setPrivateKey ($key)
	{
		$this->privateKey = $key;
	}
}

class AccountChain
{
	public $accounts;
}


Primitiver Code, richtig?

UserAPI.php


Der Vermittler zwischen Structure.php und App.php ist UserAPI.php. Dadurch werden wir bereits mit Brieftaschen arbeiten, neue registrieren und vorhandene wiederherstellen.

Code dieser Datei:

UserAPI.php
<?php

use \FurqanSiddiqui\BIP39\BIP39;
use BIP\BIP44;

class User
{
	public $account;

	public function registerNewAccount ($password)
	{
		$mnemonic = BIP39::Generate (18);
		$seed = $mnemonic->generateSeed ($password, 256);

		$HDKey = BIP44::fromMasterSeed ($seed)->derive ("m/44'/0'/0'/0/1");

		$newAccount = new Account;
		$newAccount->address = '1x' . hash ('ripemd160', hash ('sha512', $HDKey->publicKey));
		$newAccount->publicKey = $HDKey->publicKey;
		$newAccount->setPrivateKey ($HDKey->privateKey);

		$accountChain = new AccountChain;
		$accountChain->accounts = [];
		$accountChain->accounts[] = $newAccount;
		
		return ['words' => $mnemonic->words, 'chain' => $accountChain];
	}

	public function registerNewAccountInChain (&$chain, $password, $prevAccountMnemonic)
	{
		$mnemonic = BIP39::Words ($prevAccountMnemonic);
		$seed = $mnemonic->generateSeed ($password, 256);

		$accountsCount = sizeof ($chain->accounts) + 1;

		$HDKey = BIP44::fromMasterSeed ($seed)->derive ("m/44'/0'/0'/0/{$accountsCount}");

		$newAccount = new Account;
		$newAccount->address = '1x' . hash ('ripemd160', hash ('sha512', $HDKey->publicKey));
		$newAccount->publicKey = $HDKey->publicKey;
		$newAccount->setPrivateKey ($HDKey->privateKey);

		$chain->accounts[] = $newAccount;

		return ['chain' => $chain];
	}

	public function restoreAccount ($mnemonic, $password, $accountNo)
	{
		$mnemonic = BIP39::Words ($mnemonic);
		$seed = $mnemonic->generateSeed ($password, 256);

		$HDKey = BIP44::fromMasterSeed ($seed)->derive ("m/44'/0'/0'/0/{$accountNo}");

		$newAccount = new Account;
		$newAccount->address = '1x' . hash ('ripemd160', hash ('sha512', $HDKey->publicKey));
		$newAccount->publicKey = $HDKey->publicKey;
		$newAccount->setPrivateKey ($HDKey->privateKey);

		$accountChain = new AccountChain;
		$accountChain->accounts = [];
		$accountChain->accounts[] = $newAccount;

		return $accountChain;
	}
}


Die App


Die Logik unseres Kunden. Sie ist für alles verantwortlich, dafür, als Bergmann zu arbeiten, ein Gleichgewicht zu finden, Transaktionen zu senden und sie selbst zu machen.

App.php
, . 3 — , .

Zusammenfassen


Wir haben viel über etwas gesprochen, über Strukturen, über das Aufbewahren von Brieftaschen und viele Dinge. Im nächsten Teil werden wir weiterhin Währungscodes anzeigen.

TL; DR
— — FlyCoin FLC

All Articles