Kiedy utkniesz w korku – czyli problem skalowalności blockchaina
W zeszłym miesiącu miała miejsca aktualizacja Ethereum o nazwie “The Merge”. Pomimo sukcesu tego przedsięwzięcia, wiele osób czuje się zawiedzionych. Nie mam tutaj na myśli smutków związanych ze spadkiem ceny samego ETH, ale oczekiwań co do prędkości Ethereum. Trzeba uczciwie przyznać, że bierze się to raczej z niezrozumienia czym “The Merge” był i tego, że nie miał on poprawić wydajności samej sieci. Ponieważ w najbliższej przyszłości sytuacja się nie zmieni, dlatego warto poznać nieco więcej szczegółów dotyczących skalowalności blockchaina.
W tym poście opowiem z czego wynikają problemy związane z wydajnością różnego rodzaju łańcuchów oraz dlaczego niektóre są szybkie, kiedy inne przetwarzają transakcję w ślimaczym tempie, natomiast w przyszłych wpisach opiszę rozwiązania, które starają się sprostać wyzwaniom związanym z wydajnością. Zapraszam do lektury:)
Kiedy jesteś zbyt popularny
Kiedy nowa technologia wchodzi na rynek, używana jest na początku jedynie przez garstkę ludzi. Samochody, telefony komórkowe, Internet, to przykłady rozwiązań, które z czasem stały się niezwykle popularne, mimo że wiele osób nie dawało im na to szans. W przypadku tych technologii z czasem przybywało coraz więcej osób, które z nich korzystały, co w niektórych momentach sprawiało, że ich sukces mógł się przerodzić w ich największy i pociągnąć je na same dno. Dzieje się tak, ponieważ wraz ze wzrostem użytkowników pojawiają się problemy, którymi nie przejmowano się na samym początku i których nie da się dłużej unikać.
Weźmy na tapet przykład samochodów. Każda osoba mieszkająca w większym mieście wie, jakie korki powstają w godzinach szczytu. To i tak nic w porównaniu z tym, co działoby się, gdybyśmy używali infrastruktury drogowej sprzed 100 lat, która była przystosowana do “nieco” mniejszego ruchu.
Również telefonia komórkowa pokazała, jak rozwój technologii może nie nadążyć za wzrostem liczby użytkowników. Jeszcze kilka lat temu można było doświadczyć kompletnego braku możliwości dodzwonienia się do kogokolwiek w czasie ogromnego obciążenia sieci. Dobrym przykładem były noce sylwestrowe, gdy połączenie się z kimkolwiek po godzinie 24 graniczyło z cudem. Jednak dzięki ulepszonym rozwiązaniom obecnie taki problem już praktycznie nie występuje. Takich przykładów można znaleźć setki, jeśli nie tysiące, jednak z czasem ludzie zapominają, że technologia, której dzisiaj używają, przeszła ogromne zmiany od momentu swojego powstania.
Nie inaczej jest z blockchainem. Gdy w 2009 roku wystartował Bitcoin, nikt nie zajmował się problemem oczekujących transakcji oraz dużych opłat. Po pierwsze, sama technologia znana była jedynie bardzo wąskiej grupie osób i prawdopodobnie większość z nich nie sądziła, że tak szybko rozwiązanie to trafi do ogromnego grona odbiorców. Według niektórych źródeł blockchain jest rozwiązaniem, którego adopcja postępuje najszybciej w historii. Trzeba przyznać, że pomaga w tym fakt, iż podstawą dla tego rozwiązania jest Internet, który zdążył już się rozprzestrzenić po świecie. Z jednej strony jest to błogosławieństwo, z drugiej zaś przekleństwo, ponieważ liczba użytkowników blockchaina rośnie zdecydowanie szybciej niż rozwój technologii na to pozwala.
Jeśli przeanalizujemy dane pochodzące z Bitcoina, to zauważymy, że pierwszy duży przyrost nowych osób na tej sieci wystąpił w 2013 roku, kolejny w 2017 i ostatnio w 2021. Każda taka sytuacja związana była z kolejnymi hossami na rynku kryptowalut. Kiedy sytuacja się uspokaja i większość ludzi czyhających na szybki zysk odchodzi z rynku, sama technologia rozwija się dalej, czemu towarzyszą kolejne, spokojniejsze wzrosty użytkowników. Bliźniaczo wygląda sytuacja w przypadku Ethereum. Ponieważ blockchain ten jest młodszy od Bitcoina, sumaryczna liczba użytkowników wciąż jest mniejsza, jednak ze względu na zastosowania tego rozwiązania, prawdopodobnie niedługo to się zmieni. Powoduje to, że Ethereum musi zdecydowanie bardziej skupić się na rozwiązaniu problemu skalowalności, który obecnie potrafi przyprawić ludzi o ból głowy.
Z czym to się je
Warto w tym miejscu zastanowić się, czym jest wspomniana skalowalność, szczególnie jeśli mówimy o blockchainie. Na myśl w pierwszej kolejności zapewne przychodzi szybkość wykonywania transakcji. Będzie to oczywiście słuszne skojarzenie, ale nie jest to jedyna rzecz, o której trzeba powiedzieć, ponieważ zwiększenie jedynie tego parametru nie rozwiąże wszystkich problemów.
Przenosząc to na inną branżę, gdybyśmy zwiększyli jedynie moc silników w samochodach, a obecna infrastruktura, przepisy, itp. pozostałyby bez zmian, to nic nie dałoby nam to, że na pewnym odcinku możemy gnać z prędkością 400 km/h, skoro chwilę później utworzy się wąskie gardło w innym miejscu lub zabraknie nam paliwa, ponieważ nie powstało odpowiednio dużo nowych stacji. Dlatego mówiąc o skalowalności blockchaina, musimy mieć w głowie zawsze kilka równoważnych cech.
Pierwszą istotną sprawą jest koszt wykonywanych transakcji. W jednym z poprzednich wpisów omówiłem sposób, który daje alternatywę dla zapisu dużych ilości informacji poza blockchainem i przechowywanie jedynie referencji do nich w samym łańcuchu. Pozwala to zdecydowanie zmniejszyć koszty związane z takimi transakcjami. Jednak sama opłata nie jest uzależniona jedynie od ilości danych, dlatego nawet w przypadku prostej operacji, jej koszt może się okazać zaskakujący. W dalszej części powrócę jeszcze do tego tematu.
Kolejna sprawa to przepustowość blockchaina. Cecha ta mówi nam, jak długo będzie zatwierdzana transakcja oraz ile danych można umieścić w pojedynczym bloku. Na pierwszy rzut oka można by stwierdzić, że wystarczy zwiększyć rozmiar bloków, ale niestety sprawa nie jest taka prosta. Wchodzi tutaj do gry kolejny aspekt, a mianowicie potrzebne zasoby sieciowe. Im większe bloki, tym więcej “mocy” potrzeba żeby je przerobić.
Wiedząc już, z czym wiąże się skalowalność, warto zastanowić się, jak wpływa ona (albo jej brak) na inne cechy. Pierwszą i chyba najbardziej oczywistą kwestią będą różnego rodzaju ograniczenia związane ze sprzętem. Bez względu na to czy chodzi o prędkość przesyłania danych czy samo przetwarzanie transakcji, jesteśmy ograniczeni tym, co daje nam dzisiejsza technologia. Trzeba jednak przyznać, że nie jest to największy problem, ponieważ sprzęt z roku na rok jest coraz lepszy, a Internet coraz szybszy, jednak jest to coś, o czym należy pamiętać.
Kolejna sprawa to wcześniej wspomniana wielkość pojedynczego bloku. Jeśli zwiększymy ilość danych do przetworzenia, a chcielibyśmy równocześnie zachować niezmienny czas zatwierdzenia bloków, wtedy w naszej sieci musielibyśmy wyeliminować słabsze węzły. Najprościej mówiąc, nie każdy dysponuje sprzętem, który “uciągnie” takie operacje. W konsekwencji sprawi to, że sieć stanie się mniej zdecentralizowana. Jeżeli chcielibyśmy utrzymać wcześniejszy poziom decentralizacji, to musielibyśmy zwiększyć odstęp między nowymi blokami, ponieważ słabsze węzły potrzebują więcej czasu na przetworzenie większej ilości danych. Nawet pomijając tę kwestię, samo zwiększenie bloków nie rozwiązałoby ostatecznie problemu i trzeba by go dokonywać prawdopodobnie regularnie co jakiś czas, wraz z rozwojem sieci. Zatem przypomina to bardziej tabletkę na ból głowy niż dogłębne rozwiązanie problemu.
Teraz przyszedł czas, aby powrócić do tematu opłat transakcyjnych. Ponieważ do poprawnego działania sieci potrzebujemy górników albo walidatorów (w zależności od algorytmu konsensusu, na którym dany blockchain jest oparty), musi istnieć jakiś mechanizm, który zachęci ich do działania. W przypadku blockchainów opartych o Proof of Work jest to nagroda za każdy wykopany blok, ale również bonus w postaci opłat transakcyjnych, które trafiają do górników. Ponieważ wielkość bloku jest ograniczona, a o kolejności przyjętych transakcji decydują górnicy, logicznym jest, że im więcej zapłacimy, tym większa szansa, że nasze zlecenie znajdzie się w najbliższym bloku. Prowadzić to może do sytuacji, w której przesłanie kryptowaluty o wartości np. 10 $ może kosztować nas 100 $ i nie jest to niestety wyimaginowany scenariusz. Wystarczy prześledzić wykres przedstawiający średnie opłaty transakcyjne dla Bitcoina, aby uświadomić sobie, jak zachowuje się ten parametr przy zbyt obciążonej sieci.
Osoby, które mają na co dzień styczność z rynkiem kryptowalut, zapewne nie raz doświadczyły sytuacji, kiedy dokonanie jakiejś operacji na Ethereum potencjalnie kosztowałoby kilkaset, a nawet kilka tysięcy dolarów. Oczywiście ta wartość potrafi się bardzo dynamicznie zmieniać, jednak pokazuje to, jak bardzo może ona wpłynąć na dalszą adopcję tej technologii. Aby jeszcze lepiej zobrazować, jak poszczególne sieci potrafią być obciążone, warto prześledzić wykres oczekujących transakcji. Dla Bitcoina będzie to tzw. mempool, a dla Ethereum parametr zwany pending transactions. Jeżeli interesuje Cię, jak na żywo wygląda ruch na blockchainie, to możesz to sprawdzić przy pomocy ciekawej animacji na stronie TxStreet.
Szybcy i wściekli
Przeanalizujmy teraz, jak wygląda wydajność dostępnych rozwiązań. Pierwszym parametrem, na który warto zwrócić uwagę, jest liczba transakcji na sekundę, czyli TPS (Transaction Per Second). Żeby mieć lepszy pogląd na wykręcane przez blockchain wyniki, porównajmy je do tradycyjnego rozwiązania. Visa obsługuje około 1700 TPS, chociaż firma twierdzi, że ich sieć byłaby w stanie poradzić sobie nawet z 65 tys. operacji na sekundę. Jak na tym tle prezentuje się najbardziej znany blockchain?
Przyjmuje się, że Bitcoin obsługuje około 7 transakcji na sekundę. W porównaniu do Visy wartość ta wydaje się, lekko mówiąc, śmieszna. W przypadku Ethereum nie jest dużo lepiej, ponieważ sieć ta przetwarza około 15 transakcji na sekundę. Dwa najbardziej znane blockchainy zatem nie nalepiej wypadają.
Nieco lepiej wygląda sytuacja jeśli chodzi o BSC, czyli blockchain stworzony przez największą giełdę kryptowalut Binance. Sieć ta pokazała w zeszłym roku, że jest w stanie obsłużyć ponad 220 TPS. Wygląda to dużo lepiej w porównaniu do poprzednich rozwiązań, ale wciąż nawet nie umywa się do Visy.
Inaczej ma się sytuacja jeśli chodzi o Solanę. Twórcy twierdzą, żę ich rozwiązanie jest w stanie obsłużyć 65 tys. transakcji na sekundę, co jest identyczną wartością jak w przypadku założeń Visy. Póki co jest to wartość teoretyczna, ponieważ obecnie Solana przetwarza nieco ponad 1900 TPS, co i tak jest bardzo dobrym wynikiem. Z drugiej strony, czy porównywanie tych rozwiązań do Visy ma sens? Może i w przypadku Bitcoina jest to właściwe, ponieważ zarówno Visa, jak i Bitcoin służą głównie do transferów środków. Natomiast blockchainy, które obsługują również smart contracty, mają zdecydowanie więcej do zrobienia, a zatem muszą być znacznie wydajniejsze.
Rozpatrywanie jedynie liczby transakcji na sekundkę nie będzie najbardziej rzetelnym spojrzeniem na skalowalność blockchaina. Do gry wchodzi również to, ile danych może być przetworzonych w jednym bloku. Przecież mogłoby się okazać, że jeden blockchain pomimo mniejszego TPS, procesuje w tym samym czasie zdecydowanie więcej informacji. Zatem jak sytuacja wygląda w przypadku poszczególnych sieci?
Bitcoin dostarcza każdy nowy blok średnio co 10 min., jego wielkość to 1 MB, a przeciętna pojedyncza transakcja zajmuje 250 bajtów. Sprawę poprawia nieco wprowadzone rozwiązanie zwane SegWit. W dużym uproszczeniu można powiedzieć, że wielkość bloku może wynieść nawet 4 MB.
W przypadku Ethereum teoretycznie można stwierdzić, że obecnie wielkość jednego bloku to około 80 KB, a czas jego dołączenia waha się między 12 a 14 sekundami. Tyle że tutaj musimy użyć całkowicie innej miary, a mianowicie ilości tzw. gazu (ang. gas). Zanim przejdę do konkretnych wartości, warto powiedzieć, co to takiego i dlaczego w tym przypadku nie powinno się mówić o wielkości bloku w kontekście megabajtów.
Ethereum pozwala na tworzenie inteligentnych kontraktów, a operacje, jakie można wykonać na tym blockchainie, to nie tylko prosty przesył wartości. W zależności od poziomu skomplikowania danej procedury, inna ilość gazu będzie niezbędna do jej wykonania.
Najprościej zrozumieć mechanizm gazu, kiedy porównamy go do paliwa napędzającego samochody. Do przejechania 20 km autostradą będziemy potrzebowali inne ilości paliwa, niż do pokonania tej samej odległości przez zakorkowane miasto. Co więcej, wartość będzie się różnić dla różnych pojazdów. Podobnie sprawa ma się w przypadku kontraktów. Dokonując wymiany kryptowaluty przy pomocy giełdy Uniswap, ilość gazu zużyta do transakcji może być inna niż w przypadku SushiSwap, ponieważ wszystko zależy od tego, co znajduje się w kodzie. Każda operacja i jej koszt zostały szczegółowo opisane w tzw. yellow paper.
Ile gazu jest w stanie pomieścić pojedynczy blok Ethereum? Przyjmuje się, że docelową wartością jest 15 mln jednostek. W zależności od obciążenia sieci ilość gazu w bloku może zarówno rosnąć, jak i maleć, a obecnie maksymalnie może wynosić 30 mln jednostek. Teoretycznie więc mogłoby się okazać, że w bloku znajdzie się tylko jedna transakcja, która zużyje cały limit gazu. W przypadku Binance Smart Chain wielkość bloku jest większa i wynosi 100 mln jednostek gazu, natomiast każdy blok pojawia się średnio co 3 sekundy. Czy patrząc przez ten pryzmat powinniśmy całkowicie porzucić Ethereum na rzecz innych, szybszych blockchainów? Niekoniecznie.
Wybierz mądrze
Wszystko w życiu ma konsekwencje i nie inaczej sprawa wygląda w przypadku wydajności blockchaina. Jeżeli coś jest szybsze, to istnieje duża szansa, że coś jest nie tak w innym obszarze. Tutaj dochodzi do pojęcia tzw. trylematu.
Jedną z bardziej znanych sytuacji dotyczących tego pojęcia, chociaż niezwiązaną z samym blockchainem, jest sytuacja, w której klient chciałby, aby projekt dla niego został wykonany szybko, dobrze i tanio. Ale jak to bywa w przypadku trylematów, zazwyczaj nie da się osiągnąć wszystkich tych trzech cech naraz. Dlatego w takim przypadku, jeśli coś ma być zrobione tanio i szybko, to z wielkim prawdopodobieństwem ucierpi na tym jakość całego przedsięwzięcia. Natomiast jeśli ten sam projekt miałby być wykonany szybko i dobrze, to zapewne jego koszty nie będą małe.
Mówiąc o trylemacie w kontekcie blockchaina mamy na myśli sytuację, w której trzeba wybierać pomiędzy decentralizacją, bezpieczeństwem i skalowalnością. Wiesz już, czym jest skalowalność, więc skupię się teraz na dwóch pozostałych cechach.
Gdy mówimy o decentralizacji, mamy na myśli system, który nie zależy od jakiejkolwiek jednostki centralnej. Innymi słowy, nie istnieje żadna instytucja, osoba czy podmiot, które byłyby w stanie swoimi decyzjami kontrolować to, co dzieje się w obrębie rozwiązania. W takim systemie wszyscy uczestnicy działają na takich samych prawach, bez podziału na równych i równiejszych. Przykładem bardzo zdecentralizowanego blockchaina jest Bitcoin. Do niedawna powiedziałbym, że również Ethereum oferuje podobne warunki, niestety po “The Merge” pewne sprawy budzą wątpliwości, jednak i tak nie jest źle w porównaniu do innych rozwiązań.
Bezpieczeństwo to zdolność systemu do prawidłowego działania oraz obrona przed atakami, błędami oraz innymi nieprzewidzianymi sytuacjami. W blockchainie dodatkowym utrudnieniem w stosunku do tradycyjnych rozwiązań jest fakt, że większość sieci jest publicznie dostępnych, co zdecydowanie ułatwia znalezienie potencjalnych dziur. Jedną z ważniejszych kwestii w przypadku bezpieczeństwa jest to, jaki algorytm konsensusu został wykorzystany. Dzięki temu, że Bitcoin oparty jest o PoW, a cała sieć jest zabezpieczona ogromną ilością mocy obliczeniowej, możemy być niemal pewni, że żadna transakcja nie zostanie zmanipulowana i wszystkie środki w tej sieci są bezpieczne.
Dlaczego w takim razie osiągnięcie tych trzech cech równocześnie jest bardzo trudne? Posłużę się przykładem, jakim jest tzw. atak 51%. Jeśli jeszcze nie wiesz, czym on jest, to w tym poście znajdziesz szczegółowe wyjaśnienie. Czym sieć jest bardziej zdecentralizowana, tym dokonanie takiego ataku jest trudniejsze. Łatwiej byłoby przecież przekonać 6 z 10 węzłów do oszustwa, niż 5001 z 10000. Niestety dołączenie kolejnych węzłów do takiej sieci spowoduje również jej spowolnienie, ponieważ każda informacja będzie musiała być wymieniana przez większą liczbę użytkowników. Jak można zauważyć, łatwo jest połączyć ze sobą bezpieczeństwo i decentralizację. Z drugiej strony możemy stworzyć szybką i bezpieczną sieć, jednak odbędzie się to kosztem trzeciego parametru. Oczywiście wciąż jest to lepszy model niż całkowite scentralizowanie systemu, jednak trzeba być również świadomym ryzyk, jakie niosą za sobą tak funkcjonujące blockchainy.
Wróćmy raz jeszcze do pytania związanego z sensownością użytkowania Ethereum. Jak widać, to że inne blockchainy są szybsze, nie znaczy wcale, że są w każdym aspekcie lepsze. Wspomniany BSC oczywiście oferuje większą liczbę transakcji na sekundę, jednak robi to wszystko kosztem decentralizacji. Ethereum ma obecnie ponad 8 tys. aktywnych węzłów, a w szczytowym momencie było ich nawet ponad 12 tys. Dla porównania, BSC ma zaledwie 21 walidatorów. Dzięki temu sieć działa bardzo szybko, jednak potencjalnie może być narażona na manipulacje.
Na szczęście rozwiązanie problemy trylematu jest możliwe, ale wymaga nieco innego spojrzenia na blockchain, a co dokładnie można z tym zrobić dowiesz się w kolejnym poście 🙂