Java i Blockchain – jak to połączyć w aplikacji biznesowej?

01/08/2018

Niniejszy artykuł jest kontynuacją tematyki związanej z technologią blockchain, którą rozpoczęliśmy od przedstawienia podstawowych koncepcji samego łańcucha bloków. Idąc dalej, chciałbym pokazać, jak zbudować aplikację wykorzystującą technologię blockchain w Javie, która rozwiązuje realny problem biznesowy.

 

Problem biznesowy

Twoja firma się rozrasta, pracuje w niej coraz więcej osób. Do tej pory różnego rodzaju wnioski (o urlop, o nowy sprzęt lub wymianę obecnego) realizowane były w formie papierowej, co często prowadziło do nieakceptowalnych nadużyć i fałszerstw. Poszczególne strony w procesie przestały sobie ufać. Ostatnie spotkanie zarządu zakończyło się decyzją na temat zmiany tego stanu, czyli digitalizacji tych procesów, celem zwiększenia kontroli nad nimi i transparentności. Postanowiono stworzyć do użytku wewnętrznego aplikację, w której będzie można zarządzać wnioskami.

Podstawowe założenia:

Przykładowy scenariusz testowy:

  1. Stwórz “normalnych” użytkowników: user1, user2.
  2. Stwórz menedżerów: manager1, manager2.
  3. User1 tworzy wniosek o urlop.
  4. Manager1 akceptuje wniosek User1 (tworzy pozytywną decyzję).
  5. User2 tworzy wniosek o urlop.
  6. Manager2 odrzuca wniosek User2 (tworzy negatywną decyzję).

Dyrektor IT stwierdził, że podstawowe założenia, tj. niepodważalność, niezmienialność, transparentność oraz audytowalność idealnie wpisują się w technologię blockchain. Podjął decyzję, że to właśnie blockchain będzie podstawową bazą danych, jeżeli chodzi o informacje o wnioskach i decyzjach.

 

Technologie

Chcąc spełnić postawione wymagania biznesowe od razu odrzuciliśmy wszystkie publiczne blockchainy. Dlaczego? Odsyłam Was do naszego poprzedniego artykułu Blockchain-fundamenty, tam staraliśmy się wyjaśnić różnice. Dodatkowo warto spojrzeć na tę prezentację.

Poszukiwania ograniczyliśmy zatem do prywatnych łańcuchów (private blockchain/private DLT). Wniosek z poszukiwań był taki, że najczęściej polecanymi platformami są Hyperledger oraz MultiChain.

Hyperledger jest bardzo mocno wspierany i promowany przez IBM. CEO CEE Karolina Marzantanowicz wspominała na jednym ze spotkań Aula Polska o tym, że firma wdrożyła już ponad 500 projektów opartych o tę platformę. To robi wrażenie.

Po tym spotkaniu byłem (i w sumie wciąż jestem 🙂 ) zafascynowany Hyperledgerem, jednak ostatecznie w naszym projekcie zdecydowaliśmy się użyć platformy MultiChain.

Dlaczego? Głównie dlatego, że w sieci często pojawiają się komentarze mówiące o tym, że łatwiej z nim zacząć, jeżeli zależy nam głównie na time series database. Czy to prawda? Dziś nie jesteśmy w stanie tego stwierdzić, ponieważ nie wykonaliśmy porównania obu technologii “na polu walki”. Mam nadzieję, że uda nam się jeszcze wrócić do tego tematu i sprawdzić Hyperledger w akcji.

Oprócz Multichaina w aplikacji opublikowanej na GitHubie wykorzystaliśmy:

MultiChainPoszczególne komponenty systemu

Instalacja MultiChaina

Pierwszym krokiem była oczywiście instalacja MultiChaina na mojej lokalnej maszynie. Bez problemu udało się to zrobić korzystając z poradnika z oficjalnej strony MultiChaina. Nie będę opisywał tutaj dokładnie tego procesu, odsyłam do podlinkowanej instrukcji.

Alternatywnym rozwiązaniem jest uruchomienie wszystkiego za pomocą Dockera, jednym poleceniem, wykorzystując to repozytorium.

Jako, że podlinkowane repozytorium nie było od jakiegoś czasu aktualizowane, postanowiliśmy je skopiować i zaktualizować wersję używanych wewnątrz bibliotek. Polecamy skorzystać zatem z tego, co znajduje się w folderze multichain-cluster w naszym repozytorium.

