Rudarjenje Bitcoina je res zanimiva zadeva. Začeti pa moramo s hash funkcijami. Brez njih Bitcoin ne bi mogel obstajati. Najprej naj razložim, kaj so, ker je to temeljnega pomena za razumevanje delovanja Bitcoina, zlasti rudarjenja, pa tudi transakcij.
Ni vam treba razumeti, kako Bitcoin deluje, da bi imeli od njega koristi, tako kot vam ni treba razumeti, kako deluje TCP/IP, da bi lahko uporabljali internet. Vendar nadaljujte, ker je to precej zanimivo, in obljubim, da bom poskrbel, da bo razumljivo.
HASH funkcija
Začnimo s shemo, ki jo bom razložil v nadaljevanju.
Na levi stani je INPUT, na sredini je FUNKCIJA, na desni pa je OUTPUT. Input je lahko katerikoli podatek, če je le digitalen. Lahko je poljubne velikosti, le da ga zmore obdelati računalnik. Podatki se posredujejo programu SHA256. Program vzame podatke in iz njih izračuna naključno število, ki je videti kot naključno, vendar ima posebne lastnosti (o njih bomo govorili pozneje).
Prvi algoritem SHA (Secure Hash Algorithm) je prvotno razvila NSA, zdaj pa obstaja veliko različnih različic (Bitcoin uporablja SHA256). Gre za niz navodil, kako premešati podatke na zelo zapleten, vendar natančno določen način. Navodila niso skrivnost in jih je mogoče narediti tudi ročno, vendar je to zelo zamudno.
Pri SHA256 je rezultat 256-bitno število (kar ni naključje).
256-bitno število pomeni binarno število, dolgo 256 cifr. Binarno pomeni, da je vrednost predstavljena z dvema simboloma, 0 ali 1. Binarna števila lahko pretvorimo v katero koli drugo obliko, na primer v decimalno obliko, ki jo poznamo.
Čeprav funkcija vrne 256-mestno binarno število, je vrednost običajno izražena v hexadecimalni obliki, dolgi 64 mest.
Hexadecimalni format pomeni, da je namesto 10 možnih simbolov, kot smo jih vajeni pri desetiškem sistemu (od 0 do 9), na voljo 16 simbolov (deset, ki smo jih vajeni, od 0 do 9, ter črke a, b, c, d, e in f, ki imajo vrednosti od 11 do 15). Na primer, če želimo vrednost decimalnega števila 15 predstaviti v šestnajstiškem sistemu, zapišemo samo “f” in vrednost je enaka. Če potrebujete več podrobnosti, je na spletu na voljo veliko informacij s hitrim iskanjem v Googlu.
Za prikaz delovanja SHA256 lahko vzamem število 1 in ga zaženem skozi spletni hash kalkulator in dobim ta rezultat (v Hexadecimalnem/šestnajstiškem zapisu):
INPUT je zgoraj, OUTPUT pa spodaj.
Vsi računalniki na svetu bodo dali enak izhodni rezultat, če je vhodni podatek enak in je uporabljena funkcija SHA256.
Izhodno hexadecimalnio/šestnajstiško število, če ga pretvorimo v desetiško, je (opazite, da je za zapis potrebnih več številk):
48,635,463,943,209,834,798,109,814,161,294,753,926,839,975,257,569,795,305,637,098,542,720,658,922,315
In pretvorjeno v binarno obliko je:
11010111000011010110010011100111111111100110100111111001110000110011101011010111000000001001110111111110101101000111111010101110100011110101101101001001110101010100010001011110001110101001001110000000001111001010010110111011011011110000111010110110100101111010111001101011100110101110011010111001101011100110101110011010111001101011100111
Za zanimivost, tukaj je ista vrednost v bazi 64 (pustil vam bom, da si sami izbrskate, kaj pomeni baza 64):
1w1k5/5p+cM61wCd/rR+ro9bSdVEXjqTgDylu28OtpY=
Upoštevajte, da je najmanjša možna vrednost, ki jo lahko vrne SHA256, nič, vendar je dolžina še vedno 256 mest. Tako je predstavljena ničla:
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Največja možna vrednost pa je:
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
V decimalni obliki je to:
115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935
V šestnajstiškem zapisu je:
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Upoštevajte, da je natanko 64 črk F.
Nulo v šestnajstiškem sistemu lahko preprosto zapišemo kot eno samo ničlo, vendar jih je za izpis hash 64, da bi upoštevali zahtevo po izpisu fiksne velikosti:
0000000000000000000000000000000000000000000000000000000000000000
Tukaj je povzetek nekaterih dejstev o hash funkciji, ki jih je treba nujno upoštevati:
INPUTA ni mogoče določiti iz OUTPUTA
INPUT je lahko poljubno dolg
OUTPUT je vedno enako dolg
OUTPUT se bo vedno reproduciral enako, če boste zagotovili enak INPUT.
Vsaka sprememba INPUTA, ne glede na to, kako majhna je, bo povzročila nepredvidljiv in zelo različen izhod.
OUTPUT je “navidezno” naključen, vendar je dejansko determinističen (določljiv, kar pomeni, da je izračunan)
OUTPUTA ni mogoče napovedati. Lahko ga le izračunamo, kar pa zahteva merljivo količino dela z računalnikom (in ure s svinčnikom in papirjem! Ne delajte tega!).
Zdaj, ko razumete osnovni koncept, kaj je hash, lahko razumete razlago principa rudarjenja bitcoinov.
Preden nadaljujete, vam priporočam, da obiščete spletni hash kalkulator in se malo poigrate z njim ter sami preverite, kaj sem povedal o hash funkcijah. Hash kalkulator
RUDARJENJE
Začel bom s prikazom koncepta dela, od koder izvira »proof of work« v Bitcoinu.
Pojdite na spletni hash kalkulator in vpišite “I am creating 50 bitcoins and paying myself this amount.”
Natančno prepišite ta stavek, pri čemer je treba upoštevati velike in male črke, vključno s piko. Dobili bi morali dobiti ta rezultat:
Ustvarimo pravilo, ki pravi, da mora biti to sporočilo o plačilu veljavno, če se hash začne z enojno ničlo. Za to moramo nekako spremeniti vnos. Toda, kot ste se naučili, ni mogoče predvideti, kakšen bo OUTPUT za dani INPUT. Katero spremembo lahko naredimo, da zagotovimo, da se hash začne z ničlo?
Podatke moramo dodati z metodo poskusov in napak. Prav tako pa ne želimo spremeniti pomena vhodnega sporočila. Zato ustvarimo polje (dodeljen razdelek), imenovano “nonce”, ki bo vsebovalo nesmiselno vrednost.
Beseda “nonce” naj bi bila izpeljana iz “številka, ki se uporabi samo enkrat”, čeprav tega ne razumem najbolje.
Spodaj si oglejte, kako dodajanje dodatnega polja z naslovom “Nonce:” spremeni OUTPUT vrednost hasha.
Izpis se še vedno ne začne z ‘0’, zato dodajmo nekaj nesmislov (dodal sem nesmiselno črko ‘x’):
Še vedno se ne začne z ničlo. Poskusil sem še nekaj znakov, dokler se hash ni začel z ničlo:
Pa jo imamo. V skladu s pravili, ki sem jih določil, je besedilo v vnosnem oknu veljaven imaginarni blok bitcoinov z eno transakcijo, s katero sem plačal 50 bitcoinov.
Upoštevajte, da so bloki bitcoinov bistvene “strani” ledgerja. Vsak blok je oštevilčen in ustvarja nove bitcoine skupaj s transakcijami med uporabniki. To je zapis, v katerem živijo bitcoini.
Zdaj pa novo pravilo. V naslednji blok je treba vključiti hash prejšnjega bloka. Dodal bom nekaj kompleksnosti in dodal še nekaj dodatnih polj, da se približamo temu, kar je v pravem bloku bitcoinov …
Hash se začne s črko ‘f’ in ne ‘0’, zato bom moral preizkusiti nekaj vrednosti v polju nonce:
Tokrat sem imel več sreče in našel nonce že po 4 različnih poskusih. Za prvi blok sem jo našel po 22 poskusih – tu je nekaj naključij, vendar na splošno ni težko najti veljavnega hasha, če želimo dobiti le eno ničlo. Obstaja 16 možnih vrednosti za prvo števko hasha, tako da imam možnost 1 proti 16, da bo vsaka sprememba, ki jo naredim v vnosnem polju, povzročila, da bo prva števka hasha ‘0’.
Upoštevajte, da so polja Bitcoina podobna, vendar je v njih še več podrobnosti, ki jih nisem dodal, samo za ponazoritev, ne pa nujno za to, da bi natančno opisal, kako je videti blok Bitcoina.
Naslednjemu bloku bom dodal polje časa, saj ga potrebujem za razlago naslednje “prilagoditve težavnosti”:
Zgoraj je blok številka 3. Vključuje hash prejšnjega bloka, zdaj pa sem začel vključevati tudi čas. Za »nonce« sem uspešno poskrbel, da se je hash začel z ničlo (preprosto sem vpisoval ‘1’, dokler ni bil dosežen cilj hasha).
To je za zdaj dovolj, da lahko začnem razlagati nekaj zanimivih konceptov o verigi blokov Bitcoina in rudarjenju.
PRIDOBIVANJE BLOKA
Postopek rudarjenja je tekmovalen. Kdor prvi pridobi veljaven blok, si znotraj tega bloka plača nagrado, saj je blok zdaj veljaven. Rudar, ki isto številko bloka pridobi nekoliko pozneje (drugouvrščeni), ne dobi ničesar – ta blok je zavrnjen. Razlaga, zakaj je temu tako, bom razložil v dodatku.
Ko je blok 3 najden in razposlan vsem (vsem vozliščem /nodom Bitcoina), vsi rudarji prenehajo delati na bloku 3 in začnejo pridobivati blok 4. Zmagovalec objavi rezultat, nato pa vsi začnejo delati na bloku 5 itd.
Z vsakim blokom nastanejo novi bitcoini, ki skupaj tvorijo celotno dosedanjo zalogo. Če je rudarjev veliko, potem bodo statistično gledano bloki nastajali hitreje in bitcoini bodo nastajali hitreje. Težava, kajne?
V želji po omejeni ponudbi bitcoinov s predvidljivo izdajo v daljšem časovnem obdobju je Satoshi Nakamoto pomislil na to težavo in uvedel negativno povratno zanko, da bi proizvodnja blokov v povprečju potekala v 10-minutnih intervalih. Kako? Preverite, ali si lahko zamislite kakšen način. Za trenutek se ustavite in razmislite ter preverite, ali lahko pridete do enako genialne rešitve, in ko obupate, preberite naprej.
NODES: Omenil sem “veljavne” bloke. In kaj? Kdo preverja? Vozlišča Bitcoin preverjajo. Vsako vozlišče Bitcoina hrani kopijo verige blokov in po nizu pravil preverja, ali so novi bloki v skladu s pravili, in zavrne tiste, ki niso. Kje so pravila? V kodi. Računalnik, ki prenese kodo Bitcoina, je vozlišče.
PRILAGODITEV TEŽAVNOSTI (Difficulty adjustment)
Povprečni čas novih blokov Bitcoina izračuna vsako vozlišče vsakih 2016 blokov (zato je potrebno polje časa). To je del protokola in pravil, ki jih vozlišča upoštevajo. Za prilagoditev števila ničel, potrebnih za vsak hash bloka, se uporabi določena formula.
Strogo gledano se ne prilagodi število ničel, temveč ciljna vrednost, pod katero mora biti hash, vendar je razmišljanje o vodilnih ničlah preprostejše za razlago.
Če se bloki izdelujejo prehitro, se ciljna vrednost hasha prilagodi v skladu z vnaprej določenimi pravili, ki jih vsa vozlišča upoštevajo enako (to je v njihovi kodi).
Če ostanem preprost za svoj primer, recimo, da drugi ljudje tekmujejo z mano, bloki nastajajo prehitro in zdaj 4. blok potrebuje dve ničli namesto ene, v skladu z namišljenim izračunom.
Za dve ničli bom potreboval nekoliko več časa, vendar si predstavljamo, da z menoj tekmuje veliko drugih ljudi, tako da je skupni čas, ki ga vsakdo potrebuje za iskanje bloka, ohranjen na ciljni vrednosti.
Tukaj je naslednji blok:
Upoštevajte čas. Od prejšnjega bloka je minilo več kot 10 minut (čas sem si izmislil za demonstracijo). Desetminutni cilj je statističen, nikoli ni točno znano, kdaj se bo našel naslednji blok.
Nekaj minut sem se potikal po tipkovnici, dokler se nista pojavili dve ničli. To je bilo eksponentno težje kot najti eno samo ničlo. Verjetnost, da boste našli dve ničli zapored, je 1 proti 16 × 16 ali 1 proti 256.
Če se bo rudarjenju pridružilo več ljudi, ki bodo tekmovali za nove bitcoine, bodo sčasoma potrebne tri ničle.
Pravkar sem pogledal zadnji pravi blok bitcoinov, ki vsebuje hash prejšnjega bloka. Hash je bil:
000000000000000000084d31772619ee08e21b232f755a506bc5d09f3f1a43a1
To je 19 ničel! Pri vsakem poskusu je verjetnost, da boste našli takšen blok, 1 proti 1619. Rudarji bitcoinov opravijo veliko število poskusov na sekundo, in to kolektivno po vsem svetu.
Število poskusov na sekundo je znano kot “hash rate”. Trenutno je ocenjena svetovna hitrost »hash rate« nekaj manj kot 200 Tera hashov na sekundo (200 bilijonov na sekundo). Pri tolikšnem številu poskusov na sekundo se približno vsakih 10 minut najde blok, katerega hash se začne z 19 ničlami.
V prihodnosti, ko se bo pridružilo še več rudarjev, se bo hash rate še povečal, bloki bodo najdeni hitreje, težavnost Bitcoina pa se bo prilagodila tako, da bo zahtevala 20 ničel itd., kar bo ohranilo izdelavo blokov približno na vsakih 10 minut.
RAZPOLOVITEV / Halving
Ko se je bitcoin prvič pojavil, je bilo v vsakem bloku izdelanih novih 50 bitcoinov. Pravila verige blokov bitcoin določajo, da se po vsakih 210.000 blokih nagrada prepolovi. Ta trenutek je znan kot “razpolovitev” ali halving in se zgodi približno na vsaka štiri leta. Razpolovitev skupaj s prilagoditvijo težavnosti ohranjanja blokov v 10-minutnih intervalih pomeni, da bo okoli leta 2140 nagrada za blok znašala 0,00000001 ali 1 Satoshi, najmanjša enota bitcoina, in je ne bo več mogoče razpoloviti. Rudarjenje se ne bo ustavilo, vendar bo “nagrada za blok” enaka nič. Od tega trenutka naprej ne bo ustvarjenih novih bitcoinov, število bitcoinov pa je matematično izračunljivo in dovolj blizu 21 milijonom kovancev. Tako je znana skupna ponudba – ta je programsko določena.
Rudarji pa bodo še vedno nagrajeni, vendar ne z “nagrado za blok”, temveč s provizijami za transakcije – razloženo v nadaljevanju.
Kako natančno se nagrada za blok zmanjša na polovico? To je v kodi, programu, ki ga hranijo vozlišča. Vedo, da je treba zavrniti vsak nov blok po 210.000, za katerega rudar plača več kot 25 bitcoinov.
PROVIZIJE ZA TRANSAKCIJE:
Do zdaj sem prikazal le namišljene bloke z eno samo transakcijo, transakcijo, pri kateri rudar dobi nagrado. To se imenuje “coinbase transakcija”.
Ni poimenovana po podjetju Coinbase. Podjetje se je poimenovalo po transakciji coinbase in ne obratno, da ne bo pomote.
Poleg coinbase transakcije obstajajo tudi transakcije, pri katerih ljudje plačujejo drug drugemu. Tukaj je namišljen primer:
Tokrat se nisem ukvarjal z iskanjem pravega hasha (Pravzaprav je pravi hash sporočen v bloku 200.001). Nonce sem si izmislil samo za zabavo, vendar opazite, da je vanj mogoče vgraditi sporočilo.
Satoshi je v prvi blok Bitcoina (The Genesis Block) po časopisnem naslovu za tisti dan znamenito vključil besede “Kanclerka na robu drugega reševanja bank”.
Pomembno je, da je vključenih 132 transakcij (vse niso prikazane). Oglejte si transakcijo št. 132 – 2,3 bitcoina z nekega naslova plača 2,1 bitcoina drugemu naslovu in tudi drugemu naslovu znesek 0,1 bitcoina (uporabil sem pike, da bi skrajšal dolžino naslova).
Tako vir 2,3 bitcoina plača skupaj 2,2 bitcoina (2,2+0,1=2,2). Ali manjka 0,1 bitcoina? Ne, razliko zahteva rudar, kot bom pojasnil.
Rudar si lahko izplača 25 bitcoinov kot nagrado za blok (ker je minilo 210.000 blokov, se je nagrada prepolovila s 50 na 25). Toda če pogledate, je transakcija na platformi coinbase 27,33880022. Dodatnih 2,33880022 bitcoina izvira iz drugih 132 transakcij v bloku – vsi vhodi bodo nekoliko večji od vsote izhodov. Torej rudar ustvari te “zapuščene” bitcoine kot plačilo samemu sebi.
Prostor v bloku je omejen. Ko je bil bitcoin nov, so lahko uporabniki pošiljali transakcije brez plačila, rudarji pa so transakcijo vključili v blok. Zdaj pa je uporabnikov več, in ker je uvrstitev v naslednji blok konkurenčna, uporabniki v transakcijo vključijo pristojbino, da bi rudarje privabili, da izberejo njihovo transakcijo namesto drugih.
Ko se nagrada za blok nenehno zmanjšuje, tako da se vsaka štiri leta prepolovi in sčasoma doseže ničlo, rudarji še vedno prejemajo plačilo na ta način.
Nekateri predlagajo, da nekega dne nagrada rudarjem ne bo zadostovala in da bo Bitcoin propadel. Ta pomislek je bil temeljito ovržen, zato ga tu ne bom ponavljal.
Ali je mogoče blok ponovno napisati?
To je zelo malo verjetno in vredno je razumeti, zakaj. Tako boste razumeli, zakaj so transakcije Bitcoina nespremenljive.
Prej sem pojasnil, da je hash prejšnjega bloka vključen v trenutni blok. To pomeni, da vsako urejanje transakcij v starem bloku spremeni hash bloka. Vendar je ta hash zapisan v naslednjem bloku, zato je treba naslednji blok posodobiti. Če pa spremenite hash, zapisan v naslednjem bloku, je treba spremeniti tudi hash.
Upoštevajte, da ob vsaki spremembi hasha izgubite vse te čudovite ničle in vam ostane le naključna oblika hasha – in ponovno morate opraviti vse delo, da dobite ničle nazaj. Če to storite za blok, ki ste ga skušali urediti, boste morali ponovno opraviti delo za naslednji blok in naslednji vse do zadnjega bloka. Ne morete se preprosto ustaviti pri starem bloku, saj so pravila Bitcoina takšna, da je najdaljša veriga blokov pravi zapis Bitcoina. Če se vrnete nazaj in uredite blok izpred 10 blokov, nimate več najdaljše verige. Dodati morate še 10 blokov in nato še malo več, saj je med ustvarjanjem teh 10 blokov prava veriga verjetno postala nekoliko daljša. Tekmovati morate, da bi prehiteli pravo verigo. Če vam to uspe, nova veriga postane prava veriga.
Ponavljanje kolektivnega napora celotnega sveta pri hashanju od urejenega bloka do najnovejšega bloka je ovira za spreminjanje Bitcoina. Energija je bila porabljena za ustvarjanje teh hashev z vsemi neverjetnimi ničlami in to porabo energije je treba ponoviti za spreminjanje Bitcoina. Zato energija, ki se porabi za rudarjenje Bitcoina, ni “zapravljena”; namenjena je obrambi Bitcoina pred spreminjanjem; da bi bil ledger (knjigovodski zapis) nespremenljiv, ne da bi bilo ob tem treba zaupati osrednji avtoriteti.
Kaj se zgodi, če dva rudarja hkrati najdeta blok?
To se dejansko občasno zgodi in vedno se uredi na naslednji način:
Vsako vozlišče bo najprej prejelo enega od novih skoraj istočasnih blokov in ga sprejelo, kasneje prispelega pa zavrnilo. To povzroči razcep omrežja, ki pa je začasen.
Za ponazoritev imenujmo enega od blokov modri in drugega rdeči (nimata barve, le potrpite).
Rudarji nato delajo na naslednjem bloku, vendar bo prišlo do razcepa glede tega, iz katerega bloka bodo podaljšali verigo.
Recimo, da je zmagovalni rudar našel blok z uporabo modre verige. Novi blok bodo poslali vsem vozliščem in najdaljša veriga bo očitna. Vozlišča, ki so sprejela rdečo verigo, jo bodo nato opustila in sprejela modro verigo.
Vsi rudarji, ki so delali na rdeči verigi, bodo prenehali z delom in bodo zdaj delali na daljši verigi, ki je modra veriga. Rdeča veriga je umrla.
Dodatek
Zakaj je blok drugouvrščenega rudarja neveljaven
Recimo, da je rudar-A pravkar izkopal blok 700.000. 30 sekund pozneje je tudi rudar B ustvaril drugačno različico bloka 700.000. Ko bo MINER-B objavil to alternativo, jo bo vsako vozlišče zavrnilo, ker so že videli in sprejeli blok MINER-A. Še več, v teh 30 sekundah je recimo MINER-C našel blok 700.001. Glede na to, da konkurenčni 700.000. blok MINER-B ne podaljšuje trenutne verige (ki je do 700.001), je iz tega razloga tudi zavrnjen.
Še bolj zanimivo pa je, da če bi MINER-B delal na bloku 700.001 namesto na konkurenčni različici 700.000, bi imel prav toliko možnosti za rudarjenje veljavnega bloka kot neveljavnega. Zato bi moral rudar takoj, ko vidi nov blok, usmeriti svoj trud v naslednji blok.
Če pa je rudar-B našel blok 700.000 eno sekundo po rudarju-A, potem je mogoče, da nekatera vozlišča najprej vidijo blok rudarja-A, nekatera pa blok rudarja-B, odvisno od geografskih lokacij in hitrosti interneta. V tem primeru pride do začasnega razcepa in nekateri rudarji si bodo prizadevali za razširitev ene različice, nekateri pa za razširitev druge. Kot je bilo prej pojasnjeno z uporabo deskriptorjev “modra veriga” in “rdeča veriga”, se bo sčasoma ena od različic razširila dlje pred drugo in soglasno postala veljavna različica.
Original: Armantheparman.com , SHA ans Bitcoin Minning Walktrough
Toni-Bitcoin društvo SLO
Bitcoin društvo Slovenije je ustanovljeno z namenom, da povežemo slovensko kripto skupnost, organiziramo dogodke, odgovarjamo na vprašanja ter pomagamo posameznikom. Več info: https://bitcoin.si
follow me :
Related Posts
Personal Server - How to setup and configure
Jun 09, 2024
Nehajte se igrati, začnite se učiti!
Feb 19, 2024
Unpacking Plan ₿ Conference 2023: A Journey with Bitcoin Enthusiasts
Oct 28, 2023