Czym jest Double Spending w Kryptowalutach?
Czym jest Double Spending w Kryptowalutach?
Strona GłównaArtykuły

Czym jest Double Spending w Kryptowalutach?

Średnio zaawansowany
2w ago
7m

Czym jest podwójne wydatkowanie?

Podwójne wydatkowanie stanowi potencjalny problem w przypadku wszystkich cyfrowych systemów gotówkowych. Polega ono na tym, że te same środki zostają przeznaczone do płatności dwukrotnie. Bez odpowiedniej architektury systemowej, która chronić będzie protokół przed tym zagrożeniem, użytkownicy nie mają możliwości zweryfikowania czy otrzymane środki nie zostały już gdzieś wcześniej wydane.

W przypadku kryptowalut, niezwykle ważne jest zapewnienie, że określonych jednostek cyfrowych monet nie można powielić. Cały system byłby zagrożony, gdyby Alice mogła otrzymać 10 monet, skopiować je i powielić dziesięciokrotnie, stając się posiadaczem 100 jednostek kryptowaluty. Podobny problem pojawiłby się, jeśli Alice mogłaby wysłać te same 10 monet jednocześnie do Boba i Carol. Aby pieniądze cyfrowe mogły funkcjonować, muszą istnieć mechanizmy zapobiegające podwójnemu wydatkowaniu.


Jak można zapobiec podwójnemu wydatkowaniu?

Rozwiązanie scentralizowane

Scentralizowane rozwiązanie tego problemu jest znacznie łatwiejsze do wdrożenia niż zdecentralizowane alternatywy. W takim wypadku do systemu dodaje się jednego nadzorcę, który zarządza systemem oraz posiada prawo emisji jednostek cyfrowej gotówki. Dobrym przykładem scentralizowanego rozwiązania problemu podwójnego wydatkowania jest system zastosowany w eCash Davida Chauma.

W celu zapewnienia użytkownikom cyfrowych monet, będącymi substytutem tradycyjnej gotówki (możliwymi do anonimowego obrotu w stylu peer-to-peer), bank jest w stanie wykorzystać ślepe sygnatury (blind signatures). Opisuje to kryptograf David Chaum w 1982 roku, w swojej pracy Blind Signatures for Untraceable Payments.

Spójrzmy na prosty przykład. Jeśli użytkownik (nazwijmy go Dan) chce otrzymać 100 USD w gotówce cyfrowej, musi najpierw poinformować o tym bank. O ile posiada wystarczające środki na swoim koncie, może przystąpić do tego procesu. Wpierw wygeneruje on losową liczbę (lub wiele, dla mniejszych nominałów). Załóżmy, że losuje pięć liczb, z których każda ma przypisaną wartość 20 USD. Aby uniemożliwić bankowi śledzenie określonych jednostek, Dan zaciemnia losowe liczby, dodając do każdej z nich "blinding factor" .

Następnie przekazuje te dane bankowi, który pobiera 100 USD z jego konta, i podpisuje wiadomości potwierdzające, że każdą z pięciu "informacji" można wymienić za 20 USD. Dan może teraz wydawać środki wyemitowane przez bank. Idzie na przykład do restauracji Erin i kupuje obiad kosztujący 40 USD. 

Dan może usunąć blinding factor, w celu odsłonięcia liczby losowanej związanej z każdym „rachunkiem” cyfrowej gotówki. Taka liczba służy jako unikalny identyfikator dla każdej jednostki monety cyfrowej (podobnie jak numer seryjny w pralce). Ujawnia dwie z nich Erin, a restauracja musi teraz natychmiast "odkupić" je od banku, aby uniemożliwić Danowi podwójne wydatkowanie - czyli wykorzystanie tych samych monet z przypisanymi liczbami losowanymi u innego sprzedawcy. Bank sprawdzi, czy podpisy są ważne, a jeśli wszystko będzie wyglądało poprawnie, doładuje konto Erin kwotą 40 USD.

Pierwotnie zastosowane rachunki są teraz zasadniczo "spalane" albo po prostu usuwane. Konieczne jest więc stworzenie nowych przez bank, jeśli Erin zdecyduje się na wydanie swoich pieniędzy cyfrowych. Przyznacie, że jest to mało ergonomiczne rozwiązanie.

ECash Chauma mógłby zadziałać w systemie ograniczonym do prywatnych transakcji. Ale nie jest on (system) odporny na ataki, ponieważ jeden bank sprawuje kontrolę. Wydany rachunek sam w sobie nie jest nic wart, ponieważ jego wartość wynika wyłącznie z gotowości banku do wymiany go na dolary. Klienci są więc na łasce banku i muszą polegać na jego dobrej woli, aby cyfrowe pieniądze działały. Problem ten został po raz pierwszy w pełni rozwiązany w Bitcoinie.


Rozwiązanie zdecentralizowane

Zapewnienie, że funduszy nie można wydać podwójnie w systemie monetarnym bez centralnego nadzorcy, jest sporym wyzwaniem. Uczestnicy sieci muszą koordynować zbiór zasad, które zapobiegają oszustwom i zachęcają wszystkich użytkowników do uczciwego działania w obrębie ekosystemu.

Największą innowacją przedstawioną w whitepaper Bitcoina było rozwiązanie problemu podwójnego wydatkowania. Satoshi zaproponował strukturę danych, obecnie powszechnie znaną jako blockchain, rozwiązującą problem podwójnego wydatkowania monet.
Blockchain to tak naprawdę tylko baza danych z pewnymi unikalnymi właściwościami. Uczestnicy sieci (zwani węzłami) korzystają ze specjalistycznego oprogramowania, które umożliwia synchronizację kopii bazy danych z resztą uczestników systemu. Rezultat jest taki, że cała sieć może kontrolować historię transakcji, od czasu pierwszego bloku Bitcoina, zwanego genesis. Dzięki publicznej przejrzystości blockchaina, łatwo jest wykryć nielegalne działania i im aktywnie zapobiegać. Należą do nich również transakcje w ramach, których ktoś próbuje podwójnie wydać te same bitcoiny.
Gdy użytkownik rozgłasza transakcję w sieci, nie jest ona od razu dodawana do łańcucha bloków - musi najpierw zostać uwzględniona w bloku poprzez górnictwo (mining). W związku z tym odbiorca powinien uznać transakcję za ważną dopiero po dodaniu jej do łańcucha bloków kryptowaluty. W przeciwnym razie ryzykują utratą środków, ponieważ nadawca mógłby teoretycznie wydać te same monety w innym miejscu. 
Po potwierdzeniu transakcji monet nie można wydać podwójnie, ponieważ coin zostaje przypisany nowemu użytkownikowi - i cała sieć jest w stanie to zweryfikować. Z tego powodu wielu zaleca czekanie na kilka potwierdzeń przed zaakceptowaniem płatności w kryptowalucie. Każdy kolejny blok drastycznie zmniejsza szanse, że otrzymane monety zostaną podwójnie wydatkowane (choć może to wystąpić w przypadku skutecznego ataku 51%).

Powróćmy do scenariusza płatności w restauracji. Dan wraca do restauracji i tym razem zauważa na oknie naklejkę "Akceptujemy Bitcoina". Smakował mu ostatni posiłek, więc zamawia go ponownie. Kosztuje go to 0,005 BTC. 

Erin podaje mu adres publiczny, na który Dan musi wysłać fundusze. Dan tworzy transakcję, która jest w zasadzie podpisanym komunikatem stwierdzającym, że 0,005 BTC, które były w posiadaniu Dana, są teraz w posiadaniu Erin. Nie wchodząc w szczegóły, każdy kto zobaczy podpisaną transakcję Dana może sprawdzić, czy rzeczywiście był on w posiadaniu monet, a zatem miał uprawnienia do ich wysłania.

