Usprawnienia u podstaw – czyli skalowanie warstwy pierwszej
Blockchain, pomimo wielu swoich zalet, posiada jedną dużą wadę, a mianowicie obecnie średnio się sprawdza przy dużym obciążeniu sieci. Niektóre rozwiązania są znacznie szybsze niż inne, jednak zazwyczaj dzieje się tak pewnym kosztem. Więcej na ten temat znajdziesz w zeszłotygodniowym poście, z którym polecam się zapoznać przed przystąpienie do obecnego wpisu. Na szczęście istnieją praktyczne sposoby, które mogą całkowicie rozwiązać problem skalowalności blockchaina. W dzisiejszym poście znajdziesz opis dwóch takich mechanizmów, czyli algorytmów konsensusu oraz shardingu. Ale zanim do nich przejdę, muszę powiedzieć jeszcze kilka słów na temat samego blockchaina, a mianowicie…
Blockchain jest jak cebula
Prawdopodobnie każdy kojarzy animację kultową animację Shrek, a jedna ze scen może posłużyć jako alegoria struktury blockchaina. Jeśli bajka ta jest dla Ciebie obca, to zdecydowanie polecam nadrobić te zaległości :).
W pewnym momencie Shrek tłumaczy Osłowi, co wspólnego mają ze sobą ogr i cebula. Moglibyśmy sparafrazować ten dialog i powiedzieć, że blockchain jest jak cebula. I nie, nie mam tu na myśli tego, że rozwiązania tworzone przy jego pomocy „śmierdzą”, chociaż faktem jest, że w okresach wysokiej hossy na rynku krypto powstaje dużo rozwiązań nastawionych na oszustwa. Nie jest to wina technologii, a jedynie kwestia związana z ludzką chciwością.
Wracając do naszej parafrazy. Blockchain można potraktować warstwowo, a rozwiązania dotyczące skalowania oprzeć o różne poziomy. W przypadku zdecentralizowanych łańcuchów, obecnie mówimy o czterech warstwach, a oznaczamy je numerami od 0 do 3. Ja skupię się najbliższym czasie na przedstawieniu rozwiązań dotyczących Warstwy 1 (ang. Layer 1, L1) oraz Warstwy 2 (ang. Layer 2, L2). Zanim opowiem, czym te poziomy są, warto przytoczyć jeden przykład dotyczący transportu publicznego, który pomoże zobrazować, czym jest skalowanie na różnych poziomach danej technologii.
Przemieszczając się z miejsca na miejsce chcielibyśmy to zrobić zazwyczaj jak najszybciej i jak najtaniej. Gdybyśmy do tego używali zawsze jednego typu pojazdu, ten cel byłby poza naszym zasięgiem. Na szczęście wraz z rozwojem technologii, wchodzą różne usprawnienia, które sprawdzają się lepiej w konkretnych sytuacjach.
Podróżując po dużym mieście samochodem w godzinach szczytu, prawdopodobnie utkniemy w korkach. Ale dzięki coraz lepszej technologii, możemy nabyć auta, które mają bardziej oszczędne silniki. Nie rozwiązuje to oczywiście problemu związanego z czasem przemieszczania się, jednak sprawia, że sama czynność staje się nieco tańsza.
Jeżeli chcielibyśmy zostać tylko przy samochodach, to musielibyśmy zwiększyć przepustowość samych dróg. Poszerzenie jezdni w niektórych przypadkach będzie dobrym rozwiązaniem, jednak nie da się tego robić w nieskończoność. Na szczęście istnieją inne metody transportu, które pomagają w skalowaniu całego ruchu. W mieście, w którym jest metro, bardzo duża liczba osób jest w stanie przemieścić się z punktu A do B, nie tworząc przy tym dodatkowych korków. Jeżeli dodalibyśmy do tego dobrze działającą komunikację miejską w postaci tramwajów i autobusów, to przepustowość dróg zdecydowanie wzrośnie. Szczególnie, że takie środki są w stanie pomieścić zdecydowanie więcej ludzi naraz, nie zajmując dużo więcej miejsca na drodze. Nie zrozum mnie źle, nie uważam, że nagle powinniśmy porzucić całkowicie samochody na rzecz transportu publicznego, co to, to nie. Ale powinniśmy zawsze dobierać odpowiednią broń do danego przeciwnika. Jeżeli jedziemy na duże zakupy, to zdecydowanie wygodniej będzie przywieźć je samochodem. Jeżeli natomiast wybieramy się na spotkanie w centrum miasta, prawdopodobnie lepszą opcją będzie tramwaj.
Przedstawione mechanizmy możemy podzielić na dwie grupy. Te, które stricte dotyczą ulepszeń związanych z samym samochodem np. wydajniejszy silnik oraz takie, które pomagają udrożnić ruch, usprawniając go na innym poziomie. Analogicznie sytuacja wygląda dla blockchaina. Możemy próbować ulepszać sam łańcuch, albo spróbować zrobić coś dodatkowego poza nim, co poprawi ogólne działanie całej sieci. Teraz możemy wrócić do wspomnianych warstw.
L1, najprościej mówiąc, to po prostu blockchain, który służy jako infrastruktura dla innych protokołów, aplikacji i sieci, które budowane są z jej wykorzystaniem. Główna charakterystyka takiego rozwiązania zależy przede wszystkim od algorytmu konsensusu, który zarządza działaniem sieci. Typowymi przykładami Layer 1 są Bitcoin i Ethereum. Każda sieć L1 charakteryzuje się również tym, że ma swój natywny token, który służy między innymi do pokrywania opłat transakcyjnych.
Mianem L2 nazywane są rozwiązania zbudowane w oparciu o Warstwę 1, a ich zadaniem jest odciążenie głównej sieci. Takie mechanizmy mogą również być osobną siecią, ale również odpowiednio napisaną aplikacją. Dobrymi przykładami rozwiązań L2 są np. Lightning Network, Polygon czy też zkSync.
Nazewnictwo, z którym możesz się również spotkać, to mechanizmy on-chain oraz off-chain. Pierwszy termin dotyczy Warstwy 1, drugi natomiast Warstwy 2.
Tak jak wspomniałem na początku, dzisiaj skupię się na przedstawieniu dwóch rozwiązań dotyczących Warstwy 1 i dlatego teraz możemy przejść już do pierwszego z nich.
Algorytmy konsensusu
Podczas gry w Chińczyka każdy gracz od początku zna wszystkie reguły. Wie, kiedy może wyjść z bazy, jak zbić drugiego pionka oraz co się dzieje w momencie wejścia do domku. Gdyby nie ustalone z góry, jasne i proste zasady, to gra nie miałaby najmniejszego sensu, ponieważ nie dałoby się zweryfikować poprawności ruchów. Dodatkowo wszyscy gracze siedzą razem w jednym miejscu, dlatego każdy z nich może kontrolować pozostałych i sprawdzać, czy nie oszukują. Podobnie sprawa wygląda w przypadku sieci opartych o blockchain, a wszystkie zasady dyktują tam algorytmy konsensusu.
Kilka miesięcy temu opisałem szczegółowo działania tych mechanizmów, dlatego nie ma sensu powtarzać tutaj wszystkich informacji. Jeżeli interesuje Cię głębiej ten temat to detale znajdziesz w tym poście, a teraz tylko z grubsza przypomnę temat.
W odróżnieniu do Chińczyka, w którym może brać udział maksymalnie czterech graczy, osoby korzystające z blockchaina należą do wielu różnych grup interesów. Są to m.in.: inwestorzy, interesariusze giełd kryptowalutowych, górnicy, walidatorzy, użytkownicy różnych zdecentralizowanych protokołów i wielu, wielu innych. Pomimo różnego rodzaju wzajemnych oddziaływań pomiędzy grupami, to każda z nich chciałaby z oczywistych względów, aby korzyść płynąca z danej sieci była jak największa dla nich samych. Dlatego dobry algorytm konsensusu powinien, poza koordynowaniem i zabezpieczaniem sieci, z jednej strony nagradzać za dobre zachowania, a z drugiej karać za oszustwa, a wszystko należy oprzeć o jasne i przejrzyste zasady.
Od tego, jak skonstruowany jest konkretny algorytm zależy, czy dana sieć jest bezpieczna, dobrze zdecentralizowana i odpowiednio wyskalowana. Jak już wiesz, osiągnięcie tych trzech cech naraz w prosty sposób może być wręcz niemożliwe. Dlatego wybierając dany algorytm, poświęcamy pewne zalety na rzecz innych. Dla przykładu mechanizm Proof Of Work (PoW), o który opiera się Bitcoin, sprawia, że cała sieć jest niesamowicie bezpieczna i zdecentralizowana, jednak ma ogromne problemy ze skalowalnością. Natomiast blockchainy używające algorytmu Proof of Stake (PoS) są zdecydowanie szybsze, ale potencjalnie może się okazać, żę ich największym problemem będzie brak decentralizacji. Dzieje się tak, ponieważ w obecnym systemie finansowym, zdecydowanie łatwiej jest wydrukować pusty pieniądz, przy pomocy którego skupi się odpowiednie ilości kryptowaluty służącej do zabezpieczania sieci PoS, niż zbudować odpowiednio duże kopalnie potrzebne do przejęcia blockchaina PoW. Oczywiście mowa o porównaniu dużych rozwiązań, takich jak Bitcoin i Ethereum, ponieważ małe i nowe sieci są stosunkowo prostym celem ataku.
Do tej pory powstało przynajmniej kilkanaście mechanizmów konsensusu. Każdy z nich ma zarówno wady jak i zalety, jednak jeśli spojrzymy, które algorytmy tak naprawdę są wykorzystywane w obecnych sieciach, okaże się że głównie korzysta się albo Proof of Work albo Proof of Stake. Na stronie UnblockTalent znajdziesz raport, który pokazuje, jakich mechanizmów konsensusu używa sto projektów blockchainowych o największej kapitalizacji rynkowej. Co prawda w chwili pisania tego tekstu, dane tam nie są do końca aktualne, bo chociażby nie uwzględniono jeszcze zmian dokonanych przez Ethereum. Niemniej jednak dzięki obecnej dominacji samego Bitcoina nad innymi kryptowalutami, jego algorytm stanowi zdecydowanie większą część diagramu.
Obecnie wydaje się, że przytoczone dwa rozwiązania, pomimo swoich ograniczeń, są najlepszym wyborem. W celu wyskalowania blockchaina możemy zmienić jego algorytm konsensusu, ale musimy być świadomi, że często odbywa się to kosztem decentralizacji lub bezpieczeństwa. Możliwe, że w przyszłości powstaną nowe mechanizmy, które usprawnią cały proces, dlatego warto nad nimi pracować.
Sharding
Zanim omówię kolejny pomysł na polepszenie skalowalności blockchaina, udajmy się raz jeszcze na przejażdżkę samochodem. Tym razem zamiast poruszać się po mieście, wyruszymy w podróż nad nasze morze. Wyobraź sobie, że jest letni poranek, przygotowane auto stoi pod domem i z myślą, że za kilka godzin będziesz się delektować goframi, spacerując po polskiej plaży, rozpoczynasz swoją drogę. Niestety po krótkim czasie okazuje się, że na identyczny pomysł wpadła masa innych osób. Dlatego teraz zamiast smażyć się na słońcu, siedzisz wciąż w samochodzie po środku dwupasmowej autostrady w gigantycznym korku.
Ponieważ tak bardzo kochasz nasze polskie morze, w kolejnym roku decydujesz się na taką samą podróż. Po zeszłorocznych przygodach wiesz czego się spodziewać, dlatego uzbrajasz się w solidną cierpliwość. Jednak okazuje się, że ruch w tym roku jest jakby nieco bardziej płynny, nie idealny, ale poruszasz się nieco szybciej. To wszystko dzięki temu, że wybudowano dwa dodatkowe pasy.
Podobna sytuacja powtarza się co roku i przez pięć kolejnych lat autostrada została poszerzona trzykrotnie. Tym razem, pomimo ogromnej liczby samochodów na drodze, nikt nie stoi w korku, a Ty cieszysz się płynną jazdą.
Nawet jeśli przedstawiona sytuacja nie jest możliwa do zrealizowania w naszym świecie, to dobrze obrazuje to, czym jest sharding w odniesieniu blockchaina. Można powiedzieć, że mechanizm ten polega na dodaniu wielu dodatkowych pasów ruchu na blockchainowej autostradzie.
Jeśli bazy danych nie są Ci obce, to pewnie znasz już samo pojęcie shardingu i z czym on się wiąże. Jeżeli nie, to wystarczy powiedzieć, że nie powinno się trzymać wszystkich jajek w jednym koszyku. Fraza ta często odnosi się do inwestycji i oznacza, że nie należy wrzucać całego naszego kapitału w jedno aktywo, np. w kryptowaluty, ponieważ jeśli coś zawiedzie akurat w tej sferze, to stracimy wszystkie swoje pieniądze. W przypadku baz danych, chodzi w uproszczeniu o podział danych na mniejsze części i umieszczenie ich na wielu różnych serwerach.
Jeżeli chodzi o blockchain, to sprawa wygląda nieco inaczej, a mianowicie mówimy tutaj o podziale jednego łańcucha na kilka równolegle ze sobą współpracujących tzw. shardów. Mechanizm ten ma zostać w przyszłości wprowadzony w Ethereum, przez co sieć ta będzie mogła składać się równocześnie z 64 takich części. Dla przykładu, Ethereum 2.0 będzie mogło składać się równocześnie z 64 takich części.
Sharding może okazać się jednym ze sposobów, które pomogą rozwiązać problem trylematu blockchainowego, który został opisany poprzednim razem. Nawet jeśli on sam nie wystarczy do ostatecznego pozbycia się tego wyzwania, to łącząc go z innymi mechanizmami możemy osiągnąć ten efekt.
Kolejną dużą zaletą shadingu jest fakt, że dzięki niemu będzie można zmniejszyć ilość miejsca, którego potrzebują węzły do przechowywania historii blockchaina.
Póki co wszystko wygląda bardzo obiecująco, jednak istnieją też minusy, albo powinienem powiedzieć raczej wyzwania, z którymi trzeba będzie sobie poradzić.
Pierwszym z nich jest komunikacja między shardami. Sharding to mechanizm, gdzie działa równolegle wiele blockchainów i doświadczymy sytuacji, kiedy jeden z nich będzie potrzebował danych z drugiego. W takim wypadku samo przesyłanie wiadomości między nimi musi być również bardzo szybkie, ponieważ w innym wypadku to miejsce może stanowić wąskie gardło. Dlatego tak niezbędna będzie dobra koordynacja sieci.
Kolejnym zagrożeniem jest potencjalne przejęcie przez atakującego jednego z shardów. Co się stanie, jeśli dane na którymś ze współpracujących blockchainów zostaną w jakiś sposób uszkodzone lub zmanipulowane? Może to prowadzić ostatecznie do całkowitej utraty informacji.
Jeszcze inną kwestią jest to, jak dostosować niektóre obecne rozwiązania takie jak np. Simplified Payment Verification (SPV) do nowego podejścia. Nie będę teraz zagłębiaj się w to, czym jest ten mechanizm, ale jeśli Cię to interesuje w tej chwili to na tej stronie znajdziesz niezbędne informacje. Oczywiście istnieją już pomysły, jak te wszystkie kwestie rozwiązać- zainteresowanym polecam zapoznać się z materiałami dostępnymi pod adresem ethereum.org.
Sharding ma szansę okazać się jednym z ważniejszych usprawnień technologii blockchain, jednak dopóki wszystkie rozwiązania potencjalnych zagrożeń nie zostaną odpowiednio przetestowane, nierozsądne byłoby implementowanie go na dużą skalę. Dlatego w przypadku Ethereum wszystkie zmiany przygotowywane są powoli i planowane terminy aktualizacji zazwyczaj się opóźniają, ponieważ tak ważne jest to, aby zapobiec sytuacji, w której potencjalne błędy pogrążą całą sieć.
W tym miejscu zakończę dzisiejszy wpis i omawianie rozwiązań, które pomagają w skalowaniu blockchaina na poziomie Warstwy 1. Ale już za tydzień wrócę z kolejnym postem, w którym przejdę do omówienia usprawnień dotyczących Warstwy 2, a rozpocznę od kanałów (ang. channels) oraz łańcuchów bocznych (ang. sidechains).