Rudarenje osigurava da svi
sudionici Bitcoin sustava imaju jednoznačan pregled podataka u tom
sustavu. To je potrebno zato što je Bitcoin raspodijeljen sustav i
nema središnjeg autoriteta koji pazi na stanje cijelog sustava.
Rudarenje također služi za uvođenje novih bitcoina u sustav.
Rudarenje sprječava
dvostruku potrošnju i nameće vremenski redoslijed kojim su se
transakcije odvijale. Mehanizam koji to osigurava je "dokaz
rada". Dokaz rada je vrlo težak kriptografski problem koji
zahtijeva mnogo procesorkog vremena i snage da se riješi, ali kad se
riješi vrlo je jednostavno za ostale sudionike sustava provjeriti da
je rješenje ispravno. Blok transakcija koji se prvi uspješno riješi
na taj način uvrštava se u lanac blokova (block chain) te je
praktički nemoguće uzrokovati dvostruku potrošnju ili neku drugu
nekontistentnost sustava.
Kako se rudari
Sudionici Bitcoin sustava skupljaju sve objavljenje
transakcije u blok. Svaki blok sadrži zaglavlje u kojem se između
ostalog nalazi jedinstvena vrijednost "nonce". To se zaglavlje hashira dvostrukim SHA-256 hashem te rezultirajući niz
znakova mora počinjati određenim brojem nula. Dakle
SHA256(SHA256(zaglavlje)) = niz-znakova.
Budući da je jako mala vjerojatnost da će već
početni nonce dati ispravan rezultat, klijent mora modificirati
početni nonce (npr. uvećati ga za jedan) te probati hashirati opet.
To se nastavlja sve dok jedan rudar ne nađe niz znakova koji počinje
određenim brojem nula (za to je potrebno otprilike deset minuta).
Kako rudar zna s koliko nula treba počinjati niz
znakova? Svako zaglavlje bloka sadrži polje "bitovi (bits)"
koje označava metu. Kad rudari hashiraju zaglavlje koje sadrži nonce, dobiveni hash mora bit manji ili jednak meti (broju nula u
nizu).
Verzija
|
01000000 |
Hash prethodnog bloka (obrnut)
|
17975b97c18ed1f7e255adf297599b55330edab87803c8170100000000000000 |
Merkleov korijen (obrnut)
|
8a97295a2747b4f1a0b3948df3990344c0e19fa6b2b92b3a19c8e6badc171787 |
Vremenska oznaka
|
358b0553 |
Bitovi
|
1b0404cb |
Nonce
|
48750833 |
Broj transakcija
|
63 |
Coinbase transakcija
|
|
Transakcija
|
|
…
|
Polje bitovi sadrži komprimirani zapis mete
(1b0404cb). Puni zapis dobiva se pomoću formule:
0404cb * 2^(8 * (1b – 3)) = 00000000000404CB000000000000000000000000000000000000000000000000
Vrijednost dobivena dvostrukim hashiranjem noncea mora
bit manja ili jednaka meti.
Dakle, zaglavlje = "01000000" +
"17975b97c18ed1f7e255adf297599b55330edab87803c8170100000000000000" +
"8a97295a2747b4f1a0b3948df3990344c0e19fa6b2b92b3a19c8e6badc171787" +
"358b0553" + "1b0404cb" + "48750833"
Dvostruki hash to zaglavlja je:
SHA256(SHA256(zaglavlje)) = 38f1abdecb7e001ab403aecd885a010d5a254054e479d335273eaa1cbdd62674
Dakle, zaglavlje = "01000000" +
"17975b97c18ed1f7e255adf297599b55330edab87803c8170100000000000000" +
"8a97295a2747b4f1a0b3948df3990344c0e19fa6b2b92b3a19c8e6badc171787" +
"358b0553" + "1b0404cb" + "48750833"
Dvostruki hash to zaglavlja je:
SHA256(SHA256(zaglavlje)) = 38f1abdecb7e001ab403aecd885a010d5a254054e479d335273eaa1cbdd62674
Budući da dobiven vrijednost nije jednaka meti, rudar
će nonce uvećati za jedan (48750534) te pokušati opet, sve dok ne
dobije metu.
Težina rudarenja
Što je meta manja (niz počinje s više nula) to je
teže rudariti. Težina (difficulty) se računa po formuli:
težina = težina_1_meta / trenutačna_meta
težina_1_meta (ili bazna meta) je
00000000FFFF0000000000000000000000000000000000000000000000000000
Težina iz prethodnog primjera je tad
00000000FFFF0000000000000000000000000000000000000000000000000000 /
00000000000404CB000000000000000000000000000000000000000000000000 =
16307.4209
Trenutačna težina je 5,006,860,589.21 što
znači da bi prosječnom PC-ju trebalo oko 35000 godina da izrudari
blok. Ona se poveća svakih 2016 izrudarenih blokova, odnosno svaka
dva tjedna. Svakih 2016 blokova uspoređuju se vremenske oznake iz
zaglavlja blokova da bi se odredilo stvarno vrijeme koje je bilo
potrebno da se ti blokovi izrudare. Ako je trebalo manje od dva
tjedna, težina rudarenja se poveća, a ako je trebalo više, težina
se smanji. Nova meta računa se prema formuli:
nova_meta = stara_meta * (vrijeme za 2016 blokova) / 2
tjedna
Nonce i extranonce
Nonce polje u zaglavlju veličine je 32 bita. Tijekom
rudarenja njegova se vrijednost povećava te se često događa da se
ono prelije. Coinbase transakcije sadrže samo jedan ulaz koje
trenutačno sadržava i polje extranonce u koje se upisuje višak iz
polja nonce.
Naknada za izrudareni blok
Coinbase transakcije također sadrže i određeni broj bitcoina koji služe kao nagrada onome tko je izrudario prethodni blok. Naknada je u početku iznosila 50 bitcoina te se prepolavlja svakih 210 000 blokova (oko 4 godine). Nakon bloka 420 000 iznosi 25 bitcoina. Naknada je funkcija visine bloka te se računa se prema formuli:
(50 * 100000000) >> (visina / 210000)
Operacija >> predstavlja binarni pomak (shift) udesno.
To znači da će biti moguće izrudariti maksimalno 21 milijun bitcoina.