kryptowaluty
0

Kryptowaluty i “górnictwo” – na czym polega proces kopania?

“Górnictwo” XXI wieku, PoW, PoS, DPoS, PoA, Konsensus - co to wszystko oznacza?! W dzisiejszym artykule skupimy się na kryptowalutach i prawach, jakie nimi rządzą.

Spróbujmy zatem wyjaśnić w jak najbardziej przystępny sposób jak działają mechanizmy stojące za działaniem kryptowalut. Aby to zrobić, musimy nieco cofnąć się w czasie – zapraszamy do… Bizancjum!

Na początku, krótkie wprowadzenie do problemu, który dotyczy kryptowalut. Sieć kryptowalut składa się komputerów, które łączą się ze sobą z wykorzystaniem architektury sieci rozproszonej. Oznacza to tyle, że nie ma w niej głównych serwerów, a każdy komputer jest równy innym. Jednak uprośćmy na chwilę tę sytuację…

Problemem, który został zauważony już w 1975 roku, jest komunikacja pomiędzy węzłami w sieci, czyli problem dwóch generałów. Załóżmy, że mamy dwóch generałów, którzy muszą porozumieć się co do koordynacji ataku na wrogie wojska. Do dyspozycji mają swoich posłańców. Pierwszy generał wysłał swojego posłańca, by poinformować, że atakuje o 12:00. Nie wie, czy posłaniec dotarł. Drugi generał odpowiedział, że też zaatakuje o 12:00, niestety nie wie, czy pierwszy posłaniec wrócił do pierwszego dowódcy cały i zdrowy. Wysyła więc własnego, żeby potwierdzić dotarcie posłańca. Pierwszy generał potwierdza, że otrzymał odpowiedź, lecz znów nie ma pewności czy posłaniec wróci do drugiego generała. Wysyła więc własnego… i tak w nieskończoność.

kryptowaluty

W latach 1978 – 1981 został zobrazowany problem nazywany problemem bizantyjskich generałów. Jego autorami byli Leslie Lamport, Robert Shostak, oraz Marshall Pease. Wyglądał następująco:

Grupa armii bizantyjskich otacza miasto nieprzyjaciela. Rozkład sił jest taki, że jeśli wszystkie armie zaatakują razem, to będą w stanie zdobyć miasto. Innym sposobem uniknięcia porażki jest odwrót wszystkich armii. Generałowie poszczególnych armii mają zaufanych posłańców, którzy z powodzeniem dostarczą każdy komunikat od jednego generała do innego. Jednak niektórzy generałowie mogą być zdrajcami usiłującymi doprowadzić do porażki armii bizantyjskich. Należy opracować algorytm, który umożliwi wszystkim wiernym generałom uzgodnienie pewnego planu działania. Ostateczna decyzja powinna być z grubsza taka, jaka zostałaby podjęta w drodze głosowania większościowego nad decyzjami poszczególnych generałów. W przypadku nierozstrzygnięcia głosowania końcową decyzją ma być odwrót.

Przypadek problemu dwóch generałów skupia się na problemie przekazywania danych, a nie zaufania wobec źródła. Problem bizantyjski skupia się na zaufaniu do źródła, a nie zaufaniu do kanału przekazywania informacji. W sieci komputerowej możemy stwierdzić czy serwer działa, lub nie. Jeżeli serwer działa, ale niepoprawnie – wtedy dotyka nas problem bizantyjski. Musimy wtedy wprowadzić rozwiązanie, które pozwoli na uzgodnienie ostatecznej decyzji. Dzięki rozwojowi kryptografii sprawa jest w pewnym sensie ułatwiona. Pozwala na wykorzystanie cyfrowego podpisu wiadomości i jego weryfikację.

Algorytmy odporne na problem bizantyjskich generałów (fałszywe informacje) posiadają odpowiednie implementacje, określane jako Byzantine Fault Tolerance (BFT). Można uznać, że jest to również jeden z trudniejszych problemów z jakimi można spotkać się w algorytmice. Nie tylko systemy blockchain muszą posiadać odpowiednią odporność na tego typu błędy, ale również wszystkie te, które polegają na danych z dużej liczby sensorów (samoloty, elektrownie atomowe, sprzęt kosmiczny, etc.)

