Sunday, March 30, 2014

Rudarenje bitcoina: Osnove


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


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.

Tuesday, March 25, 2014

Bitcoin rječnik (englesko-hrvatski)

Englesko-hrvatski rječnik bitcoin pojmova. Rječnik će se s vremenom osvježavati.

Rječnik

 

address - adresa; svojevrstan bankovni račun u bitcoin svijetu na koji se vežu bitcoini pojedinog vlasnika

bitcoin - digitalna decentralizirana valuta temeljene na kriptografiji

base58check - poseban način enkodiranja bitcoin adresa u bazu 58

block - blok; Skup transakcija sa zaglavljem prikupljene kroz 10 minuta

block chain - lanac blokova; Najdulji lanac blokova u bitcoin mreži. Služi kao glavna knjiga koja prikazuje ukupno stanje Bitcoin sustava

block depth - dubina bloka; broj blokova koji su kreirani nakon odabranog bloka

block header - zaglavlje bloka transakcija koje sadrži hash prethodnog bloka, vremensku oznaku, korijen Merkleovog stabla transakcija u bloku i nonce

block height - visina bloka; broj blokova između genesis bloka i odabranog bloka

brainwallet - bitcoin adresa koje se generira iz lozinke koju korisnik drži u glavi. Za početak korisnik mora izmisliti (jaku) lozinku te zatim pomoću stranice kao što je brainwallet.org generirati bitcoin adresu iz te lozinke, odnosno privatni ključ. Prednost ovakvog način generiranja adresa je što korisnik svoj novčanik uvijek ima u glavi.

change - ostatak; Novac na bitcoin adresi potrebno je potrošiti u potpunosti, ako se želi potrošiti manje, ostatak se vraća pošiljatelju.

change address - adresa na koju se vraćaju nepotrošeni bitcoini iz transakcije. Često je različita od adrese s koje su poslani bitcoini zbog anonimnosti.

coinbase transaction - Prva transakcija svakog novog bloka. Donosi određeni broj bitcoina rudaru koji prvi uspješno verificira blok.

cold wallet/storage -  offline pohranjivanje bitcoin novčanika. Umjesto da uvijek bude na računalu, novčanik je moguće spremiti na USB stick ili isprintati na papir te tako povećati sigurnost novčanika.

confirmation - potvrda niza transakcija u bloku korištenjem dokaza rada.

difficulty - težina dokaza rada. Povećava se svakih dva tjedna zajedno s ukupnom stopom hashiranja hadwarea u bitcoin mreži.

digital signature - digitalni potpis; Matematički mehanizam pomoću kojeg jedan vlasnik prenosi bitcoine na drugog vlasnika.

double spend - dvostruko trošenje; Pokušaj trošenja iste transakcije dva puta.

exchange - mjenjačnica u kojoj se ostale valute mijenjaju za bitcoin

fee - naknada; Isplaćuje se rudaru za uspješno verificiran blok transakcija.

fork - grananje u lancu blokova koje se dogodi ako dva rudara istovremeno verificiraju blok te dio mreže primi jedan blok, a drugi dio primi drugi

full node - puni čvor; Bitcoin čvor (klijent) koji ima pohranjen cijeli lanac blokova te može verificirati transakcije

genesis block - prvi bitcoin blok. Generirao ga je Satoshi i to je bila osnova cijelog block chaina.

hardware wallet - hardverski novčanik; alternativa softverskim novčanicima na računalu. Mali elektronski uređaj za pohranjivanje bitcoina.

hash rate - stopa hasha; Mjerna jedinica za procesorsku snagu bitcoin mreže. Mjeri se u hashevima po sekundi.

hot wallet -  novčanik koji je povezan s internetom. Većina standardnih softverskih novčanika.

merged mining - paralelno rudarenje; Uz glavnu valutu, rudari se i sporedna valuta. Kad rudar dobije nagradu za otkriveni blok glavne valute, istovremeno dobije i nagradu za sporednu valutu. To omogućuje sporednoj valuti da koristi visoki postotak stope hashiranja glavne valute.

Merkle tree - Merkleovo stablo; Kriptografska podatkovna stablasta struktura kod koje svaki čvor koji nije list predstavlja hash dva prethodnika

mining - rudarenje; verifikacija transakcija u bloku I rješavanje kriptografskog problema za taj blok

