Maciej Sikora: Decentralizacja oprogramowania

Maciej Sikora: Decentralizacja oprogramowania

Oprogramowanie jest produktem i - jak każdy inny produkt - podlega prawom własności. Jest wręcz naturalne, że za każdym programem stoi właściciel, firma, osoba czy organizacja, która za niego odpowiada, gwarantuje pewne funkcjonalności i ustala zasady na jakich można z niego korzystać. Okazuje się jednak, że jest możliwa realizacja oprogramowania, które nie jest niczyją własnością i nie posiada podmiotu, który je kontroluje. Na pierwszy rzut oka wydaje się to karkołomnym pomysłem, ale wejdźmy w temat głębiej. 

Dzisiejszy Internet charakteryzuje centralizacja oprogramowania 

Zacznijmy od początku, czyli od tego, do jakiego typu aplikacji użytkownicy są przyzwyczajeni. Ujmując rzecz bardzo ogólnie, są to aplikacje typu klient-serwer, czyli aplikacje rozróżniające dwie strony każdej akcji - serwer, który jest dystrybutorem danych (podmiotem zaufanym) i klienta. Klientem możemy nazwać komputer użytkownika, ale również inny system korzystający z danych dystrybutora. W tej relacji mamy do czynienia z dysproporcją praw. Otóż dystrybutor jest stroną dominującą, ustalającą zasady, a klient całkowicie bazuje na otrzymanych danych i polega na ich poprawności. Przykładami takich aplikacji są Facebook, Twitter czy Instagram, ale również aplikacje usługowe jak Google Maps. Należą one do globalnych korporacji, które mają realny wpływ na ich działanie i rozwój. Niestety taka zależność powoduje, że producenci oprogramowania mają bezpośredni dostęp do danych które są przez te aplikacje gromadzone (śledzenie użytkowników). Mają również realny wpływ na to co jest dozwolone, a co nie. Najgorsze jednak jest to, że mogą dowolnie naginać lub zmieniać ustalone wcześniej przez siebie zasady. Wyobraźmy sobie, że Google Maps bez konkretnego powodu może usunąć pewne firmy z mapy, w celu utrudnienia znalezienia ich klientom. Niestety, taka praktyka może być realizowana i użytkownicy nie mają na to żadnego wpływu. 

Aplikację, którą kontroluje jeden podmiot nazywamy scentralizowaną. W tym wypadku użytkownicy korzystający z oprogramowania muszą mieć zaufanie do podmiotu kontrolującego i wierzyć, że z oprogramowaniem wiążą się pewne ustalone zasady i regulamin oraz, że producent dochował staranności w ochronie ich danych. Mamy więc do czynienia z podmiotem zaufanym i kontrolującym w jednym. Należy zauważyć, że praktycznie każda obecnie istniejąca aplikacja jest scentralizowana, czyli użytkownik zobowiązuje się przestrzegania pewnych zasad i ufa, że druga strona (podmiot kontrolujący) również będzie przestrzegała praw użytkownika. 

Weźmy najprostszy przykład przepływu danych w scentralizowanej aplikacji typu komunikator: 

Przepływ informacji dla komunikatora scentralizowanego 

Każda wiadomość wysyłana między użytkownikami przechodzi przez podmiot zaufany (Trusted Party). Obie strony muszą wierzyć, że ich wiadomość zostanie przesłana w formie, w jakiej została napisana oraz, że dostaną niezmienioną formę wiadomości przekazanej przez rozmówcę. Poważniejszym zagadnieniem w tym kontekście są na przykład transakcje bankowe. Użytkownik dokonujący przelewu środków musi wierzyć, że bank przekaże pieniądze do odbiorcy - dlatego też zaufanie w systemach bankowych jest tak ważne. Klient musi mieć gwarancję, że jego pieniądze są bezpieczne. Aplikację scentralizowaną prezentuje poniższy diagram:

Aplikacja scentralizowana

TP - Trusted Party - Podmiot zaufany 

Decentralizacja 

Zupełnie innym podejściem do realizacji aplikacji jest decentralizacja. Mamy tu do czynienia z apllikacją bez podmiotu zaufanego, bez właściciela i jednego punktu centralnego. Najbardziej znanym tego typu oprogramowaniem jest Bitcoin który w oparciu o technologię blockchain pozwala na realizację w pełni transparentnych transferów kryptowaluty między użytkownikami. Sieć Bitcoin została skonstruowana tak, że każda transakcja pojawiająca się w systemie jest dokładnie weryfikowana pod względem jej poprawności i autentyczności. Jest to możliwe dzięki temu, że każdy użytkownik podłączony do sieci posiada lokalnie zapisane wszystkie transakcje w systemie. Taka pełna wiedza każdego uczestnika sieci pozwala na weryfikację danych bez łączenia się z podmiotem centralnym. W systemie zdecentralizowanym nie ma więc potrzeby ufać czy wierzyć, każdy użytkownik takiego systemu ma wystarczające informacje, aby samemu zweryfikować otrzymane dane.