Uruchamia się to za pomocą Docker Compose. Będąc w folderze ze skryptami w konsoli wystarczy wpisać docker-compose up lub uruchomić run.bat (dla Windowsa) lub run.sh (dla Linuxa).
Utworzony klaster zawiera trzy połączone ze sobą node’y: master node, slave node oraz explorer node.

run.sh

Uruchomienie docker-compose przez skrypt run.sh

Po kilku minutach całe środowisko MultiChaina wstanie. W konsoli powinny pojawić się logi z explorera:

Java i Blockchain run.sh

 

Teraz można wejść na MultiChain Explorer’a i spojrzeć na pierwszą automatycznie utworzoną transakcję:

MultiChain Explorer

MultiChain CLI

Ponieważ nie mieliśmy wcześniej do czynienia z aplikacjami wykorzystującymi MultiChain, postanowiliśmy na początku sprawdzić czy wymyślony przez nas scenariusz uda się zaimplementować z wykorzystaniem CLI.

Jaki był tego efekt? Pozytywny, udało się!

Pierwsze kroki zostały dokładnie opisane w README, a plik run.sh w folderze multichain-cli zawiera wszystkie komendy, które należy uruchomić, aby zrealizować kroki scenariusza.

Do implementacji powyższego scenariusza wykorzystane zostały MultiChain Streams. Czym tak naprawdę są te strumienie? Pozwolę sobie zacytować CEO MultiChaina:

Gideon Greenspan

Streams provide a natural abstraction for blockchain use cases which focus on general data retrieval, timestamping and archiving, rather than the transfer of assets between participants. Streams can be used to implement three different types of databases on a chain:

  1. A key-value database or document store, in the style of NoSQL.
  2. A time series database, which focuses on the ordering of entries.
  3. An identity-driven database where entries are classified according to their author.

These can be considered as the ‘what’, ‘when’ and ‘who’ of a shared database.

Potrzebne były nam dwa strumienie. Jeden do przechowywania wniosków, a drugi do przechowywania decyzji. Dzięki takiemu podejściu mogliśmy na poziomie MultiChaina sterować uprawnieniami (kto do jakiego streama może zapisywać), dzięki czemu zwykli użytkownicy nie mogli akceptować wniosków.

 

MultiChain + Java

Jeżeli chodzi o integrację MultiChaina i Javy skorzystaliśmy z projektu MultiChainJavaAPI. API to jest troszkę ograniczone, ponieważ było tworzone z myślą o zarządzaniu już stworzonym łańcuchem przez co brakuje w nim metod typu stwórz łańcuch. Założyliśmy, że nasza aplikacja działa na stworzonym inną metodą blockchainie (np. przez CLI), więc te braki nam nie przeszkadzały.

Spójrzmy zatem na pakiety, które ukształtowały nam się w trakcie tworzenia aplikacji:

MultiChain server

Co znajduje się w poszczególnych pakietach?

mockchain

Dzięki adnotacji @Profile nad klasą możemy wskazać Springowi, które Bean’y ma wstrzykiwać w zależności od ustawionego profilu.

Java i Blockchain @Profile

Bean MockChainExplorer ma być wstrzyknięty tylko jeśli aplikacja uruchomiona jest z profilem dev

MockChainExplorer service

Bean MultichainExplorer ma być wstrzyknięty tylko jeśli aplikacja uruchomiona jest z profilem innym niż dev

Najważniejszym miejscem aplikacji od strony biznesowej jest interfejs Ledger. Interfejs ten jest pewną abstrakcją rejestru wniosków i decyzji (dodawanie/usuwanie/przeglądanie). Na tę chwilę ma on dwie implementacje – jedną bazującą na MultiChainie, a druga to mock, o którym już wspominałem przy okazji omawiania struktury pakietów. Dzięki takiemu podejściu można bardzo łatwo dodawać kolejne implementacje, bazujące np. na Hyperledgerze albo tradycyjnej bazie danych.

Java i Blockchain Ledger

Interfejs ten implementowany jest przez klasę MultichainLedger. To właśnie tutaj odbywa się integracja z MultiChainem.

W konstruktorze klasy subskrybujemy się na stworzone streamy lub tworzymy je, jeśli jeszcze nie istnieją. Jak już wspominałem wcześniej, jeden stream służy do przechowywania wniosków (Request), a drugi decyzji (Decision).

Java i Blockchain Request

Konstruktor klasy MultichainLedger wraz z metodą pomocniczą subscribe

