Przejdź do zawartości

Bitcoin/Wydobywanie

Z Wikibooks, biblioteki wolnych podręczników.

Wydobywanie (mining, kopanie) bitcoinów to proces, który tworzy jednostki przechowujące transakcje, zwane blokami. Podczas tej operacji, zatwierdzane są transakcje poprzez powiązanie ich kryptograficznie z blokiem oraz wprowadzane nowe monety do obiegu, które są wynagrodzeniem za pracę przy potwierdzaniu transakcji. Uczestników nazywa się górnikami.

Cele wydobywania:

Dystrybucja monet
Bitcoin ma przewidzianą konkretną maksymalną liczbę monet jaka ma być w obiegu. Nie są jednak one wszystkie jak na razie dostępne dla użytkowników. Muszą one zostać wygenerowane, czyli przyznane jako wynagrodzenie za ochronę sieci poprzez zatwierdzanie transakcji. Taki sposób emisji monet ma na celu po pierwsze - dystrybucję nowych monet, dzięki czemu nowe monety mogą zostać rozdzielone między użytkowników sieci, zamiast centralnej instytucji posiadającej całą pulę i rozdającej monety według nieokreślonych kryteriów, a po drugie - wynagrodzenie i zachętę za obsługę historii transakcji.
Zatwierdzanie transakcji
Praca nad wydobywaniem to przede wszystkim tworzenie tzw. bloków. Do bloków są w sposób trwały przypisywane wygenerowane przez użytkowników transakcje, a bloki te są łączone kryptograficznie w jeden ciąg, zwany łańcuchem bloków. Dzięki temu tworzony jest zapis historii transakcji, dzięki któremu znane są informacje o wydanych monetach i stanie konta. Zawartości (czyli poszczególnych transakcji, zestawu zatwierdzonych transakcji lub bloków) nie da się zafałszować (podmienić), gdyż jakakolwiek podmiana transakcji spowoduje zmianę hashów składających się na blok, co spowoduje, że podrobiony blok nie będzie według algorytmu Protokołu pasował do łańcucha i zostanie odrzucony. Podobnie nie ma możliwości posługiwania się nieistniejącymi monetami, tj, pochodzących z transakcji nie znajdujących się do momentu zatwierdzania danej transakcji w żadnym z bloków łańcucha, włącznie z tym samym, w którym transakcja miałaby się znaleźć.

Budowa łańcucha bloków

[edytuj]
Budowa bloku Bitcoina

Blok to jednostka przechowująca transakcje. Historia transakcji w sieci jest dzielona na bloki, aby móc cyklicznie dopisywać nowe transakcje i utrwalać je.

Każdy blok składa się z:

  • nagłówka zawierającego kilka informacji o samym bloku
  • części przeznaczonej na transakcje

Pojedynczy blok identyfikowany jest hashem lub numerem kolejności (tzw. wysokością).

Nagłówek bloku składa się z:

  • Wersji
  • Czasu
  • Hashu poprzedniego bloku (konkretnie - jego nagłówka)
  • Hashu wszystkich transakcji w danym bloku (Merkle Root)
  • Bity określające trudność
  • Nonce

Hash bloku to hash samego nagłówka bloku, hashowana treść nie uwzględnia transakcji. Transakcje z kolei, są przywiązywane do bloku poprzez Merkle Root, który jest hashem wszystkich transakcji umieszczanych w bloku i jest częścią nagłówka bloku.

Za nagłówkiem znajdują się transakcje. Ilość transakcji może być teoretycznie dowolna, jednak ich łączny rozmiar jest ograniczony (dla Bitcoina - max. 1MB). Musi znajdować się przynajmniej jedna transakcja i ta jedna transakcja musi być transakcją przydzielającą nagrodę za blok, tzw. coinbase.

Jakakolwiek podmiana transakcji (ich modyfikacja lub zmiana zestawu) spowoduje, że wyliczony hash Merkle Root będzie inny, niż zapisany w nagłówku bloku, a podmiana nowego Merkle Root w nagłówku spowoduje zmianę hasha bloku i nie będzie on pasował do sąsiadujących bloków. Klient sieci odrzuci blok, zawierający niezgodne informacje.

Łańcuch bloków to ciąg kolejnych bloków, powiązanych ze sobą w stałej kolejności. Łańcuch zaczyna się od bloku o numerze (tzw. wysokości) 0 (genesis block). Bloki w Bitcoinie są wydobywane średnio co 10 minut. Ilość bloków jest nieograniczona (nawet po wydobyciu wszystkich bitcoinów będzie to możliwe). Nowe bloki są dodawane, aby umieszczać w nich nowe transakcje.

Bloki są łączone ze sobą nierozerwalnie, tj. idzie ustalić ich kolejność oraz nie można zmodyfikować istniejących bloków.

Fragment łańcucha bloków. Przedstawione są powiązania między blokami oraz przypisywania transakcji.

Proces

[edytuj]

Przygotowanie

[edytuj]

Podczas rozpoczęcia wydobywania wykonywane są następujące czynności:

  • Wziąć hash nagłówka ostatnio wydobytego bloku
  • Wybrać transakcje do zatwierdzenia w najbliższym bloku
  • Stworzyć transakcję coinbase przydzielającą podstawową nagrodę za blok + opłaty z wcześniej wybranych transakcji. Takiej transakcji się nie rozgłasza oddzielnie.
  • Obliczyć hash całego zestawu tych transakcji i wstawić w pole "hashMerkleRoot" nagłówka tworzonego bloku.

Czynności te są ponawiane po wydobyciu bloku przez innego uczestnika sieci oraz brane są nowe, jeszcze nie zatwierdzone transakcje.