Aplikacja zdecentralizowana

Jakie jest jednak zastosowanie takiej decentralizacji? Czy naprawdę potrzeba istnienia podmiotu, któremu ufa użytkownik jest złe? Nie - oczywiście, że zaufanie nie jest złe, ale czasami samo istnienie tylko jednego podmiotu zaufanego nie jest wskazane. Najbardziej logicznym przykładem są systemy wyborcze. Głosowanie zawsze opatrzone jest dozą spekulacji, że jakiś podmiot chce zmienić lub nagiąć wynik. W takiej sytuacji, w celu pozbycia się wątpliwości, możemy zaproponować zdecentralizowany system wyborczy który będzie siecią jednostek zbierających głosy i kontrolujących się nawzajem. W takiej sytuacji próba zmiany wyniku w jednym węźle szybko jest wykryta przez inne jednostki.  

Drugim przykładem jest platforma wymiany informacji odporna na próby cenzury. System scentralizowany jest bardzo łatwym celem ataku, np. może zostać relatywnie łatwo wyłączony, ponieważ znajduje się w jednym miejscu. Jako, że system zdecentralizowany posiada wiele jednostek, trudniej go zatrzymać, a eliminacja pojedynczej instancji nie zaburza działania całości. Jest też łatwiejszy do skalowania, co powoduje, że potencjalna chęć “zatrzymania” go jest wyjątkowo trudna. 

Wracając do przykładu komunikatora, który był wcześniej pokazany w wersji scentralizowanej. Jak może to wyglądać w aplikacji zdecentralizowanej?

Przepływ informacji dla komunikatora zdecentralizowanego 

Od razu możemy sobie zadać pytanie - dlaczego wiadomość od Michaela do Kate przesyłana jest również przez innych uczestników sieci? Otóż, jest to konieczne do weryfikacji, że taka zmiana stanu ( wysłanie wiadomości ) miało miejsce i jest autentycznie zrobiona przez tego użytkownika. Uczestnicy sieci weryfikują wiadomość przesłaną przez Michaela i weryfikują jej poprawność przy okazji synchronizując sieć. Gdyby wiadomość była przesłana tylko od Michaela do Kate wtedy Kate musiałaby mieć pełne zaufanie do wysyłającego oraz pełne zaufanie do własnego komputera (który również mógł zostać zaatakowany). Główną zasadą systemu zdecentralizowanego jest równość wszystkich uczestników pod względem możliwości oraz wiedzy. Każdy element sieci posiada pełne dane w niej zgromadzone, czyli sieć pozostaje skalowalna nawet tylko z jednym uczestnikiem. Gdy mówimy o przesyłaniu danych przez innych uczestników - sam fakt jawności lub szyfrowania takich danych jest już po stronie implementacji danej aplikacji zdecentralizowanej i przy odpowiednich zabezpieczeniach żaden inny użytkownik sieci nie podejrzy tej wiadomości.

Centralizacja czy decentralizacja 

Nie jest oczywiście tak, że decentralizacja powinna być realizowana w każdej sytuacji. Powiem więcej - pełna decentralizacja systemów jest po prostu niemożliwa. Systemy informatyczne odzwierciedlają relacje, jakie istnieją w świecie, systemy bankowe są scentralizowane, ponieważ to one decydują o obrocie środków swoich klientów, instytucje państwowe są scentralizowane, bo to one odpowiadają za ewidencję czy wypłatę środków publicznych. Pełna decentralizacja takich systemów wiązałaby się więc bezpośrednio również z anarchizacją takich instytucji. Biorąc pod uwagę powyższe - wielce prawdopodobne, że podmioty zaufane takie jak instytucje państwowe, finansowe czy też producenci oprogramowania pozostaną w znanej nam formie. 

Kluczem do wykorzystania technologii oprogramowania zdecentralizowanego jest wykorzystanie jej w ramach istniejących struktur scentralizowanych. Takie hybrydowe podejścia, czyli decentralizacja w ramach jednego lub kilku podmiotów jest najbardziej prawdopodobną do wdrożenia. Technologia blockchain, ze względu na mechanizmy kontrolowania, decentralizacji oraz synchronizacji danych, może być wykorzystana do zwiększenia bezpieczeństwa transakcji finansowych. Może zostać również użyta do połączenia kilku instytucji finansowych, w celu zwiększenia transparentności oraz ustanowienia samokontrolującej się i bezpiecznej komunikacji między nimi. 

Warto wspomnieć o obecnie najbardziej popularnym tego typu rozwiązaniu - technologii Ethereum, która oprócz transferu pieniądza umożliwia tworzenie programów rozproszonych, tzw. Inteligentnych Kontraktów (Smart Contract). Taki Inteligentny Kontrakt jest programem komputerowym, który po wdrożeniu do sieci Ethereum nie może być zmieniony, a co za tym idzie, twórca traci nad nim jakąkolwiek kontrolę i program staje się samodzielnym tworem, który działa na zasadach zdefiniowanych w kodzie od samego początku.