tradingview

Nonce

Nonce (od ang. number used once, czyli „liczba użyta jeden raz”) to wartość, której w danym kontekście można użyć tylko raz. W kryptowalutach to słowo pojawia się w trzech zupełnie różnych rolach: jako pole w nagłówku bloku, które zmieniają górnicy, jako licznik transakcji konta w Ethereum i jako tajna liczba losowa w każdym podpisie cyfrowym.

Pierwsze dwa znaczenia są czysto techniczne i niegroźne. Trzecie jest powodem, dla którego ludzie tracili bitcoiny, a Sony straciło zabezpieczenia PlayStation 3. Dlatego to hasło jest dłuższe, niż sugeruje niepozorna nazwa.

Nonce w kopaniu bitcoina

Każdy blok Bitcoina ma nagłówek o długości 80 bajtów. Siedzi w nim sześć pól: wersja, hash poprzedniego bloku, korzeń drzewa Merkle wszystkich transakcji, znacznik czasu, zakodowany cel trudności i właśnie nonce, czyli liczba 32-bitowa.

Zadanie górnika łatwo opisać: przepuścić nagłówek dwukrotnie przez funkcję SHA-256 i sprawdzić, czy wynik jest mniejszy od aktualnego celu (target). Jeśli nie jest, zmienić nonce o jeden i spróbować znowu. I znowu. Biliony razy na sekundę.

Tu obalam pierwszy mit. W wielu materiałach przeczytasz, że górnicy „rozwiązują skomplikowane zadania matematyczne”. Nie rozwiązują niczego. Funkcji skrótu nie da się obejść sprytem: właściwego nonce nie można wyliczyć, można go tylko zgadywać. Kopanie to loteria, w której losy kupujesz za energię elektryczną. Cała „trudność” polega na tym, że wygrywających losów jest astronomicznie mało.

Jak mało? Hash zwycięskiego bloku zaczyna się dziś od około 19 zer w zapisie szesnastkowym. Statystycznie cała sieć musi wykonać rzędu 5–6 × 10²³ prób, zanim ktoś trafi, a trwa to średnio 10 minut.

Dlaczego sam nonce nie wystarcza

Tu robi się ciekawie. 32 bity to 4 294 967 296 możliwych wartości. Brzmi jak dużo, ale policzmy:

  • nowoczesna koparka ASIC wykonuje rzędu 200 TH/s, czyli 200 bilionów hashy na sekundę,
  • przejrzenie wszystkich 4,29 mld wartości nonce zajmuje jej około 21 mikrosekund,
  • cała sieć, pracująca we wrześniu 2026 roku w okolicach 900 EH/s, wyczerpuje pełną pulę nonce ponad 200 miliardów razy na sekundę.

Pole nonce kończy się więc niemal natychmiast. Co wtedy? Górnik zmienia coś innego w nagłówku, żeby dostać kolejne 4,29 mld prób:

  • extranonce, czyli dodatkowe pole w transakcji coinbase (tej, która wypłaca nagrodę za blok); jego zmiana zmienia korzeń Merkle, a tym samym cały nagłówek,
  • znacznik czasu, który można przesunąć o sekundę,
  • bity wersji: BIP 320 wydzielił w polu wersji 16 bitów, które koparki mogą „kręcić” (tzw. version rolling), bo przeliczanie korzenia Merkle jest dla sprzętu kosztowne.

W praktyce „szukanie nonce” to skrót myślowy. Górnicy szukają dowolnej kombinacji pól nagłówka, która da wystarczająco mały hash. Nonce to po prostu pole, które zmienia się najszybciej.

Co to ma wspólnego z bezpieczeństwem

Znaleziony nonce jest dowodem, że ktoś spalił realną energię. Każdy węzeł sprawdza to jednym hashowaniem: znalezienie jest drogie, weryfikacja praktycznie darmowa. Na tej asymetrii opiera się cały proof of work. Kto chciałby przepisać historię, musiałby znaleźć nowe nonce dla zmienionego bloku i wszystkich kolejnych szybciej, niż reszta sieci dokłada nowe bloki. Stąd bierze się atak 51%.

Zapamiętaj jedno: w kopaniu nonce jest jawny. Leży w nagłówku każdego bloku i każdy może go odczytać w eksploratorze. Nie ma w nim nic tajnego. Za chwilę zobaczysz, dlaczego to ważne.

Nonce w Ethereum: licznik transakcji

