WavesKit — PHP фреймворк для работы с блокчейном Waves

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

Было довольно обидно, когда при знакомстве с отечественным блокчейном Waves Platform в его арсенале не оказалось готового SDK на PHP. Что ж, пришлось его написать.

Поначалу приходилось использовать ноды для подписи транзакций. Так, для управления тремя адресами приходилось запускать три ноды… Это было жалкое зрелище, хотя и решало некоторые задачи. До тех пор, пока не пришло понимание, что полагаться на ноды — это тупик. Во-первых, из-за ограниченного функционала API, во-вторых, из-за скорости (в те дни ноды были очень медленными).

Я начал две параллельные работы. Одна — сделать обозреватель блокчейна, который будет быстрый и полностью независимый от API нод. Вторая — собрать все функции для работы с Waves Platform в одном месте. Так появились проекты w8io и WavesKit.

Первым шагом за кулисы блокчейна Waves стал обозреватель w8io. Было не просто, но всё же удалось написать независимый расчёт всех балансов и даже найти ошибку в расчётах на оригинальных нодах (программа bug-bounty кстати у них работает, за найденные ошибки платят). Вы можете подробнее изучить функционал обозревателя w8io в этой теме: https://forum.wavesplatform.com/t/w8io-waves-explorer-based-on-php-sqlite

В процессе работы над w8io у меня уже были сомнения, но когда работа подошла к логическому концу и я приступил к созданию SDK, сомнения подтвердились. Я нигде не смог найти некоторых функций, в том числе и самых важных, криптографических. Тогда я начал с создания своих кирпичей для фундамента. Так родились: ABCode для кодирования в base58 (на самом деле для кодирования любого алфавита в любой), Curve25519 для создания и проверки совместимых подписей (с вариантами на стероидах), Blake2b для расчёта одного из хэшей (который был доступен только начиная с PHP 7.2) и т.д.

Здесь я должен поблагодарить Инала Карданова за несколько ценных советов, которые направили меня в сторону composer вместо привычных для меня, но устаревших, include файлов.

Спустя пару месяцев WavesKit увидел свет, вышел из бета-версии и теперь готов к работе со всем стандартным функционалом платформы Waves. Все доступные в основной сети транзакции могут быть легко созданы, подписаны и отправлены силами всего одного пакета, работающего на всех 64-битных версия PHP от 5.6 включительно.

Подключаем WavesKit в свой проект:

composer require deemru/waveskit

Пользуемся:

use deemruWavesKit;
$wk = new WavesKit( 'T' );
$wk->setSeed( 'manage manual recall harvest series desert melt police rose hollow moral pledge kitten position add' );
$tx = $wk->txBroadcast( $wk->txSign( $wk->txTransfer( 'test', 1 ) ) );
$tx = $wk->ensure( $tx );

В примере выше мы создаём объект WavesKit, который работает в тестовой сети «T». Устанавливаем сид фразу, из которой автоматически вычисляются ключи и адрес аккаунта на основе открытого ключа. Далее мы создаём транзакцию трансфера 0.00000001 Waves с автоматически вычисленного по сид фразе адреса на адрес алиаса «test», передаём её на подпись закрытым ключом и отправляем в сеть. После этого убеждаемся, что транзакция успешно подтверждена сетью.

Работа с транзакциями сосредоточена в функциях начинающихся с tx. Для лучшего понимания работы с транзакциями вы можете изучить документацию WavesKit или сразу обратиться к наглядным примерам в тестах непрерывной интеграции.

Так как WavesKit развивался в условиях реального использования, у него уже появились продвинутые фичи. Первая киллер фича — это функция ensure, которая контролирует достижение требуемого уровня уверенности, что транзакция не потерялась, а напротив, была подтверждена и достигла необходимого количества подтверждений в сети.

Другой пуленепробиваемый механизм — как WavesKit общается с нодами. В тепличных условиях фреймворк работает только с основной нодой, поддерживая с ней постоянное соединение, но при ошибках может автоматически переключаться на резервные. Если вы устанавливаете массив резервных нод, то можете вызывать функцию setBestNode для определения лучшей ноды в качестве основной по максимальному значению текущей высоты и скорости ответа. Теперь добавьте к этому внутренний кэш запросов и почувствуйте заботу как о пользователях, так и владельцах нод.

Один из последних продвинутых механизмов — функция txMonitor. Она появилась в связи с необходимостью реагировать на входящие транзакции в реальном времени. Данная функция полностью решает все нюансы связанные с обработкой транзакций в блокчейне. Больше никакой боли, просто устанавливаете свою callback функцию с желаемыми опциями и ждёте новых транзакций, которые запустят ваши процессы. Например, ещё один мой проект VECRO полностью построен вокруг этой функции, вы спокойно можете изучить как она работает прямо в коде проекта.

Мне нравится open source, это одно из величайших достижений человечества. Так как я единственный разработчик и достиг состояния, что все мои потребности решены, я приглашаю вас использовать и вносить вклад в WavesKit.

Источник: habr.com