Saturday, May 17, 2014

Naprednije Bitcoin skripte

Transakcija s više potpisa



Transakcije s više potpisa (engl. multisignature/multisig) zathijevaju više od jednog ključa (potpisa) da se pristupi bitcoinima, npr. dva od tri.


Primjer 2-od-3: scriptSig: <sig1> <sig2>
scriptPubKey: OP_2 <pubKey1> <pubKey2> <pubKey3> OP_3 OP_CHECKMULTISIG


Za ovu je transakciju potrebno dva od tri potpisa. Prva transakcija ima dva potpisa koji su potrebni za otključavanje sredstava na adresi. Za transakciju s više potpisa scriptPubKey dio ima posebnu konstrukciju. Prvo se navodi koliko je potpisa potrebno za otključavanje, zatim javni ključevi (ne hashevi kao kod standardnih), koliko tih ključeva ima te na kraju naredba za provjeru potpisa.


Stog
Naredba
Opis
<sig2>
<sig1>

Potpisi se stavljaju na stog.
<2>
<sig2>
<sig1>

Dodaje se broj potpisa potreban za otključavanje.
<pubKey3>
<pubKey2>
<pubKey1>
<2>
<sig2>
<sig1>

Dodaju se javni ključevi pomoću koji se verificiraju potpisi. Potpisi i ključevi verificiraju se u parovima.
<3>
<pubKey3>
<pubKey2>
<pubKey1>
<2>
<sig2>
<sig1>
OP_CHECKMULTISIG
Dodaje se broj javnih ključeva. Sad su na stogu svi potrebni ulazi za provjeru transakcije.
<1>

Na stogu je rezulat izvršavanja OP_CHECKMULTISIG naredbe

 
Tehnički gledano, OP_CHECKMULTISIG zbog buga uzima jedan parametar previše te se u scriptSig prije potpisa dodaje OP_0 kao lažni parametar.

Odd/Event Bet



Slijedi prijmjer kompleksne skripte koja nasumično izvršava podskripte. Može se, na primjer, koristiti za nasumično određivanje koji korisnik plaća naknadu na transakciju.


Naredba OP_2DUP duplira dva elementa s vrha stoga. OP_SWAP zamijeni dva elementa s vrha stoga. OP_LEFT zadrži samo n lijevih znakova. OP_ADD zbraja dva elementa s vrha stoga. OP_MOD je ostatak pri dijeljenju gornja dva elementa stoga.


Primjer: scriptSig: <Sig><pubKey>
scripPubKey: <7bb...><5aa...> OP_2DUP OP_HASH160 <aHash> OP_EQUALVERIFY OP_HASH160 <bHASH> OP_EQUALVERIFY OP_1 OP_LEFT OP_SWAP OP_1 OP_LEFT OP_ADD OP_2
OP_SWAP OP_MOD
OP_IF
     OP_DUP OP_HASH160 <pubKeyAHash> OP_EQUALVERIFY OP_CHECKSIG
OP_ELSE
     OP_DUP OP_HASH160 <pubKeyBHash> OP_EQUALVERIFY OP_CHECKSIG
OP_ENDIF

 
Stog
Naredba
Opis
<5aa...>
<7bb...>
<pubKey>
<sig>
OP_2DUP
Na stog se prvo stavljaju svi elementi i gornja se dva dupliraju.
<5aa...>
<7bb...>
<5aa...>
<7bb...>
<pubKey>
<sig>
OP_HASH160
Hashiranje vrha stoga
<aHash>
<aHash>
<7bb...>
<5aa...>
<7bb...>
<pubKey>
<sig>
OP_EQUALVERIFY
Dodavanje hasha i provjera jesu li jednaki
<7bb...>
<5aa...>
<7bb...>
<pubKey>
<sig>
OP_HASH160
Hashiranje vrha stoga
<bHash>
<5aa...>
<7bb...>
<pubKey>
<sig>

Dodavanja hasha na stog
<bHash>
<bHash>
<5aa...>
<7bb...>
<pubKey>
<sig>
OP_EQUALVERIFY
Provjera jesu li jednaki
<5aa...>
<7bb...>
<pubKey>
<sig>

Dodaje se 1 na stog
<1>
<5aa...>
<7bb...>
<pubKey>
<sig>
OP_LEFT
Uzima se <1> znak hash <5aa...>
<5>
<7bb...>
<pubKey>
<sig>
OP_SWAP
Zamijena dva gornja elementa
<7bb...>
<5>
<pubKey>
<sig>

Na stog se dodaje <1>
<1>
<7bb...>
<5>
<pubKey>
<sig>
OP_LEFT
Uzima se <1> znak hash <7bb...>
<7>
<5>
<pubKey>
<sig>
OP_ADD
Gornja se dva elementa zbrajaju
<12>
<pubKey>
<sig>

Dodaje se 2
<2>
<12>
<pubKey>
<sig>
OP_SWAP
Zamjena
<12>
<2>
<pubKey>
<sig>
OP_MOD
Ostatak pri dijeljenju <12> s <2>
<0>
<pubKey>
<sig>
OP_IF
Ako je na vrhu element isitni != 0 izvrši sljedeću naredbu
<pubKey>
<sig>
OP_ELSE
Ako nije (=0)
<pubKey>
<sig>
OP_DUP OP_HASH160 <pubKeyBHash> OP_EQUALVERIFY OP_CHECKSIG
Izvrši ovo

 
Ova skripta ne može se zapravo izvršiti budući da su naredbe OP_LEFT i OP_MOD onemogućene. Ovdje je stavljena samo kao primjer kompleksne skripte.

No comments:

Post a Comment