Czym różni się aplikacja zdecentralizowana od klasycznej aplikacji? Gdzie i kiedy stosować blockchain? O co chodzi ze smart kontraktami? Od podstaw do architektury w kilku akapitach!
Czym jest blockchain?
Blockchain to specyficzny rodzaj bazy danych. Wprowadzane dane lądują w blokach. Bloki są numerowane i podpisywane za pomocą hashy tworząc łańcuch bloków.
Hash (podpis) to wynik funkcji skrótu obliczonej na podstawie numeru bloku, danych oraz hasha bloku poprzedniego. Wiążemy kolejne bloki podpisami, aby zapewnić ich niezmienność.
Jeśli zmienimy dane w pierwszym bloku (wystarczy jeden znak), to zmieni się jego podpis – dane są jednym z argumentów funkcji hashującej. Gdy hash pierwszego bloku ulegnie zmianie, to funkcja wykonana dla drugiego bloku również zwróci inny podpis, ponieważ jej argumentem jest hash bloku pierwszego.
Wniosek? Modyfikując dane x bloków wstecz, musimy ponownie obliczyć podpisy dla x bloków. Zmiana danych w bloku = konieczność znalezienia hashy dla kolejnych bloków w łańcuchu.
Jak długo zajmie przeliczenie np. 1000 hashy? Twój telefon zrobi to w mniej niż sekundę, a więc gwarancja niezmienności przedstawionej struktury jest wątpliwa 🙂
Jak utrudnić wprowadzanie zmian? Wystarczy nałożyć na hash dodatkowe warunki np. wygenerowany podpis jest poprawny, gdy po przeliczeniu do systemu dziesiętnego jest mniejszy od 100 milionów. Proces znalezienia hasha spełniającego określone warunki będzie wymagał czasu i mocy obliczeniowej.
Ale jak to? Przecież z tych samych argumentów nie dostaniemy różnych wyników? Wprowadzamy zmienność hasha przekazując do funkcji dodatkowy argument np. losową liczbę. Podstawiamy kolejne liczby generując hashe tak długo, aż znajdziemy poprawny podpis.
podpis = funkcja skrótu (nr bloku, dane, hash poprzedniego bloku, liczba)
Proces w zależności od implementacji może potrwać od kilkunastu sekund do kilkudziesięciu minut. Jeżeli zapis pojedynczego bloku zajmuje np. 10 minut (jak w Bitcoin), to wprowadzanie zmian w zaksięgowanych blokach staje się trudne.
Blockchain jako baza danych
Blockchain to tylko technologia – sposób przechowywania danych. Nie musisz korzystać z istniejących implementacji. Możesz napisać własny algorytm w dowolnym języku programowania i wykorzystać go na backendzie swojej aplikacji do przechowywania danych.
Może to być główna baza danych dla backendu w architekturze monolitowej (pojedyncza usługa) lub jedna z wielu działająca obok klasycznej bazy np. w architekturze opartej o mikroserwisy.
Możesz mieć jeden blockchain lub kilka odrębnych dla poszczególnych usług. Wszystkie chwyty i konfiguracje są dozwolone – w końcu to Twój serwer i Twoje usługi 😉
Tylko w zasadzie po co? Dlaczego nie korzystać zawsze np. z relacyjnej bazy SQL, a jeśli relacje nie są potrzebne, to może NoSQL?
Ustaliliśmy, że blockchain to taka baza danych zabezpieczona przed zmianą za pomocą algorytmów kryptograficznych. Raz wprowadzone dane zostają tam na zawsze, a ich zmiana jest bardzo trudna.
Jeśli zapisujemy tam np. informację o dacie wyprodukowania określonej partii żywności, to nasi klienci mają pewność, że dostarczamy im świeże produkty i data na opakowaniu nie została po drodze kilkukrotnie przebita.
W przypadku klasycznej bazy producent lub hurtownia może modyfikować takie dane bez ograniczeń. Stosując blockchain budujemy zaufanie w oparciu o technologię – niezaprzeczalny rejestr.
Problem? Mamy aktualnie centralny punkt przechowywania danych – łańcuch leży na naszym serwerze lub w chmurze, którą zarządzamy. Jesteśmy jego właścicielem i w każdej chwili możemy go usunąć lub podmienić, a modyfikacja, choć czasochłonna i trudna, to nadal jest możliwa. Trochę kulawa gwarancja niezmienności i brak pełnego zaufania…
Sieć blockchain – decentralizacja
Aby zagwarantować niepodważalność danych zapisanych w blockchain, wprowadzamy pojęcie sieci blockchain. Sieci połączonych ze sobą węzłów, które wspólnie utrzymują łańcuch bloków.
Węzeł to po prostu maszyna, a dokładniej proces w systemie wykonujący kod klienta określonej sieci blockchain (algorytm). Każdy węzeł posiada kopie rejestru i czuwa nad jego poprawnością.
Jeśli nawet lokalnie zmanipulujesz swój łańcuch, to pozostałe węzły w sieci od razu go odrzucą. Dopiero teraz blockchain jest godny zaufania i realnie zapewnia niezmienność wprowadzonych danych.
Możemy doprecyzować definicję. Blockchain to rozproszona baza danych (rejestr) zabezpieczona przed zmianą za pomocą algorytmów kryptograficznych.
Czy można zhakować blockchain? Jasne! Wystarczy, że masz wystarczająco dużo czasu, mocy obliczeniowej i większość węzłów w sieci, aby przekonać resztę, że Twoja wersja jest tą właściwą. W aktualnych sieciach przy węzłach liczonych w tysiącach jest to praktycznie niemożliwe.
Implementacja protokołów odpowiedzialnych za utrzymanie tak rozproszonej struktury nie jest trywialna. Mechanizmy służące do ustalenia jednej wspólnej wersji blockchain i osiągnięcia porozumienia między węzłami w sieci nazywamy algorytmami konsensusu.
Najpopularniejszym z nich jest Proof of Work (PoW), w którym spośród węzłów wyróżniamy tzw. górników udostępniających swoją moc obliczeniową w zamian za natywną kryptowalutę danej sieci. Górnicy szukają poprawnych podpisów dla kolejnych bloków zgodnie ze schematem przedstawionym w pierwszej części artykułu – podstawiają liczbę do funkcji.
Czy jest sens budować własną publiczną sieć blockchain? Najczęściej nie. Algorytmy są trudne i skomplikowane, a zbudowanie społeczności czasochłonne. Możesz tworzyć aplikacje i rozwiązania komercyjne na istniejącej infrastrukturze, ale o tym w dalszej części 😉
Jak działają sieci kryptowalut?
Przyjrzyjmy się dokładniej danym zapisywanym w blokach. W sieciach kryptowalut są to po prostu transakcje walutowe. Informacje o transferze wartości między użytkownikami sieci.
Dodatkowo każda z transakcji jest podpisana cyfrowo przez nadawcę. Nie chcesz przecież, aby ktoś w Twoim imieniu przelał środki na inne konto. Każde konto posiada adres, klucz publiczny i prywatny – kryptografia asymetryczna.
Jak sprawdzić balans konta? Wystarczy przeanalizować wstecz wszystkie transakcje z nim związane.
Jak działa programowalny blockchain?
W sieciach programowalnych wyróżniamy dodatkowe typy transakcji. Możemy wdrażać skompilowane fragmenty kodu zwane smart kontraktami, a następnie wykonywać ich funkcje. Wywołania wpływające na wartość zmiennych smart kontraktu (jego stan) zapisują się w blokach w formie transakcji.
Raz wdrożony kod bajtowy zostaje w blockchain na zawsze. Użytkownicy mogą za pośrednictwem adresu kontraktu odwoływać się do jego funkcji – odczytywać i zapisywać dane.
Wykonanie funkcji zapisującej wymaga wysłania transakcji do sieci, zajmuje czas i generuje koszty. W przeciwieństwie do odczytu, który jest szybki i darmowy.
Czym jest smart kontrakt?
Można powiedzieć, że inteligentny kontrakt jest niewielkim programem wykonywanym w trybie zapisu wywołań na blockchainie. Co to oznacza? Jeśli funkcje reprezentują akcje biznesowe np. kupno biletu, wygranie loterii czy oddanie głosu na walnym zgromadzeniu, to mamy w pełni transparenty, niezaprzeczalny system.
Użytkownicy oraz zewnętrzni obserwatorzy nigdy nie podważą zdarzeń, które miały miejsce w przeszłości. Wiemy kto, kiedy, jaką funkcję, na jakim smart kontrakcie wykonał. Nie potrzebujemy zaufanej strony trzeciej do rozstrzygania sporów.
Poniżej znajdziesz przykładowy kod kontraktu napisany w języku Solidity. Jest to język stosowany w najpopularniejszej programowalnej sieci blockchain Ethereum. Smart kontrakty możesz rozwijać i kompilować w środowisku Remix – dostępne z poziomu przeglądarki.
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; contract FirstContract { string public message; constructor(string memory initialMessage) { message = initialMessage; } function setMsg(string memory newMessage) public { message = newMessage; } }
Jak wejść w interakcję z siecią? Jak łączyć się, aby zapisywać i odczytywać dane? Wysyłać transakcje walutowe, wdrażać smart kontrakty i wykonywać ich funkcje? Możesz wykorzystać wtyczkę MetaMask, która współpracuje z większością przeglądarek.
Czym są zdecentralizowane aplikacje?
DApp (Decentralised Application) to aplikacja z backendem w postaci smart kontraktu. Interfejs użytkownika napisany w jednym z JavaScriptowych frameworków np. Angular lub React pobiera i zapisuje dane w sieci blockchain.
Jak wygląda architektura takiego rozwiązania? Frontend wskazuje adres umieszczonego na blockchainie smart kontraktu i wchodzi z nim w interakcję za pośrednictwem biblioteki Web3 (Ethereum JavaScript API).
Nawiązanie połączenia z siecią Ethereum odbywa się za pomocą wtyczki MetaMask – DApp działa w kontekście aktywnego konta użytkownika (portfela). W praktyce wtyczka wstrzykuje do okna przeglądarki obiekt window.ethereum, który przekazujemy do biblioteki Web3.
Co z użytkownikami, którzy nie mają portfela? Prezentujesz im aplikację przynajmniej w trybie tylko do odczytu – nie zapisujesz nic w blockchain, nie generujesz transakcji.
Jednak do odczytu nadal potrzebujesz połączenia z siecią. Są dwie opcje: własny węzeł lub zewnętrzne API. Utrzymanie węzła o wysokiej dostępności przechowującego kopie blockchain np. w chmurze może być kosztowne. Na początek rekomenduję zewnętrzne, w pełni skalowalne API, takie jak Infura.
Na stronie State of the DApps znajdziesz tysiące istniejących aplikacji zdecentralizowanych. Rankingi i statystyki z podziałem na kategorie. Jest to świetne miejsce do czerpania inspiracji i badania rynku.
Kiedy stosować blockchain?
Blockchain umożliwia zbudowanie zaufania między jednostkami bez pośredników. Nie potrzebujemy banków do transferu wartości, urzędów do wydawania certyfikatów i stron trzecich do rozstrzygania sporów.
Gdzie zastosować niepodważalną i w pełni transparentną bazę danych? Wszędzie tam, gdzie występuje konflikt interesów i podmioty, które wzajemnie sobie nie ufają.
Jeśli mamy tylko jedną stronę lub wszystkie strony zgadzają się ze sobą i wzajemnie sobie ufają, to blockchain będzie przerostem formy nad treścią.
Chcesz więcej?
Wow! Przeszliśmy od totalnych podstaw, przez smart kontrakty do zdecentralizowanych aplikacji na dość ogólnym poziomie.
Jeśli chcesz zgłębić temat – nauczyć się projektować, testować i wdrażać smart kontrakty, to zapraszam Cię do intensywnego kursu online, który nagrałem dla wydawnictwa Helion.
Może Twój kolejny projekt będzie DAppem? Podziel się w komentarzu swoją opinią na temat technologii blockchain. Ma przyszłość? 🙂