Dodanie czegoś do streama (co odpowiada biznesowej akcji dodania nowej prośby lub decyzji) odbywa się poprzez wykorzystanie metody publishFrom z API MultiChaina. Należy pamiętać, że dane muszą być wcześniej przekonwertowane do postaci HEX.

Java i Blockchain HEX

Tworzenie nowego wniosku

Oprócz tworzenia wniosku/decyzji, niezbędna była funkcjonalność pobierania całej listy lub listy wniosków złożonych przez konkretnego użytkownika. Polega to na wskazaniu strumienia, z którego chcemy pobierać dane i przekonwertowaniu ich z HEXa na nasze obiekty. Przykład poniżej. W przykładzie dane są dodatkowo filtrowane i sortowane.

HEX Java i Blockchain

 

Frontend – Angular 6

Klient napisany został w Angularze 6 z wykorzystaniem biblioteki Semantic UI.

multichain Angular 6

Aplikacja umożliwia:

Więcej screenów z samej aplikacji można zobaczyć w README na GitHubie.

 

Podsumowanie

Stworzenie aplikacji w Javie wykorzystującej blockchain nie jest trudne, jeśli zna się podstawowe założenia dotyczące łańcucha bloków, różnice między wersją publiczną, a prywatną oraz ograniczenia każdej z nich.

Pamiętajmy, że nie wszystkim blockchain jest potrzebny. W naszym poprzednim artykule zamieściliśmy diagram odpowiadający na pytanie Czy potrzebuję blockchaina? Warto się z nim zapoznać i zapamiętać.

Java i Blockchain

 

Mamy nadzieję, że opublikowana przez nas przykładowa aplikacja będzie pomocna dla każdego, kto chce wejść w ten temat.

Autor: Robert Witkowski, Senior Software Engineer, ASC LAB

Zarejestruj się na webinar:

Wyrażam dobrowolnie zgodę na przetwarzanie moich danych osobowych dla potrzeb procesu realizacji zgłoszenia (pokaż więcej) przez Altkom Experts sp. z o.o. oraz Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warszawa), zgodnie z Rozporządzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych („RODO”). Mam świadomość, iż podanie powyższych danych osobowych jest dobrowolne, ale konieczne do obsługi zgłoszenia oraz że posiadam prawo dostępu do treści swoich danych i możliwość ich poprawiania a zgoda może być odwołana w każdym czasie. Kontakt do inspektora ochrony danych osobowych w Altkom: iodo@altkom.pl

Wyrażam dobrowolnie zgodę na przetwarzanie moich danych osobowych w celach marketingowych (pokaż więcej)przez Altkom Experts sp. z o.o. oraz Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warszawa)oraz otrzymywanie informacji handlowych drogą elektroniczną na adres e-mail i numer telefonu podany przeze mnie, zgodnie z Rozporządzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych („RODO”), oraz Ustawy z dnia 18 lipca 2002 r. o świadczeniu usług drogą elektroniczną. Mam świadomość, iż podanie powyższych danych osobowych jest dobrowolne oraz że posiadam prawo dostępu do treści swoich danych i możliwość ich poprawiania a zgoda może być odwołana w każdym czasie. Kontakt do inspektora ochrony danych osobowych w Altkom: iodo@altkom.pl

 

Watch for free

Enter your contact details to receive a link to the recording:

I voluntarily consent to the processing of my personal data for the purposes of the application process (show more) by Altkom Experts sp. z o.o. and Altkom Software & Consulting sp. z o.o. (51 Chłodna Street, 00-867 Warsaw), in accordance with Regulation 2016/679 of the European Parliament and of the Council of 27 April 2016 on the protection of individuals with regard to the processing of personal data and on the free movement of such data ("RoDO"). I am aware that providing the above personal data is voluntary, but necessary to handle the request, and that I have the right to access the content of my data and the possibility of correcting it, and that my consent may be revoked at any time. Please contact the Altkom Data Protection Officer: iodo@altkom.pl.

I voluntarily consent to the processing of my personal data for marketing purposes (show more)by Altkom Experts sp. z o.o. and Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warsaw) and receiving commercial information by electronic means to the e-mail address and telephone number provided by me, in accordance with Regulation 2016/679 of the European Parliament and of the Council of 27 April 2016 on the protection of individuals with regard to the processing of personal data and on the free movement of such data ("RODO"), and the Act of 18 July 2002 on the provision of electronic services. I am aware that providing the above personal data is voluntary and that I have the right to access and correct my data and that my consent may be revoked at any time. Please contact the Altkom Data Protection Officer: iodo@altkom.pl.

 