mining pool - rudarski bazen; rudari se mogu udruživati u tzv. bazene (grupe) u kojima im je povećana šansa da izrudare Bitcoin blok

mixing service - mikser, mješalica; usluga za povećanje anonimnosti bitcoin transakcija. Korisnik koji želi sakriti činjenicu da nekome šalje određeni iznos bitcoina, pošalje ih kroz mixing uslugu koja pomiješa bitcoine dobivene od različitih korisnika te nije moguće odrediti tko je poslao koliko bitcoina kome.

multisignature transaction - transakcija s više potpisa (višepotpisna transakcija); Transakcija za koju je potrebno više od jednog privatnog ključa da se potroše bitcoini s adrese. 

nonce - vrijednost u zaglavlju bloka koja se ne ponavlja

offline transactions - offline transakcije; Bitcoin transakcije koje se ne provode na lancu blokova između klijenata nego se sredstva prebacuju samo unutar baze podataka jedne mjenjačnice.

orphaned block - napušteni blok jer je njegov lanac postao kraći od nekog drugog lanca blokova

paper wallet - papirnati novčanik; bitcoin novčanik je moguće isprintati na papir (javni i privatni ključ) te koristiti kao siguran oblik offline pohrane.

private key - privatni ključ; Svaki javni ključ dolazi u paru s privatnim (tajnim) ključem koji omogućuje trošenje bitcoina s pojedine adrese

proof-of-work - dokaz rada; rješavanje kriptografskog problema u zaglavlju bitcoin bloka. Njime se dokazuje da je korisnik uložio određeno procesorsko vrijeme I snagu u verificiranje transakcija.

public key - javni ključ; Koristi se za dobivanje adresa za depozit bitcoina. Generira se iz privatnog ključa.

satoshi - stomilijunti dio bitcoina

script - bitcoinov skriptni jezik za programiranje transakcija.

simplified payment verification - pojednostavljeni način verifikacije transakcija koji se oslanja na ostale čvorove u mreži

transaction - transakcija; Prijenos bitcoina s jednog vlasnika na drugog

wallet - novčanik; Softverski ekvivalent fizičkog novčanika

wallet import format - sažeti oblik pohranjivanja privatnog ključa korištenjem base58check

Sunday, March 23, 2014

Transakcije (drugi dio)


Postoje dvije vrste transakcija: pay-to-PubKeyHash i generirajuće. Prve su standarne BTC transakcije kod kojih korisnik plaća na hash javnog ključa drugog vlasnika. Druge služe kao uplata onome tko je uspješno verificirao blok transakcija. Imaju samo jedan ulaz koji sadrži "coinbase" parametar koji može biti bilo što jer se ne koristi za išta (služi samo kao oznaka). Trenutačno sadrži i "extranonce" koje se povećava svaki puta kad se nonce iz zaglavlja transakcije prelije.

Format ulaza i izlaza

 

Format ulaza


Polje
Opis
Veličina
Hash prethodne transakcije
Dvostruki SHA256 hash prethodne tx
32 bajta
Indeks izlaza prethodne tx
Ne-negativni cijeli broj izlaza prethodne tx
4 bajta
Duljina ulazne skripte
Ne-negativni cijeli broj
1-9 bajtova
Ulazna skripta / scriptSig
Skripta
Duljina skripte
Redoslijed
Koristi se uz lock-time. Uglavnom 0xFFFFFFFF
4 bajta

 Format izlaza

Polje
Opis
Veličina
Vrijednost
Ne-negativan cijeli broj satoshija koji se prenose
8 bajtova
Duljina izlazne skripte
Ne-negativni cijeli broj
1-9 bajtova
Izlazna skripta / scriptPubKey
Skripta
Duljina skripte

Naknade na transakcije

 

Na neke se transakcije plaćaju naknade. Korisnik koji prvi riješi hash za trenutačni blok transakcija dobije naknade za transakcije u njemu. Zamišljene su da kada jednog dana prestane stvaranje novih bitcoina, one budu poticaj korisnicima da nastave verificirati transakcije.

