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"
}
]
}
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
|
Bilotko može potrošiti
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