WavesKit — framework PHP do pracy z blockchainem Waves

Lubię PHP za szybkość rozwoju i doskonałą przenośność. To bardzo dobrze, gdy zawsze masz pod ręką narzędzie gotowe do rozwiązania problemów.

Było dość przykre, gdy podczas zapoznawania się z krajowym blockchainem Waves Platform nie znalazłem gotowego SDK w PHP. Cóż, musiałem go napisać.

Na początku musiałem korzystać węzły do podpisywania transakcji. Tak, by zarządzać trzema adresami, musiałem uruchomić trzy węzły… To był żałosny widok, chociaż rozwiązywało niektóre problemy. Do momentu, kiedy zrozumiałem, że poleganie na węzłach to ślepy zaułek. Po pierwsze, z powodu ograniczonej funkcjonalności API, po drugie, z powodu prędkości (w tamtych czasach węzły były bardzo wolne).

Zacząłem dwie równoległe prace. Jedna — stworzyć przeglądarkę blockchain, która będzie szybka i całkowicie niezależna od API węzłów. Druga — zebrać wszystkie funkcje do pracy z Waves Platform w jednym miejscu. Tak powstały projekty w8io i WavesKit.

Pierwszym krokiem za kulisy blockchaina Waves była przeglądarka w8io. To nie było łatwe, ale ostatecznie udało się napisać niezależny skrypt obliczający wszystkie salda i nawet znaleźć błąd w obliczeniach na oryginalnych węzłach (program bug-bounty notabene u nich działa, płacą za znalezione błędy). Możesz dokładniej zapoznać się z funkcjonalnością przeglądarki w8io w tym wątku: https://forum.wavesplatform.com/t/w8io-waves-explorer-based-on-php-sqlite

W trakcie pracy nad w8io miałem już wątpliwości, ale gdy praca dobiegła końca i przystąpiłem do tworzenia SDK, wątpliwości się potwierdziły. Nie mogłem nigdzie znaleźć niektórych funkcji, w tym najważniejszych, kryptograficznych. Wtedy zacząłem tworzyć swoje cegły na fundament. Tak narodziły się: ABCode do kodowania w base58 (tak naprawdę do kodowania dowolnego alfabetu w dowolnym), Curve25519 do tworzenia i weryfikacji zgodnych podpisów (z wariantami na sterydach), Blake2b do obliczania jednego z hashy (który był dostępny dopiero od PHP 7.2) itd.

Tutaj muszę podziękować Inalowi Kardanowowi za kilka cennych rad, które skierowały mnie w stronę composer zamiast znanych mi, ale przestarzałych, plików include.

Po kilku miesiącach WavesKit ujrzał światło dzienne, wyszedł z wersji beta i jest teraz gotowy do pracy ze wszystkimi standardowymi funkcjami platformy Waves. Wszystko dostępne w głównej sieci Transakcje mogą być łatwo tworzone, podpisywane i wysyłane za pomocą jednego pakietu działającego na wszystkich 64-bitowych wersjach PHP od 5.6 włącznie.

Integracja WavesKit w swoim projekcie:

composer require deemru/waveskit

Używamy:

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 );

W powyższym przykładzie tworzymy obiekt WavesKit, który działa w sieci testowej „T”. Ustawiamy frazę seed, na podstawie której automatycznie obliczane są klucze i adres konta na podstawie klucza publicznego. Następnie tworzymy transakcję transferu 0.00000001 Waves z adresu automatycznie obliczonego na podstawie frazy seed na adres aliasu „test”, przekazujemy ją do podpisu kluczem prywatnym i wysyłamy do sieci. Po tym upewniamy się, że transakcja została pomyślnie potwierdzona przez sieć.

Praca z transakcjami koncentruje się w funkcjach zaczynających się od tx. Aby lepiej zrozumieć pracę z transakcjami, możesz zapoznać się z dokumentacją WavesKit lub od razu zapoznać się z praktycznymi przykładami w testach ciągłej integracji.

Ponieważ WavesKit rozwijał się w warunkach realnego użycia, ma już zaawansowane funkcje. Pierwsza funkcja killer to funkcja ensure, która kontroluje osiągnięcie wymaganego poziomu pewności, że transakcja nie została utracona, a wręcz przeciwnie, została potwierdzona i osiągnęła wymaganą liczbę potwierdzeń w sieci.

Inny nieprzepuszczalny mechanizm to sposób, w jaki WavesKit komunikuje się z węzłami. W kontrolowanych warunkach framework działa tylko z głównym węzłem, utrzymując z nim stałe połączenie, ale przy błędach może automatycznie przełączać się na zapasowe. Jeśli ustalisz tablicę zapasowych węzłów, możesz wywołać funkcję setBestNode w celu określenia najlepszego węzła jako głównego na podstawie maksymalnej wartości aktualnej wysokości i czasu odpowiedzi. Teraz dodaj do tego wewnętrzną pamięć podręczną zapytań i poczuj troskę zarówno o użytkowników, jak i właścicieli węzłów.

Jednym z ostatnich zaawansowanych mechanizmów jest funkcja txMonitor. Pojawiła się w odpowiedzi na konieczność reagowania na przychodzące transakcje w czasie rzeczywistym. Ta funkcja całkowicie rozwiązuje wszystkie kwestie związane z przetwarzaniem transakcji w blockchainie. Żadnych więcej problemów, wystarczy ustawić swoją funkcję callback z pożądanymi opcjami i czekać na nowe transakcje, które uruchomią twoje procesy. Na przykład, jeszcze jeden mój projekt VECRO jest całkowicie zbudowany wokół tej funkcji, możesz swobodnie badać, jak działa bezpośrednio w kodzie projektu.

Podoba mi się open source, to jedno z największych osiągnięć ludzkości. Ponieważ jestem jedynym deweloperem i osiągnąłem stan, w którym wszystkie moje potrzeby są zaspokojone, zapraszam cię do korzystania i wnoszenia wkładu w WavesKit.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster