Zrozumieć bitcoina. Jak działa przesyłanie i weryfikacja cyfrowych monet?
Bitcoin, jako zdecentralizowana waluta cyfrowa, zasadniczo redefiniuje sposób transferu wartości w cyfrowym świecie. W tym artykule przyglądamy się łańcuchowi bloków i zapobiegamy podwójnemu wydatkowaniu.

U podstaw każdej transakcji leży zmiana właściciela, ułatwiona przez klucze kryptograficzne i zapisana w publicznej księdze zwanej blockchainem. Proces ten, choć pozornie prosty, opiera się na interakcji uczestników sieci i mocy obliczeniowej, aby zapewnić, że każda moneta zostanie wydana tylko raz, a integralność całego systemu nie zostanie narażona na utratę informacji.
Jak przesyłamy sobie bitcoiny?
Zacznijmy od wersji uproszczonej.
Każdy z posiadaczy bitcoina posiada klucz publiczny, a każda moneta jest do jakiegoś klucza przypisana. Jeśli zachodzi potrzeba, aby zmieniła ona swojego właściciela, to klient (poprzez program obsługujący transakcje i portfele) tworzy transakcję, w której obok kwoty wyrażonej w bitcoinach zapisuje także klucz publiczny nowego właściciela, podpisując wszystko na koniec kluczem (także publicznym) właściciela pierwotnego.

W przypadku kolejnych przelewów następuje podobny ciąg zdarzeń, który w jednej transakcji łączy klucz nowego właściciela wraz z kluczem starego i kwotą. Wszystkie te akcje zapisywane są właśnie w blockchainie, a następnie „rozgłaszane” pomiędzy wszystkimi klientami podpiętymi do sieci. Łańcuchy bloków są przez cały czas dopisywane i zawierają w sobie informacje o wszystkich transakcjach od początku istnienia bitcoina.
W tym właśnie momencie powinna nam się już zapalić czerwona lampka. Załóżmy, że mam 5 kolegów, a każdemu z nich jestem winien jednego bitcoina. Czy mogę pooszukiwać i wykonać 5 transakcji, w których z tym samym bitcoinem powiążę 5 kluczy moich kolegów?
Czytaj więcej o bitcoinie:
Nic bardziej mylnego
Nim dana transakcja zostanie potwierdzona, jej poprawność sprawdzają komputery, na których zainstalowane są klienty bitcoina. Interesuje je czy fundusze rzeczywiście należą do tego, kto je wydaje, a także czy nie jest to próba dwukrotnego wykorzystania tego samego bitcoina. Gdy dany przelew zostanie dołączony do bloku, czyli listy wszystkich dotychczasowych transakcji, to całość jest dopisywana do łańcucha ciągnącego się od początku istnienia wirtualnej waluty.
Przyjrzyjmy się tej sytuacji jeszcze raz. Na początku weźmy pewną wirtualną walutę, nie bitcoina konkretnie, ale po prostu, coś czym możemy obracać za pomocą internetu. Chcemy pewną jej porcję przesłać koledze. W tym celu wydajemy oficjalne oświadczenie, w którym zapisujemy: „ja, przekazuję monetę Władkowi”. Całość sygnujemy swoim podpisem cyfrowym i puszczamy w świat. Taki komunikat jest jednak niewystarczający, bo określenie „moneta” jest prostu zbyt szerokie. Mamy miliony identycznych monet, a w tym przypadku musimy zidentyfikować tę jedną, jedyną należąca właśnie do nas. Dlatego do wiadomości dodajemy jeszcze informację o „numerze seryjnym danej monety”. Wtedy cała sieć zaczyna sprawdzać prawidłowość wiadomości: „ja, przekazuję monetę 1234 Władkowi”. W tym celu przeczesuje księgę, gdzie zawarte są wpisy o wszystkich transakcjach dokonanych od początku istnienia systemu. Jeśli moneta rzeczywiście należy do mnie i nie wydałem jej wcześniej, to transakcja zostanie zaakceptowana, pieniądze znajdują nowego właściciela, a księga wzbogaca się o kolejny wpis.
Co jednak w sytuacji, kiedy zechciałbym wypróbować sieć i wysłać tę samą monetę zarówno do wcześniej wspomnianego Władka, jak i do Zbyszka? Może się przecież tak teoretycznie stać, że weryfikacja obu transakcji nastąpi dokładnie w tym samym momencie, zanim któraś z transakcji jako pierwsza dopisze się do księgi. Jak rozwiązać ten problem? Ano tutaj główną rolę odgrywa ogrom całej sieci użytkowników monet. Moja transakcja jest sprawdzana przez użytkowników, których komputery rozwiązują skomplikowaną zagadkę kryptograficzną, związaną z funkcją skrótu (z angielskiego nazywa się ją funkcją hashującą). Zagadka polega na znalezieniu takiej liczby, która po dodaniu do funkcji hashującej zwróci odpowiednią liczbę zer na początku funkcji. Jeśli potrzebujemy tylko kilku zer to sprawa jest dość prosta i rozwiązanie zostanie znalezione szybko. Wtedy ten, kto rozwiązał zagadkę pierwszy dodaje nowy wpis do księgi, a w nagrodę dostaje określoną liczbę bitcoinów. Pozostali internauci sprawdzają wtedy, czy dany wynik jest rzeczywiście prawidłowy i dopisują transakcję to swoich ksiąg.
Jednak z każdym dniem do sieci dołączają coraz to nowe komputery, które zwiększają jej sumaryczną moc obliczeniową. Dlatego teoretycznie mogłoby się tak stać, że zagadki byłyby rozwiązywane zbyt szybko – wtedy w niedługim czasie wykopalibyśmy wszystkie bitcoiny. Dlatego trudność zapytań cały czas rośnie, np. do 10 zer na początku wyjściowej funkcji , a to wymaga już sprawdzenia ok. 1012 kombinacji!

