Górnicy, kopanie, sejf i zagadka – porozmawiajmy o algorytmach konsensusu

Przemek/ 4 lipca, 2022

Zdecentralizowane rozwiązania są z natury skomplikowane. Liczba rzeczy, które mogą pójść nie tak, jest naprawdę ogromna. Jedną z nich jest poprawne zaprojektowanie sieci od strony technicznej, z drugiej strony należy uwzględnić czynnik ludzki, który może wpływać na zachowania systemu. Jak sobie z tym poradzić? Postaram się dzisiaj przedstawić sposoby, dzięki którym twórcy blockchainów uporali się z wieloma problemami, a będą to algorytmy konsensusu. Opowiem o dwóch najbardziej znanych mechanizmach, a mianowicie Proof of Work (PoW) oraz Proof of Stake (PoS). Dowiesz się, na czym polega kopanie kryptowalut oraz dlaczego Bitcoin zużywa dużo prądu, a w przypadku Ethereum wkrótce to się zmieni.

Czterej generałowie

W poprzednim artykule opisałem m.in. teorię gier, gdzie pokazałem przykładową sytuację oraz jej znaczenie w przypadku blockchaina. Zanim przejdę do algorytmów konsensusu, warto zapoznać się jeszcze z  jednym zagadnieniem, zwanym “Problemem Bizantyjskich Generałów”, które dotyczy podejmowania decyzji w rozproszonych systemach.

Sytuacja wygląda następująco: bizantyjska armia otoczyła miasto nieprzyjaciela. Generałowie, którzy dowodzą operacją, muszą podjąć wspólną decyzję, od której zależy powodzenie misji. Mają dwie opcje: albo decydują się na atak, albo wycofują swoje oddziały. Sukces osiągną tylko wtedy, gdy wszyscy podejmą jednakową decyzję. Nie ma tutaj znaczenia, czy jest to atak, czy wycofanie, ważne żeby byli jednomyślni. W każdej innej sytuacji poniosą porażkę. 

Ponieważ generałowie są znacznie oddaleni od siebie, komunikacja między nimi może przebiegać jedynie z wykorzystaniem posłańców. Problemem związanym z taką sytuacją jest fakt, że któryś z generałów może być zdrajcą i pomimo zapowiedzi ataku, wycofa się lub na odwrót. Dowódcy również nie mają pewności, czy posłaniec dotarł z wysłaną wiadomością. 

Rozwiązaniem tego problemu będzie algorytm, który sprawi, że wszyscy wierni generałowie podejmą taką samą decyzję oraz niewielka liczba zdrajców nie będzie miała wpływu na ostateczną decyzję. Oznacza to, że nawet jeśli jeden z nich zdecydowałby o wycofaniu, a reszta chciałaby zaatakować, to ostatecznie jego armia też przystąpi do ofensywy.

Rozproszone algorytmy konsensusu

Ponieważ blockchain oparty jest o rozproszoną sieć, należało w nim rozwiązać wyżej opisany problem. Udało się to zrobić przy pomocy algorytmów konsensusu. Głównym ich zadaniem jest koordynowanie działania całej sieci. Oprócz samych technikaliów, które stoją za przesyłaniem wiadomości, synchronizacją, potwierdzeniem transakcji itp. itd., ważne było, aby stworzyć przy ich pomocy mechanizm, który z jednej strony będzie zniechęcał użytkowników do próby oszustwa, z drugiej zaś powinien wynagradzać uczciwe osoby.

Istotne jest też to, że im bardziej dany blockchain jest zdecentralizowany, tym mniejsza szansa na potencjalne próby oszustwa. Dzieje się tak dlatego, że w takiej sieci występują różne grupy interesów. Mówimy tutaj o słynnych “górnikach”, giełdach, posiadaczach kryptowalut, twórcach aplikacji, różnego rodzaju instytucjach, a od jakiegoś czasu nawet o państwach. Im więcej jest takich grup i im bardziej one same są zdecentralizowane, tym bezpieczniejszy staje się blockchain. Ponieważ próby manipulacji przez jedną giełdę byłyby niekorzystne dla drugiej, dlatego nawet w obrębie jednej branży występuje kontrola.

Do tej pory powstało wiele różnych podejść do tego tematu, czego skutkiem są rozwiązania takie jak:

  • Proof of Work
  • Proof of Stake
  • Delayed Proof of Work
  • Proof of Authority
  • Proof of Burn
  • Delegated Proof of Stake
  • Proof of Space
  • Proof of Elapsed Time
  • i wiele, wiele innych…

Każde z nich charakteryzuje się nieco innymi mechanizmami, co niesie za sobą zarówno negatywne, jak i pozytywne konsekwencje. Ja skupię się w tym wpisie na algorytmach PoW oraz PoS, ponieważ wszystkie dane wskazują, że obecnie tylko te dwa podejścia mają największe znaczenie.