U originalnom bitcoin klijentu na transakciju se neće naplatiti naknada ako je transakcija manja od 1000 bajtova, svi izlazi šalju 0,01 BTC ili više te ako ima dovoljno visok prioritet. Ako ti uvjeti nisu zadovoljeni naplatit će se naknada na idućih tisuću bajtova od 0,0001 BTC za svakih 1000 bajtova veličine.

 Potvrde

 

Potvrda znači da je transakcija uključena u blok transakcija koji je uspješno riješen (nađen je dokaz rada za njega). Potvrde su osiguranje protiv dvostrukog trošenja. Ako transakcija nema potvrda moguće je manipulirati njome i dovesti do dvostruke potrošnje. Deset minuta nakon provođenja transakcije ona ću najvjerojatnije biti uključena u blok. To je jedna potvrda. Moguće je imati proizvoljan broj potvrda no to nije praktično jer predugo traje te je maksimum najćešće šest potvrda. To znači da je transakcija uključena u blok te da se na taj blok nastavilo još pet blokova transakcija.

 

Saturday, March 22, 2014

Transakcije (prvi dio)


Koristan alat za istraživanje transakcija je blockchain.


Pomoću transakcija troše se bitcoini te one tvore srž bitcoin protokola. Transakcije se referenciraju na jednu ili više prethodnih transakcija te prenose određeni iznos bitcoina s jednog vlasnika na drugog.
Slika 1: primjer bitcoin transakcija
 
Transakcija A šalje transakciji C 100 bitcoina (jedan ulaz transakcije C referencira se na izlaz transakcije A). Transakcija C generira 50 bitcoina (drugi ulaz transakcije C referencira se na transakciju B, coinbase transakciju, pomoću koje se generiraju novi bitcoini i dodjeljuju korisicima). U ovom trenutku transakcija C ima na raspolaganju 150 bitcoina, 100 preko transakcije A i 50 preko transakcije B. C transakcija šalje transakciji D 101 bitcoin. Budući da se iznos u transakciji mora potrošiti u cijelosti (kao novčanica) transakcija C ima dva izlaza. Jedan na koji se referencira transakcija D pomoću kojeg joj se dodjeljuje 101 bitcoin i drugi pomoću kojeg transakcija C dobiva nazad ostatak bitcoina (49).

Format transakcija

Transakcije (tx) su skupovi ulaza i izlaza. Ulazi i izlazi su podatkovne strukture koje osim podataka sadrže i instrukcije što napraviti s tim podacima. Transakcije su usko vezane uz script, bitcoinov skriptni jezik u kojem su pisane.
Općeniti format transakcije je:


Polje
Opis
Veličina
Version no.
Verzija protokola. Trenutačno 1.
4 bajta
In-counter
Broj ulaza. Pozitivni cijeli broj.
1-9 bajtova
List of inputs
Popis svih ulaza u transakciju. Prvi ulaz u prvu transakciju u bloku naziva se coinbase.
Broj ulaza
Out-counter
Broj izlaza. Pozitivni cijeli broj.
1-9 bajtova
List of outputs
Popis izlaza iz transakcije.
Broj izlaza
lock-time
Niz brojeva mnjih od 0xFFFFFFFF. Visina blokova ili vremenska oznaka kad se tx izvrši.
4 bajta

 

Pojednostavljeni primjer transakcije s jednim ulazom i jednim izlazom (sve adrese izražene su u heksadecimalnom formatu umjesto u Base58Check formatu). Ulaz ove transakcije prima 10 BTC-a iz izlaza broj 0 transakcije f5d8e... te ih zatim šalje na adresu 40437...

Ulaz:
Prethodna tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Indeks: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501

Izlaz:
Vrijednost: 1000000000
ScriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG

Ulaz

Ulaz se referencira na izlaz prethodne transakcije. Transakcije može imati jedan ili više ulaza. Prethodna tx je hash prethodne transakcije. Indeks je brojčana oznaka izlaza iz kojeg se uzimaju bitcoini. ScriptSig je bitcoin skripta koja prima dva parametra: potpis sadašnjeg vlasnika bitcoina i javni ključ (ne adresu) idućeg vlasnika te služi za verifikaciju.

Izlaz

