Предисловие
В одной из прошлых статей я рассказывал какие библиотеки нам пригодятся и сравнили эту задумку с той неудачной. В этой части будем разрабатывать саму криптовалюту и настроим трекер. Не будем медлить, поехали.
Список статей
- Как я писал полудецентрализованную криптовалюту на PHP. (Часть 1 — Сбор библиотек)
- Как я писал полудецентрализованную криптовалюту на PHP. (Часть 2 — Разработка)
Поговорим о библиотеке BPN
Сам я, если честно, не видал P2P библиотек под PHP, и эта библиотека была единственным выбором.
Библиотека поддерживает полу-децентрализованный P2P, соответственно, там поддерживаются трекеры.
В BPN поддерживаются два типа трекера: Native-трекер и Web-трекер.
Native-трекер, как правило можно запустить на каком нибудь другом компьютере (из одной библиотеки).
Web-трекер предназначен только для установки на сайт, поскольку в нем нету функции клиента.
Установка трекера
Переходим на репозиторий GitHub, о котором я говорил в предыдущей части. Master-ветка нас не интересует, выбираем web. Скачиваем архив с этой веткой, распаковываем его и открываем в блокноте или где нибудь еще, где Вам удобнее, файл 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. Вставляем туда следующий код:
<?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.
Код:
<?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) — Восстановить один из аккаунтов мнемонической фразой и паролем.
Код этого файла:
<?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. Именно он осуществляет все операции в сети.
Код:
Подведем итоги
Рассказали мы много о чем, о структурах, об хранении кошельков и много чего. В следующей части мы будем продолжать показывать коды к валюте.
ссылка на оригинал статьи https://habr.com/ru/post/490498/
Добавить комментарий