Saturday, April 2, 2016

Trošenje Bitcoin transakcije (dio prvi)


Nakon što primatelj dobije bitcoine od pošiljatelja, kako se konstruira transakcija koja te bitcoine troši (šalje novom primatelju)?
Postupak konstruiranja nove transakcije sastoji se od više koraka i bit će prikazan u hex(string) formatu.

1. Verzija


Svaka bitcoin transakcija ima verziju. Verzija je uvijek "01". Polje u koje se zapisuje transakcija veličine je četiri bajta te se verzija zapisuje u little-endian formatu "01000000".
Hex: "01000000"

2. Broj ulaza


Nakon verzije dolazi broj i lista ulaza koje transakcija ima. Ulazi se referenciraju na izlaze prethodnih transakcija koje su poslane tom korisniku. Broj ulaza je cijeli broj varijabilne duljine (tzv. var_int), a najčešće zauzima jedan bajt. Za transakciju s jednim ulazom taj broj je "01".
Hex: "01000000
          01"

3. Indeks prethodne transakcije


Sada slijedi lista ulaza. Svaki ulaz u transakciju sastoji se od četiri dijela: indeks transakcije čiji se izlaz (odnosno bitcoini vezani uz taj izlaz) želi potrošiti, indeksa izlaza, potpisa te oznake niza (sequence). Indeks transakcije je zapravo dvostruki SHA256 hash prethodne transakcije. To je polje veličine 32 bajta te se zapisuje u little-endian formatu. Npr. takav hash može izgledati ovako
"eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2"
 
Hex: "01000000
01
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2"

4. Indeks izlaza prethodne transakcije

Druga komponenta ulaza u transakciju, nakon indeksa prethodne transakcije, je indeks izlaza prethodne transakcije koji se želi potrošiti. Budući da transakcija može imati više od jednog izlaza, potrebno je označiti koji se točno od tih izlaza želi potrošiti. To je polje veličine četiri bajta te se zapisuje u little-endian formatu. Ako se radi o izlazu "01" to je "01000000".
 
Hex: "01000000
01
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2
01000000 "

5. Polje scriptSig

Polje scriptSig u svakom ulazu dokazuje da primatelj ima pravo trošenja izlaza iz prethodne transakcije koji referenciraju goreopisani indeks prethodne transakcije i indeks izlaza. To polje sadrži potpis ove transakcije i javni ključ na koji su bitcoini poslani (iz kojeg je izvedena bitcoin adresa na koju su bitcoini poslani). Budući da je transakcija tek u nastajanju, umjesto potpisa transakcije, privremeno se kopira sadržaj polja scripPubKey.
Polje je varijabilne duljine i zapisano je u var_string big-endian formatu. Sadrži duljinu skripte u bajtovima te samu skriptu.

Hex: "01000000
01
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2
01000000
76a914010966776006953d5567439e5e39f86a0d273bee88ac"

 

6. Oznaka niza (sequence)

Ovo polje uvijek ima maksimalnu vrijednost budući da se nikada nije koristilo onako kako je originalno bilo zamišljeno. Duljine je četiri bajta te se zapisauje u little-endian formatu. U budućnosti će se to polje koristiti za vremenski zaključane transakcije.
Hex: "01000000
01
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2
01000000
76a914010966776006953d5567439e5e39f86a0d273bee88ac
ffffffff"

7. Broj izlaza

Osim broja ulaza, transakcija sadrži i broj izlaza. Izlazi sadrže adrese i bitcoine koji se na njih šalju. Kao i broj ulaza, broj je izlaza cijeli broj varijabilne duljine (tzv. var_int), a najčešće zauzima jedan bajt. Za transakciju s jednim izlazom taj broj je "01".

Hex: "01000000
01
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2
01000000
76a914010966776006953d5567439e5e39f86a0d273bee88ac
ffffffff 
01"

8. Iznosi


Iznosi vezani uz pojedini izlaz zapisuju se u satoshijima. Polje je veličine osam bajtova te se prikazuje u little-endian formatu. Za iznos od 0.999 BTC, odnosno 99900000 satoshija to je 605af40500000000.

Hex: "01000000
01
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2
01000000
76a914010966776006953d5567439e5e39f86a0d273bee88ac
ffffffff 
01
605af40500000000"

No comments:

Post a Comment