Thursday, April 17, 2014

Merkleovo stablo


Merkleovo stablo je kriptografska stablasta struktura u kojoj je svaki čvor koji nije list, obilježen hashem labela njegove djece-čvorova. Nazvana su po Ralphu Merkleu koji je prvi predložio takav koncept.


Podaci koji se trebaju kriptirati, razbijaju se u blokove te se ti blokovi zatim hashiraju i ti hashevi predstavljaju listove stabla. Iduća se razina stabla dobiva konkateniranjem parova listova te njihovim hashiranjem. Postupak se ponavlja sve dok na kraju ne ostane samo jedan čvor, takozvani Merkleov korijen.

Slika 1



Na slici 1 podaci su razbijeni u četiri bloka. Svaki je blok hashiran (Hash1, ... , Hash4) i ti hashevi predstavljaju listove stabla. Iduća razina stabla dobiva se konkateniranjem parova listova i njihovim hashiranjem s lijeva nadesno: Hash12 = hash(Hash1 || Hash2), Hash34 = hash(Hash3 || Hash4). Zatim se postupak ponavlja: Hash1234 = hash(Hash12 || Hash34). Ovo je posljednji korak u generiranju stabla budući da je ostao samo jedan čvor Hash1234 koji se naziva korijen Merkleovog stabla.


Svaka iduća razina stabla sadrži dvostruko manje čvorova od one prethodne. Ako stablo ima 2n čvorova, algoritam nije teško provesti do kraja. Što se događa ako je broj čvorova različit od 2n ? Rješenje je da se neparni list ili čvor konkatenira sam sa sobom. Npr. hashevi blokova podataka su H1, H2, H3, H4 i H5. Algoritam izgleda ovako: H12 = hash(H1||H2), H34 = hash(H3||H4) i H55 = hash(H5||H5). Iduća je razina H1234 = hash(H12||H34) i H5555 = hash(H55||H55). Korijen = hash(H1234||H5555).

Merkleovo stablo u protokolu Bitcoin

Svaki blok u Bitcoinu sadrži Merkleov korijen dobiven na goreopisani način od transakcija prikupljenih u periodu od deset minuta. Hash funkcija koja se koristi je SHA256. Jedna razlika od gornjeg postupka je da se umjesto jednom, svi podaci hashiraju dva puta da bi se izbjegao napadproduživanjem duljine hasha.


U idućem prijeru neka su T transakcije. Merkleovo stablo od 6 transakcija je: H12 = SHA256(SHA256(T1||T2)), H34 = SHA256(SHA256(T3||T4)) i H56 = SHA256(SHA256(T5||T6)). Zatim H14 = SHA256(SHA256(H12||H34)) i H56 = SHA256(SHA256(H56||H56)). Korijen je SHA256(SHA256(H14||H56)).

Orezivanje grana Merkleovog stabla

 

Grane se u Merkleovom stablu mogu "odrezati" kako bi se uštedilo na memoriji. Grane se režu na takav način da je od preostalih moguće rekreirati ispravan Merkleov korijen.
Slika 2

 

 

Na slici 2 je primjer orezanog Merkleovog stabla. Klijentu su potrebni transakcija T1 i čvorovi Hash2 i Hash34. Korije se rekreira tako što se T1 hashira, dobiveni hash se konkatenira s Hash2 te hashira da se dobije Hash12. Taj se hash konkatenira s Hash34 i rezultat se hashira da se dobije korijen.


Orezano stablo koristi se u protokolu Stratum. Kada rudar kontaktira bazen, bazen mu šalje listu čvorova koji će rudaru biti potrebni da se dobije korijen. Na primjer, bazen ghash.io rudaru pošalje iduće čvorove:


"ea9da84d55ebf07f47def6b9b35ab30fc18b6e980fc618f262724388f2e9c591", 

"f8578e6b5900de614aabe563c9622a8f514e11d368caa78890ac2ed615a2300c", 

"1632f2b53febb0a999784c4feb1655144793c4e662226aff64b71c6837430791", 

"ad4328979dba3e30f11c2d94445731f461a25842523fcbfa53cd42b585e63fcd", 

"a904a9a41d1c8f9e860ba2b07ba13187b41aa7246f341489a730c6dc6fb42701", 

"dd7e026ac1fff0feac6bed6872b6964f5ea00bd8913a956e6b2eb7e22363dc5c", 

"2c3b18d8edff29c013394c28888c6b50ed8733760a3d4d9082c3f1f5a43afa64"
  
