Как я писал полудецентрализованную криптовалюту на PHP. (Часть 2 — Разработка)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Предисловие


В одной из прошлых статей я рассказывал какие библиотеки нам пригодятся и сравнили эту задумку с той неудачной. В этой части будем разрабатывать саму криптовалюту и настроим трекер. Не будем медлить, поехали.

Список статей


  1. Как я писал полудецентрализованную криптовалюту на PHP. (Часть 1 — Сбор библиотек)
  2. Как я писал полудецентрализованную криптовалюту на PHP. (Часть 2 — Разработка)


Поговорим о библиотеке BPN


Сам я, если честно, не видал P2P библиотек под PHP, и эта библиотека была единственным выбором.
Библиотека поддерживает полу-децентрализованный P2P, соответственно, там поддерживаются трекеры.
В BPN поддерживаются два типа трекера: Native-трекер и Web-трекер.
Native-трекер, как правило можно запустить на каком нибудь другом компьютере (из одной библиотеки).
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';

Это всего лишь пример. Вы должны изменить по своему. Выкладываем все это на хостинг. Настройка веб-трекера завершена.
Native-трекер ставить не будем. Хотя если у Вас провайдер с белым IP и возможностью открывать порты — пожалуйста. Правда оставьте компьютер 24/7.

Разработка



General


Итак, нам нужно создать ядро, через которое будет осуществляться вызов всех функций, включая консоль.
Создаем файл General.php. Вставляем туда следующий код:
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 библиотеки.
Он похож на General.php, за исключением того что тут подключаются библиотеки, а не модули в целом.

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. Именно он предназначен для хранения собственных кошельков. Он поддерживает следующие методы:
registerNewAccount (string $password) — Создать аккаунт. Пароль необходим для создания seed.
registerNewAccountInChain (object &$chain, string $password, string $prevAccountMnemonic) — Создать еще один аккаунт. Требует мнемоническую фразу первого аккаунта, чтобы восстановить ключевую пару. Хотя из файла accounts можно взять… Лень.
restoreAccount (string $mnemonic, string $password, int $accountNo) — Восстановить один из аккаунтов мнемонической фразой и паролем.
Код этого файла:
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. Именно он осуществляет все операции в сети.
Код:
App.php
Так стоп, мы уже много о чем рассказали. В части 3 — Логика, мы расскажем про код логики программы.


Подведем итоги


Рассказали мы много о чем, о структурах, об хранении кошельков и много чего. В следующей части мы будем продолжать показывать коды к валюте.
TL;DR
Об названии — название крипты будет всем тем же — FlyCoin с трехзначным кодом FLC
Источник: https://habr.com/ru/post/490498/


Интересные статьи

Интересные статьи

Здравствуйте. Представляю вам заключительную главу цикла. В ней пойдет речь о реализации самого парсера, его модулей, вроде функции анализа, построения стека и dom дерева. Помимо это...
В обновлении «Сидней» Битрикс выпустил новый продукт в составе Битрикс24: магазины. Теперь в любом портале можно создать не только лендинг или многостраничный сайт, но даже интернет-магазин. С корзино...
Привет, Хабр! Представляю вашему вниманию перевод статьи "How does a relational database work". Когда дело доходит до реляционных баз данных я не могу не думать, что чего-то не хватае...
«Попробуйте изменить себя и вы поймете, насколько ничтожны ваши шансы изменить других» (С) Вольтер Может ли «красный» лидер быть эффективным? (Спойлер: Да, если он не красный). В первой...
Одной из «киллер-фич» 12й версии Битрикса была объявлена возможность отдавать статические файлы из CDN, тем самым увеличивая скорость работы сайта. Попробуем оценить практический выигрыш от использова...