Od Web do Blockchain developera. Moja przygoda z Blockchainem
Z roku na rok technologia Blockchain zyskuje na popularności. Oferuje także coraz więcej: powstają chainy umożliwiające przechowywanie danych, wykonywanie skomplikowanych obliczeń czy wreszcie tworzenie aplikacji korzystających z zalet zdecentralizowanego środowiska. W tym artykule opowiadam, jak rozpoczęła się moja przygoda z Blockchainem.
Kuba Wilczek. Ruby on Rails developer w krakowskim software house Nopio. Momentami front-end developer, zdarzyło mu się też w przeszłości pisać w Javie i C++. Od niedawna zafascynowany Blockchainem i to temu tematowi poświęca najwięcej uwagi, eksperymentując, prezentując, wertując artykuły i pisząc własne. Jego hobby jest triathlon – w wolnym czasie biega, pływa lub jeździ na rowerze.
Nic więc dziwnego, że wielu z nas – developerów – zastanawia się nad spróbowaniem swoich sił w programowaniu decentralized apps (dApps) i sprawdzeniu na własnej skórze, o co właściwie w tym całym Blockchainie chodzi. Jako, że sam miałem podobne myśli, postanowiłem opisać moją przygodę z tą technologią. Być może dzięki temu ktoś z was będzie miał łatwiejszy start albo po prostu zachęci go to do zapoznania się bliżej z tą tematyką.
Ten artykuł nie jest tutorialem – nie zawiera zbyt dużo informacji technologicznych, nie tłumaczy, czym jest Blockchain oraz jak stworzyć własną aplikację. Dlatego niewtajemniczonym polecam przed lekturą zapoznać się z podstawami działania tej technologii.
Spis treści
Słowem wstępu – dlaczego Blockchain?
Jestem Ruby on Rails Developerem w firmie Nopio, ale w przeszłości pracowałem też z frameworkami front-endowymi (Ember, React), Javą, a nawet C++. Skąd więc wzięło się moje zainteresowanie Blockchainem?
Czytając wiele artykułów w sieci, doszedłem do wniosku, że to bardzo interesująca technologia (szczególnie dla osób stawiających tak jak ja backend ponad frontend) i może mieć przed sobą ciekawą przyszłość. Prawdopodobnie nie rozwiąże problemu głodu na świecie (znalazłem artykuł o takiej możliwości), ale może ułatwić życie wielu ludziom. No i przyznaję, do zainteresowania się blockchainem przekonała mnie wszechobecna moda na to hasło.
Być może wielu z Was jest już znudzonych ciągłym tworzeniem tak samo działających aplikacji webowych i pisaniem CRUDa po raz setny. Myślę, że dla web developerów zapoznanie się z Blockchainem może być inspirującym, nowym doświadczeniem. Umożliwia zrozumienie nowoczesnej technologii opartej na kryptografii i zachęca do prześledzenia obecnych trendów w developmencie.
Ta technologia może stać się w przyszłości naprawdę popularna (na co osobiście liczę) i wpłynąć na niektóre dziedziny naszego życia. Dlatego im wcześniej zrozumiemy jej działanie oraz poznamy jej wady i zalety, tym lepiej. Póki co, blockchain jest młodą technologią, która stale się rozwija i potrzebuje dużego zainteresowania, aby stać się naprawdę popularna. To od tego, czy programiści, developerzy zainteresują się tą technologią, będą ją współtworzyć oraz z niej korzystać, może zależeć jej przyszłość.
Blockchain – jak zacząć?
1. Solidny research
Przed rozpoczęciem pracy nad tworzeniem aplikacji, skupiłem się na researchu – przeczytałem bardzo dużo artykułów na temat działania tej technologii i tworzenia zdecentralizowanych apek. Osobiście polecam korzystanie z platformy Medium, gdzie można znaleźć wiele ciekawych artykułów: od najbardziej podstawowych, wyjaśniających czym jest Blockchain, po te zawierające najnowsze informacje z branży.
Dużo dał mi również kontakt z osobą bardziej doświadczoną ode mnie. To bardzo pomaga, ponieważ żaden artykuł nie odpowiada na wszystkie pytania, które mogą się pojawić podczas zapoznawania się z nową technologią, szczególnie tak skomplikowaną jak Blockchain.
2. Wybór odpowiedniej technologii
Swoją pracę na Blockchainie rozpocząłem od stworzenia aplikacji webowej w Ruby on Rails. Postawiłem na Railsy, ponieważ w nich czuję się najlepiej, jednak nie uważam tego za dobry wybór. Biblioteka, której używałem była wprawdzie dobrze udokumentowana, ale niestety brakuje w sieci tutoriali, jak tworzyć decentralizowane aplikacje w Rubym. Nie jest to więc najlepsza technologia do tego celu.
Najpopularniejszym językiem, który ma również najlepsze wsparcie, jest JavaScript z biblioteką web3.js. Dodatkowo JavaScript jest językiem, który jest interpretowany po stronie klienta, co jest jednym z głównych wymogów bezpieczeństwa w Blockchainie. Jeśli ktoś nie lubi JavaScriptu, to niestety mam dla niego złą wiadomość – przy pracy z Blockchainem bardzo ciężko będzie go uniknąć.
Jeśli chodzi o część blockchainową, to tu również polecam najbardziej popularny stack: Ethereum jako chain, na którym będziemy pracować oraz Solidity jako język pisania smart contractów. Zaletą korzystania z popularnych technologii jest nie tylko duża ilość dostępnych w sieci materiałów wspomagających uczenie, ale również dobre wsparcie techniczne i rozbudowana społeczność. Jeśli zapoznamy się z zasadami programowania aplikacji zdecentralizowanych używając Ethereum, będziemy w stanie w dość łatwy i szybki sposób przenieść się na development na innych chainach. Podobnie jak z językami programowania, na początku powinniśmy poznać podstawy, dopiero potem zabierać się za resztę.
Ethereum pozwala na testowanie aplikacji na specjalnie przygotowanym testowym środowisku, w którym operujemy fake’owym Etherem, dzięki czemu nie musimy płacić za nasze transakcje prawdziwymi pieniędzmi. Z dodatkowych narzędzi polecam zapoznać się z Truffle’m. Jest to środowisko umożliwiające testowanie i deployowanie smart contractów w prosty sposób.
3. Web development vs. Blockchain
Zaczniemy od porównania pracy z Blockchainem do pracy w standardowej wersji web developmentu. Dodatkowo przedstawię kilka aspektów, które odróżniają te dwa podejścia. Są to m.in. problemy, które mogą się pojawić podczas projektowania systemu opartego o blockchain. Warto przemyśleć niektóre z nich, jeśli chcemy w przyszłości uniknąć wielu błędów i utraty naprawdę dużych pieniędzy. Ta część artykułu odnosi się bardziej do sfery ogólnej projektowania systemów informatycznych, czyli samej architektury.
4. Kiedy warto postawić na Blockchain?
Tworzenie aplikacji niewiele się zmienia – możemy w uproszczeniu traktować blockchain jako ultra bezpieczną bazę danych, która przetrzymuje informacje w nieskończoność. Ważne, aby oddzielić logikę aplikacji od części blockchainowej i tylko naprawdę istotne funkcje delegować do smart contractów.
Często klienci zafascynowani modą chcą na siłę wpychać Blockchain do swoich aplikacji. To nie do końca ma sens – w większości przypadków wystarczy zastosowanie klasycznej bazy danych. Blockchain jest najbardziej użyteczny, gdy nasz produkt wymaga dużego bezpieczeństwa zapisu danych i przeprowadzonych transakcji. Rozważając tę technologię warto poświęcić więcej czasu na przemyślenie czy zakładane funkcjonalności faktycznie potrzebują zalet blockchaina i czy warto żyć z komplikacjami z tym związanymi. Tak więc, gdy już ustalimy, co powinno znajdować się w Blockchainie i jakie informacje powinny być tam trzymane, możemy przejść do programowania.
5. Testy to podstawa
Dlaczego polecam zaczynać od testów? Z kilku powodów. Po pierwsze są bardzo ważne, znacznie ważniejsze niż w standardowym developmencie. Blockchain developer, podobnie jak saper, myli się tylko raz.
Trzeba pamiętać o tym, że każdy zdeployowany contract zostaje w blockchainie na zawsze. Jeśli nawet stworzymy i wypuścimy do sieci nową wersję naszego contractu, każdy kto używa go poza naszą aplikacją (np. korzystając z programu metamask), będzie musiał zostać poinformowany o zmianie i konieczności przełączenia się na nową wersję kontraktu. Oczywiście są metody na rozwiązanie tego problemu, o których napiszę później, ale i tak nie powinniśmy nadużywać tego mechanizmu. Co więcej, nasz kod jest widoczny publicznie, więc każde uchybienie jest widoczne przez potencjalnego atakującego.
Kolejnym powodem, dla którego polecam TDD jest głębsze zrozumienie problemu i działania budowanego systemu. Nawet jeśli przeprowadziliśmy dogłębną analizę tematu, podczas tworzenia testów możemy znaleźć jakieś nieprzestudiowane edge case’y. Jedną z praktyk podczas tworzenia testów jest wcześniejsze zapisanie wszystkich przypadków testowych w jakimś dokumencie i skrupulatne zaznaczanie kolejnych testów, które ‘przechodzą’.
6. Integracja
Połączenie aplikacji webowej z blockchainem zwykle opiera się na aktualizacji danych. Zaletą nowej technologii jest dostęp publiczny oraz stałość i niezmienność zapisanych w chainie danych. Dzięki temu możemy udowodnić wiarygodność naszych transakcji.
Ważną rzeczą, o której musimy pamiętać, to czas wykonywania transakcji. Zależy nam przecież, aby transakcje w systemie przeprowadzane były szybko. Proces kopania często trwa dość długo, a nie chcemy żeby nasza aplikacja ‘wisiała’ na kilkanaście sekund lub nawet minut. Z tego powodu wywołania funkcji smart contractów powinny przebiegać asynchronicznie, a dane powinny być synchronizowane z danymi zapisanymi w chainie. Kopiowanie danych z chaina do bazy danych umożliwia nam znacznie szybszy dostęp do informacji (node’y nie są zoptymalizowane pod względem wydajności dostępu).
7. Koszty
Bardzo ważnym aspektem, który warto mieć w głowie nie tylko w czasie projektowania, ale również implementacji są koszty związane z korzystaniem z danego chaina. Im mniej oraz im mniejsze transakcje, które wykonujemy w blockchainie, tym mniejszy koszt związany z opłatami dla kopaczy.
Z tego powodu powinniśmy ograniczyć ilość danych oraz transakcji na blockchainie. Przy dużej liczbie użytkowników przeglądanie listy wszystkich pozostawionych komentarzy może być operacją dość kosztowną, a nie są to dane, na których rzetelności nam zależy, więc może warto rozważyć trzymanie ich tylko w bazie danych.
8. Zarządzanie użytkownikami
Przetrzymywanie danych o użytkownikach oraz zarządzanie nimi powinno być obsłużone po stronie aplikacji webowej. W Smart Contract powinniśmy jedynie przechowywać listę użytkowników, którzy mogą korzystać z naszej aplikacji oraz filtrować ich dostęp do określonych funkcji czy zasobów. Problem pojawia się przy tworzeniu kont użytkowników. Możemy mieć do tego dwa podejścia. Pierwsze zakłada, że użytkownicy posiadają już swoje wallety (adresy w blockchainie) i wtedy tworzymy po stronie klienta (tak, musimy użyć javascriptu) moduł odpowiedzialny za podpisywanie transakcji kluczem prywatnym.
Drugim podejściem, który warto rozważyć podczas projektowania aplikacji, jest całkowite ukrycie przed użytkownikami interakcji z Blockchainem. W większości aplikacji to podejście będzie odpowiednim wyborem – nie chcemy filtrować użytkowników poprzez zaawansowanie technologiczne ani wymagać od nich dodatkowej wiedzy. W tym przypadku, to my – nasza aplikacja tworzy blockchainowe ‘konta’ i podpisuje transakcje ich kluczami. Ważne, aby klucze nie były przechowywane w bazie danych. Podstawą jest bezpieczeństwo! Możemy, np. rozważyć przechowywanie ich w usłudze AWS HMS.
9. Wersjonowanie
Mimo testów nigdy nie jesteśmy w stanie ustrzec się przed błędami, które będziemy musieli w przyszłości poprawić. Dodatkowo istnieje duże prawdopodobieństwo, że w miarę rozrastania się naszego systemu będziemy chcieli dodać nowe funkcjonalności, również do naszego Smart Contractu.
Jak wcześniej wspomniałem, to co jest w Blockchainie zostaje w nim zawsze, a contracty są immutable, czyli nie da się ich uaktualnić, jedynie zmienić na nowe. Wiąże się z tym problem migracji danych.
Załóżmy, że przetrzymujemy w naszym smart contract’cie stan konta użytkowników. Deployując nową wersję contractu musielibyśmy przepisać wszystkie dane. Jednym z rozwiązań jest stworzenie dwóch smart contractów, w których jeden przetrzymuje dane i stan związany z aplikacją oraz adres aktualnej wersji drugiego contractu zawierającego logikę. W tym podejściu, gdy chcemy zmienić lub zaktualizować logikę wystarczy, że zmienimy w smart contract’cie przechowującym dane adres smart contractu z logiką i nie musimy już wykonywać bardzo drogiej akcji migrowania danych.
Podsumowanie
Mam nadzieję, że ten artykuł okaże się pomocny we wdrażaniu się w tworzenie aplikacji webowych opartych o Blockchain i pokazuje szerszą perspektywę pracy z tą technologią. Jak już wspomniałem, Blockchain jest bardzo ciekawą i obiecującą technologią. Pamiętajmy jednak, że nie jest złotym środkiem na wszystkie problemy i jeśli będziemy chcieli (lub nasz klient chciał) stworzyć aplikację opartą o Blockchain, zastanówmy się czy na pewno nie da się rozwiązać go w prostszy sposób.
Dla tych, którzy jeszcze zastanawiają się nad spróbowaniem swoich sił z aplikacjami decentralizowanymi polecam warsztaty Blockchain, które będziemy organizować w Nopio. Tam oprócz poznania teorii będziemy mieli okazję stworzyć swoją pierwszą aplikację decentralizowaną w Ruby on Rails. Więcej szczegółów poznacie pod tym linkiem.
Od redakcji: Blockchain budzi zainteresowanie wśród wielu developerów, dlatego jesteśmy ciekawi, czego chcielibyście dowiedzieć się od ludzi, którzy wykorzystują tę technologię codziennie do swojej pracy. Co prawda trudno znaleźć eksperta blockchaina, ze względu na to, że to bardzo młoda technologia, ale kilka tygodni temu udało nam się porozmawiać z Danielem Kmakiem, który jest Frontend & DAPP Developerem w ChronoLogic.