Izlaz sadrži upute za slanje bitcoina. Vrijednost je iznos u satoshijima (stomilijuntim dijelovima bitcoina) koje ova transakcija prenosi. ScriptPubKey je bitcoin skripta koja za parametar prima adresu (ne javni ključ) idućeg vlasnika i služi za verifikaciju. Ako adresa s koje se šalje sadrži više bitcona nego što se želi poslati, cijeli se iznos s te adrese potroši pa se ostatak bitcoina vrati na nju. Na transakciju se može platit naknada onome tko prvi verificira blok u kojem se ona nalazi.

Wednesday, March 19, 2014

Base58Check


Base58Check je enkodiranje u modificiranoj bazi 58 koje se koristi za enkodiranje bitcoin adresa. Ono pretvara nizove bajtova u nizove znakova koje ljudi mogu lakše zapisivati odnosno tipkati. Base58Check posebno je konstruirano kako bi se izbjegli znakovi "0", "O", "I" te "l" da nebi došlo do greške prilikom upisivanja adrese.

Uz te karakteristike Base58Check ima i jedan bajt koji označava verziju bitcoin adrese, 4 bajta zaštitne sume bazirane na SHA-256 te dodatan korak koji pazi da se sačuvaju vodeće nule u zapisu. Važno je napomenuti da se kod enkodiranja koristi big-endian format.

Enkodiranje privatnog ključa

Osim što se koristi za enkodiranje javnih ključeva u bitcoin adrese, Base58Check koristi se i za enkodiranje privatnih ključeva u tzv. Wallet Import Format kako bi se olakšalo njihovo prepisivanje odnosno kopiranje.
Postupak:
  1. Primjer privatnog ključa 0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
  2. Na početak mu se dodaje bajt 0x80 za glavnu mrežu ili 0xef za testnu 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
  3. Niz se hashira pomoću SHA-256 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592
  4. I opet 507A5B8DFED0FC6FE8801743720CEDEC06AA5C6FCA72B07C49964492FB98A714
  5. Prva četiri bajta uzimaju se za zaštitnu sumu 507A5B8D
  6. Ta se četiri bajta dodaju na kraj niza iz točke 2 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D507A5B8D
  7. Enkodiranje pomoću Base58Check daje konačni rezultat 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ

Tablica za konverziju

Vrijednost
Znak
Vrijednost
Znak
Vrijednost
Znak
Vrijednost
Znak
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
A
10
B
11
C
12
D
13
E
14
F
15
G
16
H
17
J
18
K
19
L
20
M
21
N
22
P
23
Q
24
R
25
S
26
T
27
U
28
V
29
W
30
X
31
Y
32
Z
33
a
34
b
35
c
36
d
37
e
38
f
39
g
40
h
41
i
42
j
43
k
44
m
45
n
46
o
47
p
48
q
49
r
50
s
51
t
52
u
53
v
54
w
55
x
56
y
57
z





 


Monday, March 17, 2014

Bitcoin adrese


Bitcoin se zasniva na kriptografiji javnog ključa, točnije na digitalnim potpisima baziranim na eliptičkim krivuljama. Krivulja koju bitcoin klijent koristi je secp256k1.
Pomoću nje se generiraju privatni i javni ključevi koji se koriste za potpisivanje transakcija odnosno dobivanje bitcoin adresa.

Privatni ključ

Privatni ključ omogućuje trošenje bitcoina. Svaka bitcoin adresa ima odgovarajući privatni ključ koji vlasniku omogućuje pristup bitcoinima na toj adresi. Sastoji se od 256 bitova, odnosno 64 heksadecimalna znaka.

Bitcoin adresa

Bitcoin adresa dobiva se iz javnog ključa:
  1. Duljina javnog ključa je 512 bitova odnosno 64 heksadecimalna znaka 50863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
  2. Na njega se dodaje jedan bajt 0x04 pa se dobiva 0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
  3. Hashira li se to pomoću SHA-256 dobiva se 600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
  4. Zatim se prethodni niz znakova hashira pomoću RIPEMD-160 010966776006953D5567439E5E39F86A0D273BEE
  5. Na to se dodaje bajt koji označuje verziju (0x00 ako se radi o glavnoj mreži, 0x6f ako se radi o testnoj ili 0x34 ako se radi o Namecoinu) 00010966776006953D5567439E5E39F86A0D273BEE
  6. Nad time se ponovno radi SHA-256 445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094
  7. Te još jednom SHA-256 D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30
  8. Prva četiri bajta tog niza uzimaju se kao zaštitna suma D61967F6
  9. Ta se zaštitna suma dodaje na kraj niza iz koraka 5 00010966776006953D5567439E5E39F86A0D273BEED61967F6
  10. To je bitcoin adresa izvedena iz javnog ključa, a najčešće se zapisuje u Base58Check formatu 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM

