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
- Enquanto escrevia uma criptomoeda semi-descentralizada em PHP. (Parte 1 - Coletando bibliotecas)
- 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
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.Resumir
Conversamos muito sobre algo, sobre estruturas, sobre manter carteiras e muitas coisas. Na próxima parte, continuaremos exibindo códigos de moeda.