Uniwersytet Warszawski Wydział Matematyki, Informatyki i Mechaniki Daniel Malinowski Nr albumu: 292680 Uczciwa loteria oparta na systemie Bitcoin Praca magisterska na kierunku INFORMATYKA Praca wykonana pod kierunkiem dra hab. Stefana Dziembowskiego Instytut Informatyki Wrzesień 2014
Oświadczenie kierującego pracą Potwierdzam, że niniejsza praca została przygotowana pod moim kierunkiem i kwalifikuje się do przedstawienia jej w postępowaniu o nadanie tytułu zawodowego. Data Podpis kierującego pracą Oświadczenie autora (autorów) pracy Świadom odpowiedzialności prawnej oświadczam, że niniejsza praca dyplomowa została napisana przeze mnie samodzielnie i nie zawiera treści uzyskanych w sposób niezgodny z obowiązującymi przepisami. Oświadczam również, że przedstawiona praca nie była wcześniej przedmiotem procedur związanych z uzyskaniem tytułu zawodowego w wyższej uczelni. Oświadczam ponadto, że niniejsza wersja pracy jest identyczna z załączoną wersją elektroniczną. Data Podpis autora (autorów) pracy
Streszczenie System Bitcoin jest kryptograficznym systemem płatności wprowadzonym w 2008 roku przez Satoshiego Nakamoto. System ten zyskał w ostatnim czasie znaczną popularność, głównie ze względu na swoją najistotniejszą cechę, jaką jest decentralizacja oraz brak kontroli nad walutą przez żaden kraj, bank czy instytucję. Ponadto w systemie tym możliwe jest wykonanie szybkich przelewów do dowolnych użytkowników na świecie, a opłaty transakcyjne są zerowe bądź też bardzo małe. System ten pozwala także na dokonywanie bardziej skomplikowanych transakcji niż zwykłe przelewy. W pracy tej opiszemy dwa protokoły bazujące na tej własności systemu Bitcoin. Pierwszy z nich Zobowiązania Bitowe oparte na systemie Bitcoin pozwala na karanie finansowe użytkownika, który nie chce otworzyć swojego zobowiązania. Drugi Uczciwa loteria oparta na systemie Bitcoin jest przykładem loterii, w której przegrani gracze zmuszeni są do zapłaty zwycięzcy ustalonej wcześniej stawki. Oba te protokoły nie wymagają żadnej zaufanej strony trzeciej, ich bezpieczeństwo opiera się na właściwościach systemu Bitcoin oraz kryptografii. Na końcu pracy przedstawimy również prostą implementację protokołu loterii. Słowa kluczowe Bitcoin, loteria, zobowiązania bitowe, bezpieczne obliczenia wielopodmiotowe 11.3 Informatyka Dziedzina pracy (kody wg programu Socrates-Erasmus) Klasyfikacja tematyczna Theory of computation - Computational complexity and cryptography - Cryptographic protocols Fair Bitcoin-based lottery Tytuł pracy w języku angielskim
Spis treści Wprowadzenie........................................ 5 Motywacja........................................ 5 Znaczenie wyników opisanych w pracy......................... 6 Zawartość pracy..................................... 7 Powiązane prace oraz problemy otwarte........................ 9 1. Wiadomości wstępne................................... 11 1.1. Notacja....................................... 11 1.2. Bezpiecznie obliczenia wielopodmiotowe..................... 11 1.3. Model z losową wyrocznią............................. 13 2. Opis systemu Bitcoin................................... 15 2.1. Główna idea oraz własności systemu Bitcoin................... 15 2.2. Wysokopoziomowe wprowadzenie do systemu Bitcoin i dowodów pracy.... 17 2.3. Standardowe działanie systemu Bitcoin...................... 18 2.4. Prawdziwe, najogólniejsze działanie systemu Bitcoin.............. 19 2.5. Notacja transakcji w systemie Bitcoin...................... 21 2.6. Własności sieci P2P w systemie Bitcoin..................... 22 3. Zobowiązania bitowe oparte na systemie Bitcoin................... 27 3.1. Klasyczne zobowiązania bitowe.......................... 27 3.2. Definicja Zobowiązania bitowego opartego na systemie Bitcoin........ 29 3.3. Protokół....................................... 30 3.4. Dowód bezpieczeństwa............................... 30 4. Uczciwa loteria oparta na systemie Bitcoin...................... 33 4.1. Algorytm Bluma.................................. 33 4.2. Definicja Uczciwej loterii opartej na systemie Bitcoin.............. 34 4.3. Protokół....................................... 35 4.4. Dowód bezpieczeństwa............................... 37 5. Opis implementacji Uczciwej loterii opartej na systemie Bitcoin........... 41 5.1. Opis projektu.................................... 41 5.2. Opis funkcjonalności................................ 42 5.3. Przykładowa użycie programu do rozegrania loterii............... 42 Podsumowanie........................................ 45 Podziękowanie...................................... 45 3
Bibliografia.......................................... 48 4
Wprowadzenie Motywacja Bezpieczne obliczenia wielopodmiotowe są kryptograficzną metodą na wspólne wykonanie akcji w sposób bezpieczny przez nieufających sobie wzajemnie użytkowników. Mówiąc w skrócie, pozwalają one użytkownikom na obliczenie funkcji na parametrach będących ich sekretami, bez ujawniania samych sekretów. Jedyny sposób, w jaki nieuczciwi gracze mogą wpłynąć na wykonywany protokół, to wybranie własnego sekretu, przy użyciu którego będzie obliczana funkcja. Klasycznym problemem w teorii bezpiecznych obliczeń wielopodmiotowych jest problem milionerów. W problemie tym dwóch użytkowników chce się dowiedzieć, który z nich jest bogatszy 1. Nie chcą oni jednak podawać swojego majątku drugiej stronie. Przy zastosowaniu technik bezpiecznych obliczeń wielopodmiotowych mogą oni to zrobić. Oczywiście każdy z nich może podać większą bądź mniejszą wartość niż jego rzeczywisty majątek oraz dowie się, czy majątek drugiego gracza (wartość jaką on podał) jest większy czy mniejszy od jego. Jednak bezpieczeństwo oznacza tyle, że nie może zrobić nic więcej nie sprawi, że funkcja wskaże, że ich majątki są równe (chyba, że przez przypadek o pomijalnie małym prawdopodobieństwie zajścia) ani nie pozna dokładnego majątku drugiego gracza. Innym rozważanym problemem jest problem loterii. W problemie tym gracze nie posiadają żadnych własnych sekretów. Chcą oni jednak rzucić monetą wygenerować wspólnie jednostajnie losowy bit każdy z nich musi mieć pewność, że bit ten jest rzeczywiście jednostajnie losowy. Bit ten może oznaczać, który z nich jest zwycięzcą loterii. Bezpieczeństwo protokołu rozwiązującego ten problem oznacza m.in., że żaden z graczy nie może wpłynąć na rozkład prawdopodobieństwa generowanych bitów, np. nie może sprawić, że zawsze będzie wygrywał loterię. Możliwości bezpiecznych obliczeń wielopodmiotowych są znacznie większe, niż te powyżej wymienione. Udowodniono [16], że każdą wielomianową funkcję można zaimplementować jako protokół bezpiecznych obliczeń wielopodmiotowych. Dzięki tej teorii można również w sposób bezpieczny grać w gry, w których gracze posiadają tajne informacje oraz wykonują swoje akcje w zależności od poprzednich ruchów w grze. Prostym przykładem takiej gry jest poker. Dzięki bezpiecznemu protokołowi do gry w pokera tzw. pokerowi mentalnemu można rozegrać całą partię, od rozdania kart aż do zwycięstwa jednego z graczy, przez internet bez potrzeby ufania żadnej trzeciej stronie. Mimo swojego wielkiego potencjału, wielu badań oraz naturalnego zastosowania w grach hazardowych, bezpieczne obliczenia wielopodmiotowe nie są używane w internetowych kasynach. Istnieją co najmniej dwa istotne powody za to odpowiedzialne. Pierwszym z nich jest to, że w ogólności bezpieczne obliczenia wielopodmiotowe nie zapewniają uczciwości, gdy liczba 1 Mówiąc bardziej formalnie, chcą obliczyć funkcję f(x, y) = 1 gdy x > y, f(x, y) = 1 gdy x < y oraz f(x, y) = 0 gdy x = y. 5
złych (nieuczciwych) graczy wynosi co najmniej połowę. Uczciwość jest własnością protokołu mówiącą, że jeżeli jeden z graczy pozna wynik, to wszyscy gracze go poznają. Jeżeli np. protokół loterii nie posiada tej własności, to nieuczciwy graczy, gdy dowie się, że przegrał, mógłby przerwać wykonanie protokołu, sprawiając, że loteria byłaby nieważna. Z taką sytuacją mamy do czynienia m.in. w przypadku gier dwuosobowych. Ponadto w grach wieloosobowych jest to również duży problem, gdyż w internecie łatwo jest tworzyć wiele tożsamości, zatem jeden przeciwnik może kontrolować wielu pojedynczych użytkowników (jest to atak typu sybil opisany w [9]). Drugim problemem związanym z użyciem bezpiecznych obliczeń wielopodmiotowych do gier hazardowych są ich naturalne ograniczenia. Obliczenia te nie zapewniają nic więcej niż tzw. emulację świata idealnego, w którym gracze po prostu poznają wynik funkcji. Jednak w żaden sposób wynik ten nie jest związany ze światem rzeczywistym. Nie ma kryptograficznej metody zmuszenia kogoś do uszanowania wyniku gry i zapłacenia zwycięzcy odpowiedniej kwoty. Zarządzanie pieniędzmi znajduje się po prostu poza klasyczną kryptografią. W celu ominięcia powyższego problemu, w pracy tej skupiliśmy się na kryptograficznej walucie bitcoin. System Bitcoin został wprowadzony w 2008 roku przez Satoshiego Nakamoto w [14] (jest to prawdopodobnie pseudonim). W ostatnim czasie system ten zyskał ogromną popularność poprzez możliwość wykonywania szybkich przelewów do dowolnego użytkownika na świecie obarczonych zerową, lub bardzo niską opłatą. Ponadto system ten jest zdecentralizowany. Oznacza to, że żaden kraj, bank czy instytucja nie może zabrać ani zamrozić pieniędzy użytkowników bądź też dodrukować pieniędzy w celu zwiększenia inflacji. System Bitcoin pozwala również na projektowanie bardziej skomplikowanych operacji pieniężnych niż same przelewy posiada on możliwość tworzenia kontraktów. Z naszego punktu widzenia jest to bardzo ważna cecha, gdyż naszym celem było stworzenie kryptograficznej loterii, w której przegrany użytkownik musi respektować wynik i zapłacić zwycięzcy, a kontrakty to umożliwiły. Znaczenie wyników opisanych w pracy W internecie działa bardzo wiele stron internetowych do uprawiania hazardu opierających się o system Bitcoin. Działają one na zasadzie internetowego kasyna. Oznacza to, że gracz musi najpierw wpłacić bitcoiny na konto kasyna. Podczas gry zmieniają się środki na jego koncie w kasynie i w każdej chwili może je wypłacić. Ciekawą własnością większości internetowych kasyn opartych o walutę bitcoin, jest dowodzenie uczciwości po grze. Polega ono na tym, że przed przeprowadzeniem losowania (o to, czy gracz wygra czy przegra) serwer generuje losowy ciąg znaków i wyświetla użytkownikowi jego hasz (zobowiązuje się do niego). Następnie gracz wpisuje swój własny (losowy) ciąg znaków. Oba ciągi znaków są łączone, haszowane i na podstawie uzyskanego hasza obliczany jest wynik losowania. Po losowaniu serwer ujawnia swój ciąg znaków. Dzięki temu wynik losowania jest rzeczywiście losowy, gdyż zależy od wyniku funkcji haszującej na nieprzewidywalnym parametrze. Ponadto użytkownik może sprawdzić, czy losowanie zostało poprawnie przeprowadzone poprzez sprawdzenie poprawności ujawnionego przez serwer ciągu znaków. Własność ta spowodowała, że użytkownicy zaufali internetowym kasynom i wierzą, że nie zostaną oszukani. Z punktu widzenia kryptografii własność dowodzenia uczciwości po grze jest niewystarczająca. Główny problem polega tu na tym, że pierwsze co musimy zrobić przed rozpoczęciem gry, to wpłacić swoje bitcoiny na konto kasyna. W związku z tym, nic nie gwarantuje, że po wygraniu gry rzeczywiście będziemy mogli odzyskać te pieniądze. Jeżeli właściciel kasyna jest nieuczciwy, to może on zamknąć kasyno i ukraść powierzone mu środki. Takie sytuacje 6
w kasynach grających o bitcoiny miały już miejsce. Kasyna internetowe pobierają pewną małą kwotę od wygranych. Opłata ta zwykle waha się w przedziale 0.5% 2%. Jej wielkość często uzależniona jest od tego, jaką reputację posiada dane kasyno. Bardziej znane kasyna, którym ludzie ufają, że nie znikną z rynku kradnąc środki, mogą pozwolić sobie na większe opłaty. Przykładem na to jest serwis SatoshiDice, największe z tego typu kasyn, który pobiera opłatę około 2%. Opłaty te sprawiają, że granie w kasynach jest całkowicie nieopłacalne. Aby rozwiązać powyższe problemy, opracowaliśmy protokół loterii opartej o system Bitcoin. Loteria ta jest bardzo prostego typu użytkownicy wpłacają równe stawki do puli, a następnie jednostajnie losowo wybrany jeden z nich zgarnia całą pulę. Nasz protokół może być wykorzystany do gry między nieznającymi się osobami, a jego bezpieczeństwo stwierdza, że osoby te nie mogą się nawzajem oszukać. Przegrany zawsze musi zapłacić zwycięzcy ustaloną wcześniej stawkę. Jedyny sposób, w jaki może on wpłynąć na protokół, to trochę go opóźnić. Protokół ten jest wykonywany bez pomocy żadnej zaufanej strony trzeciej, jego bezpieczeństwo opiera się jedynie na własnościach systemu Bitcoin oraz kryptografii. Ponadto w protokole tym nie ma żadnych opłat, jedynie przy wysyłaniu transakcji systemu Bitcoin trzeba do nich dołączyć (bardzo) małe opłaty, niezależne od wielkości stawki. Dzięki temu, używanie naszego protokołu jest bardziej bezpieczne i opłacalne niż używanie internetowych kasyn. Protokół nasz można również prosto zmienić, jeżeli chcielibyśmy wprowadzić nierówne stawki, zmienić prawdopodobieństwo wygrania poszczególnych graczy, czy wprowadzić opłatę dla kasyna. W pracy tej opiszemy również drugi protokół oparty o system Bitcoin, który stworzyliśmy pracując nad protokołem bezpiecznej loterii. Protokół ten rozszerza możliwości zobowiązań bitowych. W klasycznych zobowiązaniach bitowych Zobowiązujący w pierwszej fazie zobowiązuje się do swojego sekretu nie ujawniając o nim żadnej informacji. Natomiast w drugiej fazie otwiera on swoje zobowiązanie, czyli pokazuje swój sekret. Robi to w taki sposób, że Odbiorca ma pewność, że o ten sekret chodziło Zobowiązującemu od początku. Pewnym problemem może być czasem sytuacja, w której Zobowiązujący nie chce otworzyć swojego zobowiązania. W naszym protokole rozwiązaliśmy to w taki sposób, że Zobowiązujący płaci odpowiednią karę w bitcoinach, jeżeli do ustalonego momentu nie otworzy swojego zobowiązania. Tak jak przy naszym protokole do uczciwej loterii, tutaj także własność ta jest zapewniona przez system Bitcoin oraz kryptografię i nie wymaga żadnej zaufanej strony trzeciej. Z samej definicji protokołu loterii wynika, że ma on pewne problemy, które powodują, że prawdopodobnie nie będzie on używany w rzeczywistej grze. Po pierwsze, przy okazji wykonania protokołu gracze muszą założyć depozyt (który dostaną na zakończenie z powrotem), którego wielkość rośnie z liczbą graczy. Jego wielkość jest akceptowalna dla 2-3 graczy, ale dla większej liczby graczy jest on zbyt duży. Po drugie, czas wykonania protokołu jest dosyć wysoki. Pojedyncze wykonanie protokołu może trwać nawet kilka godzin. Jeżeli jednak niestandardowe własności systemu Bitcoin, które są w tym protokole wykorzystywane, stałyby się bardziej popularne i łatwiejsze w użyciu, to czas ten może się znacząco skrócić. W ostatnim rozdziale pracy przedstawimy prosty program służący do testowego rozegrania loterii przy użyciu naszego protokołu. Jest to nieduży projekt, którego celem jest pokazanie możliwości wykonania naszego protokołu, a nie jego używanie w praktyce i nie jest on głównym wynikiem tej pracy. Zawartość pracy Podamy teraz opis zawartości kolejnych rozdziałów pracy. 7
Rozdział pierwszy zawiera wiadomości wstępne potrzebne do pełnego zrozumienia pracy oraz omawianego tematu. W pracy tej zakładamy, że czytelnik zna najbardziej podstawowe pojęcia kryptograficzne, zatem nie będą one omówione w ramach wiadomości wstępnych. Rozdział ten zaczyna się od notacji używanej przy stosowaniu pojęć kryptograficznych. Następnie omówione zostaną wspomniane wcześniej bezpieczne obliczenia wielopodmiotowe. Nie są one bardzo istotne do zrozumienia wyników opisanych w pracy, jednak są one z nimi mocno powiązane. Dodatkowo opisane są tam założenia przyjmowane w teorii bezpiecznych obliczeń wielopodmiotowych, które my również będziemy przyjmowali w tej pracy. Rozdział pierwszy kończy się opisem modelu z losową wyrocznią. Praca w tym modelu jest założeniem często spotykanym w protokołach używających funkcji haszujących. W naszym przypadku użycie tego założenia związane jest ze stosowaniem systemu Bitcoin, który niejako wymaga użycia modelu z losową wyrocznią. Kolejny rozdział zawiera opis systemu Bitcoin. System ten jest dosyć nowy oraz mimo swojej ogromnej popularności jego własności nie są szeroko znane. W związku z tym postanowiliśmy opisać całościowe działanie tego systemu (w sposób ogólny). W naszych protokołach będziemy mocno korzystać z zaawansowanych własności transakcji w systemie Bitcoin, zatem opiszemy ich działanie ze szczegółami. Rozdział ten zaczniemy od opisu idei systemu Bitcoin oraz powodów, dla których zyskał on popularność. Opiszemy na czym on polega oraz postaramy się rozwiać część mitów go dotyczących. Następnie przejdziemy do technicznego opisu działania systemu Bitcoin. Działanie to pokażemy w trzech krokach począwszy od działania uproszczonego wraz z opisem dowodów pracy, poprzez standardowe działanie, które wystarcza w prawie wszystkich przypadkach, a skończywszy na opisaniu niestandardowych transakcji, które będą nam dalej potrzebne. Opiszemy co zawierają takie transakcje, jak się je waliduje oraz wysyła, na czym polega tzw. kopanie bitcoinów a także nieformalnie zaagitujemy dlaczego system ten jest bezpieczny. W dalszej części drugiego rozdziału opiszemy język skryptowy używany w transakcjach oraz naszą notację do zapisywania jego oraz samych transakcji. Rozdział ten kończy się opisem pewnych cech systemu Bitcoin związanych z tym, że działa on w sieci rozproszonej. Cechy te to opóźnienia w dokonywaniu transakcji, jawność transakcji po ich wysłaniu oraz ich kowalność. Kowalność jest istotnym problemem w projektowaniu protokołów w systemie Bitcoin pokażemy w jaki sposób własność ta wpływa na bezpieczeństwo na przykładzie protokołu na depozyt, wziętego z literatury związanej z systemem Bitcoin. Trzeci rozdział zawiera pierwszy z dwóch wyników opisanych w pracy Zobowiązania bitowe oparte na systemie Bitcoin. Rozdział ten zaczniemy jednak od przypomnienia klasycznych zobowiązań bitowych. Opiszemy definicje zobowiązań bitowych oraz ich bezpieczeństwa. Następnie przypomnimy prosty protokół na zobowiązania bitowe używający funkcji haszujących. Udowodnimy także jego bezpieczeństwo w modelu z losową wyrocznią. W dalszej części tego rozdziału skupimy się na Zobowiązaniach bitowych opartych na systemie Bitcoin. Podamy ich ideę, definicje bezpieczeństwa a także protokół w wersji formalnej oraz bardziej opisowej. Protokół ten będzie rozwinięciem podanego wcześniej rozwiązania klasycznego problemu. Rozdział zakończymy dowodem poprawności i bezpieczeństwa naszego protokołu. Następny rozdział zawiera nasz kolejny protokół Uczciwą loterię opartą na systemie Bitcoin. Rozdział ten ma podobną strukturę co poprzedni. Zaczniemy od przypomnienia klasycznego problemu bezpiecznego rzutu monetą na odległość wraz z jego rozwiązaniem algorytmem Bluma. Algorytm ten w prosty sposób wykorzystuje klasyczne zobowiązania bitowe. Przedstawimy definicję tego problemu oraz jego bezpieczeństwa a także dowód poprawności algorytmu Bluma. Następnie przejdziemy do Uczciwej loterii opartej na systemie Bitcoin. Zdefiniujemy problem oraz jego warunki bezpieczeństwa. Później zaprezentujemy nasze rozwiązanie tego problemu podamy protokół w sposób opisowy a także w sposób for- 8
malny. Nasz protokół będzie rozwinięciem algorytmu Bluma będzie jednak wykorzystywał Zobowiązania bitowe oparte na systemie Bitcoin zamiast klasycznych zobowiązań bitowych. Rozdział zakończymy dowodem poprawności i bezpieczeństwa naszego protokołu. Ostatni z rozdziałów jest opisem implementacji protokołu na Uczciwą loterię opartą na systemie Bitcoin. Jest to nieduży projekt, którego celem jest pokazanie możliwości użycia naszego protokołu. Jego celem nie jest używanie naszego protokołu w praktyce tylko testowe uruchomienie naszego protokołu. Program ten również jest tylko dodatkiem do naszych protokołów, to one stanowią główną część pracy. W rozdziale tym projekt ten zostanie zaprezentowany opiszemy jego architekturę, biblioteki z których korzysta a także opis jego funkcjonalności. Rozdział zakończymy przykładami użycia tego programu. Powiązane prace oraz problemy otwarte Praca ta powstała bazując na naszej poprzedniej pracy Secure Multiparty Computations on Bitcoin napisanej wraz z Marcinem Andrychowiczem, Stefanem Dziembowskim oraz Łukaszem Mazurkiem [3] (praca ta została odznaczona nagrodą za najlepszą pracę na konferencji 35th IEEE Symposium on Security & Privacy 2014). W [3] zostały wprowadzone bezpieczne obliczenia wielopodmiotowe oraz przedstawione tu protokoły, jednak bez dowodów bezpieczeństwa ani implementacji. Bezpieczny protokół loterii opartej na systemie Bitcoin był również niezależnie opisany przez Adama Back a oraz Iddo Bentov w [4]. Jednak protokół loterii z [4] jest protokołem tylko dla dwóch graczy oraz w przeciwieństwie do naszego protokołu, nie jest on odporny na kowalność transakcji. Temat bezpiecznych obliczeń wielopodmiotowych opartych na systemie Bitcoin był dalej rozwijany niezależnie w [2, 1] oraz w [7]. Prace te wykorzystują system Bitcoin aby zapewnić własność uczciwości w dowolnych obliczeniach wielopodmiotowych gracz, który przerywa protokół zmuszony jest do zapłacenia odpowiedniej kary w bitcoinach. Zobowiązania bitowe w kontekście systemu Bitcoin były rozważane także wcześniej, ale w innym celu. W [6] autorzy stworzyli prostszą wersję zobowiązań, którą wykorzystali do zwiększenia anonimowości transakcji. Natomiast [8] proponuje użyć system Bitcoin jako zamianę zaufanej strony w procesie stemplowania dokumentów znakiem czasowym. Pozostałe prace związane z systemem Bitcoin dzielą się zasadniczo na dwie grupy. Pierwsza z nich stara się analizować graf transakcji tego systemu i na jego podstawie wyciągnąć wnioski na temat użytkowników systemu. Do przykładów prac z tej grupy można zaliczyć m.in. [15]. Kolejną grupę tworzą prace proponujące ulepszenia do systemu Bitcoin. Jedna z ciekawszych z nich to [11] proponująca zmianę (wraz z dowodem poprawności), dzięki której użytkownicy i transakcje będą idealnie anonimowi. Do problemów otwartych w systemie Bitcoin zaliczyć można m.in. stworzenie wydajniejszych kontraktów rozwiązujących istotniejsze problemy niż zwykłą loterię. Ponadto wiele pracy wymaga samo sformalizowanie modelu systemu Bitcoin i dowiedzenie jego własności i bezpieczeństwa w tym modelu. Z powodu braku takiego modelu pojawiają się prace [12, 5] podważające bezpieczeństwo systemu, zatem istotne jest aby dowieść co dokładnie można a czego nie można w tym systemie zrobić. 9
Rozdział 1 Wiadomości wstępne W rozdziale tym ustalimy notację stosowaną w pracy oraz przypomnimy pewne wiadomości z kryptografii, takie jak bezpieczne obliczenia wielopodmiotowe oraz model z losową wyrocznią. W pracy tej zakładamy znajomość podstawowych pojęć kryptograficznych, takich jak schemat podpisu oraz (kryptograficzne) funkcje haszujące, w związku z tym nie będziemy ich przybliżać. W celu przypomnienia sobie tych pojęć czytelnik może zajrzeć np. do [13]. 1.1. Notacja Dla użytkownika P jego para kluczy: klucz publiczny, klucz sekretny, używane w schemacie podpisu, będą oznaczane odpowiednio przez P.pk oraz P.sk. Funkcję obliczającą podpis kryptograficzny na wiadomości m używając klucza P.sk użytkownika P będziemy oznaczać przez podpis P.sk (m). Natomiast funkcję weryfikującą podpis σ użytkownika P (czyli korzystającą z klucza publicznego P.pk) na wiadomości m będziemy oznaczać przez wer P.pk (m, σ). Funkcja ta zwraca wartość prawda bądź też wartość fałsz, w zależności od tego, czy podpis jest poprawny. Rozkład jednostajny na zbiorze A będziemy oznaczać przez U(A). Wylosowanie wartości x zgodnie z rozkładem R będziemy oznaczać przez x R. Wylosowanie wartości x jednostajnie ze zbioru A będziemy oznaczać przez x $ A. Zatem x $ A oznacza dokładnie to samo, co x U(A). Parametr bezpieczeństwa będziemy oznaczać symbolem λ bądź też 1 λ. Funkcje haszujące będziemy oznaczać literą h. Zatem h jest funkcją {0, 1} {0, 1} λ. W rozdziale 3 będziemy chcieli użyć funkcji haszujących jako zobowiązań bitowych (będą one omówione również w rozdziale 3). W związku z tym będziemy do parametru funkcji haszującej doklejać losowy ciąg bitów długości λ. Tak zmodyfikowaną randomizowaną funkcję będziemy oznaczać literą H. Zatem H jest funkcją {0, 1} λ+ {0, 1} λ. Funkcja ta na parametrze x losuje r $ {0, 1} λ oraz zwraca wartość h(x r), gdzie oznacza konkatenację napisów. 1.2. Bezpiecznie obliczenia wielopodmiotowe Zobowiązania bitowe oraz bezpieczne loterie, które będą omówione w dalszej części pracy, są przykładami ogólniejszego pojęcia w kryptografii, jakim są bezpieczne obliczenia wielopodmiotowe. Mówiąc w skrócie, bezpieczne obliczenia wielopodmiotowe pozwalają użytkownikom nie ufającym sobie wzajemnie wykonać (obliczyć) pewną akcję w taki sposób, że mają oni pewność, że została ona wykonana prawidłowo oraz bezpiecznie. Nie będziemy przedstawiać 11
tu bardzo formalnych definicji bezpiecznych obliczeń wielopodmiotowych, gdyż praca ta dotyczy ich tylko częściowo. Postaramy się jednak przybliżyć to pojęcie trochę dokładniej. W bezpiecznych obliczeniach wielopodmiotowych dana jest pewna grupa użytkowników. Nie znają się oni wzajemnie, jednak dla uproszczenia przyjmujemy, że każda para użytkowników połączona jest bezpiecznym kanałem. Oznacza to, że każdy użytkownik może wysłać każdemu innemu wiadomość. Wiadomość ta dojdzie do adresata w niezmienionej formie przed upływem limitu czasu oraz nikt jej nie podsłucha. Użytkownicy nie ufają sobie wzajemnie. Nie zakładamy tutaj, że przeciwnik jest jednostką z zewnątrz, która próbuje się czegoś dowiedzieć o wykonaniu protokołu, tylko że niektórzy z graczy mogą być źli. Oznacza to, że przeciwnik kontroluje (nieznaną) podgrupę użytkowników zna całą ich losowość, komunikacje oraz wykonuje za nich akcje. Inaczej mówiąc źli gracze współpracują ze sobą. Pozostali (uczciwi) gracze wykonują protokół zgodnie z opisem (zawsze zakładamy, że co najmniej jeden uczciwy gracz istnieje). Bezpieczne obliczenia wielopodmiotowe polegają na tym, że przy powyższych założeniach, chcemy obliczyć wartość danej funkcji w sposób bezpieczny. Funkcja ta (zależna od protokołu) przyjmuje jako parametry sekrety użytkowników i jej wynik powinni poznać wszyscy gracze. Bezpieczeństwo obliczenia polega na tym, że przeciwnik nie powinien dowiedzieć się niczego niepowołanego na temat sekretów uczciwych użytkowników. Formalizuje się to poprzez stwierdzenie, że przeciwnik nie jest w stanie dowiedzieć się ani zrobić nic więcej niż w świecie idealnym. Świat idealny polega na tym, że użytkownicy mają do dyspozycji zaufaną stronę oraz połączeni są z nią bezpiecznym kanałem komunikacyjnym. W celu obliczenia wartości funkcji na sekretach, każdy z graczy przesyła swój sekret do zaufanej strony. Jako, że kanał jest bezpieczny, a zaufana strona nie jest pod kontrolą przeciwnika, to w tej fazie przeciwnik nie dowie się niczego o sekretach uczciwych użytkowników. Następnie zaufana strona znając wszystkie parametry funkcji oblicza jej wartość i odsyła ją do wszystkich użytkowników. W świecie idealnym przeciwnik zasadniczo może zrobić trzy rzeczy. Może poznać sekrety użytkowników, których kontroluje. Może również kazać im wysłać wybrane przez siebie wartości do zaufanej strony, czyli może poznać wartość funkcji, gdzie parametry kontrolowanych przez siebie graczy są przez niego wybrane. Ponadto może on próbować wywnioskować coś na temat sekretów uczciwych graczy na podstawie poznanej wartości funkcji. Załóżmy przykładowo, że mamy dwóch użytkowników, z czego jeden jest uczciwy, a drugi zły. Funkcją, którą chcą oni policzyć, jest koniunkcja sekretnych bitów. Jeżeli zły gracz poda zaufanej stronie bit 1, to wartość funkcji będzie równa sekretnemu bitowi drugiego gracza, zatem przeciwnik go pozna. Jeżeli natomiast zły gracz poda bit 0, to wartość funkcji będzie wynosiła 0 a przeciwnik nie dowie się niczego o sekretnym bicie uczciwego użytkownika. Protokół obliczania danej funkcji jest bezpieczny, gdy nie pozwala na na zrobienie niczego więcej, niż w świecie idealnym. Oznacza to np., że przeciwnik nie powinien móc poznać wartości funkcji na dwóch różnych wejściach bądź też poznać sekretu uczciwych graczy, o ile nie jest to możliwe w świecie idealnym. Ponadto każdy z uczciwych graczy musi poznać taką samą wartość funkcji, która jest obliczona na sekretach uczciwych graczy oraz wartościach wybranych przez przeciwnika. Oczywiście jak zwykle w kryptografii zakładamy zaniedbywane (względem 1 λ ) prawdopodobieństwo tego, że któraś z tych własności nie zostanie spełniana. Funkcję f nazywamy zaniedbywalną, jeżeli po pomnożeniu jej przez dowolny wielomian dąży ona ciągle do zera przy rosnących parametrach, tzn. n>0 M x>m f(x) x n < 1. Teorio-informacyjnie nawet proste funkcje, takie jak głosowanie większościowe, nie mogą być obliczone w sposób bezpieczny, jeżeli liczba nieuczciwych graczy wynosi co najmniej jed- 12
ną trzecią wszystkich. Jednak już przy podstawowych założeniach kryptograficznych możliwe jest bezpieczne obliczenie dowolnej wielomianowej funkcji dla dowolnie wielu złych użytkowników pierwszą ogólną konstrukcję dla dowolnej wielomianowej funkcji pokazał Yao w [16]. Jednak tutaj również pojawia się pewien problem, gdy złych graczy jest co najmniej połowa wówczas w protokołach brakuje uczciwości, czyli własności mówiącej, że jeżeli przeciwnik pozna wartość funkcji, to również wszyscy uczciwi gracze poznają wartość funkcji. Ciekawe rozwiązanie tego problemu polegające na finansowym karaniu przeciwnika w przypadku, gdy nie przekaże on poprawnej wartości funkcji uczciwemu graczowi, można znaleźć w [2] oraz [1]. Przykłady klasycznych protokołów na bezpieczne obliczenia wielopodmiotowe, tzn. zobowiązania bitowe oraz bezpieczne loterie są opisane wraz z dowodami bezpieczeństwa w kolejnych rozdziałach. Przy rozważaniu naszych rozszerzeń do tych protokołów poprzez użycie systemu Bitcoin będziemy zakładali takie same założenia odnoście przeciwnika oraz bezpieczeństwa kanału jak w tej sekcji. 1.3. Model z losową wyrocznią W całej pracy będziemy pracowali w modelu z losową wyrocznią. Praca w tym modelu jest częstym założenie w protokołach kryptograficznych używających funkcji haszujących. Nieformalnie, mówi ono tyle, że używana funkcja haszująca h jest pewną funkcją jednostajnie losowo wybraną ze zbioru wszystkich funkcji. Funkcji {0, 1} {0, 1} λ jest jednak nieskończenie wiele, zatem musimy to doprecyzować. W modelu z losową wyrocznią funkcja haszująca jest osobnym komponentem protokołu tzw. losową wyrocznią. Komponent ten działa jak normalna funkcja. Można do niego dostarczyć parametr, a dostaniemy z powrotem odpowiadającą mu wartość. Losowa wyrocznia dla nowo dostarczonego parametru losuje niezależnie od poprzednich wyborów wartość y $ {0, 1} λ odpowiadającą temu parametrowi. Jeżeli natomiast spytano się powtórnie o wartość dla danego parametru, to zwracana jest ta sama wartość co wcześniej. W związku z tym strony w protokole nie mają żadnej informacji na temat wartości losowej wyroczni na danym parametrze dopóki nie spytają się o wartość dla dokładniej tego parametru. Model z losową wyrocznią jest oczywiście silniejszy od standardowych założeń o funkcjach haszujących. Z niezależności oraz jednostajnej losowości wartości wynikają w prosty sposób odporność na kolizje czy jednokierunkowość. Więcej na ten temat w rozdziale 3. Model z losową wyrocznią często ułatwia dowody. Czasami dowód jej używający jest jedynym, który jest znany. Dla teoretyków takie dowody są niewystarczające, gdyż w rzeczywistości przy użyciu danego protokołu użyjemy konkretnej funkcji haszującej, a nie jednostajnie wylosowanej funkcji. W związku z tym, zawsze szukają oni dowodów w standardowym modelu, czyli gdy o funkcji haszującej zakładamy jedynie jej podstawowe własności. Dla praktyków jednak dowody w modelu z losową wyrocznią są zwykle wystarczające. Często wynika to z faktu, że protokoły z dowodem w standardowym modelu są mniej wydajne niż protokoły z dowodem jedynie w modelu z losową wyrocznią, a w praktyce wydajność jest bardzo istotna. W systemie Bitcoin model z losową wyrocznią wydaje się jedynym możliwym wyborem, gdyż w procesie kopania bitcoinów (opisanym w następnym rozdziale) zakłada się, że wartości funkcji haszującej są nie tylko różne od siebie, ale także jednostajnie rozłożone w obrazie. Dlatego też nasze protokoły również rozważamy w tym modelu. 13
Rozdział 2 Opis systemu Bitcoin W rozdziale tym zostanie zaprezentowany system Bitcoin. Zaczniemy od jego własności, idei, powodów dla których ludzie mu zaufali oraz kontrowersji z nim związanych. Następnie przejdziemy do technicznego opisu systemu. Przedstawimy trzy wersje działania systemu począwszy od uproszczonej, a skończywszy na najbardziej skomplikowanej, która jest prawdziwą wersją używaną w praktyce. Na końcu omówimy również praktyczne zasady działania systemu Bitcoin, na które trzeba zwrócić uwagę, dowodząc bezpieczeństwo protokołów opartych na tym systemie. 2.1. Główna idea oraz własności systemu Bitcoin Bitcoin jest to waluta kryptograficzna opisana przez anonimowego autora o pseudonimie Satoshi Nakamoto w [14]. W ostatnim czasie zyskała ona znaczną popularność jej całkowita wartość rynkowa wynosi obecnie ponad 7 mld dolarów. Do powodów, dla których waluta ta zyskała wielu zwolenników, można zaliczyć między innymi możliwość wysyłania łatwo i szybko przelewów dowolnemu innemu użytkownikowi systemu Bitcoin na świecie, opłaty transakcyjne są bardzo niskie a nawet zerowe, użytkownicy są częściowo anonimowi, a waluta jest zdecentralizowana. Anonimowość, czy raczej pseudonimowość w systemie Bitcoin polega na tym, że przy przesyłaniu pieniędzy między użytkownikowi używa się adresów, które są losowymi kluczami publicznymi. W celu zwiększenia anonimowości, dla każdej transakcji używa się nowo wygenerowanego klucza publicznego. Dzięki tym zabiegom trudno jest połączyć konkretną osobę z jego adresami bądź też transakcjami. Jednak powstało już wiele prac np. [15], które starają się powiązać adresy, próbując znaleźć wszystkie kontrolowane przez pojedynczą osobę. Ponadto kupując bitcoiny często trzeba podać swoje dane osobowe. Osoby posiadające dostęp do tych danych mogą być w stanie powiązać ludzi z ich transakcjami. W praktyce problem ten nie wydaje się być bardzo duży i jest akceptowany, gdyż dzięki temu cały system jest wydajniejszy. Decentralizacja systemu Bitcoin polega na tym, że żadne państwo, żadna organizacja czy bank nie sprawują nad nim kontroli. Nikt nie może zabrać lub zamrozić użytkownikom ich pieniędzy, dodrukować bitcoinów w celu wzbogacenia się lub wygenerowania inflacji ani też zamknąć całej waluty. Własność ta jest główną ideą systemu Bitcoin, to dzięki niej ludzie zaczęli jej używać. Widać to było zwłaszcza po sytuacji na Cyprze w 2013 roku, kiedy to państwo zablokowało wszystkie konta bankowe w kraju, a następnie przejęło część środków na nich zgromadzonych niedługo po tych wydarzeniach zainteresowanie systemem Bitcoin oraz cena waluty znacząco podskoczyły. Decentralizacja systemu możliwa jest dzięki temu, że 15
system ten działa w rozproszonej sieci P2P, w której użytkownicy łącznie emulują bank łącznie walidują transakcje oraz stan kont użytkowników. Poprawność transakcji oraz zgodność z protokołem tworzenia nowych monet jest łatwe do sprawdzenia lokalnie, zatem użytkownicy trzymają lokalny stan całego systemu i to, na co oni się zgadzają, jest rzeczywistym stanem systemu. Więcej na temat napiszemy w następnej sekcji. Z fizycznego punktu widzenia monety w systemie Bitcoin to zwykłe ciągi zer i jedynek. W celu zapobiegnięcia sytuacji, w której ktoś chciałby wydać tą samą monetę wiele razy, system Bitcoin używa kryptografii głównie podpisów kryptograficznych oraz funkcji haszujących. Bitcoin swoje bezpieczeństwo oraz własności opiera właśnie na sile kryptografii oraz na założeniu, że większość siły obliczeniowej systemu jest w rękach uczciwych użytkowników, działających zgodnie z protokołem. Założenie to wydaje się być rozsądne, gdyż posiadając znaczną część całkowitej siły obliczeniowej systemu prawdopodobnie warto postępować uczciwie 2. Ponadto całkowita moc obliczeniowa systemu Bitcoin jest większa niż całkowita moc wszystkich 500 najmocniejszych superkomputerów na świecie, zatem próba uzyskania większości mocy obliczeniowe byłaby ogromnie kosztowna. Waluta bitcoin cieszy się coraz większym zainteresowaniem nie tylko ze strony zwykłych użytkowników, ale również sklepów i firm. W ostatnim czasie wiele wielkich amerykańskich firm, m.in. DELL, Wikipedia, Amazon, Dish Network, ebay czy PayPall zaczęło akceptować bitcoiny. Mimo ciągłych problemów z trudnością nabycia bitcoinów, to również jest coraz prostsze w wielu miejscach na świecie pojawiają się bankomaty, w których można zamieniać bitcoiny i standardową walutę. Ponadto niektórzy znani ekonomiści jak np. Ben Bernanke oraz angielskie FCA uznały system Bitcoin za godny uwagi i obiecujący. Również coraz częściej ludzie używają bitcoinów samych w sobie płacą nimi nie zamieniając ich na tradycyjne waluty. W związku z tym można uznać, że system Bitcoin coraz bardziej się rozwija oraz coraz częściej jest akceptowany i może zmienić nasze wyobrażenie o pieniądzach. Wiele osób ma różnego rodzaju uwagi w stosunku do systemu Bitcoin. Zarzucają mu m.in., że nie ma wartości, kopanie bitcoinów (opisane w następnej sekcji) marnuje niepotrzebnie dużo energii lub też twierdzi, że waluta ta jest używana głównie przez kryminalistów. Mimo częściowych racji, ciężko się zgodzić z tymi zarzutami. Wartością bitcoina są możliwości, które daje i których nie można uzyskać w standardowych walutach. Są to wspomniane wcześniej łatwość wykonywania tanich i szybkich przelewów oraz decentralizacja. Ponadto wartością danej rzeczy jest cena, jaką ludzie są w stanie za nią zapłacić złoto również nie ma wartości samej w sobie, po prostu jest uważane za drogie, więc jest drogie. Przy wytwarzaniu nowych monet oraz samym istnieniu systemu Bitcoin zużywane są ogromne ilości pracy komputerów więc i energii. Ale przy wydobyciu, transporcie i składowaniu złota również zużywane są znaczne zasoby. Prawdą jest, że niektórzy kryminaliści używają systemu bitcoin, ale wynika to z faktu, że po prostu upraszcza on transakcje, a jeżeli ktoś chce prać brudne pieniądze lub unikać płacenia podatków, to równie dobrze mógłby użyć tradycyjnych walut. I jak już wcześniej wspomniano, coraz więcej zwykłych użytkowników, sklepów i organizacji korzysta z dobrodziejstw systemu Bitcoin. My zajęliśmy się systemem Bitcoin, gdyż umożliwia on połączenie wartości pieniężnych z kryptografią. Ponadto nie jest on konstrukcją teoretyczną, ale jest używany w praktyce. Dodatkowo umożliwia on bardziej skomplikowane operacje finansowe niż tylko przesłanie komuś pieniędzy. Te możliwości oraz pewne szczegóły techniczne systemu Bitcoin omówimy w kolejnych sekcjach tego rozdziału. 2 Nie jest to jednak do końca pewne, patrz np. [12, 5]. 16
2.2. Wysokopoziomowe wprowadzenie do systemu Bitcoin i dowodów pracy Przedstawimy teraz uproszczoną wersję systemu Bitcoin. Na system składają się użytkownicy, każdy z nich (oznaczmy go przez P) posiada parę: klucz publiczny, klucz sekretny (P.pk, P.sk). Ponadto w systemie znajduje się jawna KsięgaGłówna zawierająca wszystkie transakcje wykonane w systemie. Transakcje przesyłają pojedyncze monety między użytkownikami. Każda z transakcji składa się z numeru poprzedniej transakcji, którą wydaje, a także klucza publicznego odbiorcy oraz podpisu kryptograficznego nadawcy na tej wiadomości. Transakcja ta jest poprawna, jeżeli wydawana transakcja nie była wcześniej wydana oraz podpis jest poprawnym podpisem odbiorcy wydawanej transakcji. Oczywiście, skoro KsięgaGłówna zawiera wszystkie dotychczas wykonane transakcje, to łatwo jest sprawdzić czy dana transakcja nie została dotychczas wydana. Ponadto klucz publiczny wydawanej transakcji jest w niej zawarty, zatem poprawność podpisu również można łatwo zweryfikować. Dzięki temu każdy użytkownik mając dostęp do KsięgiGłównej może sprawdzić, czy nowa transakcja jest poprawna. Głównym wyzwaniem w tym rozwiązaniu jest implementacja KsięgiGłównej. Ideą systemu Bitcoin jest decentralizacja, zatem nie możemy powierzyć nikomu zadania zarządzania nią. Musimy zaimplementować KsięgęGłówną w sposób rozproszony w systemie, który jest siecią P2P. Każdy z użytkowników powinien mieć własną kopię KsięgiGłównej, będziemy musieli zatem zadbać o to, żeby każdy z nich miał tą samą kopię. Implementacja KsięgiGłównej oparta jest na sprytnej idei dowodów pracy. Dowody pracy, wprowadzone w [10], polegają na pomyśle każącym każdą akcję poprzeć swoją pracą. Pracą tą może być odgadnięcie pewnej zagadki, której rozwiązanie wymaga nakładów pracy, lecz sprawdzenie poprawności wyniku jest bardzo szybkie. Aby akcja została uznana, trzeba do niej dołączyć rozwiązanie odpowiedniej (zależnej od tej akcji) zagadki. Przykład takiej zagadki podamy za chwilę, przy opisie implementacji KsięgiGłównej. Prostym (teoretycznym) przykładem wykorzystania dowodów pracy jest walka z niechcianymi wiadomościami w poczcie e-mail. Jeżeli do każdego wysyłanego maila należałoby dołączyć dowód pracy (zależny od maila oraz adresata), której wykonanie trwałoby około sekundę, to ilość niechcianych wiadomości zmalałaby drastycznie, gdyż ideą spamu jest wysyłanie dużej ilości wiadomości do wielu adresatów. Implementacja KsięgiGłównej wykorzystuje dowody pracy następująco: KsięgaGłówna jest tak na prawdę łańcuchem bloków (tak właśnie nazywa się ją w terminologii systemu Bitcoin, my jednak zostaniemy przy nazwie KsięgaGłówna), przy czym każdy blok zawiera transakcje wykonane od momentu stworzenia poprzedniego bloku. Aby zapewnić, że wszyscy użytkownicy zgadzają się na wspólną zawartość KsięgiGłównej, stosuje się regułę mówiącą, że najdłuższy łańcuch bloków jest poprawny. Jednak stworzenie nowego bloku nie jest łatwe. Właśnie tutaj wykorzystuje się dowód pracy aby stworzyć nowy blok (wykopać go) trzeba rozwiązać następującą zagadkę: znaleźć taką liczbę r, że hasz bloku, na który składają się nowe transakcje, liczba r oraz hasz poprzedniego bloku, zaczyna się od ustalonej liczby m zer. Wartość m jest tak dobrana (i dostosowywana co dwa tygodnie), że znalezienie poprawnej wartości r jest w miarę trudne całościowo wszystkim użytkownikom systemu Bitcoin zdarza się to raz na 10 minut. Oczywiście sprawdzenie poprawności rozwiązania jest bardzo szybkie wystarczy policzyć hasz bloku. System Bitcoin swoje bezpieczeństwo opiera na założeniu, że większość mocy obliczeniowej systemu kontrolowane jest przez uczciwych użytkowników, którzy zachowują się zgodnie z protokołem (jednak zgodnie z najnowszymi wynikami badań to założenie powinno być wzmocnione, a temat dalej drążony, gdyż nie stworzono dotychczas żadnego formalnego do- 17
wodu bezpieczeństwa systemu Bitcoin a nawet formalnego matematycznego modelu). Istotne jest tu założenie mówiące o połowie mocy obliczeniowej a nie połowie użytkowników, gdyż w rozproszonym systemie P2P bez systemu reputacji łatwo jest tworzyć nowych użytkowników w celu uzyskania większości. Natomiast znaczące zwiększenie swojej mocy obliczeniowej jest kosztowne. Dzięki temu założeniu, uczciwi użytkownicy będą tworzyli (wykopywali) większość bloków, co uniemożliwi tzw. atak podwójnego wydawania monet. Atak ten polega na tym, że mając monetę (która w rzeczywistości jest ciągiem zer i jedynek), możemy spróbować przesłać ją kilku osobom. Nie jest to jednak bezpośrednio możliwe, gdyż tylko jedna z transakcji wydających tą monetę może trafić do KsięgiGłównej. To co można próbować zrobić, to cofnąć historię. Skoro uznajemy, że najdłuższy łańcuch bloków jest poprawny, to można spróbować uruchomić następujący atak: jeżeli transakcja, którą chcemy cofnąć, znajduje się w bloku B k, to spróbujmy stworzyć alternatywny blok B k, który tej transakcji nie zawiera. Jednak aby nasz alternatywny łańcuch został uznany za poprawny, musimy stworzyć wiele nowych bloków B k+1, B k+2,... aż łańcuch ten będzie dłuższy od oryginalnego. Mając znacząco poniżej połowy mocy obliczeniowej całego systemu prawdopodobieństwo sukcesu spada wykładniczo do zera wraz z ilością bloków ponad blokiem B k 1 w oryginalnym łańcuchu. W praktyce uznaje się, że cofnięcie sześciu bloków jest niemożliwe. Przy większych transakcjach warto poczekać, aż po włączeniu naszej transakcji do KsięgiGłównej pojawi się później sześć nowych bloków. Dopiero wówczas możemy uznać, że transakcja jest wykonana poprawnie. System Bitcoin posiada sporą zachętę do kopania nowych bloków. Proces ten jest potrzebny do działania sieci tylko dzięki niemu nowe transakcje dodawane są do KsięgiGłównej, czyli wykonywane. Dla użytkowników natomiast powoduje on koszt w postaci opłat za sprzęt oraz prąd. W związku z tym stosuje się zasadę mówiącą, że każdy kto stworzy (wykopie) nowy blok dostaje w nagrodę 25 nowych bitcoinów (w przyszłości kwota ta będzie spadać, a kopacze będą zarabiać głównie na opłatach, o których napiszemy w następnych sekcjach), co na chwilę obecną warte jest około 15500 dolarów. Jest to jedyny sposób tworzenia nowych monet w systemie. 2.3. Standardowe działanie systemu Bitcoin Omówione powyżej działanie KsięgiGłównej jest prawdziwym działaniem w systemie Bitcoin. Jednak wygląd transakcji jest dużo bardziej skomplikowany. Omówimy teraz jak działają tzw. standardowe transakcje, które są używane w prawie wszystkich przypadkach. Transakcje korzystające z bardziej skomplikowanych możliwości są rzadkie nie znaleziono dla nich jeszcze poważnego praktycznego zastosowania. My jednak potrzebujemy ich do konstrukcji naszych protokołów, zatem omówimy je w następnej sekcji. Standardowe transakcje są podobne do transakcji opisanych w poprzedniej sekcji przesyłają one bitcoiny między adresami. Jednak dają one użytkownikom więcej możliwości. Główną różnicą jest to, że transakcje mogą dowolnie zbierać i dzielić monety. Standardową jednostką w systemie Bitcoin jest 1 bitcoin oznaczany 1 B, który jest równy 10 8 satoshi. Transakcje mogą mieć wiele wejść wydawać wiele (wyjść) poprzednich transakcji i mogą dowolnie podzielić swoją wartość między adresy w swoich wyjściach. Zatem (ciągle uproszczona) standardowa transakcja ma następującą postać: T = ([(x 1, wy 1 ),..., (x k, wy k ), (v 1, pk 1 ),..., (v m, pk m )], σ 1,..., σ k ) co oznacza, że transakcja T wydaje wyjście wy 1 transakcji x 1,..., wyjście wy k transakcji x k oraz dzieli całą kwotę następująco: v 1 B dla użytkownika o adresie publicznym pk 1, 18
..., v m B dla użytkownika o adresie publicznym pk m. Zazwyczaj w transakcji używa się dwóch wyjść jedno z nich przesyła ustaloną kwotę do zamierzonego adresata, a drugie wydaje resztę przesyła pozostałą kwotę z powrotem do nadawcy. Pierwsza część transakcji: [(x 1, wy 1 ),..., (x k, wy k ), (v 1, pk 1 ),..., (v m, pk m )] nazywana jest jej treścią, a σ 1,..., σ k to podpisy kryptograficzne tej treści. Transakcja T jest poprawna, jeśli żadne z jej wejść (x 1, wy 1 ),..., (x k, wy k ) nie zostało wcześniej wydane, każde σ i jest poprawnym podpisem na treści przy użyciu klucza, do którego zostały wysłane bitcoiny w wyjściu (x i, wy i ) oraz sumaryczna wydawana kwota v 1 + + v m jest niewiększa niż sumaryczna kwota na wejściu, czyli niewiększa niż suma wartości wyjść (x 1, wy 1 ),..., (x k, wy k ). Różnica między tymi wartościami jest nazywana opłatą transakcyjną i będzie dokładniej omówiona w następnej sekcji. Kolejną różnicą, wyglądającą na małą, lecz mającą czasami spore znaczenie, jest indeksowanie transakcji. Mianowicie transakcji nie indeksuje się kolejnymi numerami, ale ich haszami. Oznacza to, że x 1,..., x k to w rzeczywistości hasze transakcji, a nie numery. W standardowych transakcjach zmiana ta nie ma znaczenia, zatem omówimy ją dokładniej dopiero w sekcji 2.6. Podobna zmiana dotyczy adresowania transakcji. W rzeczywistości adresem użytkownika w systemie Bitcoin jest odpowiednio zakodowany hasz jego klucza publicznego. W związku z tym, aby wydać transakcje zaadresowaną do siebie, użytkownik musi podać zarówno klucz publiczny, którego hasz jest równy adresowi, jak i podpis treści transakcji odpowiadający podanemu kluczowi publicznemu. Ta zmiana nie ma jednak żadnego wpływu na nasze protokoły i nie będzie stosowana, gdyż zmniejsza czytelność skryptów w transakcjach. Podsumujemy teraz standardowe działanie systemu Bitcoin. Każdy z użytkowników P posiada parę kluczy: publiczny P.pk i sekretny P.sk, oraz ma dostęp do KsięgiGłównej. KsięgaGłówna jest w rzeczywistości łańcuchem bloków, które zawierają dokonane wcześniej transakcje. Gdy jeden z użytkowników A chce przesłać drugiemu B v bitcoinów, to tworzy odpowiednią transakcje T i wysyła ją do sieci Bitcoin (patrz sekcja 2.6). Transakcja ta wygląda następująco: T = ([(x 1, wy 1 ), (v, B.pk), (w v, A.pk)], σ), co oznacza, że A wydaje wyjście numer wy 1 swojej transakcji o haszu x 1. Oznaczmy wartość tego wyjścia przez w. Część tej kwoty o wartości v przesyła do B używając jego adresu będącego jego kluczem publicznym, a pozostałą kwotę przesyła do siebie. Całość podpisuje używając swojego klucza sekretnego uzyskując podpis σ (σ = podpis A.sk ((x 1, wy 1 ), (v, B.pk), (w v, A.pk))). W międzyczasie użytkownicy systemu Bitcoin starają się wykopać nowy blok. Gdy któremuś się to uda, to wysyła go do innych użytkowników, a oni akceptują go poprzez kopanie kolejnego bloku. Dodatkowo szczęśliwy kopacz dostaje 25 B. Blok ten będzie zawierał transakcję T, co oznacza, że transakcja została dokonana. Jednak warto poczekać na kilka (6) nowych bloków, żeby mieć pewność, że nie będzie ona wycofana. Wykopanie pojedynczego bloku trwa około 10 minut, zatem aby mieć pewność, że transakcja nie będzie wycofana, trzeba poczekać około godziny. 2.4. Prawdziwe, najogólniejsze działanie systemu Bitcoin System Bitcoin został tak zaprojektowany, aby za jego pomocą można było operować pieniędzmi w sposób bardziej skomplikowany niż zwykłe przesyłanie pieniędzy. Służą do tego kontrakty, które są możliwe dzięki istnieniu niestandardowych transakcji. Transakcje tego typu różnią się od standardowych tym, że mogą zawierać blokadę czasową transakcji nie 19