- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

Спустя пару месяцев WavesKit увидел свет [16], вышел из бета-версии [17] и теперь готов к работе со всем стандартным функционалом платформы Waves. Все доступные в основной сети [18] транзакции могут быть легко созданы, подписаны и отправлены силами всего одного пакета, работающего на всех 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 [19]. Для лучшего понимания работы с транзакциями вы можете изучить документацию WavesKit [20] или сразу обратиться к наглядным примерам в тестах непрерывной интеграции [21].

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

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

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

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

Автор: Дмитрий Пичулин

Источник [27]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/313185

Ссылки в тексте:

[1] PHP: https://en.wikipedia.org/wiki/PHP

[2] Waves Platform: https://wavesplatform.com

[3] ноды: https://docs.wavesplatform.com/en/waves-full-node/what-is-a-full-node.html

[4] API: https://docs.wavesplatform.com/en/waves-api-and-sdk/waves-node-rest-api.html

[5] w8io: https://github.com/deemru/w8io

[6] WavesKit: https://github.com/deemru/WavesKit

[7] обозреватель w8io: https://w8io.ru

[8] программа bug-bounty: https://forum.wavesplatform.com/t/bug-bounty-program/1127

[9] https://forum.wavesplatform.com/t/w8io-waves-explorer-based-on-php-sqlite: https://forum.wavesplatform.com/t/w8io-waves-explorer-based-on-php-sqlite

[10] ABCode: https://github.com/deemru/ABCode

[11] Curve25519: https://github.com/deemru/Curve25519

[12] на стероидах: https://github.com/deemru/Curve25519/blob/0ba56fa566f4a29b06126465b9ebbe59c915ffbd/src/Curve25519.php#L104

[13] Blake2b: https://github.com/deemru/Blake2b

[14] Инала Карданова: https://twitter.com/ikardanoff

[15] composer: https://en.wikipedia.org/wiki/Composer_(software)

[16] WavesKit увидел свет: https://forum.wavesplatform.com/t/client-libraries-for-php-elm-and-rust/3001/15

[17] бета-версии: https://twitter.com/ikardanoff/status/1091241637706190848

[18] основной сети: https://docs.wavesplatform.com/en/waves-environment/waves-mainnet.html

[19] функциях начинающихся с tx: https://github.com/deemru/WavesKit/blob/master/docs/WavesKit.md#waveskittxaddressscript

[20] документацию WavesKit: https://github.com/deemru/WavesKit/blob/master/docs/WavesKit.md

[21] тестах непрерывной интеграции: https://github.com/deemru/WavesKit/blob/2c4937199c88bc4ae105f60657b1389482471c1f/test/selftest.php#L237

[22] функция ensure: https://github.com/deemru/WavesKit/blob/master/docs/WavesKit.md#waveskitensure

[23] setBestNode: https://github.com/deemru/WavesKit/blob/master/docs/WavesKit.md#waveskitsetbestnode

[24] txMonitor: https://github.com/deemru/WavesKit/blob/master/docs/WavesKit.md#waveskittxmonitor

[25] VECRO: https://github.com/deemru/VECRO

[26] в коде проекта: https://github.com/deemru/VECRO/blob/85d8373de56baff7c05697475211633b521bca7d/src/VECRO.php#L80

[27] Источник: https://habr.com/ru/post/446110/?utm_source=habrahabr&utm_medium=rss&utm_campaign=446110