Księga publiczna
Jednak i rosnąca trudność zapytań nie rozwiązuje w pełni problemu możliwości oszukania na transakcjach bitcoinowych. Załóżmy, że do jednej części sieci, jako pierwsza dotarła wiadomość o przekazaniu monety Zbyszkowi, a do drugiej części o jej przekazaniu Władkowi. Dwaj użytkownicy w obu częściach internetu znajdują właściwe odpowiedzi na funkcje hashujące, co powoduje powstanie dwóch różnych i stojących ze sobą w sprzeczności wpisów w jednej księdze. Do nich następnie dopisywane są równolegle kolejne transakcje i w rzeczywistości księga zaczyna się rozdwajać, a oba łańcuchy żyją swoim życiem.
Recepta na zapobiegnięcie takim sytuacjom jest jednak dość prosta – rywalizacja pomiędzy oboma łańcuchami toczy się aż do końca metaforycznej kartki (w rzeczywistości jest to tzw. blok transakcji). Ta grupa internautów, która jako pierwsza wypełni ostatni wers na stronie wygrywa i to jej wersja transakcji staje się kanoniczną. Zależnie od tego czy była to wersja Władka lub Zbyszka, to właśnie któryś z nich staje się prawowitym właścicielem monety. Oczywiście transakcje potwierdzone przez przegrywająca grupę nie przepadają, a zwyczajnie zostają dopisane do zweryfikowania od nowa….

Co jednak gdybym to właśnie ja miał szczęście i udałoby mi się znaleźć rozwiązanie na obie zagadki – zarówno tę dotycząca Władka, jak i Zbyszka? Otóż jeśli takie podwójne wydatkowanie zostałoby dołączone przeze mnie do księgi to natychmiast wychwyciliby to inni użytkownicy i udaremniliby moje niecne plany.
A jak zachowa się sieć, w której posiadałbym większość mocy obliczeniowej?
Odchodząc już od naszego teoretycznego modelu – potencjalny atak na sieć bitcoina jest w tym przypadku teoretycznie możliwy. Wymagane są do tego jednak ogromne zasoby mocy obliczeniowej przekraczające możliwości superkomputerów.
Duży może więcej?
Teoretycznie można założyć, że człowiek (choć bliżej praktyki byłoby raczej określenie grupa) posiadający w swoim władaniu ponad połowę aktualnej mocy obliczeniowej sieci bitcoina mógłby w blockchainie nieco namieszać. W jaki sposób? Protokół bitcoina zapewnia, że oszukiwanie w systemie jest prawie niemożliwe. Nawet jeśli sporadycznie pojawiają się osoby, które próbują sfałszować zapis wcześniejszych transakcji (tak, aby nie było widać, że pewne bitcoiny zostały już raz wydane), to są one w łatwy sposób wykrywalne przez uczciwą większości sieci, która także kieruje się własnym interesem w wydobywaniu waluty. Jeśli jednak kontrolowana przez kogoś większość sieci zaczęłaby skutecznie fałszować transakcje, sieć automatycznie straciłaby swoją wiarygodność, bazującą przecież na przekonaniu o niemożliwości podwójnego (i więcej) wydatkowania.
Inne zagrożenie dotyczy tzw. selfish miningu, do którego potrzeba tylko ok. 30 proc. mocy obliczeniowej całej sieci. Polega ono na przetrzymywaniu zautoryzowanego bloku transakcji w prywatnym blockchainie. Taka grupa później przez jakiś czas dalej autoryzuje transakcje i tworzy kolejne bloki, a potem publikuje wszystko je za jednym zamachem. To tego momentu wszyscy inni kopacze nieskutecznie próbują potwierdzać transakcje, gdyż nie wiedzą, że prawidłowe rozwiązanie zostało już znalezione – pozostaje ono przecież w tajemnicy. Można więc rzec, że kopiący de facto marnują prąd. Choć jeśli administrator poola próbującego dokonać self miningu jest zbyt chciwy, to może przeciągnąć czas opublikowania bitcoinów, do momentu kiedy ktoś inny zatwierdzi pierwszy blok. Wtedy wszystkie skolekcjonowane transakcje po prostu przepadają.
Wszystko to jest jednak łatwe do wyśledzenia (nawet ten przetrzymany blok musi się w końcu pojawić) i zidentyfikowania. Dzięki temu dopóki w społeczności bitcoina będą się znajdować odpowiedzialni ludzie prawdopodobieństwo sukcesu tego typu ataków będzie odpowiednio mniejsze.