Enquanto escrevia uma criptomoeda semi-descentralizada em PHP. (Parte 2 - Desenvolvimento)

Prefácio


Em um dos artigos anteriores, falei sobre quais bibliotecas são úteis para nós e comparei essa idéia com a que não teve êxito. Nesta parte, desenvolveremos a própria criptomoeda e configuraremos o rastreador. Não vamos hesitar, vamos lá.

Lista de Artigos


  1. Enquanto escrevia uma criptomoeda semi-descentralizada em PHP. (Parte 1 - Coletando bibliotecas)
  2. Enquanto escrevia uma criptomoeda semi-descentralizada em PHP. (Parte 2 - Desenvolvimento)

Instalação do rastreador


Antes de começarmos a instalar o rastreador da Web, eu digo: a biblioteca suporta dois tipos de rastreador - Nativo e Web. O rastreador nativo pode ser usado em vários VDS, e eles manterão facilmente listas de usuários na rede.
Aqui vou usar um rastreador da Web que pode ser facilmente instalado no site.
Passamos para o repositório GitHub, sobre o qual falei na parte anterior. O ramo principal não nos interessa, selecionamos web. Faça o download do arquivo com este thread, descompacte-o e abra-o no bloco de indexação ou em outro lugar, onde você preferir, o arquivo index.php. Aqui está o conteúdo do arquivo:

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

Você deve alterar a constante TRACKER_KEY para muitos caracteres diferentes para que não corresponda ao arquivo original.

Vamos dizer o seguinte:


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

Este é apenas um exemplo. Você deve mudar à sua maneira. Nós publicamos tudo na hospedagem. A configuração do rastreador da Web está concluída.

Para que serve esse rastreador?

Desenvolvimento


Geral


Como esse é o nosso aplicativo, você precisa conectar todos os pacotes e componentes, a saber, os pacotes Composer e não Composer, estabelecer a estrutura das contas e o banco de dados local de contas, fazer a interação entre o aplicativo e as estruturas e inicializar o próprio aplicativo.

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


A biblioteca para BIP39 requer digitação estrita; nós a declaramos nas primeiras linhas de código.
As bibliotecas BIP39 e BIP44 são carregadas com o arquivo autoload.php, padrão para o Composer.
Declararemos a estrutura de dados em Structure.php.

As funções para trabalhar com carteiras estarão no arquivo UserAPI.php.

As bibliotecas BPN e phpblockchain não são compatíveis com o Composer, criamos um arquivo com um nome semelhante ao Composer.

Retiramos o aplicativo em App.php - este será o último arquivo conectado, pois precisamos carregar tudo de cima.

NotComposer / fornecedor / autoload.php


Eu já disse que essas duas bibliotecas não são compatíveis com o Composer, existem arquivos que não são nativos para eles ou que não existem, e também estão ausentes no Packagist. Você precisa baixá-los manualmente e conectá-los. Este arquivo foi projetado para isso.

Estrutura


As estruturas de dados aqui são projetadas para facilitar o manuseio de carteiras. A biblioteca é necessária para que o UserAPI.php faça o trabalho com carteiras, ou seja, registre e restaure a carteira, e que o App.php use essas carteiras.
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, certo?

UserAPI.php


O intermediário entre Structure.php e App.php é UserAPI.php. Por meio dele, já operamos com carteiras, registramos novas e restauramos as existentes.

Código deste arquivo:

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


A aplicação


A própria lógica do nosso cliente. Ela é responsável por tudo, por trabalhar como mineradora, obter um saldo, enviar transações e torná-las caseiras.

App.php
, . 3 — , .

Resumir


Conversamos muito sobre algo, sobre estruturas, sobre manter carteiras e muitas coisas. Na próxima parte, continuaremos exibindo códigos de moeda.

TL; DR
— — FlyCoin FLC

All Articles