Kilofy w dłoń

Pewnie nie raz słyszałeś, że istnieją ogromne kopalnie kryptowalut, w których górnicy wykopują bitcoiny. Nie ma to oczywiście nic wspólnego z tradycyjnym górnictwem, ale samo nawiązanie jest dosyć trafne. 

Żeby wykopać złoto, potrzebujemy zwerbować osoby, które wyposażymy w narzędzie, a następnie będę one musiały zużyć swoją energię do wykonania pewnego rodzaju pracy, aby wydobyć cenny kruszec. W przypadku kopania kryptowalut jest podobnie, tyle że kopalniami są wielkie farmy komputerów, górnikami ich właściciele, kilofem sam komputer, pracą zaś jest rozwiązanie “kryptograficznej zagadki”, a zużyta energia to oczywiście prąd elektryczny. O takie mechanizmy oparty jest właśnie algorytm zwany Proof of Work. Czym jednak jest ta wspomniana łamigłówka?

W jednym z poprzednich artykułów opisałem mechanizm haszowania oraz fakt, że każdy blok posiada identyfikator, który jest tworzony za pomocą funkcji skrótu, do której przekazywane są takie informacje, jak m.in. hash poprzedniego bloku, dane transakcji oraz data utworzenia bloku. Wspomniana kryptograficzna zagadka polega właśnie na stworzeniu takiego identyfikatora. Przykładowy hash może wyglądać następująco:

000000000000000000039beb14e8322181d1927428e35243e32507746d9c4420

Pomimo że na pierwszy rzut oka jest to losowy ciąg znaków, to na pewno rzuca Ci się w oczy to, że na samym początku występują tylko zera. Ich minimalna liczba jest wymaganiem nakładanym na górników, którzy chcieliby stworzyć nowy blok. 

Jeżeli dobrze pamiętasz, to wynik funkcji haszującej jest zawsze taki sam, dla tych samych danych wejściowych. Dodatkowo z posiadanego rezultatu, nie da się wywnioskować co wpadło do funkcji. Jak w takim razie otrzymać wynik, który rozpoczyna się od ustalonej ilości zer? Metoda jest jedna i polega na… mozolnym wywoływaniu funkcji skróty, aż do momentu, kiedy jej wynik spełni wymagania, przy czym za każdym razem należy coś zmienić w danych wejściowych.

Jeżeli spojrzysz na przykładowy blok Bitcoina, to zauważysz, że znajduje się w nim pole o nazwie nonce. Jest to kolejna wartość, która wchodzi w skład danych wejściowych funkcji haszującej. Zadaniem górnika jest odgadnięcie takiej liczby, przy pomocy której otrzyma on ciąg znaków o odpowiedniej liczbie zer. Precyzyjniej mówiąc, to hash zamieniany jest na liczbę i uzyskany wynik musi być mniejszy niż ten narzucony, jednak w uproszczeniu sprowadza się do początkowych zer.

Ciekawostką może być fakt, że liczba kombinacji, które można otrzymać zmieniając nonce, może się okazać niewystarczająca do otrzymania wymaganego wyniku. W takim wypadku można np. zamienić kolejność transakcji w bloku lub wybrać inne z kolejki oczekujących. Istnieje też możliwość manipulacji daną, mówiącą o czasie powstania bloku. Z tego też powodu tworząc aplikacje, zazwyczaj nie powinno opierać się logiki na czasie bloku, tylko należy wykorzystać do tego jego numer. Wartością tą nie da się manipulować, a każdy kolejny blok będzie posiadał wyższą liczbę.

To właśnie proces haszowania odpowiedzialny jest za większość zużytego prądu, wykorzystanego do utrzymania sieci. Sama liczba transakcji ma marginalne znaczenie. “Prądożerność” tego rozwiązania jest często tematem wielu dyskusji. Jednak prawda jest nieco inna, niż zazwyczaj możesz usłyszeć w mediach. To prawda, że Bitcoin zużywa dosyć sporo energii i jeśli potraktujemy go jedynie jako zabawkę dla “nerdów”, to jest to wielkie marnotrawstwo. Jednak trzeba zauważyć, że sam Bitcoin jest kompletnym systemem transakcyjnym i gdyby porównać go do tradycyjnej bankowości, to zużyta przez niego energia okazuje się tylko nic nieznaczącym źdźbłem trawy. 

Oczywiście nieco upraszczam cały temat, ale warto jeszcze zauważyć, że branża kryptowalutowego górnictwa jest tą, która najszybciej wdraża odnawialne źródła energii. Nie jest to nic dziwnego. Skoro prąd jest z głównych kosztów takiej działalności, to posiadanie darmowej energii znacznie podwyższy wyniki finansowe. Polecam zapoznać się z raportem, aby wyrobić sobie zdanie na temat prawdziwego zużycia energii przez Bitcoina, a nie bazować na przekazach medialnych:).