PoW – Proof of Work

Proof of Work był używany jeszcze przed Bitcoinem. W 1997 roku Adam Back stworzył algorytm Hashcash, który był wykorzystywany do ograniczenia wysyłania spamu email. Pomimo tego jakże ułatwiającego życie zastosowania, Proof of Work zdobył swoją największą popularność dopiero dzięki implementacji w Bitcoinie. Na czym jednak polega Proof of Work i co ma z tym wspólnego proces kopania kryptowalut?

Proof of Work oznacza… konieczność wykonania pracy. W przypadku kryptowalut jest to odgadnięcie pewnej zagadki. Obecnie istnieje kilkadziesiąt algorytmów PoW: wspomniany Hashcash, Bitcoinowy SHA256, Ethash, Equihash, NeoScrypt i wiele, wiele innych. Dla potrzeb tego artykułu zostańmy jednak przy algorytmie Bitcoina, aby nie komplikować próby wyjaśnienia podejmowanego tematu.

W oryginalnej wersji Hashcash używa funkcji skrótu (hash) SHA1, którego długość wynosi 160 bitów. Bitcoin używa podwójnego SHA256. Długość SHA256 wynosi 256 bitów. Jak już wspomnieliśmy, Proof of Work wymaga rozwiązania zagadki. Zagadką, którą trzeba rozwiązać w Bitcoinie jest znalezienie takiego wyniku funkcji haszującej, która jest mniejsza od wskazanego celu (en. target).

H(x) < target

Można powiedzieć, że zagadka polega na znalezieniu takiego hasza, który będzie zawierał daną liczbę zer na początku. Algorytmy Proof of Work mają również mechanizmy trudności, by zachować średnią szybkość znalezienia nowego bloku (w Bitcoin średnia wynosi 10 minut, w Ethereum 15 sekund). Trudność została wprowadzona ze względu na wzrost ilości komputerów, które będą szukać danego rozwiązania.

Elementem, który jest wykorzystywany w algorytmach PoW to tzw. nonce. Nonce jest wykorzystywany jako element dynamiczny, który musi zostać znaleziony. Każdy “górnik”, mając dane transakcji. próbuje odgadnąć odpowiedni nonce, “doklejając” go do reszty danych. Spróbujmy więc pokazać to na przykładzie:

Przyjmijmy, że poszukujemy hasza, który ma 3 zera na początku, oraz naszym znanym elementem (który docelowo jest danymi o transakcjach) będzie tekst: “antyweb”. Haszem SHA256 dla naszego tekstu “antyweb” jest: 3f186f524e5395a9876cb8c900749aba8734bbfa0b7f0b668048531094978477. Jak widzimy, nie posiadamy zakładanej liczby zer na początku, więc musimy wykorzystać wspomniany wcześniej nonce. Wykorzystując więc prosty skrypt bashowy spróbujmy odgadnąć jaki nonce potrzebujemy, żeby spełnić warunek 3-ech zer na początku. Spróbujemy to zrobić iterując nonce od zera w górę, czyli haszując kolejno: “antyweb0”, “antyweb1”, “antyweb2”, itd. Wykorzystując więc wspomniany, prosty skrypt:

i=0; while true; do echo -n "antyweb"$i | sha256sum | grep -q '^000' && echo $i $(echo -n "antyweb"$i | sha256sum); ((i++)); done

Otrzymamy wynik:

5387 000c3d92284057270874106b5912a9b702e70e4ecf63171601780e8528885cb0 –
10794 000818a5f2335f0faa5d4160f10fd83d2017f050f4ced0e6fee8a61eb7cabfa3 –
22248 0009451638cf738b9dfe28c6ee120562ef357a99820f316a7c255877b5bbc51b –
23153 0009cd2f918315e7861bdbd5e357cdbbf7ca629c1f0aa8851e80c908d1e07dd4 –

