Mientras escribía una criptomoneda semi descentralizada en PHP. (Parte 2 - Desarrollo)

Prefacio


En uno de los artículos anteriores, hablé sobre qué bibliotecas son útiles para nosotros y comparé esta idea con la que no tuvo éxito. En esta parte, desarrollaremos la propia criptomoneda y configuraremos el rastreador. No lo dudemos, vámonos.

Lista de artículos


  1. Mientras escribía una criptomoneda semi descentralizada en PHP. (Parte 1 - Coleccionar bibliotecas)
  2. Mientras escribía una criptomoneda semi descentralizada en PHP. (Parte 2 - Desarrollo)

Instalación del rastreador


Antes de comenzar a instalar el rastreador web, le diré: la biblioteca admite dos tipos de rastreador: nativo y web. Native-tracker se puede usar en varios VDS, y mantendrán fácilmente listas de usuarios en la red.
Aquí usaré un rastreador web que se puede instalar fácilmente en el sitio.
Pasamos al repositorio de GitHub, del que hablé en la parte anterior. La rama maestra no nos interesa, seleccionamos web. Descargue el archivo con este hilo, descomprímalo y ábralo en el índice o en otro lugar, donde prefiera, el archivo index.php. Aquí está el contenido del archivo:

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

Debe cambiar la constante TRACKER_KEY a muchos caracteres diferentes para que no coincida con el archivo original.

Digamos esto:


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

Esto es solo un ejemplo. Debes cambiar a tu manera. Lo publicamos todo en el hosting. La configuración del rastreador web está completa.

¿Para qué sirve este rastreador?

Desarrollo


General


Dado que esta es nuestra aplicación, debe conectar todos los paquetes y componentes, es decir, los paquetes Composer y no Composer, establecer la estructura de las cuentas y la base de datos local de cuentas, hacer la interacción entre la aplicación y las estructuras, e inicializar la aplicación en sí.

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 biblioteca para BIP39 requiere una mecanografía estricta; la declaramos en las primeras líneas de código.
Las bibliotecas BIP39 y BIP44 se cargan con el archivo autoload.php, estándar para Composer.
Declararemos la estructura de datos en Structure.php.

Las funciones para trabajar con billeteras estarán en el archivo UserAPI.php.

Las bibliotecas BPN y phpblockchain no son compatibles con Composer, creamos un archivo con un nombre similar a Composer.

Eliminamos la aplicación en App.php: será el último archivo conectado allí, ya que primero debemos cargar todo desde arriba.

NotComposer / vendor / autoload.php


Ya dije que esas dos bibliotecas no son compatibles con Composer, hay archivos que no son nativos de ellas, o no existen en absoluto, y también están ausentes en Packagist. Debe descargarlos manualmente y conectarlos. Este archivo está diseñado para eso.

Estructura


Las estructuras de datos aquí están diseñadas para facilitar el manejo de billeteras. La biblioteca es necesaria para que UserAPI.php haga el trabajo con billeteras, es decir, registrar y restaurar la billetera, y para que App.php use estas billeteras.
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;
}


Código primitivo, ¿verdad?

UserAPI.php


El intermediario entre Structure.php y App.php es UserAPI.php. A través de él, ya operaremos con billeteras, registraremos nuevas y restauraremos las existentes.

Código de este archivo:

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


La aplicación


La lógica de nuestro cliente. Ella es responsable de todo, de trabajar como minero, obtener un saldo, enviar transacciones y hacerlas caseras.

App.php
, . 3 — , .

Para resumir


Hablamos mucho sobre algo, sobre estructuras, sobre mantener billeteras y muchas cosas. En la siguiente parte, continuaremos mostrando códigos de moneda.

TL; DR
— — FlyCoin FLC

All Articles