Proof of work

[edytuj]

Opisany wcześniej mechanizm służy tylko do łączenia gotowych bloków oraz późniejszej weryfikacji łańcucha. Do tego, by uczestniczyć w procesie tworzenia bloków trzeba się wykazać wkładem pracy. Nazywane jest to Proof of work. Służy to do rozproszenia pracy wśród górników.

Mechanizm Proof of work polega na wykonywaniu serii obliczeń przypominających metodę Brute force, za pomocą oprogramowania i sprzętu, której rezultatem mają być brakujące dane dla nagłówka. Tym parametrem jest nonce.

Zadaniem algorytmu jest odnalezienie takiej wartości nonce, aby po wstawieniu do nagłówka i jego zahashowaniu osiągnąć hash, który ma na początku określoną liczbę zer. Ta liczba zer z kolei jest określana przez trudność, która zależy od sumy włożonej mocy wszystkich uczestników i opisaną w dalszej części tego rozdziału.

Moc

[edytuj]

Urządzenia przeliczające parametry nowego bloku różnią się szybkością, z jaką wypróbują przez określony czas ilość kombinacji. Moc takich urządzeń mierzy się w ilości wypróbowanych hashy na sekundę (Hash/sec) oraz ich wielokrotnościach (np. Khash/s = 1000 hash/s).

Regulacja trudności

[edytuj]

Przewidziane jest, że bloki mają być generowane co około 10 minut. Sieć musi więc teoretycznie zapobiec wydobywaniu częściej bloków. Oprócz tego, w miarę dokładania mocy bloki będą wydobywane coraz szybciej, więc musi być system regulacji, który dostosuje się do mocy sieci. Taki mechanizm nazywany jest trudnością wydobycia (lub trudnością sieci).

W Bitcoin, trudność jest ponownie przeliczana na podstawie prędkości wydobycia co 2016 bloków (przewidziane na 2 tygodnie).

Cel
[edytuj]

Cel (ang. target) to 256 bitowa liczba (bardzo wielka), która jest taka sama dla wszystkich węzłów Bitcoin. Hash wyliczany za pomocą SHA-256 z nagłówka bloku musi być mniejszy lub równy bieżącemu celowi, aby blok mógł zostać zaakceptowany przez sieć. Im cel jest mniejszą liczbą tym trudniej jest wygenerować blok.

Obliczenia trudności
[edytuj]
Spodziewany czas na odnalezienie bloku przy znanej mocy

Konkurencja

[edytuj]
Łańcuch bloków. Zielony - genesis block, czarne - główny (właściwy, najdłuższy) łańcuch, fioletowe - osierocone, powstałe w wyniku forka

Czasami może się zdarzyć, że w tym samym czasie dwóch górników odnajdzie pasujący kolejny blok, ale będą się różnić parametrami. W takim przypadku decyduje długość odgałęzienia tj. do którego z tych dwóch bloków zostanie dodana jak najdłuższa seria kolejnych bloków. Bloki, które znajdują się w krótszym łańcuchu od rozgałęzienia (forka) nazywane są osieroconymi. Transakcje zaakceptowane poza najdłuższym są uznawane za nieważne i wciąż mają szansę zostać zatwierdzone w głównych blokach.

Atak 51%

[edytuj]

Teoretycznie, jeżeli jeden górnik posiada więcej niż 50% mocy obliczeniowej całej sieci (czyli większość), może on teoretycznie dokonać ataku poprzez doklejanie wydobywanych przez siebie bloków do dowolnego bloku z łańcucha bloków, który był już wydobyty parę bloków wcześniej, co spowoduje celowe kopanie własnego odgałęzienia, które jest w stanie, z racji posiadanej większości mocy, prześcignąć "dobry" łańcuch i stać się najdłuższym, czyli akceptowanym przez Protokół. Może to skutkować odwróceniem zatwierdzonych transakcji, co powoduje utratę środków oraz możliwość wysłania ponownie tych samych monet.

Taki atak jest mało prawdopodobny ze względu na możliwość wyboru kopalni jak i zakładania własnych. Zalecane jest więc wybieranie kopalni mających mniejszy udział sieci.

Wynagrodzenie

[edytuj]

Aby wynagrodzić trud kopacza, może on przydzielić na swój adres nagrodę za blok. Zawiera ona nagrodę podstawową i opłaty transakcyjne.

Podstawowa nagroda zaczynała się od 50 BTC i jest zmniejszana co 210000 bloków poprzez podzielenie na pół (25 BTC, 12.5 BTC, ...).

Sprzęt i oprogramowanie

[edytuj]

Teoretycznie, jest możliwe kopanie za pomocą:

  • Procesora komputera (CPU)
  • Procesora karty graficznej (GPU)
  • Dedykowanych układów (ASIC i FPGA)

Sprzęty kontroluje oprogramowanie, które łączy się też siecią, by przesyłać bloki.

Więcej informacji w części praktycznej.

Algorytmy kryptograficzne

[edytuj]
  • sha256d - Wykorzystywany przez Bitcoina i wiele pochodnych walut
  • scrypt - Wprowadzony w Litecoin
  • x11
  • x13
  • x15
  • keccak

Proof of stake

[edytuj]

Niektóre kryptowaluty zamiast Proof of work implementują Proof of stake (czasami oba jednocześnie lub najpierw PoW, potem PoS). Taki mechanizm polega na udowodnieniu, że posiadało się nieruszone przez określony czas środki. Skutkiem jest zwiększenie ilości posiadanych monet na wzór lokaty bankowej.

Zobacz też

[edytuj]