Hej, hej... Programisto, to kolejny artykuł dla Ciebie! Druga część artykułu na temat wzorców projektowych. Poznaj Adapter oraz Memento.
Hej, dzisiaj jako Innokrea chcemy Wam opowiedzieć o blockchainie. Jeśli jesteście zainteresowani światem transakcji, kryptowalut i elektronicznych płatności to zapraszamy do lektury.
W dzisiejszych czasach dziennie odbywają się miliardy, jeżeli nie więcej, płatności, wykorzystujących liczne waluty z całego świata. W płatnościach tradycyjnych (gotówkowych) przekaz pieniędzy i autoryzacja odbywały się w sposób prosty – przeważnie w płatnościach wyróżnić można dwie strony – płatnika, który powinien przekazać pewne, ustalone środki odbiorcy, zazwyczaj w zamian za dostarczenie przez tego ustalonych dóbr na rzecz płatnika. Płatnik prezentował odpowiednią ilość gotówki odbiorcy. Ten wówczas miał za zadanie fizycznie zweryfikować (policzyć), czy zaprezentowana przez płatnika kwota zgadza się z ustaloną, a następnie przyjąć pieniądze (i zazwyczaj udokumentować ten fakt). Wówczas płatność można było uznać za zakończoną pomyślnie. Jeżeli jednak zaprezentowana kwota była niższa od umówionej, odbiorca nie przyjmował gotówki i płatność nie była realizowana – czego konsekwencją zazwyczaj było przerwanie pewnej transakcji, czyli zwolnienie odbiorcy z obowiązku realizacji konkretnej usługi lub przekazania na rzecz płatnika pewnych dóbr.
Rysunek 1 – Weryfikacja fizycznej płatności
Co jednak w przypadku, kiedy odbiorca nie jest w stanie zweryfikować, czy płatnik rzeczywiście jest w posiadaniu odpowiedniej ilości gotówki albo czy zamierza ją faktycznie przekazać? Taka sytuacja ma miejsce przy zawieraniu transakcji bezgotówkowych (czyli tych wykonywanych choćby kartą lub przelewem), kiedy posiadane pieniądze w pewnej walucie znajdują się w “wirtualnym portfelu” (np. na koncie) płatnika i nie mają one fizycznej reprezentacji. Wówczas niezbędna jest ingerencja trzeciej, godnej zaufania strony – która potwierdzi, że płatnik rzeczywiście środki posiada oraz zadba o przekazanie ich na rzecz odbiorcy. Taką instancję nazywa się zaufaną trzecią stroną (ang. TTP, Trusted Third Party) i zazwyczaj jej rolę pełnią banki lub podobni pośrednicy finansowi.
Rysunek 2 – Uproszczony schemat transakcji z zaufaną trzecią stroną
To rozwiązanie posiada niestety znaczące wady. Po pierwsze, ogromna ilość danych osobowych (zarówno płatnika, jak i odbiorcy) musi zostać udostępniona pośrednikowi, aby ten mógł rzeczywiście w sposób wiarygodny weryfikować przepływ środków. Ciężko wówczas zachować anonimowość, która w niektórych przypadkach może być pożądana. Drugim znaczącym problemem jest to, że w niektórych środowiskach możemy nie być w stanie w ogóle znaleźć godnego zaufania podmiotu – w końcu strony transakcji również muszą być w stanie zweryfikować prawdziwość, uczciwość i wiarygodność instancji pośredniczącej (lub instancji pośredniczących), aby móc polegać na nich i zaufać im w sprawie regulowania przepływu środków. Problem wyznaczenia takiej instancji obserwuje się szczególnie często w przypadku dokonywania transakcji na rynkach niekontrolowanych przez żadne rządy lub używając wirtualnych walut niewystępujących fizycznie w obiegu (tzw. kryptowalut).
A gdyby tak… Wszystkie transakcje były publiczne, a każdy mógł sprawdzić ich dotychczasowy przebieg? Gdyby dodatkowo każdą płatność traktować jak pewien blok (ang. block) w łańcuchu (ang. chain) płatności, dołączając informację o wszystkich dotychczas wykonanych operacjach i ich kolejności, a raz zatwierdzona transakcja nie mogła nigdy już być modyfikowana?
Korzystając z takiego jednego, wspólnego łańcucha transakcji dostępnego dla wszystkich, każdy miałby możliwość weryfikacji, czy płatnik rzeczywiście posiada wymagane środki – chociażby przeglądając historię jego płatności i sprawdzając, czy odpowiednia kwota nadal znajduje się na koncie. Taką technologię nazywa się blockchain.
Rysunek 3 – Korzystanie ze współdzielonego łańcucha transakcji w środowisku ograniczonego zaufania
W blockchainie z tzw. mechanizmem proof of work, każda transakcja jest grupowana w bloki, które muszą zostać zatwierdzone przed dodaniem do łańcucha. Aby zatwierdzić blok, wiele użytkowników (ang. miners) próbuje znaleźć dla nowej transakcji odpowiednie parametry hasha, aby spełniał on określone warunki (zazwyczaj wartość takiego hasha musi być mniejsza niż jakaś ustalona liczba). Jest to operacja trudna i czasochłonna – jeśli jednak użytkownikowi uda się uzyskać odpowiednią liczbę jako pierwszemu, sam uzyska nagrodę. Użytkownik, który pierwszy znajdzie odpowiedni hash, rozgłasza to wszystkim innym, którzy następnie mogą zweryfikować poprawność rozwiązania – warto zauważyć, że choć znalezienie wartości, która po dołączeniu do procesu hashowania dałaby odpowiedni wynik, tak już sprawdzenie, czy hash transakcji z podanymi parametrami spełnia warunki jest operacją bardzo prostą. Aby transakcja mogła zostać zatwierdzona i dodana do łańcucha, to większość użytkowników musi zgodzić się co do poprawności wartości hasha – osiągnąć konsensus (ang. consensus). Każdy blok w łańcuchu zawiera ponadto odniesienie do poprzedniego bloku (w postaci jego hasha) – przez to próba zmiany jakiejkolwiek transakcji wymagałaby zmiany wszystkich kolejnych bloków – czyli wykonywania dla każdej kolejnej transakcji opisanych pracochłonnych obliczeń – co jest praktycznie niemożliwe.
Jako, że mechanizm blockchain jest zdecentralizowany, to może dojść do pewnych opóźnień w synchronizacji – na przykład, kiedy w zbliżonym momencie odbyła się próba zrealizowania dwóch transakcji A i B, a część użytkowników dowiaduje się najpierw o A (i rozpoczyna już pracę nad znalezieniem odpowiedniego hasha), a reszta użytkowników najpierw zajmuje się B. Część sieci zatwierdza wówczas transakcję A, a inna część B, przez co powstają dwie wersje łańcucha. Użytkownicy kontynuują pracę na obu, ale ostatecznie (zazwyczaj po dodaniu odpowiedniej liczby kolejnych transakcji) dłuższy łańcuch zostanie uznany za prawidłowy (skoro szybciej rośnie, to prawdopodobnie pracuje nad nim więcej użytkowników), a krótszy – odrzucony. Warto zauważyć, że zapobiega to również sytuacji, w której użytkownik planowałby kilkukrotnie wydać wszystkie swoje środki w różnych transakcjach w tym samym czasie – nawet, jeżeli chwilowo powstanie kilka wersji łańcucha, ostatecznie zachowany zostanie tylko jeden z nich, udaremniając pozostałe operacje nieuczciwego płatnika. Zdecentralizowany charakter mechanizmu niesie za sobą jeszcze kilka innych wątpliwości, których omówienie jednak mogłoby stanowić odrębną serię wpisów – zainteresowanych odsyłamy do artykułu przedstawiającego walutę Bitcoin [1].
Choć blockchain z mechanizmem proof of work rozwiązuje problem braku zaufanej trzeciej strony poprzez decentralizację, uniemożliwia jakiekolwiek zmiany lub usunięcie zatwierdzonej transakcji, zapewnia wysoki stopień anonimowości oraz to, że po pewnym czasie wszyscy użytkownicy będą zgodni co do wyglądu łańcucha transakcji, to mechanizm ten nie pozostaje bez wad. Przede wszystkim, ze względu na dużą trudność znalezienia liczby, przy której transakcja mogłaby zostać opisana odpowiednim hashem, technologia ta mocno ogranicza możliwą do przeprowadzenia liczbę transakcji na sekundę (ang. Transactions per Second, TPS) – szacuje się, że obecnie z użyciem proof of work zatwierdzone może być jedynie kilka TPS, podczas gdy standardowe, scentralizowane mechanizmy płatności (jak np. Visa) dopuszczają takich transakcji wiele tysięcy [2]. Nie należy również pomijać aspektu wysokiego zużycia zasobów potrzebnego do wygenerowania odpowiedniego hasha – jednostka poszukująca musi wykonywać bardzo szybkie, intensywne obliczenia przez długi czas, co budzi zastrzeżenia pod kątem zarówno ekologicznym, jak i ekonomicznym. Proponowane są alternatywne metody zatwierdzania transakcji, takie jak proof of stake, w której najbardziej ufa się najzamożniejszym użytkownikom – jako, że to im najbardziej powinno zależeć na stabilności systemu finansowego. Tego typu rozwiązanie spotkać można m. in. w systemie Ethereum [3].
Powyższe opracowanie opisuje technologię blockchain na wysokim poziomie abstrakcji, stąd pewne szczegóły mogły zostać pominięte dla czytelności. Jeżeli natomiast chcielibyście dowiedzieć się więcej o mechanizmach używanych w tym procesie (np. hashowanie), zachęcamy do zapoznania się z naszymi artykułami dotyczącymi kryptografii Kryptografia – szyfry strumieniowe, Kryptografia – dobre praktyki odnośnie haseł, Kryptografia – o podstawowych pojęciach i definicjach, Kryptografia – losowość w cyberbezpieczeństwie. Do usłyszenia!