Jak już wspomniano, transakcja jest ważna tylko wtedy, gdy zostanie zawarta w bloku, a blok potwierdzony przez sieć (górników). Akceptowanie niepotwierdzonych transakcji przypomina przyjmowanie 40 USD w eCash z poprzedniego przykładu, bez natychmiastowej wypłaty otrzymanych pieniędzy w banku - pozwala to nadawcy wydać je gdzie indziej. Dlatego zaleca się, aby Erin czekała na co najmniej 6 potwierdzeń z sieci (co trwa około godziny) przed finalnym zaakceptowaniem płatności Dana.


Podwójne wydatkowanie w Bitcoinie

Bitcoin został starannie zaprojektowany, aby zapobiegać atakom związanym z podwójnym wydatkowaniem. Przynajmniej wtedy, gdy protokół jest używany zgodnie z założeniami. Oznacza to, że jeśli poszczególne osoby czekają na potwierdzenie transakcji w bloku, nadawca nie może cofnąć transakcji. Żeby to zrobić, musieliby „odwrócić” cały łańcuch bloków Bitcoina, co wymagałoby dostępu do absurdalnie wielkich pokładów mocy obliczeniowej i wiązałoby się z ogromnymi kosztami.

Istnieje jednak kilka ataków polegających na podwójnym wydatkowaniu, których celem są strony akceptujące niepotwierdzone transakcje. Na przykład w przypadku zakupów o niskiej wartości akceptant może nie chcieć czekać na włączenie transakcji do bloku. Restauracji typu fast food prawdopodobnie nie stać na czekanie na potwierdzenia z sieci. Jeśli więc firma umożliwia „natychmiastowe” płatności, otwiera się na atak z podwójnym wydatkowaniem. Ktoś może zamówić burgera, zapłacić za niego, a następnie natychmiast wysłać te same środki na swój adres. Przy wyższej opłacie ta nowa transakcja prawdopodobnie zostanie najpierw potwierdzona, a zatem unieważni poprzednią.

Istnieją trzy popularne metody przeprowadzania tych ataków:

  • atak 51%: gdy jednostka lub organizacja przejmie ponad 51% mocy obliczeniowej sieci kryptowaluty, umożliwi jej to odwrócenie łańcucha bloków i podwójne wydatkowanie transakcji. Taki atak jest możliwy również w Bitconie, jednak na astronomiczne koszty z nim związane oraz problemy logistyczne - nigdy nie miał miejsca.
  • Wyścig: nadawane są dwie transakcje z tymi samymi środkami, lecz tylko jedna z nich zostaje zaakceptowana. Celem atakującego jest unieważnienie jednej transakcji i doprowadzenie do zatwierdzenia tej, dzięki której zyska monety dla siebie (np. wysyłając kryptowaluty na adres, który kontroluje). Przeprowadzenie ataku "wyścigowego" wymaga, żeby odbiorca akceptował płatności z niepotwierdzonymi transakcjami (0-conf transactions).
  • Atak Finney'a: atakujący przygotowuje jedną transakcję, bez natychmiastowego rozgłaszania jej do sieci. Następnie wydaje te same monety w ramach innej transakcji i dopiero wtedy rozsyła swój wcześniej wydobyty blok, który może później unieważnić płatność. Ataki Finney'a wymagają określonej sekwencji zdarzeń i dobrej koordynacji, a także uzależnione są od tego, czy odbiorca przyjmuje płatności 0-conf.

Jak możemy zauważyć, sprzedawca, który czeka na kilka potwierdzeń transakcji w sieci, znacznie zmniejsza ryzyko stania się ofiarą ataków polegających na podwójnym wydatkowaniu.


Wnioski

Podwójne wydatkowanie w monetarnych systemach cyfrowych pozwala atakującym na uzyskania korzyści finansowych, wykorzystując te same fundusze więcej niż raz. Tradycyjnie, brak odpowiednich rozwiązań problemu, przeszkadzał w dokonaniu postępu w tej dziedzinie.

Na szczęście jednak użycie ślepych podpisów zaproponowało interesujące rozwiązanie dla scentralizowanych programów finansowych. Późniejsze stworzenie mechanizmów Proof of Work i technologii blockchain dało początek Bitcoinowi, jako potężnej formie zdecentralizowanego pieniądza. Zapoczątkował on erę kryptowalut jakie znamy dziś.