Rudar generira coinbase transakciju te koristeći gornje transakcije generira Merkleov korijen.

 

Recimo da je dvostruk hash coinbase transakcije koju je rudar dobio:
8300639d3ed0b31c766f4d597839f4cd49cc9bf1572c46c680121dc6bc4090c3


Sad se konkatenira taj hash 8300... i hash ea9d... te se taj rezultat hashira:
061eb6650cd2688b058b48735912279e56d26cf90a79255df707d3edfc8cbb3f
I dalje 061e...||f857... i dvostruki hash:


b05bcb7fea6b35be774fd3222c72029c0ad655bdbe836751cdf1494d8bd817f0

SHA256(SHA256(b05b...||1632...)):
711ce7c29a166c21106fbb33072891c4a04edbab3af908f7e0429e645303646d

SHA256(SHA256(711c...||ad43...)):
04aae851be411ca558eb48f0d861d5204c568c0614554eb997d6fe80a4178590

SHA256(SHA256(04aa...||a904...)):
c1f30474fac25636b9465ef17276e41a79d368dc1343455194301c2df8949103

SHA256(SHA256(c1f3...||dd71)):
7600625958076fe5243b6378bae5d977372f3ecd5cf549108ddbb626e08cde1d

SHA256(SHA256(7600...||2c3b...)):
6f7b0464b92b6f612bcea205894f77bfb952dea62fb818d639d8ff1dc602db63

To je Merkleov korijen za dobiveve čvorove i generiranu coinbase transakciju.


 

Sunday, April 13, 2014

Rudarenje bitcoina: protokol Stratum


Protokol Stratum služi za komunikaciju između rudara i bazena, a zasnovan je na JSON-RPC-u. Bazen mora učinkovito raposređivati posao među rudarima i brzo prikupljati rezultate. Bazen također mora osigurati da rudari ne dupliciraju posao te da ne rade na blokovima koji su već izrudareni.

Jedan problem predstavljaju brzi rudari kojim prolete kroz sve kombinacije noncea prije nego bazen stigne poslati novi blok. Stratum to rješava tako što rudarima omogućuje da lokalno kreiraju coinbase transakciju i prema potrebi modificiraju njezino polje extranonce (promjena coinbase transakcije automatski znači da se promijenilo i zaglavlje bloka budući da se promijenilo Merkleovo stablo transakcija).

Poruke u protokolu

 

Da bi započeo rudarenje u nekom bazenu pomoću Stratum protokola, rudar prvo mora poslati bazenu registracijsku poruku na koju mu bazen odgovori podacima za registraciju:


id
1
set_difficulty
b4b6693b72a50c7116db18d6497cac52
notify
ae6812eb4cd7735a302a8a9dd95cf71f
extranonce1
45fadd2d
extranonce2_size
4
error
null

 

Bazen javlja koja je težina rudarenja u tom bazenu, koji je hash bloka na kojem se trenutačno radi, vrijednost extranonce1 koja osigurava da svi klijenti generiraju jedinstvene blokove te duljinu polja extranonce2 koju će generirati rudar.


Rudar zatim pošalje zahtjev za početak rudarenja, a bazen mu odgovara porukom koja sadrži osnovne podatke za kreiranje bloka:

job_id
2dddaca8
prev_hash
c3a8a906d58a374d5092ba6792ab4d5e38c932f01dc4dcd6000000
0000000000
coinb1
01000000010000000000000000000000000000000000000000000
000000000000000000000ffffffff4803da8204062f503253482f0472b
b4a5308
coinb2
2e522cfabe6d6d4183475fab25720b7274cc7decea671073d97e050
abeababf0a80b44241a3bf804000000000000000000000001eccb6b
95000000001976a91480ad90d403581fa3bf46086a91b2d9d4125db
6c188ac00000000
merkle_branch
c69d0e3aed71cd90f681fa8178766ca3a234f854a0dac42e3ce4a4b1
c51e8e5f, ...
version
00000002
nbits
1900b3aa
ntime
534abb71
clean_jobs
false

 
job_id predstavlja identifikator rudara koji on mora poslati bazenu kad šalje rješenje bloka, prev_hash je hash prethodnog bloka, coinb1 i coinb2 su početni i završni dio coinbase transakcije. Merkle_branch sadrži osnovne grane potrebne za generiranje merkleovog korijena, version je verzija bloka, nbits je meta, ntime je trenutačno vrijeme, a clean_jobs zastavica čije značenje trenutačno nije bitno.

