Bitcoin mining (rudarenje Bitcoina) je proces natjecanja za pravo na kreiranje bloka. Pobjednik uzima određeni broj transakcija (on sam bira koje će transakcije uzeti i staviti u blok), spajanja tih transakcija u “blok” te dodavanje tog bloka na kraj lanca prijašnjih blokova (eng. blockchain) u kojem su zapisane sve obrađene Bitcoin transakcije. Za utrošeno vrijeme i resurse u obavljanje tog posla (99.99% se potroši na natjecanje, jer je ostali dio posla brz i ne zahtjeva puno računalnih resursa), Bitcoin rudari dobiju fiksnu, unaprijed određenu nagradu, u obliku novih Bitcoina te dodatno sve naknade za transakcije koje su dodali i ubacili u novo kreirani blok.
Sam proces majnanja se sastoji od dva koraka. Svaki korak ima svoju specifičnu funkciju i ulogu u održavanju mreže.
1. korak: Natjecanje
Kako bi miner dobio pravo na kreiranje bloka te nagradu za taj blok, prvo se mora natjecati za to pravo sa ostalim minerima. Pravila natjecanja su javna i u svakom trenutku poznata cijeloj mreži te se prilagođavaju za svaki pojedini blok. Svaki blok ima cilj natjecanja, te mineri moraju doći do rezultata koji je jednak ili manji od tog cilja. Samo natjecanje se svodi na računanje javno poznate kriptografske hashing funkcije u koju mineri ubacuju nounce koji povećavaju, te se nadaju da će jedan od dobivenih rezultata biti manji od zadanog.
Kako bi mogli pojednostavljeno objasniti proces računanja tj. natjecanja, moramo za početak znati kako rade hashing funkcije. Hashing funkcije su funkcije u koje se kao input ubaci neka (bilo koja) vrijednost, te ta hashing funkcija, za tu vrijednost uvijek izbaci neki unikatan “hash”. O hashiranju smo već pisali u članku Koliko je Bitcoin siguran? no ovdje ćemo ukratko ponoviti kako to izgleda.
Npr. ovako izgledaju ulazi i izlazi neke hashing funkcije:
test1 ==> 1b4f0e9851971998e732078544c96b36c3d01cedf7caa332359d6f1d83567014
hello world ==> b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
Ovo je neki duži tekst ==> 633126dd343201b6cb5a1fdaae762eda889b5a339720a3191b4237856a95ba87
2 ==> d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
Sa lijeve strane su inputi u funkciju, dok su sa desne strane outputi.
Da maksimalno pojednostavnimo primjer, pretpostavimo da je za sljedeći blok postavljen cilj da miner koji dobije rezultat koji počinje sa brojem 6 ili manje, ima pravo na kreiranje bloka. Mineri kreću sa hashiranjem te u hash funkciju ubacuju razno razne inpute i traže željeni rezultat. Nakon nekog vremena i puno pokušaja, jedan od minera ubacuje u hashing funkciju tekst: “test123” i dobiva rezultat: 6782893f9a818abc3da35d745a803d72a660c9f5.
Taj miner bira transakcije koje su mu dostupne a da ne zauzimaju više od 1MB podataka, stavlja ih u blok, te rezultat svega šalje cijeloj mreži. Cijela mreža može provjeriti njegov rezultat, ubaciti njegov tekst u hash funkciju, i provjeriti dali je rezultat stvarno taj koji on tvrdi da je. Ako sve prođe provjeru, njegov blok se uzima kao legitiman te ga svaki “full node” dodaje na kraj blockchain-a te samim time priznaje vlasništvo minera nad spomenutom fiksnom nagradom i fee-evima svih transakcija koje je uključio u taj blok.
Treba nadodati da algoritam za svaki novi blok traži različiti rezultat, te da isto tako, uzima podatak iz prijašnjeg bloka, te ga dodaje inputima za sadašnji blok. Tako u praksi miner mora računati:
podatci-iz-bloka-0-nounce0 ==> 0bb52e7ac0b11ee2ed4bc4d45b122f8e05102679184a3c7b7cf2b17be32c2ae9
podatci-iz-bloka-0-nounce1 ==> eadfab8db4bc99d26f10380a4759dee76c36741e70c2c85b600bcd3f1c72a889
podatci-iz-bloka-0-nounce2 ==> 29faafd1b825442c7d22b53a626347fe11cff7df13cf718a2b20b63e7ef0b04c
podatci-iz-bloka-0-nounce3 ==> 3e3e4b0e98748979706d9f58d9fc146c44f8a058ed0dd703c9358192819cc726
Za sljedeći blok bi to izgledalo:
podatci-iz-bloka-1-nounce0 ==> 477ddc9fda3a04da6403c892e015859d125ee50d84531b0616914b901680520b
podatci-iz-bloka-1-nounce1 ==> 6029d33de52de44309764dee1e0a95f6598406cd4c5c0d0c4d014c26ca6133c7
podatci-iz-bloka-1-nounce2 ==> 938b50e2428513759cac4b81af230539dc0bb6e05552a32de5f7801ce9cde222
podatci-iz-bloka-1-nounce3 ==> ebca76779f23b58265284db4be0e2dcfbb4666e72a3f89cc1f5665c38ef0ca1c
itd.
Prefiks (podatci-iz-bloka-0, podatci-iz-bloka-1) je u praksi isto hash dobiven iz podataka iz zadnjeg bloka tako da ga se ne može “pogoditi” unaprijed a postoji iz razloga da se minerima onemogući hashiranje podataka unaprijed (npr. dok je difficulty manji) te korištenje tih rezultata u budućim blokovima, što bi dovelo do toga da se blokovi kreiraju brže od predviđenih 1 blok svakih 10 minuta (u prosjeku). Korištenje prefiksa garantira svim minerima jednaku startnu poziciju nakon svakog novog bloka.
Kako je cijeli proces javan, te kako svaki miner mora svoje rezultate proslijediti svima na provjeru, tako svaki sudionik mreže može sam izračunati točnost krajnjeg rezultata, te prema tome priznati taj blok ili ga odbaciti. Sama provjera ne zahtjeva skup proces natjecanja te se može raditi brzo i efikasno i na najstarijim i najslabijim računalima koja se koriste u svakodnevnom radu (npr. Raspberry PI itd.).
Mining algoritam je podešen tako da pokušava održati brzinu generiranja blokova na 1 blok svakih 10 minuta. Kako je prema gore napisanom jasno da u otkrivanju blokova ulogu ima i sreća, tako brzina kreiranja blokova nije uvijek ista. Nekada se pronađe više blokova u par minuta a nekada se ne pronađe niti jedan u pola sata. No u prosjeku se sve svede na 1 blok svakih 10 minuta.
Pošto je majnanje otvoreno za bilo koga, i bilo tko, bilo kada i bilo gdje može krenuti majnati, tako mining algoritam ima mogućnost modificiranja težine na način da prilagodi cilj natjecanja.
Vratimo se na prije spomenuti primjer, kada je cilj bio broj 6 ili manje. Ako u tom slučaju, u mrežu dođe novi miner te na taj način poveća hashing rate (sumu broja pogađanja koju odrađuju natjecatelji) cijele mreže, algoritam mijenja cilj majnanja sa 6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ili manje na npr. 06xxxxxxxxxxxxxxxxxxxxxxxxxxxxx ili manje. Kako je šansa da se dobije takav broj manja od šanse da na prvom mjestu bude broj šest, tako će svakom pojedinom majneru trebati duže da dođe do traženog rezultata, no kako je hashing rate veći, tako će brzina kreiranja novih blokova opet biti cca. 10 min, samo će u prosjeku jedan blok otkriti jedan majner a drugi blok drugi majner, tj. svakom zasebnom majneru će biti teže, no ukupan rezultat će ostati isti.
Isto se dešava, kada iz mreže (npr. zbog slabe isplativosti) izađe određeni dio minera ili mineri ugase dio neprofitabilne mining opreme (smanji se hashing rate cijele mreže). Algoritam prilagođava cilj na nešto što je lakše pogoditi, te preostali mineri svaki za sebe pogađaju češće rezultat, no kako ih je manje tako se brzina kreiranja blokova opet održava na zadanih 1 blok u cca. 10 minuta.
2. korak: Kreiranje bloka
Samo kreiranje bloka je vrlo brzo i jednostavno te ne troši niti puno vremena niti puno resursa (struja, CPU itd.). Nakon što netko od minera pobjedi u natjecanju, on ima pravo skupiti sve transakcije koje želi a da su sve zajedno zauzimaju manje od 1Mb, odrađuje jednostavne matematičke funkcije, te ih “spaja” u jedan blok i javlja mreži sve potrebne informacije. U samom bloku je zapisano tko ga je stvorio, kolika je fiksna nagrada, koliko je prikupio fee-a, koje su bile transakcije itd.
Prema dobivenim rezultatima, svaki sudionik mreže može provjeriti valjanost svakog bloka, te ukoliko je sve u redu, prihvatiti blok te ga dodati na kraj blockchain-a kojeg drži spremljenog na svom računalu. Ukoliko se desi da je neki miner htio prevariti mrežu, da je poslao lažne ili na neki način namještene podatke, mreža jednostavno odbija njegov blok, te je taj miner izgubio vrijeme i resurse koje je uložio u natjecanje. Na taj način se mreža štiti od “zlih” aktera (kažnjava ih se financijski, jer uloženi resursi nisu jeftini).
Nagrade za kreirani blok su unaprijed određene, te su u početku rada Bitcoin mreže iznosile 50 BTC-a po kreiranom bloku. Svakih 210000 blokova se nagrada smanjuje za pola, što se do sada desilo dva puta, tako da u trenutku pisanja ovog teksta iznosi 12.5 BTC-a. Sljedeće “halfanje” se očekuje u 5. mjesecu 2020. godine, kada će nagrada pasti na 6.25 BTC-a.
Po tome se lagano zaključi da će u budućnosti mreža prestati efektivno proizvoditi novi Bitcoin, te će ga na kraju biti oko 20.99999 mil. Bitcoina (što se u razgovoru redovito zaokruži na 21 mil.) Kako prolazi vrijeme, tako će mineri svoju zaradu prebacivati sa te fiksne nagrade, na zaradu od fee-eva koje uključuju u blokove. U trenutku pisanja ovoga teksta iznos koji mineri prikupe od naknada za transakcije iznosi između 1-5 BTC-a. U budućnosti to može biti više ili manje te će isplativost rudarenja ovisiti o tome koliko se koristi mreža te kolika je težina rudarenja u tom trenutku.
Cijeli sistem automatske promjene težine majnanja, garantira da će rudarenje biti isplativo u bilo kojem trenutku određenom broju minera nevezano da li je cijena BTC-a 0.01$ ili 100000$ te da li je cijena struje 0.01$ ili 100000$ po Watt-u struje. Sa padom cijene BTC-a ili rastom cijene struje, pada isplativost majnanja, što tjera određene minere da ugase svoju manje efikasnu opremu i prestanu majnati, što pak uzrokuje prilagođavanja težine, što pak povećava dobit onima koji su ostali u mreži, dok se obrnuto, prilikom povećanja cijene BTC-a ili smanjenja cijene struje, povećava i broj minera, tj. hash rate mreže, te se samim time povećava i težina majnanja.