W Ethereum nonce oznacza coś innego: kolejny numer transakcji wysłanej z danego adresu. Pierwsza transakcja z nowego konta ma nonce 0, druga 1, trzecia 2 i tak dalej. Sieć wykona transakcję z nonce 7 dopiero wtedy, gdy wykona tę z nonce 6.

Po co to? Z dwóch powodów:

  1. Ochrona przed powtórzeniem (replay). Podpisanej transakcji „wyślij 1 ETH do Kowalskiego” nie da się nadać drugi raz, bo jej nonce jest już zużyty.
  2. Kolejność. Jeśli wysyłasz kilka transakcji jedna po drugiej, nonce gwarantuje, że wykonają się w zadanej kolejności.

Bitcoin nie potrzebuje takiego licznika, bo działa na modelu UTXO: każde wyjście transakcji można wydać tylko raz, więc podwójne wydanie jest zablokowane z samej konstrukcji. Ethereum ma model kont z saldem i to nonce pełni tam tę rolę.

Zawieszona transakcja, czyli praktyka

Tu nonce przestaje być teorią. Wysyłasz transakcję z za niską opłatą gas i ona wisi w mempoolu. Potem wysyłasz drugą, z normalną opłatą, i ona też wisi. Dlaczego? Bo ma nonce o jeden wyższy i czeka w kolejce na pierwszą. Jedną tanią transakcją zablokowałeś sobie konto.

Rozwiązanie jest jedno: wysłać nową transakcję z tym samym nonce i wyższą opłatą. Sieć przyjmie tę z wyższą opłatą, a starą odrzuci. Tak działają przyciski „przyspiesz” i „anuluj” w portfelach. „Anuluj” to zwykle przelew 0 ETH na własny adres z tym samym nonce i wyższą opłatą. W MetaMasku możesz też włączyć w ustawieniach zaawansowanych ręczne ustawianie nonce i zrobić to samodzielnie.

Ciekawostka: po przejściu Ethereum na proof of stake we wrześniu 2022 roku pole nonce w nagłówku bloku zostało, ale zawsze wynosi zero. Kopania już nie ma, więc nie ma czego zgadywać. Nonce konta działa po staremu.

Nonce w podpisie cyfrowym: tu leżą pieniądze

Teraz najważniejsza część. Każda transakcja w Bitcoinie i Ethereum jest podpisana kluczem prywatnym. Podpis ECDSA, a także podpis Schnorra używany w Bitcoinie od aktualizacji Taproot z 2021 roku, wymaga przy każdym podpisie nowej, tajnej, losowej liczby. Ją też nazywa się nonce, a w literaturze oznacza literą k.

Tu zasada „użyj raz” przestaje być ozdobnikiem. Jeśli ten sam klucz podpisze dwie różne wiadomości z tym samym k, to z dwóch publicznie widocznych podpisów da się wyliczyć klucz prywatny. Prostą algebrą, na kartce, bez superkomputerów. Nawet nonce przewidywalny tylko częściowo, na przykład z kilkoma stałymi bitami, pozwala przy odpowiedniej liczbie podpisów odzyskać klucz metodami kryptoanalizy.

W kopaniu nonce jest jawny i niegroźny. W podpisie musi być tajny, nieprzewidywalny i jednorazowy, a jego wyciek oznacza wyciek klucza.

Trzy historie, które to pokazują

PlayStation 3 (2010). Sony podpisywało oprogramowanie konsoli algorytmem ECDSA, ale przez błąd implementacji za każdym razem używało tego samego k. Grupa fail0verflow pokazała na konferencji Chaos Communication Congress, że z dwóch podpisów da się wyliczyć główny klucz Sony. Zabezpieczenia konsoli poszły do kosza. Jeden z największych koncernów elektronicznych świata, jeden błąd w jednej liczbie.

Portfele na Androidzie (2013). Błąd w generatorze liczb losowych na Androidzie sprawiał, że niektóre portfele bitcoinowe generowały powtarzające się wartości k. Wystarczyło przeskanować blockchain w poszukiwaniu podpisów z tym samym k, wyliczyć klucze i wyczyścić adresy. Doszło do kradzieży, a twórcy portfeli musieli w trybie awaryjnym wypuszczać poprawki i prosić użytkowników o przeniesienie środków na nowe adresy.

