Dowód pracy w Bitcoin: Nie użyto liczby zmiennoprzecinkowej

Ten post został po raz pierwszy opublikowany na Medium.

Wyjaśniamy, jak działa Proof of Work (PoW) w Bitcoinie.

Dowód pracy

Istotą procesu PoW (Proof of Work) jest znalezienie hasha poniżej wartości docelowej ustawionej przez sieć. Funkcja skrótu używana przez Bitcoin to double SHA-256, która generuje 256-bitową wartość skrótu. Górnicy generują wartości skrótu, łącząc informacje nagłówka bloku z wartością jednorazową i przekazując je przez funkcję skrótu. Ponieważ wynik funkcji skrótu jest nieprzewidywalny, górnicy zasadniczo zgadują różne wartości jednorazowe, dopóki nie znajdą takiej, która wygeneruje skrót poniżej wartości docelowej. Proces ten wymaga dużej mocy obliczeniowej i nazywany jest wydobyciem.

Cel vs trudność

Celem jest 256-bitowa liczba całkowita, którą wszyscy górnicy Bitcoina starają się znaleźć poniżej wartości skrótu. Prawidłowe bloki muszą mieć skrót poniżej tego celu. 256-bitowy oznacza, że jest niezwykle duży i może reprezentować szeroki zakres wartości. Ta szczegółowość pozwala na precyzyjne dostosowanie do trudności wydobycia sieci.

Trudność jest miarą tego, jak trudno jest znaleźć skrót poniżej danego celu. Sieć Bitcoin ma globalną trudność blokową.

Cel jest odwrotnie powiązany z trudnością wydobycia. Niższy cel oznacza większą trudność, ponieważ istnieje mniej możliwych wartości skrótu spełniających kryteria. I odwrotnie, wyższy cel zwiększa zakres wartości skrótu uznawanych za prawidłowe, zmniejszając trudność.

Trudność w dostosowaniu

Trudność łamigłówki Proof of Work dostosowuje się mniej więcej co dwa tygodnie, aby utrzymać stały czas bloku wynoszący około 10 minut, niezależnie od ilości mocy obliczeniowej w sieci.

Co 2016 bloków sieć Bitcoin oblicza czas potrzebny na wydobycie ostatnich bloków z 2016 roku. Następnie porównuje ten czas z pożądanymi ramami czasowymi wynoszącymi 20 160 minut (2016 bloków * 10 minut na blok). Jeśli rzeczywisty czas jest krótszy niż żądany, oznacza to, że bloki są wydobywane zbyt szybko, a cel obniża się (zwiększa się trudność). I odwrotnie, jeśli rzeczywisty czas jest dłuższy, co wskazuje, że bloki są wydobywane zbyt wolno, cel podnosi się (zmniejszanie trudności).

Jak realizowany jest cel?

W nagłówku bloku Bitcoin przechowywana jest kompaktowa 32-bitowa forma (znana jako „Bity”), a nie pełny 256-bitowy cel. Oszczędza miejsce i ułatwia pracę i transmisję w sieci.

Konwersja bitów na cel

Bits to po prostu skrócona/kompaktowa wersja celu. Działa jak notacja naukowa, z tą różnicą, że używa podstawy 256 zamiast podstawy 10.

Zasadniczo jest on podzielony na dwie części:

Wykładnik: podaje rozmiar celu w bajtach.
Mantysa: Daje to początkowe 3 bajty celu.
Na przykład, jeśli wartość Bits jest równa 0x1810696F4, wartość docelową można obliczyć w następujący sposób:

0x18 w heksadecymie to 24.

Wiodące zera

W białej księdze „zera wiodące” zastosowano jako sposób intuicyjnego zrozumienia znalezienia prawidłowego skrótu poniżej progu docelowego.

gist.githubusercontent.com/xhliu/179224cc8cfeb42ed0c5fd313bbe66e5/raw/b58610de6dbc4b1a3dd1692436cd66922d7dea65/checkblock.cpp

Aby zobaczyć dlaczego, rozważ powyższy cel jako pełne 32 bajty (512 bitów) w formacie szesnastkowym poniżej, z poprzedzającymi zerami.

Cel: 0x000000000000000000696f4000000000000000000000000000000000000000000
Poniższy hipotetyczny skrót bloku jest nieprawidłowy, który różni się od celu jedynie w ostatnim bajcie (0x01 vs 0x00). Mimo że ma taką samą liczbę zer wiodących jak element docelowy, jest większy i dlatego jest nieprawidłowy.

Hash bloku: 0x000000000000000000696f4000000000000000000000000000000000000000001
Żadnych liczb zmiennoprzecinkowych

Liczba zmiennoprzecinkowa to sposób reprezentowania liczb rzeczywistych w obliczeniach, który może obejmować bardzo szeroki zakres wartości. Termin „zmiennoprzecinkowy” wynika z faktu, że przecinek dziesiętny może „pływać”; oznacza to, że można go umieścić w dowolnym miejscu względem cyfr znaczących liczby. Przykładami liczb zmiennoprzecinkowych są 0,1243 i 12,245.

W komponentach Bitcoina krytycznych dla konsensusu, takich jak dostosowywanie trudności lub porównywanie wartości skrótu, unika się reprezentacji zmiennoprzecinkowych, ponieważ mogą one zachowywać się niespójnie w różnych architekturach obliczeniowych. Ta niespójność wynika z potencjalnych różnic w zaokrągleniach właściwych arytmetyce zmiennoprzecinkowej, które mogą prowadzić do niedeterministycznych wyników. Ponieważ zasady konsensusu Bitcoina wymagają całkowitego determinizmu, aby zapewnić, że wszyscy uczestnicy zgadzają się co do stanu łańcucha bloków, system opiera się na typach danych i operacjach, które dają ten sam wynik na dowolnej maszynie, wykluczając w ten sposób liczby zmiennoprzecinkowe ze względu na ich utratę precyzji i błędy zaokrągleń. Zamiast tego używane są liczby całkowite.

W procesie COPA przeciwko Wrightowi świadek COPA Adam Back twierdzi, że kod Bitcoin używa zmiennoprzecinkowego w PoW. Jest to ewidentna nieprawda. Wszystkie liczby w PoW, celu i Bitach są reprezentowane jako liczby całkowite. Nie stosuje się arytmetyki zmiennoprzecinkowej. Warto zauważyć, że trudność nie jest widoczna w kodzie. Jest to miara pochodna od celu.

Obejrzyj: Dlaczego Proof of Work to najbezpieczniejszy model konsensusu

Autor : BitcoinSV.pl

Źródło : Proof of Work in Bitcoin: No floating point number used – CoinGeek

Author: BitcoinSV.pl
CEO