Bitcoin: Elektroniczny system pieniężny oparty na sieci peer-to-peer
Satoshi Nakamoto
2008
www.bitcoin.org
Pełnowartościowa wersja pieniądza elektronicznego oparta na modelu komunikacji sieciowej peer-to-peer pozwoliłaby na przesyłanie płatności online bezpośrednio od jednego podmiotu do drugiego bez konieczności przepływu transakcji przez instytucje finansowe. Podpisy cyfrowe dają nam częściowe rozwiązanie zagadnienia, jednakże podstawową wadą tego rodzaju rozwiązania jest wymagana obecność zaufanego, nadrzędnego podmiotu, aby zapobiec podwójnemu wydatkowaniu środków (tzw. double-spending). Proponujemy rozwiązanie problemu podwójnego wydatkowania w postaci wykorzystania sieci peer-to-peer. Sieć znakuje transakcje przy pomocy znaczników czasu, hashując je do postaci ciągłego łańcucha dowodów wykonanej pracy (tzw. proof-of-work), tworząc rejestr, który nie może zostać zmieniony bez dokonania modyfikacji dowodów wykonanej pracy. Najdłuższy łańcuch nie służy tylko jako dowód wystąpienia sekwencji zdarzeń, ale także jako dowód, iż pochodzi ona z największej puli mocy obliczeniowej. Tak długo jak większość mocy obliczeniowej znajduje się pod kontrolą węzłów, które nie współpracują ze sobą w celu zaatakowania sieci, utworzą one najdłuższy łańcuch i wyprzedzą potencjalny atak. Sama sieć wymaga minimalnej struktury. Wiadomości rozpropagowywane są na zasadzie najwyższej staranności, zaś same węzły mogą opuścić i ponownie dołączyć do sieci w dowolnym momencie, przyjmując najdłuższy łańcuch dowodów wykonanej pracy jako potwierdzenie tego co wydarzyło się w sieci podczas ich nieobecności.
1. Wprowadzenie
Handel internetowy zmuszony jest polegać niemal wyłącznie na instytucjach finansowych służących jako zaufane podmioty przetwarzające płatności elektroniczne. Podczas gdy system działa wystarczająco sprawnie dla większości transakcji, wciąż jest obciążony wadami modelu bazującego na zaufaniu. Całkowicie nieodwracalne transakcje nie są możliwe w tego rodzaju modelu, z uwagi na fakt niemożności uniknięcia kwestii spornych i uczestnictwa instytucji finansowych w związanych z nimi mediacjach. Koszty mediacyjne zwiększają koszty transakcji, ograniczając minimalny praktyczny rozmiar transakcji, eliminując tym samym możliwość dokonywania codziennych, małych transakcji. Pojawia się także znacznie większy koszt niemożności dokonywania nieodwracalnych transakcji w przypadku usług, także o charakterze nieodwracalnym.
Wraz z możliwością dokonywania transakcji zwrotnych, potrzeba zaufania wzrasta. Handlowcy muszą być ostrożni w relacjach ze swoimi klientami, wymagając od nich zazwyczaj więcej informacji niż mogłoby być to konieczne. Określony odsetek oszustw jest akceptowany jako nieunikniony. Wymienionych kosztów oraz niepewności związanych z płatnością można uniknąć w przypadku transakcji bezpośredniej z wykorzystaniem fizycznej waluty, jednak nie istnieją jakiekolwiek mechanizmy dokonywania płatności poprzez kanały komunikacyjne bez obecności zaufanej strony trzeciej.
Co jest potrzebne, to elektroniczny system płatności oparty na dowodach kryptografii zamiast na zaufaniu, umożliwiając dowolnym dwóm podmiotom, wyrażającym taką chęć, realizację transakcji bezpośrednio pomiędzy sobą bez potrzeby uczestnictwa dodatkowego, zaufanego podmiotu. Transakcje których wycofanie jest obliczeniowo niepraktyczne będą bronić sprzedawców przed oszustwami, zaś wprowadzenie rutynowych mechanizmów depozytowych z łatwością chroniłoby kupujących.
W niniejszym referacie proponujemy rozwiązanie problemu podwójnego wydatkowania poprzez implementację modelu rozproszonych czasowych serwerów znakujących, w celu wygenerowania kalkulacyjnego dowodu chronologicznego porządku zrealizowanych transakcji. System takowy jest bezpieczny dopóty, dopóki rzetelne węzły wspólnie kontrolują większą moc obliczeniową niż jakakolwiek współpracująca ze sobą grupa węzłów atakujących.
2. Transakcje
Definiujemy walutę elektroniczną jako łańcuch podpisów cyfrowych. Każdy z posiadaczy może przenieść własność monety poprzez cyfrowe podpisanie hasha poprzedniej transakcji oraz klucza publicznego następnego właściciela, dodając te wartość na koniec zapisu monety. Odbiorca płatności ma możliwość weryfikacji tych podpisów, pragnąc sprawdzić łańcuch posiadania.
Problemem jest oczywiście to, że odbiorca płatności nie ma możliwości sprawdzenia czy jeden z posiadaczy nie spieniężył monety podwójnie. Powszechnym rozwiązaniem jest wprowadzenie centralnego zaufanego autorytetu lub mennicy, która sprawdza każdą transakcję, aby zapowiedz podwójnemu wydatkowaniu. Po każdej transakcji moneta musi być zwrócona do mennicy, aby ta wyemitowała nowe monety i jedynie monety pozyskane bezpośrednio od mennicy są postrzegane jako zaufane i z pewnością nie wydane więcej niż raz. Problem związany z tego rodzaju rozwiązaniem polega na tym, iż w takim przypadku cały system monetarny oparty jest na firmie która prowadzi mennicę, przez która każda transakcja zmuszona jest przejść, zupełnie tak jak przez bank.
Potrzebujemy rozwiązania dla odbiorcy płatności, aby mógł mieć one pewność, że poprzedni właściciele nie podpisali jakichkolwiek wcześniejszych transakcji. Dla naszych potrzeb, zakładamy że liczy się najwcześniejsza transakcja, więc nie dbamy już o późniejsze próby podwójnego wydawania. Jedynym sposobem potwierdzenia nieobecności transakcji jest wgląd we wszystkie transakcje. W modelu opartym na istnieniu mennicy, była ona zaznajomiona ze wszystkimi transakcjami i decydowała, która z nich dociera jako pierwsza. Jeśli chcemy dokonać tego bez zaufanej trzeciej strony, transakcje muszą być rozgłaszane publicznie [1]. Potrzebujemy także systemu dla uczestników transakcji, w którym uzgodnimy pojedynczą historię uwzględniającą kolejność w jakiej otrzymywano transakcje. Odbiorca płatności potrzebuje dowodu, że w momencie realizacji każdej z transakcji, większość węzłów zgadzało się, że była ona pierwszą jaką otrzymały.
3. Czasowy serwer znakujący
Rozwiązanie, które proponujemy zakłada istnienie czasowego serwera znakującego. Serwer znakujący pobiera hash pozycji listy, które mają zostać oznakowane znacznikami czasowymi i powszechnie rozgłasza hash, tak jak ma to miejsce w gazecie lub też w poście Usenet [2-5]. Znacznik czasowy udowadnia, że dane istniały w określonym czasie, aby móc dostać się do hasha. Każdy znacznik czasowy umieszcza poprzedni znacznik w swoim hashu, tworząc w ten sposób łańcuch, w którym każdy dodatkowy znacznik wzmacnia, te występujące przed nim.
4. Dowód wykonanej pracy
Chcąc wdrożyć model rozproszonego czasowego serwera znakującego na zasadach sieci peer-to-peer, będziemy musieli wykorzystać system dowodu wykonanej pracy (dowodu wykonanego działania), podobny do systemu Hashcash zaproponowanego przez Adama Back’a, a nie model gazety czy też postów forum Usenet. Dowód wykonanej pracy zakłada poszukiwanie zahashowanej wartości rozpoczynającej się od określonej liczby zerowych bitów, tak jak ma to miejsce w przypadku SHA-256. Przeciętny wymagany nakład pracy rośnie wykładniczo wraz z liczbą bitów zerowych i może zostać zweryfikowany poprzez wykonanie pojedynczego hasha.
Dla potrzeb naszej sieci opartej na modelu czasowego serwera znakującego, używamy systemu dowodu wykonanej pracy w którym zwiększamy wartość jednorazowej liczby znakującej szyfrowany komunikat (tzw. nonce), aż do momentu odnalezienia wartości, która daje przynależnemu do bloku hashowi wymagane bity zerowe. Kiedy wysiłek mocy obliczeniowej procesorów zostanie już rozszerzony na tyle, aby spełnić wymagania dowodu wykonanej pracy, blok nie może zostać już zmieniony bez ponownego wykonania tej samej pracy. Z racji, że po określonym bloku do łańcucha dołączają kolejne, próba zmiany określonego bloku wiązałaby się ze zmianą wszystkich bloków następujących po nim.
Model dowodu wykonanej pracy rozwiązuje także problem wyłaniania większości w większościowym modelu podejmowania decyzji. Jeśli większość byłaby oparta na zasadzie – jeden adres IP = jeden głos – mogłaby zostać bez problemu podważona przez kogokolwiek zdolnego do przydzielenia sobie wielu numerów IP. Dowód wykonanej pracy to w istocie zasada – jeden procesor = jeden głos. Decyzja większościowa reprezentowana jest przez najdłuższy łańcuch, który zainwestował największy „wysiłek” włożonej pracy. Jeśli większość mocy obliczeniowej znajduje się pod kontrolą „uczciwych” węzłów, „uczciwy” węzeł urośnie najszybciej, pozostawiając w tyle potencjalne węzły konkurujące. Chcąc zmodyfikować któryś z poprzednich bloków, atakujący musiałby przerobić dowód wykonanej pracy danego bloku oraz wszystkich bloków następujących po nim, następnie dogonić i wyprzedzić pracę „uczciwych” węzłów. W dalszej części referatu wykażemy, że prawdopodobieństwo dogonienia pracy „uczciwych” węzłów przez potencjalnego, wolniejszego atakującego spada wykładniczo wraz z dodawaniem kolejnych bloków.
Chcąc zrekompensować ciągły wzrost dostępnych mocy obliczeniowych sprzętu komputerowego oraz zmienne zainteresowanie eksploatacją węzłów z perspektywy czasu, poziom trudności dowodu wykonanej pracy jest determinowany przez ruchomą średnią określającą ilość bloków złamanych w ciągu godziny. Jeśli te łamane są zbyt szybko, poziom trudności wzrasta.
5. Sieć
Funkcjonowanie sieci krok po kroku wygląda następująco:
1) Nowe transakcje są rozgłaszane do wszystkich węzłów
2) Każdy węzeł zbiera wszystkie transakcje do pojedynczego bloku
3) Każdy z węzłów pracuje nad odnalezieniem skomplikowanego dowodu pracy dla swojego bloku
4) Kiedy węzeł odnajduje dowód, rozgłasza blok do wszystkich węzłów
5) Węzły akceptują block tylko wtedy, jeżeli wszystkie zawarte w nim transakcje są autentyczne i nie zostały już wcześniej zrealizowane
6) Węzły wyrażają swoją akceptację w stosunku do danego bloku, rozpoczynając pracę nad następnym blokiem, używając hasha zaakceptowanego bloku, jako hasha poprzedniego.
Węzły zawsze uważają najdłuższy łańcuch jako ten właściwy, kontynuując pracę nad jego przedłużaniem. Jeżeli dwa węzły rozpowszechnią dwie wersje następnego bloku jednocześnie, poszczególne węzły otrzymają obie wersje w różnej kolejności w określonych odstępach czasu. W takim przypadku, pracować będą zawsze nad pierwszym który otrzymały, zachowując jednak drugą gałąź na wypadek jeśli to właśnie tamta miałaby stać się dłuższą. Węzeł zostaje zerwany w momencie odnalezienia następnego dowodu wykonanej pracy, który wydłuża jedną z gałęzi. Węzły, które pracowały nad niewłaściwą gałęzią przełączą się do gałęzi dłuższej.
Informacje o wystąpieniu nowych transakcji nie muszą koniecznie dotrzeć do wszystkich węzłów. Wystarczy, że dotrą do odpowiednio dużej ilości węzłów. W takim przypadku w niedługim czasie także dostaną się do bloku. Transmisja bloków jest także odporna na ewentualność niedostarczenia wiadomości. Jeśli węzeł nie otrzyma bloku, poprosi o niego w momencie kiedy otrzyma następny blok, zdając sobie sprawę, że jeden został przez niego przegapiony.
6. Zachęta
Zgodnie z założeniem, pierwsza transakcja w bloku jest transakcją specjalnego rodzaju, rozpoczynającą nową monetę, należącą do twórcy złamanego bloku. Daje to zachętę, motywację dla pozostałych węzłów, aby wspierać sieć, dając także możliwość początkowej dystrybucji monet do obiegu, jako że model ten nie uznaje centralnego autorytetu, który miałby je emitować. Równomierny przyrost ilości nowych monet jest analogiczny do dawnych poszukiwaczy, wydobywców złota eksploatujących coraz to głębsze zasoby, dodając w ten sposób nowe ilości złota do obiegu. W naszym przypadku, głębokość eksploatacyjna polega na zwiększaniu zużycia czasu obliczeniowego procesora oraz energii.
Zachęta może być odnajdywana także w opłatach transakcyjnych. Jeżeli wartość wyjściowa transakcji jest mniejsza niż jej wartość wejściowa, różnica stanowi opłatę transakcyjną, uiszczaną jako dodatkowa nagroda, składając się na łączną sumę nagród za złamanie bloku zawierającego tą transakcję. Wraz z osiągnięciem odgórnie ustalonej liczby monet w obiegu, zachęta może zostać skierowana całkowicie na opłaty transakcyjne, będąc całkowicie odporną na inflację.
Motywacja tego typu może pomóc zachęcić węzły do poprawnego – prawego funkcjonowania. Jeśli zachłanny atakujący będzie w stanie zgromadzić większy zbiór mocy obliczeniowej w porównaniu do wszystkich „uczciwych” węzłów, będzie musiał wybierać pomiędzy wykorzystaniem tego do okradania ludzi poprzez ponowne wykradanie swoich płatności albo wykorzystaniem tego do generowania nowych monet. W efekcie powinien dojść do wniosku, iż bardziej opłacalnym jest postępowanie według zasad. Zasad, które nagradzają go większą ilością monet niż ktokolwiek i cokolwiek innego, razem wzięte. Powinien także zdać sobie sprawę z nieopłacalności podważania całego systemu, a więc w rezultacie jego wiarygodności – a co za tym idzie, także wartości swojego własnego majątku.
7. Odzyskiwanie przestrzeni dyskowej
Kiedy ostatnia transakcja przynależąca do monety jest przykryta odpowiednią ilością bloków, zrealizowane transakcje znajdujące się przed nią mogą zostać usunięte, aby oszczędzić przestrzeń dyskową. Chcąc osiągnąć to bez naruszania hasha przynależnego do bloku, transakcje hashowane są według drzewa merkle [7][2][5], gdzie tylko korzeń załączony jest w hashu danego bloku. Stare bloki mogą zostać skompresowane poprzez odcinanie gałęzi drzewa. Nie ma potrzeby przechowywania wewnętrznych hashy.
Nagłówek bloku z zerową ilością transakcji powinien zajmować około 80 bajtów. Jeśli założymy, że bloki generowane są co każde 10 minut, 80 bajtów * 6 * 24 * 365 = 4,2MB na rok. Biorąc pod uwagę zestawy komputerowe sprzedawane zazwyczaj z 2 gigabajtami RAM-u (stan na rok 2008) oraz Prawo Moora, zakładające wzrost na poziomie 1,2 GB na rok, wielkość przestrzeni dyskowej nie powinna stanowić problemu, nawet jeśli nagłówki bloków będą musiały być przechowywane w pamięci.
8. Uproszczona weryfikacja płatności
Możliwa jest weryfikacja płatności bez konieczności uruchamiania całej sieci węzłów. Użytkownik musi przechowywać jedynie kopię nagłówków bloku najdłuższego łańcucha dowodów wykonanej pracy, który może pozyskać poprzez wysyłanie zapytań do węzłów sieci, tak długo, aż będzie przekonany że posiada najdłuższą reprezentację łańcucha, a następnie pozyskać gałąź merkle łączącą transakcję z blokiem w którym jest oznaczona znacznikiem czasowym. Użytkownik nie może dokonać weryfikacji transakcji w pojedynkę, ale poprzez połączenie jej z miejscem w łańcuchu jest w stanie stwierdzić, że uzyskała ona akceptację sieci węzłów, zaś bloki dodane po niej jeszcze mocniej potwierdzają, że została ona zaakceptowana przez sieć.
W tej postaci, weryfikacja jest niezawodna tak długo jak „uczciwe” węzły posiadają kontrolę nad siecią, jednak może stać się bardziej zawodna w przypadku jeśli sieć zaczyna być zdominowana przez atakującego. Podczas gdy węzły należące do sieci mogą samemu zweryfikować legalność transakcji, uproszczona metoda weryfikacji może zostać oszukana poprzez pochodzące od atakującego sfabrykowane transakcje, rozpropagowywane tak długo, jak długo atakującemu uda się utrzymywać kontrolę nad siecią. Jedna ze strategii walki z tego rodzaju atakami zakłada otrzymywanie powiadomień od węzłów sieci, kiedy te wykryją niewłaściwy blok, tym samym skłaniając oprogramowanie użytkownika do pobrania pełnego bloku wraz z transakcjami oznaczonymi jako alarmujące, aby potwierdzić brak spójności. Firmy otrzymujące częste płatności, będą prawdopodobnie wolały posiadać swoje własne węzły dla bardziej niezależnego bezpieczeństwa i szybszej weryfikacji.
9. Łączenie i podział wartości
Pomimo że byłoby wykonalnym rozróżnianie każdej z monet pojedynczo, byłoby nieporęcznym dokonywanie oddzielnych transakcji dla każdego przesyłanego centa. Chcąc umożliwić dzielenie i łączenie wartości, transakcje zawierają zwielokrotnioną liczbę wyjść i wejść. Zazwyczaj będzie to albo pojedyncze wejście z jednej większej, zaistniałej transakcji lub też zwielokrotniona liczba wejść, łącząca w sobie mniejsze sumy oraz co najwyżej dwa wyjścia: jedno dla płatności oraz pozostałe zwracające resztę, jeśli takowa wystąpi, z powrotem do wysyłającego.
Powinniśmy odnotować, że rozkład w którym transakcja zależy od kilku transakcji, które z kolei zależą od wielu innych, nie stanowi tu problemu. Nigdy nie występuje bowiem potrzeba wyodrębniania samodzielnej kopii historii transakcji.
10. Prywatność
Tradycyjny model bankowy osiąga zakładany poziom prywatności poprzez ograniczanie dostępu do informacji, zarówno na temat uczestniczących stron jak i zaufanej strony trzeciej. Konieczność publicznego ogłaszania wszystkich transakcji wyklucza tą metodę, jednak prywatność może zostać zachowana, poprzez przerwanie przepływu informacji w innym miejscu: poprzez utrzymywanie anonimowości kluczy publicznych. Każdy może prześledzić, że ktoś wysyła określoną sumę do kogoś innego, jednakże bez informacji łączącej transakcję z konkretnymi podmiotami. Jest to podobne do poziomu informacji udostępnianej przez giełdy papierów wartościowych, gdzie czas i rozmiar indywidualnych transakcji, jest udostępniany do publicznej wiadomości, jednak bez precyzowania danych określających strony dokonujące wymiany handlowej.
Jako dodatkowe zabezpieczenie, do każdej transakcji powinno się używać nowej pary kluczy, aby uniknąć powiązania ich ze wspólnym właścicielem. Pewnego rodzaju skojarzeń nie jesteśmy jednak w stanie uniknąć mając do czynienia z transakcjami posiadających wiele wejść, które siłą rzeczy zdradzają, że ich wejścia stanowią własność tego samego właściciela. Ryzyko polega zatem na tym, iż w przypadku ujawnienia właściciela klucza, bez problemu można powiązać i zidentyfikować poprzednie, należące do niego transakcje.
11. Obliczenia
Załóżmy scenariusz, w którym atakujący próbuje generować alternatywny łańcuch szybciej niż generowany jest „uczciwy” łańcuch. Nawet jeśli uda mu się to osiągnąć, nie oznacza to, że system będzie w tym momencie narażony na arbitralne zmiany, takie jak tworzenie wartości „z powietrza”, czy też przywłaszczanie sobie pieniędzy, które nigdy nie należały do atakującego. Węzły nigdy nie zatwierdzą błędnej transakcji jako płatności, a „uczciwe” węzły nigdy nie potwierdzą bloku, który takowe transakcje zawiera. Atakujący może jedynie próbować jedną ze swoich własnych transakcji, aby odzyskać pieniądze, które ostatnio wydał.
Wyścig pomiędzy „uczciwym” łańcuchem a łańcuchem tworzonym przez atakującego można scharakteryzować jako dwumianowe błądzenie losowe. Wydarzeniem definiującym sukces określimy sytuację, kiedy „uczciwy” łańcuch zostaje rozszerzony o jeden blok, powiększając swoje prowadzenie o +1, zaś wydarzeniem definiującym niepowodzenie określimy powiększenie łańcucha atakującego o wartość jednego bloku, zmniejszając różnice pomiędzy dwoma łańcuchami o -1.
Prawdopodobieństwo sytuacji, w której atakującemu udaje się zniwelować ustalony deficyt jest analogiczne do problemu „ruiny gracza”. Załóżmy, że hazardzista dysponujący nieograniczonymi środkami na koncie, rozpoczyna ze stratą i gra potencjalnie nieograniczoną ilość razy próbując doprowadzić do finansowej równowagi stron. Jesteśmy w stanie oszacować prawdopodobieństwo ewentualnego osiągnięcia przez niego równowagi lub też prawdopodobieństwo, że atakującemu uda się kiedykolwiek dogonić uczciwy łańcuch, według następującego wzoru:
p = prawdopodobieństwo znalezienia następnego bloku przez „uczciwy” węzeł
q = prawdopodobieństwo znalezienia następnego bloku przez atakującego
qZ = prawdopodobieństwo, że atakującemu da się kiedykolwiek dogonić uczciwy łańcuch startując z pozycji straty równej z bloków.
Uwzględniając nasze założenie, że p > q, prawdopodobieństwo maleje wykładniczo wraz ze wzrostem ilości bloków, które atakujący musi nadrobić. Z prawdopodobieństwem działającym na jego niekorzyść, jeśli nie uda mu się szczęśliwie nadrobić części straty wystarczająco wcześnie, jego szanse zaczynają graniczyć z zerem, podczas gdy jego strata zaczyna rosnąć.
Przeanalizujmy teraz, ile odbiorca nowej transakcji potrzebuje czekać, zanim będzie mógł być wystarczająco pewien, że osoba wysyłająca nie zmieni transakcji. Zakładamy, że wysyłający jest atakującym, który ma na calu skłonienie odbiorcy, aby ten uwierzył, że otrzymał płatność, podczas gdy atakujący po pewnym czasie zmienia transakcję i wysyła pieniądze z powrotem do siebie. Odbiorca zostanie zaalarmowany kiedy to już się stanie, jednak wysyłający ma nadzieję, że wtedy będzie już za późno na reakcję.
Odbiorca generuje nową parę kluczy, udostępniając wysyłającemu klucz publiczny na krótko przed złożeniem podpisu. To zapobiega sytuacji, w której atakujący przygotowuje łańcuch bloków z czasowym wyprzedzeniem, poprzez generując go nieustannie, aż do chwili kiedy szczęśliwie udaje mu się wypracować sobie wystarczającą przewagę. W tym momencie wykonuje daną transakcję. Kiedy transakcja zostaje wysłana, nieuczciwy nadawca zaczyna pracować w tajemnicy nad równoległym łańcuchem, zawierającym alternatywną wersję swojej transakcji.
Odbiorca czeka aż transakcja zostanie dodana do bloków oraz liczba z bloków zostanie z nim powiązana. Nie jest świadomy postępu jakiego dokonał atakujący, jednak zakładając że „uczciwe” bloki potrzebowały przeciętnego wymaganego czasu do łamania poszczególnych bloków, zakładany postęp atakującego będzie można określić na zasadzie rozkładu Poissona, z oczekiwaną wartością wynoszącą:
Chcąc wyliczyć prawdopodobieństwo, że atakującemu nadal uda się nadrobić stratę, mnożymy gęstość Poissona (dla każdej wielkości postępu, który mógł osiągnąć) przez prawdopodobieństwo, że odrobienia starty, poczynając od zadanego punktu:
Przekształcamy wzór w celu uniknięcia sumowania nieskończonego łańcucha dystrybucji…
Konwertujemy do kodu języka C…
#include <math.h>
double PrawdopodobienstwoSukcesuAtakujacego(double q, int z)
{
double p = 1.0 – q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 – pow(q / p, z – k));
}
return sum;
}
Po zwracanych wartościach widzimy, że prawdopodobieństwo spada wykładniczo wraz ze zmienną z.
q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006
Rozwiązując dla P mniejszego niż 0,1%…
P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340
12. Wnioski
W niniejszym referacie zaproponowaliśmy system elektronicznych transakcji nie wymagający konieczności polegania na zaufaniu. Rozpoczęliśmy od zwykłej struktury, polegającej na monetach opartych na podpisach cyfrowych, która daje dużą kontrolę nad własnością, jednak jest niekompletna bez sposobu zapobiegania podwójnego wydatkowania środków. W celu rozwiązania tego problemu zaproponowaliśmy model sieci peer-to-peer wykorzystującej dowód wykonanej pracy w celu zapisywania publicznej historii transakcji, która z perspektywy obliczeniowej dla potencjalnego atakującego, szybko staje się nierealna do zmiany, jeśli tylko „uczciwe” węzły kontrolują większość mocy obliczeniowej. Siła sieci leży w jej pozbawionej strukturalizacji prostocie. Węzły pracują jednocześnie potrzebując niewielkiej tylko koordynacji. Nie ma potrzeby ich identyfikowania, odkąd wiadomości nie są powiązane z jakimkolwiek szczególnym miejscem, a ich propagacja musi być oparta jedynie na zasadach najwyższej staranności. Węzły mogą opuścić i ponownie dołączyć do sieci w dowolnym momencie, akceptując łańcuch dowodów wykonanej pracy jako dowód na to co wydarzyło się podczas ich nieobecności. Węzły głosują z wykorzystaniem swojej mocy obliczeniowej, wyrażając swoją akceptację dla poprawnych bloków poprzez pracę nad ich wydłużaniem oraz odrzucając błędne bloki poprzez jej odmowę. Każda potrzebna zmiana zasad czy też systemu zachęt może wprowadzona w życie z wykorzystaniem tego mechanizmu osiągania konsensusu.
źródło tłumaczenia polskiego: https://bitcoin.pl/manifest-satoshi-nakamoto/