Wróćmy jeszcze na chwilę do samego haszowania. Może się już domyślasz, że im większą mocą dysponuje górnik, tym szybciej jest w stanie odgadnąć hasz. Ponieważ chcielibyśmy zachować stały lub chociaż przybliżony czas dołączania nowych bloków, dlatego wymagana ilość zer na początku może się zmieniać w czasie. W przypadku Bitcoina każdy blok powinien być tworzony średnio co 10 minut. Dlatego co 2016 bloków sprawdzany jest przeciętny czas dołączania bloków w poprzednim okresie, a następnie dostosowywana jest tzw. trudność kopania (liczba zer na początku). Jeżeli okaże się, że bloki powstały za szybko, wtedy do wymagań dokładane są zera. Jeśli powstały w zbyt długim czasie, “zagadka” jest upraszczana.

Nic za darmo

Kopanie kosztuje, a w czasach ogromnych kosztów energii jest to tym bardziej odczuwalne. Dlatego żaden górnik nie zdecydowałbym się na utrzymywanie sieci, jeśli nie miałby mieć z tego żadnych korzyści. Otrzymaną nagrodą za wykonywaną pracę jest kryptowaluta danego blockchaina, inaczej zwana monetą. Obecnie w przypadku Bitcoina jest to 6,25 BTC za każdy wydobyty blok. Nagroda ta zmniejsza się o połowę w przypadku każdego halvingu, który następuje średnio co 4 lata. Otrzymuje ją górnik, który jako pierwszy wykopał blok. Zatem nawet jeśli poświęcisz masę energii, ale nie uda Ci się wygrać wyścigu, to zostaniesz z niczym. Chociaż może niezupełnie, ponieważ górnicy zarabiają też na opłatach, które muszą uiszczać osoby dokonujące transakcji.

Wysokość opłaty zależy od obecnego ruchu na sieci. Im większy ruch, tym więcej trzeba zapłacić, aby transakcja weszła razem z najbliższym blokiem. Tym sposobem łatwo jest górnikom wybierać transakcje, które chcą zawrzeć w swoim bloku. Kto da więcej, ten może mieć pewność, że zostanie wybrany. Prowadzi to czasem do chorych sytuacji, w których ludzie prześcigają się w proponowanych napiwkach, a to powoduje ogromne zwiększenie bieżących opłat.

Mechanizm nagród świetnie sprawdza się jako zachęta do prawidłowego zachowania. Karą natomiast jest pozbawienie górnika możliwości uczestnictwa w blockchainie. Jeżeli okazałoby się, że dany górnik próbowałby np. stworzyć blok, w którym zawarłby fałszywą transakcję, wtedy po wykryciu tego procederu inni użytkownicy mogliby zacząć ignorować przesyłane przez niego wiadomości, tym samym odłączając go od sieci. Cały wysiłek i koszt sprzętu, który poniósł nieuczciwy górnik, poszedłby na marne. Takie podejście sprawia, że próby oszustwa praktycznie nie występują, ponieważ ryzyko strat w stosunku do potencjalnego zysku jest zbyt duże.

Każdy blockchain oparty o PoW działa na przedstawionej zasadzie. Różnice, które mogą występować to np. czas, w którym mają pojawiać się nowe bloki lub funkcja skrótu używana do tworzenia identyfikatora. Przykładowo w Ethereum nowe bloki dołączane są średnio co 13-15 sekund.

Kiedy moc przestaje mieć znaczenie

