Blokowy algorytm haszujący

17 lutego 2021
Category: Jest Również

Wydobywanie bitcoinów wykorzystuje funkcję hashcash proof of work; algorytm hashcash wymaga następujących parametrów: ciąg usługi, wartość jednorazowa i licznik. W bitcoinie ciąg usługi jest kodowany w strukturze danych nagłówka bloku i zawiera pole wersji, hash poprzedniego bloku, hash root drzewa Merkle wszystkich transakcji w bloku, aktualny czas i poziom trudności. Bitcoin przechowuje wartość nonce w polu extraNonce, które jest częścią transakcji coinbase, która jest przechowywana jako lewy najbardziej wysunięty węzeł w drzewie Merkle (baza monet jest specjalną pierwszą transakcją w bloku). Parametr licznika jest mały i ma 32 bity, więc za każdym razem, gdy jest zawijany, pole extraNonce musi być zwiększane (lub w inny sposób zmieniane), aby uniknąć powtarzania pracy.Podstawy algorytmu hashcash są dość łatwe do zrozumienia i zostały opisane bardziej szczegółowo tutaj. Podczas wydobywania bitcoinów algorytm hashcash wielokrotnie haszuje nagłówek bloku, zwiększając jednocześnie pola counter i extraNonce. Zwiększenie pola extraNonce pociąga za sobą ponowne obliczenie drzewa Merkle, ponieważ transakcja bazy monet jest najbardziej wysuniętym na lewo węzłem liścia. Blok jest również od czasu do czasu aktualizowany, gdy nad nim pracujesz.

Nagłówek bloku zawiera następujące pola:

Pole Cel, powód Zaktualizowano kiedy. Rozmiar (w bajtach) Numer wersji blokuAktualizujesz oprogramowanie i określa nową wersję4256-bitowy skrót poprzedniego nagłówka blokuNadchodzi nowy blok32256-bitowy hash oparty na wszystkich transakcjach w blokuTransakcja zostaje zaakceptowana32Aktualny znacznik czasu bloku w sekundach od 1970-01-01T00: 00 UTCCo kilka sekund4Obecny cel w kompaktowym formacieTrudność jest dostosowana4Liczba 32-bitowa (zaczyna się od 0)Próbowano użyć skrótu (przyrosty)4
Wersja hashPrevBlock hashMerkleRoot Czas Bity Chwilowo
Treść bloku zawiera transakcje. Są one mieszane tylko pośrednio przez korzeń Merkle. Ponieważ transakcje nie są bezpośrednio szyfrowane, zaszyfrowanie bloku z 1 transakcją wymaga dokładnie tego samego wysiłku, co zaszyfrowanie bloku zawierającego 10 000 transakcji.

Kompaktowy format celu jest specjalnym rodzajem kodowania zmiennoprzecinkowego przy użyciu 3-bajtowej mantysy, wiodącego bajtu jako wykładnika (gdzie używa się tylko 5 najniższych bitów), a jego podstawa to 256. Większość tych pól będzie taka sama dla wszystkich użytkowników. Mogą występować drobne różnice w sygnaturach czasowych. Nonce będzie zwykle inne, ale rośnie w ściśle liniowy sposób. Wartość „Nonce zaczyna się od 0 i jest zwiększana dla każdego skrótu. Za każdym razem, gdy przepełnia Nonce (co robi się często), część extraNonce transakcji generowania jest zwiększana, co zmienia korzeń Merkle.

Co więcej, jest bardzo mało prawdopodobne, aby dwie osoby miały ten sam root Merkle, ponieważ pierwsza transakcja w Twoim bloku to „wysłanie pokolenia na jeden zTwoichunikalnych adresów Bitcoin. Ponieważ Twój blok różni się od bloków wszystkich innych, masz (prawie) gwarancję, że wygenerujesz różne skróty. Każdy obliczony hash ma taką samą szansę na wygraną, jak każdy inny hash obliczony przez sieć.

Bitcoin używa: SHA256 (SHA256 (Block_Header)), ale musisz uważać na kolejność bajtów.

Na przykład ten kod Pythona obliczy hash bloku z najmniejszym hashem z czerwca 2011, Block 125552. Nagłówek jest zbudowany z sześciu pól opisanych powyżej, połączonych razem jako wartości little-endian w notacji szesnastkowej:

Endianess

Zauważ, że hash, który jest 256-bitową liczbą, ma wiele wiodących zerowych bajtów, gdy jest przechowywany lub drukowany jako stała szesnastkowa big-endian, ale ma końcowe zero bajtów, gdy jest przechowywany lub drukowany w little-endian. Na przykład, jeśli jest interpretowany jako ciąg i najniższy (lub początek) adres ciągu zachowuje najniższy znaczący bajt, jest to little-endian.

Dane wyjściowe blockexplorer wyświetlają wartości skrótu jako liczby big-endian; notacja liczb jest zwyczajna (cyfry wiodące to cyfry najbardziej znaczące czytane od lewej do prawej).

Na przykład tutaj jest wersja w zwykłym C bez żadnej optymalizacji, wątkowości lub sprawdzania błędów.

Oto ten sam przykład w zwykłym PHP bez żadnej optymalizacji.

We use cookies to provide you with the best possible experience. By continuing, we will assume that you agree to our cookie policy