W pierwszej kolumnie, mamy liczbę iteracji wymaganą, by osiągnąć wskazany cel i mieć 3 zera na początku hasza. Zwiększając trudność – powiedzmy, że chcielibyśmy posiadać na początku 4 zera – i wykorzystując ponownie nasz skrypt zmieniając ^000 na ^0000 otrzymamy:

i=0; while true; do echo -n "antyweb"$i | sha256sum | grep -q '^0000' && echo $i $(echo -n "antyweb"$i | sha256sum); ((i++)); done

39775 00005e15dee9ac46e24649cf59872b2995d24095f6264cc833fc5c609d50c5bb –
136342 00000d68cc0824adca5cc9c5bd586a178fca91b07f91254ec33981bad951415b –
145097 00007108f76396d6dfa8f064834e1e2f62ff1e8613ed4c574d0d0ebb93d54747 –
256406 000003f21497e0f69016bba19685f4dd5e7178619d4a7f1258ea38b7f718df5a –

O ile w pierwszym przykładzie otrzymaliśmy wynik po 5387 iteracji, o tyle w drugim musieliśmy wykonać już 39755 iteracji. Składając to wszystko jako “antyweb39775” otrzymujemy nasz cel. Jeżeli chcielibyśmy uzyskać na początku pięć zer, potrzebowalibyśmy wykonać 136342 iteracji, co widać również na powyższym przykładzie. Jeżeli chcecie, możecie sprawdzić co się stanie, jeżeli naszego nonce ustawimy jako 17031805.

Musimy jeszcze zaznaczyć, że zastosowaliśmy tutaj pewne uproszczenie. Wyświetlamy dane w systemie szesnastkowym. Jednakże docelowo jest to system dwójkowy, a “górnicy” szukają zer w bitach (dokładniej to H(x) < target). Początkowo było to szukanie zer w początkowych 32 bitach z całości 256. Obecnie jest to już około 72 bitów, które są zerami na początku danego hasza.

W sieci rozproszonej, jakimi są sieci kryptowalutowe, każdy z górników próbuje być pierwszy i pracuje nad podobnym zestawem danych. Transakcje wybierane przez górników zależą od prowizji, jaką osoba zlecająca transakcje ustaliła. Rezultatem tego, że wszyscy pracują mniej więcej nad tym samym “zadaniem”, jest wolna wydajność sieci (8-15 transakcji na sekundę w porównaniu do około 50 tysięcy, którą może obsługiwać np. VISA). W takiej sytuacji, przy dużym obciążeniu sieci blockchain prowizje za transakcje rosną.

Wydobyty blok zostaje następnie przez górnika wysłany do kolejnych nodów w sieci. Każdy z nich weryfikuje jego poprawność: jeżeli jest poprawny, przesyła go dalej do znanych sobie nodów; jeżeli jest niepoprawny, to go odrzuca i po prostu nie rozsyła go dalej.

Algorytmy PoW były początkowo uruchamiane na PC i wykorzystywały do swoich zadań tylko procesor (CPU). Z czasem algorytmy zostały zmigrowane do działania na kartach graficznych (GPU), a obecnie bardzo dynamiczne są rozwijane specjalistyczne urządzenia dedykowane pod algorytmy PoW (ASIC). Przykładowo, Bitcoin posiada już zbudowane ASIC, które są obecne na rynku od paru lat. Rezultatem wprowadzenia ASIC na rynek, kopanie bitcoinów na GPU stało się nieopłacalne. Niedawno pojawiły się także spekulacje donoszące o tym, że jedna z firm zajmujących się budową ASICów, zbudowała urządzenie (i posiada je w ofercie pre-order) także dla Ethereum. Pikanterii sprawie dodaje fakt, że Ethereum i jego algorytm Ethash są o tyle ciekawie, że Ethash ma duże wymagania co do przepustowości pamięci RAM i w założeniach ma być algorytmem odpornym na dedykowane urządzenia (tzw. ASIC-resistant).

