Предисловие
В одной из прошлых статей я рассказывал какие библиотеки нам пригодятся и сравнили эту задумку с той неудачной. В этой части будем разрабатывать саму криптовалюту и настроим трекер. Не будем медлить, поехали.
Список статей
- Как я писал полудецентрализованную криптовалюту на PHP. (Часть 1 — Сбор библиотек)
- Как я писал полудецентрализованную криптовалюту на PHP. (Часть 2 — Разработка)
Установка трекера
Прежде чем приступим устанавливать веб-трекер, расскажу — в библиотеке поддерживаются два типа трекера — Native и Web. Native-трекер можно использовать на различных VDS, и те будут без труда обслуживать списки пользователей в сети.
Здесь я буду использовать Web-трекер, который легко можно установить на сайт.
Переходим на репозиторий GitHub, о котором я говорил в предыдущей части. Master-ветка нас не интересует, выбираем web. Скачиваем архив с этой веткой, распаковываем его и открываем в блокноте или где нибудь еще, где Вам удобнее, файл index.php. Вот контент файла:
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']);
Вы должны изменить константу TRACKER_KEY на много разнообразных символов, чтобы не совпадало с оригинальным файлом.
Допустим вот так:
const TRACKER_KEY = 'sdT*&Y&*YO*&T*OGTGYFIYYUFGKUHLIYIj9sfhysdphphdpsfhBLABLABLAhsidlfhlisd';
Это всего лишь пример. Вы должны изменить по своему. Выкладываем все это на хостинг. Настройка веб-трекера завершена.
Для чего этот трекер?
Разработка
General
Поскольку это у нас приложение, нужно подключить все пакеты и компоненты, а именно пакеты Composer и не Composer, установить структуру аккаунтов и локальной БД аккаунтов, сделать взаимодействие между самим приложением и структурами, и инициализировать само приложение.
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'; # Консолька
Библиотека для BIP39 требует строгую типизацию, обьявляем его в первых строчках кода.
Сами библиотеки BIP39 и BIP44 подгружаем файлом autoload.php, стандартным для Composer.
Структуру данных обьявим в Structure.php.
Функции для работы с кошельками будут в файле UserAPI.php.
Библиотеки BPN и phpblockchain не совместимы с Composer, создаем файл, по названию похожий с Composer.
Само приложение выносим в App.php — оно будет там последним подключенным файлом, поскольку надо сначала все сверху прогрузить.
NotComposer/vendor/autoload.php
Я уже говорил, что те две библиотеки не совместимы с Composer, существуют не родные им файлы или же их вообще нет, а также отсутствуют на Packagist. Приходится вручную скачивать их, и подключать их. На то и расчитан данный файл.
Structure
Структуры данных тут созданы для того, чтобы можно было легче оперировать с кошельками. Библиотека нужна для UserAPI.php, чтобы сделать саму работу с кошельками, а именно регистрацию и восстановления кошелька, так и для App.php, чтобы использовать эти кошельки.
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;
}
Примитивный код, не так ли?
UserAPI.php
Посредник между Structure.php и App.php является UserAPI.php. Через него мы уже и будем оперировать с кошельками, регистрировать новые и восстанавливать уже существующие.
Код этого файла:
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;
}
}
App
Сама логика нашего клиента. Она отвечает за все, за работу майнером, получение баланса, отправка транзакций и их самодельное создание.
App.php
Так стоп, мы уже много о чем рассказали. В части 3 — Логика, мы расскажем про код логики программы.
Подведем итоги
Рассказали мы много о чем, о структурах, об хранении кошельков и много чего. В следующей части мы будем продолжать показывать коды к валюте.
TL;DR
Об названии — название крипты будет всем тем же — FlyCoin с трехзначным кодом FLC
SDKiller
Вы бы хоть документацию композера почитали, прежде чем такое публиковать.
Что вы имеете в виду, когда пишете "несовместимые с composer"?
То что их нет на packagist?
Так на гитхабе же они есть.
Посмотрите альтернативные способы подключения пакетов.