Bajt 0x00 se također kodira te se zbog specifičnosti formata Base58Check kovertira u broj 1. Zato sve bitcoin adrese u glavnoj mreži počinju brojem 1. Većina je adresa duljine 33 ili 34 znaka.

 

Saturday, March 15, 2014

Bitcoin: tehničko pojašnjenje (drugi dio)

5. poglavlje: Network



Ovdje se navode koraci opisani prethodno u ovom tekstu. Također je vidljivo da iako je moguće da dijelovi mreže imaju različite blokove neko vrijeme. Ta će situacija trajati sve dok se ne "riješi" idući blok transakcija, tj. dok se ne nađe dokaz rada za idući blok. Tad će jedan lanac blokova postati dulji te će se nastaviti raditi na njemu. Onaj drugi blok kao da se nikad nije dogodio.

6. poglavlje: Incentive



Svaki blok započinje posebnom transakcijom koja onome tko je riješio prethodni blok daje određenu svotu bitcoina. Nakon što su u prethodnom vremenskom intervalu prikupljene transakcije i nakon što je pronađen dokaz rada za taj blok, čvor koji je uspješno riješio taj blok dobiva određenu svotu bitcoina u posebnoj transakciji koja se prva uključuje u idući blok. To potiče klijente da nastave s rješavanjem blokova odnosno verificiranje transakcija.

Također se govori o tome da će postojati unaprijed određeni broj bitcoina koji će biti moguće dobiti rješavanje blokova. Nakon što prestanja stvaranje novih bitcoina, klijenti će i dalje verificirati transakcije jer će se verifikacija i dalje plaćati.

Govori se i o napadu s 51% resursa. Iako je moguće da će takav napadač moći poništavati svoje transakcije, isplativije je ako nastavi verificirati transakcije.

7. poglavlje: Reclaiming disk space



Da bi se smanjilo zauzeće prostora na disku, transakcije se mogu sažeti u Merkleovo stablo te se u blok umjesto samih transakcija zapisuje korijen stabla.

Na slici iz ovog poglavlja prvi se puta vidi da se blok sastoji od dva dijela: zaglavlja (header) i "tijela". U zaglavlju se nalazi nonce, hash prethodnog bloka i korijen Merkleovog stabla. U ostatku bloka, "tijelu", nalaze se transakcije koje je klijent skupio. Transakcije je moguće sažeti "rezanjem grana" Merkleovog stabla.

8. poglavlje: Simplified Payment Verification



Transakcije je moguće verificirati bez pokretanja cijelog čvora (full node). CIjeli čvor  je čvor koji kod sebe drži kopije svi blokova i svih transakcija na njima. Ako je na klijentu pokrenut cijeli čvor, transakcije se verificiraju tako da se provjeravaju sve prethodne transakcije koje vode do ove sadašnje.

Za razliku od toga, pojednostavljeni čvor drži kod sebe samo zaglavlja transakcija. Takav čvor ne može sam za sebe provjeravati transakcije nego "vjeruje" drugim čvorovima da ispravno verificiraju transakcije. Nakon što se određena transakcija "zakopa" ispod x blokova, pojednostavljeni klijent prihvaća tu transakciju kao ispravnu.

Pojednostavljeni čvor ipak može provjeriti nalazi li se neka transakcija u određenome bloku. Kombinirajući zaglavlja blokova koje čvor čuva i hasheva određenih transakcija koje su dohvaćene iz mreže, moguće je provjeriti je li određena transakcija u bloku zahvaljujući svojstvima Merkleovog stabla.

Pojednostavljeni se klijenti oslanjaju na ostale čvorove u mreži da im jave što je ispravno. U slučaju napada korištenjem 51% resursa jednostavni će čvorovi prihvaćati neispravne transakcije kao ispravne.

9. poglavlje: Combining and Splitting Value