Ponieważ Ethereum na rynku nie posiada (jeszcze?) urządzeń ASIC, jego “wydobywanie” odbywa się głównie przy pomocy kart graficznych. Jak pewnie wszyscy, którzy interesują się branżą techniczną słyszeli, w ostatnich parunastu miesiącach karty graficzne stały się trudno dostępne, a ich ceny poszybowały w górę. Ciekawostką w świecie Ethereum jest to, że społeczność chce zmienić algorytm z Proof of Work n Proof of Stake. Plotki o ASIC wzbudziły również w społeczność chęć przeprowadzenia hard-forka modyfikującego algorytm, tak by ASIC PoW były bezużyteczne w tej sieci. Potencjalne pojawienie się ASIC może spowodować szybszą migrację Ethereum do algorytmu PoS – na pewno będziemy śledzić ten temat ze sporym zainteresowaniem.

Wykorzystanie dużej ilości sprzętu komputerowego (głównie GPU oraz ASIC) spowodowało w efekcie także wzrost wykorzystania energii elektrycznej. Obecne wykorzystanie energii elektrycznej przez sieć bitcoina jest prognozowane jako wyższe, niż zużycie roczne… Irlandii czy Republiki Czeskiej i wynosi około 70,25 TWh!.

PoS – Proof of Stake

Rosnąca popularność kryptowalut oraz coraz większe wykorzystanie sprzętu, a co za tym idzie prądu, pokazała, że konieczne jest szukanie innych rozwiązań. Rozwiązań, które pozwolą na minimalizację zużycia energii elektrycznej i łatwiejszej adaptacji technologii przez firmy z różnych branż. Jedną z alternatyw jest tzw. Proof of Stake (PoS).

Proof of Stake jest to mechanizm potwierdzania transakcji, wykorzystujący “stan posiadania”. W przypadku PoW, górnik, który posiada większą moc obliczeniową, po prostu więcej zarabia. Użytkownik, który będzie miał koparkę złożoną z sześciu kart, będzie miał większy zysk, aniżeli użytkownik z jedną kartą graficzną. W przypadku PoS zatwierdzenie transakcji i bloku odbywa się poprzez losowanie użytkownika z określonej puli. W założeniu pula ta składa się z użytkowników, którzy zadeklarowali pewną część (lub nawet wszystkie) swoich coinów na rzecz bycia tzw. Walidatorem. Osoba, która ma większą ilość zdeponowanych coinów, będzie miała większe szanse na bycie wylosowanym (wylosowana osoba stworzy nowy blok i dostanie za niego nagrodę oraz prowizje za transakcje – tak jak jest to w przypadku algorytmu PoW).

DPoS – Delegated Proof of Stake

Delegated Proof of Stake jest pewną odmianą Proof of Stake. Z założeń jest bardziej demokratyczna i ma być bardziej sprawiedliwa oraz efektywna w porównaniu do innych metod. Użytkownicy sieci, którzy wykorzystują DPoS jako algorytm konsensusu, głosują na tzw. delegata / świadka (en. delegate/witness). Tworzy się w ten sposób grupa, która jest uprzywilejowana do zatwierdzania transakcji i bloków. Niestety, w pewnym stopniu struktura sieci ulega zmianie i staje się zdecentralizowaną, zamiast rozproszoną. Plusem DPoS może być natomiast osiągnięcie szybszego działania pod względem obsługiwanych transakcji na sekundę, ale odbywa się to kosztem centralizacji.

PoA – Proof of Authority

Mechanizm konsensusu Proof of Authority stosowany jest głównie w sieciach, które wymagają autentykacji użytkownika. Dzieje się tak dlatego, że w PoA tożsamość użytkownika musi być znana. Dla sieci oznacza to tyle, że tylko zaufane komputery (osoby) mogą korzystać z jej zasobów. Jeżeli zaufanie to zostanie złamane, to sieć może zablokować dostęp danemu użytkownikowi. W PoA możemy spotkać pełną centralizację, jako że algorytm ten może być stosowany w rozwiązaniach zamkniętych (blockchain prywatny). Oczywiście istnieje również opcja na decentralizację, gdzie społeczność sieci wybiera osoby zaufane – podobnie jak w DPoS (jednakże DPoS może być anonimowy).

Konsensus i zaufanie