Rysunek 5. Dawid i Goliat
(źródło: https://whatnext.pl/ile-wzrostu-mial-goliat-archeologia/)

Pomimo wielu zalet stojących za Proof of Work, podejście to posiada również wady. Pierwszą z nich jest duże zużycie prądu i mimo faktu, że nie wygląda to tak, jak przedstawiają media, jest to pewnego rodzaju marnotrawstwo. Druga sprawa to horrendalne opłaty transakcyjne w okresie dużego obciążenia sieci. Do tego dochodzi stosunkowo długi czas potrzebny na zatwierdzenie bloku. Nie wspominając już o rosnących cenach kart graficznych, które wykorzystywane są do wykonywania górnicznych obliczeń. Również sama decentralizacja może nie wyglądać tak jak powinna. W obecnej chwili, jako pojedyncza osoba, nie jesteś w stanie kopać bitcoinów. Nic nie stoi na przeszkodzie, żebyś dołączył do sieci jako górnik, ale szanse, że uda Ci się z Twoją mocą obliczeniową wykupować chociaż jeden blok, są prawie równe zeru. Z tego powodu warto przyjrzeć się drugiemu, co do popularności, rozwiązaniu, o nazwie Proof of Stake.

W odróżnieniu do PoW, tutaj nie ma ani górników, ani też wykopywania (ang. mine) bloków. Istnieją natomiast walidatorzy, którzy wykuwają (ang. mint / forge) bloki. Proces ten nie wymaga rozwiązywania żadnego wyzwania. Oczywiście blok wciąż posiada identyfikator, który otrzymywany jest przy pomocy funkcji haszującej, ale nie występuję tutaj żadne  wymagania. W wypadku PoS bierze się jednorazowo dane wejściowe i przepuszcza się je przez funkcję skrótu, a następnie przypisuje się hash do nowego bloku. W metadanych bloku możesz znaleźć pole nonce, ale jego wartość nie ma znaczenia. Jeżeli spojrzysz na bloki należące do blockchaina stworzonego przez Binance, to zauważysz, że nonce wynosi 0, a sam hasz jest losowym ciągiem znaków, bez większych wymagań nałożonych na niego. Spowodowane jest to tym, że w PoS węzły nie muszą ze sobą rywalizować o prawo dołączenia nowego bloku, ponieważ wybierane są losowo.

Aby mieć pewność, że dany węzeł nie będzie zamieszczał fałszywych transakcji, każdy walidator musi zablokować pewną ilość swoich środków na blockchainie (kryptowalut). Środki te stają się jego stawką (ang. stake) w tej grze (stąd nazwa Proof of Stake). Ponieważ każdy użytkownik sieci może sprawdzić, czy dany blok jest poprawny i nie zawiera zmanipulowanych transakcji, w momencie, gdy walidator dopuści się oszustwa, zostanie ukarany odebraniem części  bądź wszystkich jego zablokowanych środków. Z drugiej strony, jeśli będzie się zachowywał uczciwie, to w nagrodę dostanie monety, pochodzące z opłat transakcyjnych.

Sam algorytm selekcji walidatora może przyjmować różne parametry decydujące o kolejnym wyborze. Może to być np. liczba zablokowanych monet przez daną osobę lub ilość czasu, jaka minęła od kiedy zabezpiecza sieć. Algorytm taki musi być dobrze skonstruowany, aby wyniki jego decyzji była jak najbardziej zdecentralizowane. Zazwyczaj jest to rezultat mieszanki różnych parametrów.

Obecnie jednymi z bardziej znanych przedstawicieli blockchainów opartych o Proof of Stake są:  BNB Chain, wcześniej znany pod nazwą Binance Smart Chain, oraz Polygon. Wkrótce do nich powinno dołączyć samo Ethereum, a migracja z PoW na PoS jest obecnie jednym z największych wyzwań dla tego blockchaina. Pewne kamienie milowe zostały osiągnięte i można już stać się walidatorem, jednak wciąż dużo rzeczy może pójść nie tak, dlatego trzymajmy kciuki, żeby wszystko dobrze się skończyło!

Aby zostać walidatorem na sieci Ethereum, trzeba zablokować 32 ETH. Z jednej strony nie jest to mało pieniędzy, bo na moment pisania tego tekstu wartość takiej stawki wynosi około 35 tys. $, jednak jeszcze nie tak dawno temu wystarczyło kilka tys. zł, aby posiadać wymaganą ilość. Niemniej jednak wciąż jest to bardziej wykonalne, niż poczynienie milionowych inwestycji, w celu kopania bitcoinów.

Proof of Stake ma niewątpliwie kilka niepodważalnych zalet. Po pierwsze, ilość energii potrzebna do walidacji bloków jest bardzo mała. Po drugie, sama praca wykonywana przez walidatorów nie jest marnowana, ponieważ nie muszą się ścigać o laury pierwszeństwa. Kolejną zaletą jest fakt, że o wiele łatwiej zostać walidatorem niż górnikiem, co sprawia, że cała sieć staje się jeszcze bardziej zdecentralizowana. W PoW dołączenie nowych górników powoduje, że moc w sieci rośnie, co sprawia, że rośnie próg wejścia. W PoS, z każdym nowym walidatorem nic się nie zmienia, a jedynie rośnie decentralizacja.

Przedstawione algorytmy posiadają zarówno zalety, jak i wady. Możliwe, że w przyszłości powstaną inne, które zdominują rynek, jednak w tej chwili nic tego nie zapowiada. Samo przejście Ethereum na Proof of Stake, może spowodować, że stanie się to wiodący mechanizm konsensusu w blockchainowym świecie.

Pomimo świetnie zaprojektowanych algorytmów, wciąż występują sytuacje, gdzie coś może pójść nie tak. Ten temat poruszę kolejnym razem, kiedy to  porozmawiamy o tzw. problemie podwójnego bloku oraz ataku zwanym 51%.

Share this Post
Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments