Comme j'ai écrit une crypto-monnaie semi-décentralisée en PHP. (Partie 2 - Développement)

Préface


Dans l'un des articles précédents, j'ai parlé des bibliothèques qui nous sont utiles et j'ai comparé cette idée avec celle qui a échoué. Dans cette partie, nous allons développer la crypto-monnaie elle-même et configurer le tracker. N'hésitez pas, allons-y.

Liste d'articles


  1. Comme j'ai écrit une crypto-monnaie semi-décentralisée en PHP. (Partie 1 - Collecte des bibliothèques)
  2. Comme j'ai écrit une crypto-monnaie semi-décentralisée en PHP. (Partie 2 - Développement)

Installation du tracker


Avant de commencer l'installation du tracker Web, je vais vous dire que la bibliothèque prend en charge deux types de tracker: natif et Web. Native-tracker peut être utilisé sur divers VDS, et ils maintiendront facilement des listes d'utilisateurs sur le réseau.
Ici, je vais utiliser un tracker Web qui peut être facilement installé sur le site.
Nous passons au référentiel GitHub, dont j'ai parlé dans la partie précédente. La branche master ne nous intéresse pas, nous sélectionnons le web. Téléchargez l'archive avec ce fil, décompressez-la et ouvrez dans le pavé d'index ou ailleurs, où vous préférez, le fichier index.php. Voici le contenu du fichier:

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']);

Vous devez remplacer la constante TRACKER_KEY par de nombreux caractères différents afin qu'elle ne corresponde pas au fichier d'origine.

Disons ceci:


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

C'est juste un exemple. Vous devez changer à votre manière. Nous publions tout sur l'hébergement. La configuration du tracker Web est terminée.

À quoi sert ce tracker?

Développement


Général


Comme il s'agit de notre application, vous devez connecter tous les packages et composants, à savoir les packages Composer et non-Composer, établir la structure des comptes et la base de données locale des comptes, effectuer l'interaction entre l'application et les structures et initialiser l'application elle-même.

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';                    # 


La bibliothèque pour BIP39 nécessite un typage strict; nous le déclarons dans les premières lignes de code.
Les bibliothèques BIP39 et BIP44 elles-mêmes sont chargées avec le fichier autoload.php, standard pour Composer.
Nous déclarerons la structure des données dans Structure.php.

Les fonctions de travail avec les portefeuilles seront dans le fichier UserAPI.php.

Les bibliothèques BPN et phpblockchain ne sont pas compatibles avec Composer, nous créons un fichier avec un nom similaire à Composer.

Nous supprimons l'application elle-même dans App.php - ce sera le dernier fichier connecté, car nous devons d'abord tout charger par le haut.

NotComposer / vendor / autoload.php


J'ai déjà dit que ces deux bibliothèques ne sont pas compatibles avec Composer, il y a des fichiers qui ne leur sont pas natifs, ou qui n'existent pas du tout, et ils sont également absents sur Packagist. Vous devez les télécharger manuellement et les connecter. Ce fichier est conçu pour cela.

Structure


Les structures de données ici sont conçues pour faciliter la gestion des portefeuilles. La bibliothèque est nécessaire pour UserAPI.php pour faire le travail avec les portefeuilles, à savoir l'enregistrement et la restauration du portefeuille, et pour App.php pour utiliser ces portefeuilles.
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;
}


Code primitif, non?

UserAPI.php


L'intermédiaire entre Structure.php et App.php est UserAPI.php. Grâce à lui, nous allons déjà fonctionner avec des portefeuilles, en enregistrer de nouveaux et restaurer les existants.

Code de ce fichier:

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;
	}
}


L'application


La logique même de notre client. Elle est responsable de tout, de travailler comme mineur, d'obtenir un solde, d'envoyer des transactions et de les faire maison.

App.php
, . 3 — , .

Résumer


Nous avons beaucoup parlé de quelque chose, des structures, de la conservation des portefeuilles et de beaucoup de choses. Dans la prochaine partie, nous continuerons à afficher les codes de devise.

TL; DR
— — FlyCoin FLC

All Articles