Kreiranje coinbase transakcije

 

Rudar sad ima sve podatke potrebne za generiranje coinbase transakcije: coinb1, extranonce1, extranonce2 (koji je sam generirao) i coinb2. Transakcija se dobiva konkateniranjem tih vrijednosti:


Version
01000000
Input count
01
Previous hash
0000000000000000000000000000000000000000000000000000000
000000000
Index
ffffffff
Scriptlen
0x48 (72)
Script
03da8204062f503253482f0472bb4a530845fadd2d000017e42e522cfa
be6d6d4183475fab25720b7274cc7decea671073d97e050abeababf0a8
0b44241a3bf80400000000000000
Sequence
00000000
Output count
01
Value
eccb6b9500000000
Scriptlen
19
Script
76a91480ad90d403581fa3bf46086a91b2d9d4125db6c188ac
Lock time
00000000

 

Zaglavlje bloka dobiva se na sličan način: iz podataka poslanih od bazena (verzija bloka, hash prethodnog bloka, Merkleov korijen (dobiven iz grana i coinbase transakcije), vremenska oznaka, meta i nonce.

Sunday, April 6, 2014

Rudarenje bitcoina: Pool mining


Rudarenje u grupi ili bazenu (engl. mining in a pool) olakšava rudarenje tako što raspodjeljuje posao među rudarima. Kad bazen uspješno izrudari blok, naknada se raspodjeljuje među svim rudarima tog bazena kao nagrada za obavljeni posao. Postoje razni bazeni za rudarenje te postoje razni načini dodjele nagrada rudarima.

Bazeni moraju provjeravati koliko posla obavljaju rudari. To rade tako što rudarima proslijede blok koji treba verificirati te skupljaju djelomična rješenja bloka od rudara. Svako djelomično rješenje pokazuje da rudar pokušava riješiti blok te znači da će dobiti dio nagrade ako se blok uspješno riješi.


Na primjer, potrebno je da hash počinje s 15 nula, no bazen će tražiti od rudara hasheve koji počinju s 10 nula što je mnogo lakše za pronaći. Bazen skuplja te nizove (udjele) koji počinj manjim brojem nula kao dokaz da rudari verificiraju blok. Ovisno o snazi procesora koji koriste, rudari će te jednostavnije nizove generirati nekoliko puta u sekundi ili nekoliko puta u satu. Prije ili kasnije jedno će od tih rješenja počinjati ne samo s 10 nego i s 15 nula te će blok biti uspješno verificiran, odnosno izrudaren, a bazen će rudarima podijeliti dobivenu nagradu. Ako netko izvan bazena prvi izrudari blok, bazen će jednostavno poslati novi blok rudarima te kreće nova runda verificiranja.

Vrste nagrada

 

Prop. - Proportional (proporcionalna). Dodjeljuje se rudarima proporcionalno broju udjela koji su rudari poslali bazenu.
PPS – Pay per share (plaća po udjelu). Svaki udjel poslan bazenu vrijedi određeni broj bitcoina. Verificiranje bloka zahtjeva broj udjela ovisan o trenutačnoj težini rudarenja. Tako bi cijena udjela bila <naknada_za_blok> / <trenutačna_težina>, odnosno (25 BTC) / <trenutačna_težina>.
PPLNS – Pay per last N shares (plaća prema zadnjih N udjela). Slična proporcionalnoj metodi, ali umjesto da gleda broj udjela po rundi, gleda zadnjih N udjela bez obzira na rundu.
SMPPS – Shared maximum pay per share. Kao PPS ali ne plaća više nego bazen zaradi.
PPLNSG – Pay per last N groups (or shifts) (plaća po zadnji N grupa odnosno smjena). Slična PPLNS, ali se udjeli grupiraju u "smjene" te se one isplaćuju u cijelosti.
RSMPPS – Recent shared maximum pay per share. Slično SMPPS-u, ali prioritizira novopristigle rudare.
ESMPPS – Equalized share maximum pay per share. Kao SMPPPS no izjednačava naplatu među svima koji ju trebaju primiti.
CPPSRB – Capped pay per share with recent backpay. Kad se pronađe blok, isplati se 25 BTC-a neisplaćenih udjela.
POT – Pay on target (plaća po meti). Isplaćuje više što je težina rudarenja veća.
Bodovi – metoda zasnovana na bodovanju. Slična proporcionalnoj metodi, ali koristi težinske faktore u ovisnosti o vremenu.

 


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.