Dark Skippy (2024). Najbardziej niepokojący przykład, bo dotyczy portfeli sprzętowych. W sierpniu 2024 roku badacze opisali technikę, w której złośliwe oprogramowanie w urządzeniu podpisującym celowo używa słabych nonce z zakodowanymi fragmentami frazy seed. Wystarczą dwa takie podpisy, na przykład jedna transakcja z dwoma wejściami, żeby atakujący obserwujący blockchain odtworzył całe 12 słów. Urządzenie działa normalnie, transakcje przechodzą, niczego nie widać. Nie pomaga passphrase ani portfel air-gapped, bo kanałem wycieku jest sam podpis wysłany do sieci.

Jak się przed tym bronić

  • Deterministyczne nonce (RFC 6979). Zamiast losować k, portfel wylicza je z klucza prywatnego i treści podpisywanej wiadomości. Różne wiadomości dają różne k, a słaby generator losowy przestaje mieć znaczenie. To dziś standard.
  • Anti-exfil (anti-klepto). Portfel na komputerze dokłada własną losowość do nonce urządzenia i sprawdza, czy urządzenie jej użyło. Złośliwy firmware nie ma wtedy jak przemycić danych. Obsługują to między innymi Blockstream Jade i BitBox02.
  • Łańcuch dostaw. Dark Skippy wymaga podmienionego firmware. Portfel sprzętowy kupujesz wyłącznie od producenta albo autoryzowanego sprzedawcy, a oprogramowanie aktualizujesz tylko z oficjalnego źródła, sprawdzając jego podpis.
  • Multisig z urządzeniami różnych producentów. Przy większych kwotach jedno skompromitowane urządzenie nie wystarcza do kradzieży.

Nonce w API giełd

To czwarte miejsce, w którym spotkasz to słowo, jeśli handlujesz przez API albo używasz bota. Wiele giełd wymaga, żeby każde prywatne zapytanie miało nonce: rosnącą liczbę, najczęściej znacznik czasu w milisekundach. Giełda odrzuca zapytanie, którego nonce nie jest większy od poprzedniego. Chroni to przed przechwyceniem i ponownym wysłaniem Twojego zlecenia.

Klasyczny błąd: dwa boty albo dwa skrypty korzystają z tego samego klucza API. Każdy generuje własne nonce, zapytania docierają w przypadkowej kolejności i giełda zaczyna je odrzucać (na Krakenie jako błąd „EAPI:Invalid nonce”). Rozwiązanie: osobny klucz API dla każdego programu. To przy okazji lepsza praktyka bezpieczeństwa: każdy klucz z minimalnymi uprawnieniami i bez prawa do wypłat.

Najczęstsze nieporozumienia

„Nonce to rodzaj hasła.” Nie. W kopaniu i w API jest jawny. Tajny jest tylko w podpisie i tam nikt go nie ustawia ręcznie.

„Górnicy wyliczają nonce.” Zgadują. Masowo, ale zgadują.

„Mój portfel sprzętowy jest bezpieczny, bo klucz nigdy go nie opuszcza.” Klucz nie opuszcza urządzenia, ale podpisy już tak. Jeśli firmware jest złośliwy, podpis może nieść w sobie klucz. Bezpieczeństwo urządzenia zaczyna się od tego, skąd je masz.

„Nonce w Ethereum i w Bitcoinie to to samo.” Ta sama nazwa, trzy różne rzeczy: pole nagłówka do zgadywania, licznik transakcji konta i tajna liczba w podpisie.

Co ja o tym myślę

Nonce to dla mnie najlepszy dowód, że w kryptowalutach bezpieczeństwo nie leży tam, gdzie patrzy marketing. Producenci portfeli sprzedają chipy, certyfikaty i stalowe płytki na seed. A historia pokazuje, że klucze wyciekały przez jedną liczbę, którą ktoś źle wylosował albo celowo podstawił.

Nie musisz rozumieć algebry krzywych eliptycznych. Wystarczy, że zapamiętasz trzy rzeczy. W kopaniu nonce to los na loterii i nic więcej. W Ethereum to numer w kolejce, a zawieszoną transakcję naprawiasz tym samym numerem z wyższą opłatą. W podpisie to jedyna liczba, której nie wolno użyć dwa razy, i właśnie dlatego portfel sprzętowy kupujesz tylko od producenta, a przy większych kwotach nie ufasz jednemu urządzeniu.

Reszta to szczegóły, które powinny interesować programistów portfeli, nie Ciebie. Twoja rola polega na tym, żeby ich błąd nie stał się Twoją stratą.