Transakcije mogu imati više ulaza te jedan do dva izlaza. Bitcoin se prebacuje s vlasnika na vlasnika tako da se svi bitcoin s jedne adrese prvog vlasnika prebace na adresu drugog vlasnika. U slučaju da je korisnik želio prebaciti manje bitcoina nego zapravo ima na toj adresi, ostatak bitcoina će mu se vratiti. Dakle transakcija će imati jedan izlaz ako se svi bitcoini s jedne adrese prebacuju na drugu, a dva ili više ako se prebacuje manje te je ostatak potrebno vratiti pošiljatelju.

Bitcoin se ponaša slično novčanicama. Kada je u dućanu potrebno platiti određeni iznos, kupac prodavaču daje novčanicu određene denominacije. Ako je denominacija veća od ukupnog troška, prodavač kupcu vraća ostatak.

10. poglavlje: Privacy



Iako se sve transakcije moraju javno objaviti moguće je zadržati dozu privatnosti tako što će javni ključevi biti anonimni. Kada se provede bitcoin transakcija, moguće je vidjeti koliko je sredstava preneseno na neku adresu, ali ne zna se kome ta adresa pripada. Za dodatnu razinu sigurnosti potrebno je generirati novi par ključeva za svaku transakciju.

Bitcoin: tehničko pojašnjenje (prvi dio)


Ovaj bi tekst trebao pokušati pojasniti rad u kojem je opisan Bitcoin protokol.
Originalni tekst je vrlo sažet i nije jednostavan za čitanje. Prije čitanja rada bilo bi dobro imati osnovno zanje iz područja kriptografije javnog ključa, digitalnih potpisa, Merkleovog stabla, kriptografskih hash funkcija, raspodijeljenih sustava te problema bizantskih generala.


Rad se oslanja i na implementaciju samog protokola u bitcoin klijentu. Bitcoin rad i programski kod razvijani su istovremeno.

Ovaj će tekst pratiti originalni rad o bitcoinu poglavlje po poglavlje te je zamišljen da se čita nakon svakog poglavlja originalnog teksta.

2. poglavlje: Transactions 

 

U prvom odlomku drugog poglavlja bitcoin je definiran kao lanac digitalnih potpisa. Znači da bitcoin nije nešto kao elektronički token koji si korisnici međusobno prosljeđuju, nego nešto apstraktnije. Niz digitalnih potpisa koji su na neki način povezani (svaka "karika" ovisi o prethodnoj) te tako tvore lanac. Svaki element tog lanca naziva se transakcija. Transakcija je prijenos bitcoina s jednog vlasnika na drugog. Prijenos se obavlja tako da se hash prethodne transakcije, odnosno podataka koje ona sadrži, digitalno potpisuje zajedno sa javnim ključem idućeg vlasnika (prikazano na idućoj slici).

bitcoin transakcije
Slika 1. Bitcoin transakcije


Recimo da vlasnik 0 želi prenijeti nešto bitcoina vlasniku 1. Svaki od vlasnika ima svoj jedinstveni javni i privatni ključ. Svaki od pravokutnika na slici predstavlja jednu transakciju Da bi prenijeo sredstva vlasnik 0 uzima hash prethodne transakcije od koje je njemu prenesen bitcoin te javni ključ vlasnika 1 i ta dva podatka digitalno potpisuje svojim privatnim ključem.

Slično, ako vlasnik jedan želi dati nešto bitcoina vlasniku 2. On uzima hash goreopisane transakcije, javni ključ vlasnika 2 te ta dva podatka digitalno potpisuje svojim privatnim ključem. Ako vlasnik 2 želi provjeriti tu transakciju, uzima javni ključ vlasnika 1 te verificira transakciju.

U iduća se dva odlomka uočava problem dvostrukog trošenja. Kako novi vlasnik bitcoina može biti siguran da prethodni vlasnik nije poslao identičnu transakciju već nekome prije i tako stvorio novac ni iz čega? Zaključuju se tri stvari: da je bitan samo prvi pokušaj trošenja (prijenosa) novca te da oni kasniji nisu važni, da se sve transakcije moraju javno objaviti kako bi se izbjeglo oslanjanje na posrednika i da je potreban sustav kako bi se svi njegovi sudionici mogli složiti oko jedinstvenog redoslijeda izvršavanja transakcija (odnosno prijenosa novca s jednog vlasnika na drugog). Dvije mogućnosi javnog objavljivanja transakcija opisane su u tekstu b-money.