Początek artykułu przedstawia problem, z którym wszystkie algorytmy osiągnięcia konsensusu muszą się zmierzyć – Byzantine Fault Tolerance (BFT). Osoby interesujące się działaniem kryptowalut na pewno nie jeden raz mogły spotkać się z tym określeniem. Przed czym nas chroni wprowadzenie tolerancji na problem bizantyjskich generałów? Głównie przed użytkownikami, którzy próbują zmusić sieć do działania na szkodę innych, oraz próbami malwersacji. W konsekwencji chroni również przed atakami “51%”.

I tutaj zatrzymajmy się na moment przy ataku 51%. W algorytmach PoW, aby taki atak doszedł do skutku, należy posiadać większość mocy obliczeniowej. Możliwe jest wtedy wykonywanie niepoprawnych przelewów, czy cofania sieci wstecz (tak jak było to w przypadku Bitcoin Gold). W przypadku PoS, atakujący musiałby posiadać większościowy udział w całości coinów. Wiele osób uważa, że osoba posiadająca 51% udziału w sieci w postaci coinów nie będzie miała z tego korzyści z prostego powodu – atakowała by wtedy własną sieć.

Czym zatem właściwie jest konsensus? Czy można powiedzieć, że jest nim PoW (PoS, itd.)? Niestety nie – sam algorytm nie jest konsensusem. Aby lepiej zrozumieć to zagadnienie, musimy wrócić do samej architektury sieci. Sieć kryptowalut z reguły jest siecią rozproszoną. Sami górnicy też nie osiągną konsensusu (choć może tak być w utopijnej sytuacji, w której każdy węzeł to górnik). Sytuację może przedstawić poniższy rysunek:

kryptowaluty

Górnik wykopując nowy blok, rozsyła go do sieci internetowej. Pomiędzy węzłami w sieci, szybkość komunikacji może być różna. Może więc być tak, że dwóch górników w podobnym czasie wydobędzie blok. Oczekując na kolejny blok, wygra więc ten fragment łańcucha, który będzie dłuższy (ktoś wydobędzie następny blok i prześle go do sieci). Jednak konsensus, to również nie to, który łańcuch jest dłuższy. Konsensus w sieci to nic innego, jak porozumienie pomiędzy węzłami w sieci – tymi które kopią i tymi które weryfikują transakcje i rozsyłają je dalej – co do zasad działania.

Przykładem może być zgoda na wprowadzenie nowej funkcjonalności. Jeżeli zwykłe węzły będą taką chęć wyrażać, a górnicy nie, to te mogą przestać akceptować bloki przysyłane od górników. Obie strony więc muszą się porozumieć, które bloki są poprawne i kiedy (a to oznacza, że węzły muszą być zgodne z protokołem sieci).

Mamy nadzieję, że w miarę przystępny sposób udało się nam pokazać jak działają algorytmy konsensusu w sieciach blockchain. Oczywiście stosując pewne uproszczenia, ponieważ technicznie algorytmy wydobycia lub podpisania bloku i rozpropagowania go w sieci (wraz z walidacją poprawności) mogą być o wiele bardziej zaawansowane :)
________________________________________________
Autorzy:

Justyna Kot – Project Manager & Business Analyst
https://twitter.com/JustineKot
https://www.linkedin.com/in/justyna-kot/

Piotr Pawlak – Blockchain dApps Developer
https://www.linkedin.com/in/ppawlakov/

Concise Software – software house specjalizujący się w rozwiązaniach z zakresu blockchain, Internet of things, automotive, web oraz aplikacjach mobilnych.
Od 11 lat działamy na skalę globalną, ale serce naszego teamu bije niezmiennie w Rzeszowie. Jesteśmy zgranym zespołem inżynierów i projektantów, którzy każdego dnia z pasją pomagają tworzyć swoim partnerom innowacyjny, zintegrowany świat. Wśród nich znajdują się m. in. Jaguar, Red Bull, Panasonic, Delivery Hero, Bosch, Neufund. Nasi inżynierowie należą także do czołówki ekspertów zajmujących się technologią blockchain.