Sunday, May 11, 2014

Osnove Bitcoin skripti


Transakcije u Bitcoin protokolu temelje se na skriptama. Skripte su niz instrukcija pisanih u Bitcoinovom skriptnom jeziku Script. Script je modeliran prema programskom jeziku Forth. Temelji se na stogu i izvršava s lijeva nadesno. To znači da se svaki podatak, ulaz ili izlaz, stavlja na stog. Script ne podržava petlje.

Skripte opisuju kako osoba na koju se prenose bitcoini može tim bitcoinima pristupiti. Osoba koja želi potrošiti bitcoine mora osigurati dvije stvari: javni ključ koji kad se hashira podudara s adresom odredišta u skripti i potpis kojim dokazuje privatni ključ koji je vezan uz tu adresu.

Transakcija je ispravna ako se skripta uspješno izvrši i vrijednost na vrhu stoga je različita od nule (istinita). Osoba koja šalje bitcoine određuje uvjete pod kojima se oni prenose primatelju. Primatelj mora dati ulaze pošiljateljevoj skripti kako bi ona nakon izvršavanja dala istinit rezultat.


Primjeri skripti


 
Script sadrži nekoliko desetaka različitih naredbi. Ovdje će biti opisane samo one najčešće korištene.

Primjer transakcije:

{
  "hash":"7c40250...",
  "ver":1,
  "vin_sz":1,
  "vout_sz":1,
  "lock_time":0,
  "size":224,
  "in":[
   {
     "prev_out":{
       "hash":"2007aec...",
       "n":0
     },
   "scriptSig":"signature"
  }
],
"out":[
  {
   "value":"0.31900000",
   "scriptPubKey":"script"
   }
  ]
}


Detalji transakcije opisani su ovdje i ovdje. U ovom će se postu opisivati boldani dijelovi.

Skripta se sastoji od dva dijela: scriptSig i scriptPubKey. scriptSig najčešće prima dva parametra <sig> i <pubKey>, odnosno javni ključ (ne adresu) novog vlasnika i ECDSA potpis hasha prethodne transakcije od koje je sadašnji vlasnik dobio bitcoine. scriptPubKey sadrži instrukcije kako tim bitcoinima pristupiti.

 Nepotrošiva transakcija



Najjednostavniji primjer transakcije je nepotrošiva transakcija ili nul-transakcija.


Primjer: scriptSig: OP_RETURN
             scriptPubKey: .....
 
Stog
Naredba
Opis
Prazan
OP_RETURN
Neispravna transakcija

Naredba OP_RETURN označuje transakciju kao neispravnu i što god se nalazilo u scriptPubKey dijelu neće se moći izvršiti. Ovakav oblik transakcije koristi se često ako se u lanac blokova samo želi pohraniti neki podatak. Nakon naredbe OP_RETURN u polje se mogu zapisati podaci koji neće imati nikakvo značenje za bitcoin klijente. Takve se transakcije koriste npr. u platformi Counterparty.

Bilotko može potrošiti


Primjer: scriptSig: (prazno)
             scriptPubKey: OP_TRUE


Stog
Naredba
Opis
Prazan
OP_TRUE
Stavlja 1 na stog
1

Transakcija ispravna

 
Ako transakcija nema javni ključ primatelja, bilo tko je može potrošiti. OP_TRUE označuje logičku istinu. Točnije na stog se stavlja broj 1. Budući da su u Scriptu sve vrijednosti istina osim nule, ovo označuje da je rezultat izvršavanja transakcije istinit te da se bitcoini smiju prebaciti novom vlasniku.

Coinbase transakcija



Ovo je pojednostavljeni primjer općenite transakcije. Coinbase transakcija donosi nagradu rudaru koji je uspješno izrudario prethodni blok.


Primjer: scriptSig: <sig>
             scriptPubKey: <pubkey> OP_CHECKSIG


Stog
Naredba
Opis
<pubKey>
<sig>
OP_CHECKSIG
Provjerava ispravnost potpisa koristeći javni ključ novog vlasnika
1

Potpis ispravan


Na stog se stavljaju digitalni potpis hasha transakcije koja prenosi bitcoine rudaru i njegov javni ključ. Ako naredba OP_CHECKSIG vrati istinu, transakcija je uspješno izvršena te rudar može preuzeti nagradu.

Osnovna transakcija



Ovo je primjer transakcije s jednim ulazom i jednim izlazom.


Primjer: scriptSig: <sig><pubKey>
             scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG


scriptSig dio sadrži već poznati potpis i javni ključ novog vlasnika. scriptPubKey je nešto složeniji i sastoji se od nekoliko koraka. OP_DUP kopira element s vrha stoga. OP_HASH160 hashira element s vrha stoga dva puta, prvo sa SHA256, a zatim s RIPEMD160. OP_EQUALVERIFY su dvije naredbe u jednoj: OP_EQUAL pa zatim OP_VERIFY. Prva vraća 1 (istinu) ako su najgornja dva elementa na stogu jednaka. Druga verificira rezultat, tj. označuje transakciju kao neispravnu ako gornji element nije istinit.


Stog
Naredba
Opis
<pubKey>
<sig>
OP_DUP
Kopira element s vrha stoga.
<pubKey>
<pubKey>
<sig>
OP_HASH160
RIPEMD160(SHA256(pubKey))
<pubKeyHash>
<pubKeyHash2>
<pubKey>
<sig>

Na stog se stavlja bitcoin adresa na koju se šalje (hash javnog ključa)

<pubKeyHash>
<pubKeyHash2>
<pubKey>
<sig>
OP_EQUALVERIFY
Provjerava jesu li hash javnog ključa iz ulaza i bitcoin adresa isti
<pubKey>
<sig>
OP_CHECKSIG
Provjerava potpis pomoću javnog ključa
OP_TRUE

Transakcija je ispravna

 
Za transakciju iz prethodnog primjera parametri su:


scriptSig: <304502205014856cdf89da70ad9a4f223bac4e5477da5c6cb69ef2
b9f8b5f8548e21307e0221009bfe2698f1eb1c561f41981d8e78c11d9e685a70
e682f144ee6c8ab5ecb0497c01> <042b2d8def903dd62d0c4161ed8d4ccfa5967e11a28e65cb141235b7c27d8e
f6aa3bd63be077323cf3d7e0e8895b264b94feb4b40478b431da6f45dfc8e1004f62>
  
scriptPubKey: OP_DUP OP_HASH160 a7db6ff121871c65a8924b8e40f160d385515ad7 OP_EQUALVERIFY OP_CHECKSIG

 Blok geneze



Skripta za genesis blok: scriptSig: prazno
                                      scripPubKey: OP_HASH256 <hash> OP_EQUAL


Da bi se transakcija potrošila potrebno je naći niz znakova koji kad se dva puta hashiraju daju određeni hash (6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000).


Stog
Naredba
Opis
Prazan

Na stog je potrebno staviti podatke koji će zadovoljiti hash
<data>
OP_HASH256
Podaci se dva puta hashiraju
<hash>
<data_hash>

Na stogu su generirani hash i hash koji je potrebno izračunati (6fe...)
<hash>
<data_hash>
OP_EQUAL
Provjeri zadovoljava li generirani hash zadani hash
OP_TRUE

Transakcija ispravna

 
Detaljan popis Script naredbi nalazi se ovdje.

No comments:

Post a Comment