3. poglavlje: Timestamp server



Ovo se poglavlje primarno temelji na tekstu How to timestamp a digital document. Kaže da “timestamp server” uzima hash stvari (pretpostavlja se transakcija) koji treba vremenski obilježiti te se taj hash na neki način javno objavi. Također je vrlo bitno da taj hash sadrži prethodnu vremensku oznaku u sebi.


Ako je bitcoin timestamp server modeliran prema gorespomenutom tekstu, davat će izlaze kao n-torke (n, tn, IDn, yn, Ln). N je redni broj elementa koji se vremenski označava, t je vrijeme (vremenska oznaka), ID je identifikator klijenta (javni ključ vlasnika), y je sama transakcija koja se označuje, a L je hash prethodne vremenske oznake.

U tekstu "Improving the efficiency and reliability of digital time-stamping" opisana su poboljšanja timestamp poslužitelja. Taj tekst daje odgovor na pitanje što ako jako veliki broj banalnih događaja želi da ih se vremenski obilježi, no događaji sami po sebi nisu "dovoljno značajni" za to? U prijevodu na bitcoin: što ako korsinici bitcoin sustava međusobno šalju velik broj transakcija zanemarive vrijednosti? Transakcije moraju biti uključene u sustav, no predstavljaju nepotrebno opterećenje.

Tekst predlaže sljedeće rješenje: timestamp poslužitelj prikuplja dokumente koji mu stižu kroz određeni vremenski period (npr. sat vremena). Zatim od tih dokumenata stvara Merkleovo stablo te korijen tog stabla hashira s korijenom prethodnog stabla dobivenog na isti način u prijašnjih sat vremena. Svaki korijen ima vremensku oznaku.

4. poglavlje: Proof-of-work



U ovom se poglavlju prvi put eksplicitno spominje peer-to-peer model bitcoin sustava. Budući da je cilj Bitcoin rada omogućiti sudionicima sustava itravnu interakciju, dakle bez posrednika, p2p je pogodan model. Peer-to-peer timestamp server temelji se na modelu sličnom modelu Hash-cash.

Ovaj model s "dokazom rada" sličan je modelu opisanom u prethodnom poglavlju. Svi sudionici ovog raspodijeljenog sustava (peerovi) prikupljaju transakcije koje se u njemu događaju kroz određeni vremenski period (10 minuta). Zatim te transakcije stavljaju u blok (popis transakcija) te se u taj blok stavlja hash prethodnog bloka. No u novom se modelu uz transakcije i hasheve prethodnog bloka dodaje i tzv. nonce, niz znakova koji se ne ponavlja.

Taj niz znakova, nonce, koristi se za "dokaz rada". Nonce se inkrementira te se svaka nova vrijednost hashira pomoću SHA256 algoritma i provjerava se počinje li hashirana vrijednost s unaprijed određenim brojem nula.

Prednost ovakvog načina postavljanja vremenskih oznaka je u tome što se krivotvorenje blokova transakcija otežava. Svaki novi blok transakcija ovisi o točno hashiranoj vrijednosti iz prethodnog bloka te da bi se promijenio sadašnji blok potrebno je prvo promijeniti sve njegove prethodnike.

Ova konstrukcija također rješava problem dvostrukog trošenja. U poglavlju dva spomenuto je da je bitan samo prvi pokušaj trošenja (prijenosa) bitcoina. Sad je vidljivo i zašto. Zato što će prvo trošenje stvoriti dulji lanac transakcija u koji je uloženo više rada (dokaza rada) te će korisnici sustava prihvatiti taj lanac, a odbaciti onaj kraći (eventualni pokušaj dupliciranja iste transakcije).


Kako se brzina računala povećava, težina se dokaza rada također povećava.

BTC Croatia uvod

Blog BTC Croatia bit će posvećen tehničkoj strani protokola bitcoin. Sadržavat će moje zabilješke i pojašnjenja koja zapisujem u dok čitam tekstove kao što su Bitcoin paper, bitcoin adrese, transakcije i sl. Pisan je na hrvatskom jer nam nedostaje stručnijih tekstova o bitcoinu te možda posluži slučanijm lokalnim posjetiteljima bloga.