Zarejestruj się na webinar:

Wyrażam dobrowolnie zgodę na przetwarzanie moich danych osobowych dla potrzeb procesu realizacji zgłoszenia (pokaż więcej) przez Altkom Experts sp. z o.o. oraz Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warszawa), zgodnie z Rozporządzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych („RODO”). Mam świadomość, iż podanie powyższych danych osobowych jest dobrowolne, ale konieczne do obsługi zgłoszenia oraz że posiadam prawo dostępu do treści swoich danych i możliwość ich poprawiania a zgoda może być odwołana w każdym czasie. Kontakt do inspektora ochrony danych osobowych w Altkom: iodo@altkom.pl

Wyrażam dobrowolnie zgodę na przetwarzanie moich danych osobowych w celach marketingowych (pokaż więcej)przez Altkom Experts sp. z o.o. oraz Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warszawa)oraz otrzymywanie informacji handlowych drogą elektroniczną na adres e-mail i numer telefonu podany przeze mnie, zgodnie z Rozporządzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych („RODO”), oraz Ustawy z dnia 18 lipca 2002 r. o świadczeniu usług drogą elektroniczną. Mam świadomość, iż podanie powyższych danych osobowych jest dobrowolne oraz że posiadam prawo dostępu do treści swoich danych i możliwość ich poprawiania a zgoda może być odwołana w każdym czasie. Kontakt do inspektora ochrony danych osobowych w Altkom: iodo@altkom.pl

 

Zarejestruj się na webinar:

Wyrażam dobrowolnie zgodę na przetwarzanie moich danych osobowych dla potrzeb procesu realizacji zgłoszenia (pokaż więcej) przez Altkom Experts sp. z o.o. oraz Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warszawa), zgodnie z Rozporządzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych („RODO”). Mam świadomość, iż podanie powyższych danych osobowych jest dobrowolne, ale konieczne do obsługi zgłoszenia oraz że posiadam prawo dostępu do treści swoich danych i możliwość ich poprawiania a zgoda może być odwołana w każdym czasie. Kontakt do inspektora ochrony danych osobowych w Altkom: iodo@altkom.pl

Wyrażam dobrowolnie zgodę na przetwarzanie moich danych osobowych w celach marketingowych (pokaż więcej)przez Altkom Experts sp. z o.o. oraz Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warszawa)oraz otrzymywanie informacji handlowych drogą elektroniczną na adres e-mail i numer telefonu podany przeze mnie, zgodnie z Rozporządzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych („RODO”), oraz Ustawy z dnia 18 lipca 2002 r. o świadczeniu usług drogą elektroniczną. Mam świadomość, iż podanie powyższych danych osobowych jest dobrowolne oraz że posiadam prawo dostępu do treści swoich danych i możliwość ich poprawiania a zgoda może być odwołana w każdym czasie. Kontakt do inspektora ochrony danych osobowych w Altkom: iodo@altkom.pl

 

Zarejestruj się na webinar:

Wyrażam dobrowolnie zgodę na przetwarzanie moich danych osobowych dla potrzeb procesu realizacji zgłoszenia (pokaż więcej) przez Altkom Experts sp. z o.o. oraz Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warszawa), zgodnie z Rozporządzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych („RODO”). Mam świadomość, iż podanie powyższych danych osobowych jest dobrowolne, ale konieczne do obsługi zgłoszenia oraz że posiadam prawo dostępu do treści swoich danych i możliwość ich poprawiania a zgoda może być odwołana w każdym czasie. Kontakt do inspektora ochrony danych osobowych w Altkom: iodo@altkom.pl

Wyrażam dobrowolnie zgodę na przetwarzanie moich danych osobowych w celach marketingowych (pokaż więcej)przez Altkom Experts sp. z o.o. oraz Altkom Software & Consulting sp. z o.o. (ul. Chłodna 51, 00-867 Warszawa)oraz otrzymywanie informacji handlowych drogą elektroniczną na adres e-mail i numer telefonu podany przeze mnie, zgodnie z Rozporządzeniem Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich danych („RODO”), oraz Ustawy z dnia 18 lipca 2002 r. o świadczeniu usług drogą elektroniczną. Mam świadomość, iż podanie powyższych danych osobowych jest dobrowolne oraz że posiadam prawo dostępu do treści swoich danych i możliwość ich poprawiania a zgoda może być odwołana w każdym czasie. Kontakt do inspektora ochrony danych osobowych w Altkom: iodo@altkom.pl