tag:blogger.com,1999:blog-46726818205314396752024-03-13T21:46:55.306-07:00BTC CroatiaHyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.comBlogger34125tag:blogger.com,1999:blog-4672681820531439675.post-86959276506608861222017-02-19T11:55:00.001-08:002017-02-19T11:55:15.114-08:00Verificiranje potpisa transakcija za programe svjedočanstva verzije 0 (BIP143)
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
<br />
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Originalni
način hashiranja transakcije za potpisivanje ima složenost O(n<sup>2</sup>).
Prosječno vrijeme verificiranja transakcija u bloku veličine 1MB je
2sekunde, dok u nekim slučajevima to vrijeme doseže 25 sekundi.
Cilj novog algoritma je smanjiti složenost na O(n) uvođenjem
međustanja koja su ista za sve ulaze transakcije.</div>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
<br />
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Novi
algoritam za hashiranje transakcije za potpisivanje je dvostruki
SHA256 vrijednosti:</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
</div>
<ol>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
nVersion</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
hashPrevouts</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
hashSequence</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
outpoint</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
scriptCode ulaza</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
vrijednost izlaza
koju ovaj ulaz troši</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
nSequence ulaza</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
hashOutputs</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
nLocktime</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
sighash</div>
</li>
</ol>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
1, 4,
7, 9 i 10 imaju isto značenje kao i do sad.</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Broj 5:</div>
<ul>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
U slučaju P2WPKH
scriptCode je 0x19761914{20 bajtova hasha javnog ključa}88ac</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
U slučaju P2WSH
scriptCode je redeemScript.</div>
</li>
</ul>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Broj 6
je 8 bajtova koji predstavljaju iznos koji ovaj ulaz troši.</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
hashPrevouts:</div>
<ul>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
Ako zastavica
ANYONECANPAY nije postavljena, hashPrevouts je dvostruki SHA256
serijaliziranih outpointova u ulazima.</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
U suprotnom je
vrijednost ovog polja 0x000…000 (256-bitova 0).</div>
</li>
</ul>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
hashSequence:</div>
<ul>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
Ako zastavica
ANYONECANPAY, SINGLE ili NONE nije postavljena, hashSequence je
dvostruki SHA256 serijalizacije nSequence polja svih ulaza.</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
U suprotnom je
vrijednost ovog polja 0x000…000 (256-bitova 0).</div>
</li>
</ul>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
hashOutputs:</div>
<ul>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
Ako zastavice
SINGLE ili NONE nije postavljena, hashOutputs je dvostruki SHA256
serijalizacije svih izlaza (iznos + scriptPubKey).</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
Ako je zastavica
SINGLE postavljena, a indeks ulaza je manji od broja izlaza,
hashOutputs je dvostruki SHA256 iznosa izlaza + scriptPubKey
odgovarajućeg izlaza.</div>
</li>
<li><div lang="hr-HR" style="margin-bottom: 0.14in;">
U suprotnom je
vrijednost ovog polja 0x000…000 (256-bitova 0).</div>
</li>
</ul>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Polje
hashPrevouts, hashSequence i hashOutputs mogu se ponovno koristiti za
sve ulaze te ih je dovoljno računati samo jednom. Kompleksnost
postupka se tako smanjuje s O(n<sup>2</sup>) na O(n).</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Za
P2WPKH i P2WSH koriste se samo kompresirani javni ključevi.</div>
<h2 class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Primjer</h2>
<h3 class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
P2WPKH</h3>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Transakcija
koju treba potpisati:</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
nVersion:
01000000</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
txin: 02</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
00000000 00 eeffffff</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
ef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
01000000 00 ffffffff</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
txout: 02 202cb20600000000</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
1976a9148280b37df378db99f66f85c95a783a76ac7a6d5988ac</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
9093510d00000000</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
1976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
nLockTime: 11000000</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Prvi ulaz pripada P2PK transakciji:<br />scriptPubKey: 2103c9f4836b9a4f77fc0d81f7bcb01b7f1b35916864b9476c241ce9fc198bd25432ac vrijednost: 6.25<br />privatni ključ: bbc27228ddcb9209d7fd6f36b02f7dfa6252af40bb2f1cbc7a557da8027ff866</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Drugi ulaz pripada P2WPKH transakciji:<br />scriptPubKey: 00141d0f172a0ecb48aee1be1f2687d2963ae33f71a1 value: 6<br />privatni ključ: 619c335025c7f4012e556c2a58b2506e30b8511b53ade95ea316fd8c3286feb9<br />javni ključ: 025476c2e83188368da1ff3e292e7acafcdb3566bb0ad253f62fc70f07aeee6357</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Algoritam se provodi za svaki ulaz transakcije. Potpisivat će se sa SIGHASH_ALL zastavicom.</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
hashPrevouts: dSHA256(fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad9</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
69f00000000ef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
90ec68a01000000) =<br />96b827c8483d4e9b96712b6713a7b68d6e8003a781feba36c31143470b4efd37</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
hashSequence: <br />dSHA256(eeffffffffffffff) = 52b0a642eea2fb7ae638c36f6252b6750293dbe574a806984b8e4d8548339a3b</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
hashOutputs:<br />dSHA256(202cb206000000001976a9148280b37df378db99f66f85c95a783a76ac7</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
a6d5988ac9093510d000000001976a9143bde42dbee7e4dbe6a21b2d50ce2f0167f</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
aa815988ac) = <br />863ef3e1a92afbfdb97f31ad0fc7683ee943e9abcf2501590ff8f6551f47e5e5</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Prethodne se tri vrijednosti izračunavaju samo jednom i koriste u svim ulazima.<br />Za prvi ulaz transakcija koja će se hashirati da bi se potpisala izgleda ovako:</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
nVersion: 01000000<br />hashPrevouts: 96b827c8483d4e9b96712b6713a7b68d6e8003a781feba36c31143470b4efd37<br />hashSequence: 52b0a642eea2fb7ae638c36f6252b6750293dbe574a806984b8e4d8548339a3b<br />outpoint: fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f00000000<br />scriptCode: 197614dcea56a687796f1038e2598cc256b627f49f823b88ac<br />amount: 40be402500000000<br />nSequence: eeffffff<br />hashOutputs: 863ef3e1a92afbfdb97f31ad0fc7683ee943e9abcf2501590ff8f6551f47e5e5<br />nLockTime: 11000000<br />nHashType: 01000000</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
outpoint je hash prethodne transakcije i indeks izlaza na koju se ovaj ulaz referencira.<br />Scriptcode sadrži HASH160 javnog ključa P2PK transakcije.<br />Amount je heksadecimalni little-endian iznosa 6.25 kojeg taj ulaz troši.</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Potpis te transakcije je 30450221008b9d1dc26ba6a9cb62127b02742fa9d754cd3bebf337f7a55d114c8e5</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
cdd30be022040529b194ba3f9281a99f2b1c0a19c0489bc22ede944ccf4ecbab4cc6</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
18ef3ed</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Za drugi ulaz:<br />nVersion: 01000000<br />hashPrevouts: 96b827c8483d4e9b96712b6713a7b68d6e8003a781feba36c31143470b4efd37<br />hashSequence: 52b0a642eea2fb7ae638c36f6252b6750293dbe574a806984b8e4d8548339a3b<br />outpoint: ef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a01000000<br />scriptCode: 1976a9141d0f172a0ecb48aee1be1f2687d2963ae33f71a188ac<br />amount: 0046c32300000000<br />nSequence: ffffffff<br />hashOutputs: 863ef3e1a92afbfdb97f31ad0fc7683ee943e9abcf2501590ff8f6551f47e5e5<br />nLockTime: 11000000<br />nHashType: 01000000</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Hash te transakcije je c37af31116d1b27caf68aae9e3ac82f1477929014d5b917657d0eb49478cb670,<br />A potpis 304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f01</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
cc44a0220573a954c4518331561406f90300e8f3358f51928d43c212a8caed02de6</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
7eebee.</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
Konačna transakcija:<br />nVersion: 01000000<br />marker: 00<br />flag: 01<br />txin: 02 fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f 00000000 494830450221008b9d1dc26ba6a9cb62127b02742fa9d754cd3bebf337f7a55d11</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
4c8e5cdd30be022040529b194ba3f9281a99f2b1c0a19c0489bc22ede944ccf4ecb</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
ab4cc618ef3ed01 eeffffff<br /> ef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a 01000000 00 ffffffff<br />txout: 02 202cb20600000000 1976a9148280b37df378db99f66f85c95a783a76ac7a6d5988ac<br /> 9093510d00000000 1976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac<br />witness: 00<br /> 02 47304402203609e17b84f6a7d30c80bfa610b5b4542f32a8a0d5447a12fb1366d7f</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
01cc44a0220573a954c4518331561406f90300e8f3358f51928d43c212a8caed02de</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
67eebee01 21025476c2e83188368da1ff3e292e7acafcdb3566bb0ad253f62fc70f07aeee6357<br />nLockTime: 11000000</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
<style type="text/css"> </style></div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt;</style>
</div>
<div class="western" lang="hr-HR" style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: 11pt; }</style>
</div>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; color: rgb(0, 0, 10); line-height: 115%; }P.western { font-family: "Calibri",serif; font-size: 11pt; }P.cjk { font-family: "Droid Sans Fallback"; font-size: 11pt; }P.ctl { font-family: "Calibri"; font-size: </style>Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-41944158609342685522017-01-18T11:47:00.000-08:002017-01-18T11:47:12.255-08:00Izdvojeno svjedočanstvo (segregated witness)
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<br />
<div style="margin-bottom: 0.14in;">
Izdvojeno svjedočanstvo (engl.
segregated witness) struktura je koja se zapisuje u blok izvan
Merkleovog stabla transakcija (svjedočanstva se zapisuju u poseban
dio transakcije, a ulazi se referenciraju na njih). Sadrži podatke
potrebne za provjeru ispravnosti transakcije, no ne i za provjeru
rezultata transakcije. Točnije, sadrži skripte i potpise.
Svjedočanstvo se zapisuje stablo koje se ugnježđuje u postojeće
Merkleovo stablo preko coinbase transakcije.</div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<div style="margin-bottom: 0.14in;">
Ovakav način strukturiranja
transakcije omogućuje nekoliko stvari:</div>
<ol>
<li><div style="margin-bottom: 0.14in;">
Nema više promjenjivosti
transakcije. Budući da potpis više nije dio hasha transakcije (jer
je u izdvojenom svjedočanstvu), više nije moguće promijeniti
potpis transakcije.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
SPV klijenti više ne moraju
primati potpise transakcija, ako im je cilj samo provjeriti postoji
li transakcija.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Hashiranje transakcija kod
potpisivanja više ne ovisi o kvadratu veličine bloka.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Povećava se broj transakcija u
bloku zbog mjesta koje je oslobođeno izdvajanjem potpisa.</div>
</li>
</ol>
<h2>
ID transakcije</h2>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<br />
<div style="margin-bottom: 0.14in;">
Uvođenjem podatkovne strukture
svjedočanstva (engl. witness) transakcija će imati dva
identifikatora. Standardni txid koji je dvostruki SHA256
serijalizirane transakcije:</div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
[nVersion][txins][txouts][nLockTime]</div>
<div style="margin-bottom: 0.14in;">
I novi wtxid koji je dvostruki
SHA256 novog formata serijalizirane transakcije:</div>
<div style="margin-bottom: 0.14in;">
[nVersion][marker][flag][txins][txouts][witness][nLockTIme]</div>
<div style="margin-bottom: 0.14in;">
Marker je veličine jednog bajta i
uvijek nula: 0x00.</div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Flag je veličine jednog bajta te
ima vrijednost različitu od nule. Trenutačno: 0x01.</div>
<div style="margin-bottom: 0.14in;">
Witness je serijalizacija svih
svjedočanstava transakcije. Svaki ulaz transakcije, txin, povezan je
s poljem svjedočanstva. Svako polje svjedočanstva počinje var_int
tipom podatka koji prikazuje broj podataka koji se stavljaju na stog
za pojedini ulaz. Zatim slijede sami podaci od koji svaki opet
počinje tipom podatka var_int koji opisuje duljinu podatka.
Svjedočanstvo nije skripta.</div>
<div style="margin-bottom: 0.14in;">
Ako je transakciju kreirao stariji
klijent koji ne podržava svjedočanstva, ulazi u transakciju moraju
imati prazno witness polje: 0x00. U tom je slučaju wtxid = txid.</div>
<h2 style="margin-bottom: 0.14in;">
Zapis svjedočanstva</h2>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Svi wtxid-ovi moraju se zapisati.
Wtxid coinbase transakcije je 0x0000…0000.</div>
<div style="margin-bottom: 0.14in;">
Vršni hash svjedočanstava
izračunava se iz svih wtxid-ova u bloku, slično korijenu Merkleovog
stabla. Taj se hash zapisuje u scriptPubKey coinbase transakcije.
Zapis je minimalne duljine 38 bajtova, s time da je prvih šest
0x6a24aa21a9ed:</div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
1 bajt – OP_RETURN (0x6a)</div>
<div style="margin-bottom: 0.14in;">
1 bajt – Stavi sljedećih 36
bajtova (0x24) na stog</div>
<div style="margin-bottom: 0.14in;">
4 bajta – zaglavlje zapisa
(0xaa21a9ed)</div>
<div style="margin-bottom: 0.14in;">
32 bajta – hash zapisa –
dvostruki SHA356(vršni hash svjedočanstava | rezervirana
vrijednost)</div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
scriptPubKey polje sadrži i
32-bitnu rezerviranu vrijednost. Ako postoji više izlaza takve
strukture, onaj s najvećim indeksom smatra se zapisom hasha
svjedočanstva. Rezervirana vrijednost zasad nema nikakvog značenja</div>
<h2 style="margin-bottom: 0.14in;">
Program svjedočanstva (witness program)</h2>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Skripta scriptPubKey koja se sastoji
od bajta [OP_0..OP_16] nakon kojeg slijedi 2 do 40 bajtova dobiva
novo značenje. Prvi bajt naziva se bajt verzije. Ostali bajtovi
predstavljaju program svjedočanstva.</div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<div style="margin-bottom: 0.14in;">
Dva slučaja u kojima se
svjedočanstvo verificira su:</div>
<ol>
<li><div style="margin-bottom: 0.14in;">
Ako se scriptPubKey sastoji od
bajta verzije i programa svjedočanstva. U tom slučaju scriptSig
mora biti prazan jer je u suprotnom transakcija neispravna.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Ako je scriptPubKey P2SH
skripta. U tom je slučaju redeemScript skripta u polju scriptSig
bajt verzije plus program svjedočanstva. Ako u polju scriptSig nije
BIP16 redeemScript, transakcija nije ispravna.</div>
</li>
</ol>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<div style="margin-bottom: 0.14in;">
Ako je bajt verzije 0, a program
svjedočanstva je duljine 20 bajtova:</div>
<ul>
<li><div style="margin-bottom: 0.14in;">
Interpretira se kao
pay-to-witness-public-key-hash (P2WPKH) program.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Svjedočanstvo se sastoji od 2
elementa (oba manja od 520 bajtova). Prvi je potpis, a drugi javni
ključ.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
HASH160 javnog ključa mora
odgovarati programu svjedočanstva.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Nakon verifikacije skripte,
potpis se verificira pomoću javnog ključa korištenjem naredbe
CHECKSIG.</div>
</li>
</ul>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<div style="margin-bottom: 0.14in;">
Ako je bajt verzije 0, a program
svjedočanstva je duljine 32 bajta:</div>
<ul>
<li><div style="margin-bottom: 0.14in;">
Interpretira se kao
pay-to-witness-script-hash (P2WSH) program.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Svjedočanstvo se sastoji od
elemenata koji su ulaz skripti te serijalizirane skripte
(witnessScript < 10000 bajtova).</div>
</li>
<li><div style="margin-bottom: 0.14in;">
SHA256 skripte witnessScript
mora odgovarati programu svjedočanstva.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
witnessScript se deserijalizira
i izvršava.</div>
</li>
</ul>
<br />
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<br />
<div style="margin-bottom: 0.14in;">
Ako je bajt verzije 0, a program
svjedočanstva nije duljine 20 niti 32 bajta, skripta nije ispravna.
Ako je verzija veća od nule, program svjedočanstva se ne
interpretira.</div>
<h2 style="margin-bottom: 0.14in;">
Parametri i semantika</h2>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Težina bloka računa se kao
veličina bloka (1 MB) plus ukupna veličina svjedočanstava (3 MB).</div>
<div style="margin-bottom: 0.14in;">
Broj potpisa po bloku povećava se s
20.000 na 80.000.</div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Uvode se tri nova pravila za
rudarenje:</div>
<ol>
<li><div style="margin-bottom: 0.14in;">
Za P2WPKH i P2WSH prihvaćaju
se samo komprimirani javni ključevi.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Argumenti za OP_IF i OP_NOTIF
moraju biti prazan vektor (neistina) ili 0x01 (istina).</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Ako OP_CHECKSIG ili
OP_CHECKMULTISIG ne uspiju, potpis mora biti nul-vektor.</div>
</li>
</ol>
<h2>
Primjeri</h2>
<h3>
P2WPKH</h3>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<br />
<div style="margin-bottom: 0.14in;">
Slijedi primjer verzije 0 P2WPKH:</div>
<div style="margin-bottom: 0.14in;">
scriptPubKey: 0 <20 bajtova hasha
javnog ključa></div>
<div style="margin-bottom: 0.14in;">
(0x0014{20 bajtova hasha})</div>
<div style="margin-bottom: 0.14in;">
scriptSig: (prazno)</div>
<div style="margin-bottom: 0.14in;">
svjedočanstvo: <potpis><javni
ključ></div>
<div style="margin-bottom: 0.14in;">
Ponašanje je vrlo slično
dosadašnjem. Skripta scriptPubKey u izlazu transakcije šalje
bitcoine na hash javnog ključa (adresu). Transakcija koja želi te
bitcoine potrošiti daje javni ključ koji odgovara hashu u izlazu
transakcije koja je bitcoin poslala i potpis transakcije. Umjesto da
se potpis i javni ključ nalaze u polju scriptSig, nalaze se u polju
svjedočanstva.</div>
<div style="margin-bottom: 0.14in;">
U skripti scriptPubKey 0 označuje
verziju witness programa. Duljina programa kaže da se radi o vrsti
P2WPKH. Potpis se verificira s: <signature><pubkey>
CHECKSIG. U usporedbi s P2PKH, P2WPKH koristi tri bajta manje u
scriptPubKey.</div>
<h3 style="margin-bottom: 0.14in;">
P2WSH</h3>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Slijedi primjer 1 od 2 višepotpisne
transakcije verzije 0 P2WSH:</div>
<div style="margin-bottom: 0.14in;">
scriptPubKey: 0 <32 bajta hasha
skripte svjedočanstva></div>
<div style="margin-bottom: 0.14in;">
(0x0020{32 bajta hasha})</div>
<div style="margin-bottom: 0.14in;">
scriptSig: (prazno)</div>
<div style="margin-bottom: 0.14in;">
svjedočanstvo: 0 <potpis1> <1
<javni1> <javni2> 2 CHECKMULTISIG></div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
U skripti scriptPubKey 0 označuje
verziju witness programa. Duljina programa kaže da se radi o vrsti
P2WSH. Posljednji element u svjedočanstvu (witnessScript) hashira se
pomoću SHA256 te se hash uspoređuje s 32-bajtnom vrijednošću u
polju scriptSig. Ako odgovaraju, skripta se izvršava. P2WSH povećava
veličinu skripte s dosadašnjih 520 bajtova na 10.000.</div>
<h2>
</h2>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-26958153517815230872016-11-13T01:51:00.000-08:002016-11-13T01:51:14.692-08:00Promjenjivost transakcija (malleability)
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<br />
Svaka Bitcoin transakcija
referencira se na neku prethodnu transakciju. Referenca na
transakciju dvostruki je hash cijele transakcije. Prije nego se
transakcije uključi u blok, taj hash može promijeniti bilo tko od
primatelja transakcije. To se naziva promjenjivost transakcija i
predstavlja problem ako se transakciju želi koristiti prije nego je
dodana u blok. <br />
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<br />
<div style="margin-bottom: 0.14in;">
U Bitcoinu postoji nekoliko uzroka
promjenjivosti:</div>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
<ol>
<li><div style="margin-bottom: 0.14in;">
Potpisi koji nisu u DER
formatu.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Operacije u polju scriptSig
koje ne stavljaju podatke na stog.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Operacije koje stavljaju
podatke na stog za transakcije nestandardne veličine.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Brojevi predvođeni nulama.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Negativna vrijednost broja S u
potpisu.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Suvišni podaci u polju
scriptSig.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Skripta zanemaruje ulazne
podatke.</div>
</li>
<li><div style="margin-bottom: 0.14in;">
Maskiranje na temelju sighash
zastavice.</div>
<div style="margin-bottom: 0.14in;">
<br /></div>
</li>
</ol>
<h3>
Potpisi koji nisu u DER formatu</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</h3>
<div style="margin-bottom: 0.14in;">
U prošlosti se Bitcoin klijent
oslanjao na OpenSSL biblioteku koja nije zahtijevala strogo
pridržavanje DER formata. Prihvaćanjem promjena koje je donio
BIP66, ovo više nije problem.</div>
<h3 style="margin-bottom: 0.14in;">
Operacije u polju scriptSig koje ne stavljaju podatke na stog</h3>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Dodatne operacije u polju scriptSig
mogu dati isti rezultat skripte, ali drugačiji hash. Npr.
<sig><pubkey><2>OP_DROP.</div>
<h3 style="margin-bottom: 0.14in;">
Operacije koje stavljaju podatke na stog za transakcije nestandardne veličine</h3>
<h3 style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</h3>
<div style="margin-bottom: 0.14in;">
Kod višepotpisnih transakcija može
se dogoditi da je potpis prevelik (> 75 bajtova) pa se polje za
veličinu potpisa počinje tumačiti kao naredba u skripti. Zbog toga
je potrebno dodati neku od OP_PUSHDATA naredbi.</div>
<h3 style="margin-bottom: 0.14in;">
Brojevi predvođeni nulama</h3>
<h3 style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</h3>
<div style="margin-bottom: 0.14in;">
U polju scriptPubKey brojevi koji se
koriste mogu biti predvođeni nulama.</div>
<h3 style="margin-bottom: 0.14in;">
Negativna vrijednost broja S u potpisu</h3>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Kod računanja broja S može se
uzeti njegova pozitivna ili negativna vrijednost. To je moguće jer
se kod izračuna potpisa koristi aritmetika nad eliptičkom krivuljom
y<sup>2</sup> = x<sup>3</sup> + 7. Obje vrijednosti daju ispravan
rezultat. BIP66 propisuje da se uzme manja pozitivna vrijednost. To
pravilo je dio konsenzusa ne protokola pa ga nije nužno poštivati.</div>
<h3 style="margin-bottom: 0.14in;">
Suvišni podaci u polju scriptSig</h3>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Dodavanje podataka na početak polja
scriptSig koji se neće koristiti u odgovarajućem polju
scriptPubKey.</div>
<h3 style="margin-bottom: 0.14in;">
Skripta zanemaruje ulazne podatke</h3>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Ako skripta scriptPubKey počinje
naredbom OP_DROP, ostatke skripte se zanemaruje.</div>
<h3 style="margin-bottom: 0.14in;">
Maskiranje na temelju sighash zastavice </h3>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Sighash zastavice mogu se koristiti
za ignoriranje pojedinih dijelova transakcije.</div>
<div style="margin-bottom: 0.14in;">
<br /></div>
<div style="margin-bottom: 0.14in;">
<style type="text/css">P { margin-bottom: 0.08in; direction: ltr; }</style>
</div>
<div style="margin-bottom: 0.14in;">
Gorenavedene situacije u kojima je
moguća promjenjivost transakcija rješava segregated witness.</div>
<div style="margin-bottom: 0.14in;">
<br /></div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-63287150340633173292016-07-17T13:38:00.002-07:002016-07-17T13:38:41.252-07:00Relativno vremensko zaključavanje transakcija (CHECKSEQUENCEVERIFY)
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
BIP65 odnosno naredba CHECKLOCKTIMEVERIFY omogućuje trošenje
transakcije u budućnosti, na točno određeni datum ili visinu
bloka. BIP112, odnosno naredba CHECKSEQUENCEVERIFY, omogućuje
zaključavanje transakcije na neki vremenski period, npr. tjedan dana
ili 48 sati. Specifikacija se sastoji od tri dijela: BIP113 (srednje
prošlo vrijeme), BIP68 (relativno vremensko zaključavanje
korištenjem broja niza [sequence numbera]) i BIP112 (naredba
CHECKSEQUENCEVERIFY).<br />
<br />
<h2>
Srednje prošlo vrijeme</h2>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Prije pojave BIP113 transakcije nisu se uključivale u blok ako su
trenutačno vrijeme ili visina bloka manji od onoga specificiranog u
polju locktime. Ovakvo ponašanje omogućivalo je rudarima da netočno
prijavljuju vrijeme blokova kako bi u njih uključili što više
transakcija.<br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
BIP113 mijenja određivanje proteklog vremena na temelju oznake iz
prethodnog bloka u određivanje proteklog vremena na temelju srednje
vrijednosti polja locktime zadnjih 11 blokova. Potrebno je uzeti
prethodnih 11 blokova te ih poredati po veličini prema vrijednosti
polja locktime. Na kraju se iz tog niza uzima srednja vrijednost kao
proteklo vrijeme. Ovo garantira da će se vrijednost proteklog
vremena monotono povećavati.<br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Ovakav mehanizam koristit će se i kod apsolutnog vremenskog
zaključavanja transakcija (BIP65).<br />
<br />
<h2>
Broj niza</h2>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Prije pojave relativnog vremenskog zaključavanja transakcija,
polje broj niza nije se koristilo, odnosno uvijek je bilo postavljeno
na maksimalnu vrijednost 0xFFFFFFFF. U novoj specifikaciji prvi bit
(1<<31) određuje kako će se polje interpretirati. Ako je prvi
bit postavljen, vrijednost se polja zanemaruje, a ako nije
postavljen, polje se tretira kao relativno vrijeme zaključavanja.<br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Bit 1<<22 određuje kako će se zapisano vrijeme tumačiti.
Ako je bit postavljen, tumači se kao relativno vrijeme u intervalima
od 512 sekundi. Vremenski interval počinje srednjim prošlim
vremenom prethodnog bloka izlaza koji se zaključava, a završava
srednjim prošlim vremenom prethodnog bloka. Ako bit nije postavljen,
tumači se kao broj blokova. Sam vremenski interval zapisan je u
bitovima 0-15.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_-9BQEeT5cgEIWt2vj-2eX7nH_QoHcYP4R3y0QDDIe4TDl-jK0M1IcgfG5qiXW9YD0XXWK6THtZ-kGM6PGTCvFEoPu8YTpCLvhVNLREelA7tmMe4n6qJGfESHTVcljQeE2ure25kC0L8E/s1600/encoding.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_-9BQEeT5cgEIWt2vj-2eX7nH_QoHcYP4R3y0QDDIe4TDl-jK0M1IcgfG5qiXW9YD0XXWK6THtZ-kGM6PGTCvFEoPu8YTpCLvhVNLREelA7tmMe4n6qJGfESHTVcljQeE2ure25kC0L8E/s400/encoding.png" width="400" /></a></div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Interval od 512 sekundi odabran je da bude sličan intervalu u
kojem se blokovi generiraju. Na taj se način u isti broj bitova može
zapisati ili visina bloka ili relativno vrijeme.<br />
<br />
<h2>
Primjena</h2>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
CHECKSEQUENCEVERIFY primjenjuje se na zaključavanje pojedniih
izlaza kao i CHECKLOCKTIMEVERIFY. Može se koristiti kod zajamčenih
pologa (escrow), dvosmjerne platne kanale, mrežu Lighntning i slične
mehanizme za transakcije izvan lanca blokova.<br />
<br />
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-17672425437629315332016-06-22T12:09:00.000-07:002016-06-22T12:09:33.807-07:00Logička hijerarhija determinističkih novčanika (BIP44)
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
BIP32 ostavlja previše slobode u implementiranje logičke
strukture HD novčanika što može uzrokovati probleme prilikom
restoracije novčanika. BIP44 predlaže logičku strukturu na više
razina.<br />
<br />
<h2>
Struktura</h2>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
m / purpose' / coin_type' / account' / change / address_index<br />
Apostrof označava da se radi o ojačanom izvodu ključa. Svaka
razina ima određeno značenje i ondnosi se na indeks za BIP32 CKD.<br />
<br />
<h3>
Purpose (svrha)</h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
Polje 'svrha' je konstanta koja iznosi 44 (0x8000002C). Označuje
da se radi o stalastoj strukturi kakvu definira ovaj BIP.<br />
<br />
<h3>
Coin_type (vrsta kriptovalute)</h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
Ovo polje označuje za koju se kriptovalutu izvode ključevi
(Bitcoin, Litecoin, Dogecoin...). Npr. oznaka Bitcona je 0
(0x80000000), Litecoina 2 (0x80000002) i sl. Sve oznake mogu se
pronaći <a href="https://github.com/satoshilabs/slips/blob/master/slip-0044.md">ovdje</a>.<br />
<br />
<h3>
Account (račun)</h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
Na ovoj se razini ključevi dijele prema identitetima
korisnika.tako da se različiti računi nikad ne pomiješaju. Brojevi
računa kreću od 0 te se povećavaju.<br />
<br />
<h3>
Change (kusur)</h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
0 označuje da se radi o normalnoj adresi na koju korisnik prima
sredstva. 1 označuje da se radi o adresi nakoju korisnik prima
ostatak sredstava (kusur) poslanih na neku adresu.<br />
<br />
<h3>
Address_index (indeks adresa)</h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
Indeksi adresa počinju od nule te se inkrementiraju.Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-89728805140913119952016-06-11T07:36:00.000-07:002016-06-11T07:36:57.167-07:00Bitovi verzija (BIP9)
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Blokovi originalnog protokola Bitcoin imali su verziju
1. Polje za verziju bloka veliko je 32 bita, a zapisuje se u
little-endian formatu. Pojavom BIP 34, verzija je povećana na 2 te
je uveden mehanizam za provođenje soft-fork promjena. Mehanizam je
provjeravao koliko blokova na 1000 ima zadanu verziju bloka što je
signaliziralo da je promjena softvera prihvaćena. Problem ove metode
je što podržava samo jedan soft-fork u paraleli. BIP 66 povećao je
verziju bloka na 3, a BIP 65 na 4.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
BIP 9 uvodi nov mehanizam provođenja soft-fork
promjena te nov način tretiranja polja verizije u bloku. Verzija se
od sada tretira kao vektor bitova u kojem se svaki bit može
koristiti za praćenje verzije soft-forka. U dvotjednom (retarget)
periodu zbrajaju se bitovi pojedinih verzija kako bi se ustanovilo
ima li pojedina promjena dovoljnu podršku rudara (jesu li prešli
"prag").</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
Specifikacija</h2>
<h2 lang="zxx">
</h2>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Svaki soft-fork obilježavaju sljedeći parametri:</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<ul>
<li><div lang="zxx">
Ime: Vrlo kratko opisuje soft-fork (npr. bip N).</div>
</li>
<li><div lang="zxx">
Bit: Označuje koji će se bit u verziji bloka
koristiti za praćenje konkretnog soft-forka. Bira se iz skupa [0,
28].</div>
</li>
<li><div lang="zxx">
Starttime: Vrijeme u budućnost od kada bit
počinje vrijediti specificirano kao srednje proteklo vrijeme
(medium time past).</div>
</li>
<li><div lang="zxx">
Timeout: Specificira vrijeme nakon kojeg se
prihvaćanje soft-forka smatra neuspjelim.</div>
</li>
</ul>
<h2>
</h2>
<h2>
Stanja</h2>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Uz svaki blok i soft-fork vežu se stanja:</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<ul>
<li><div lang="zxx">
DEFINED – svaki soft-fork započinje u ovom
stanju.</div>
</li>
<li><div lang="zxx">
STARTED – svi blokoi za koje je prošlo
starttime.</div>
</li>
<li><div lang="zxx">
LOCKED_IN – svi blokovi kojih nakon stanja
STARTED u dvotjednom periodu ima barem za prijelaz praga određene
verzije.</div>
</li>
<li><div lang="zxx">
ACTIVE – svi blokovi nakon stanja LOCKED_IN.</div>
</li>
<li><div lang="zxx">
FAILED – svi blokovi za koje prošao timeout, a
LOCKED_IN nije postignut.</div>
</li>
</ul>
<h2>
</h2>
<h2>
Bitovi kao zastavice</h2>
<br />
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; </style>Blokovi u stanju STARTED postavljaju bitove u polju
verzije na 1 kako bi signalizirali koji soft-fork podržavaju. Vršna
tri bita takvih blokova moraju biti 001. Budući da su BIP 34, 66 i
65 imali verzije 00000000000000000000000000000010 (2),
00000000000000000000000000000011 (3) i
00000000000000000000000000000100 (4), odnosno u little-endian formatu
10000000000000000000000000000000, 11000000000000000000000000000000
i 00100000000000000000000000000000, mogu se koristiti samo bitovi od
3. do 31., odnosno svaka verzija mora imati tri vršna bita 001.</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Dakle, mogući raspon bitova je [0x20000000,
0x3FFFFFFF]. Do tog se raspona dolazi ako se uzme najmanja moguća
verzija u little-endian formatu 00100000000000000000000000000000
(0x20000000) i najveća moguća verzija
00111111111111111111111111111111 (0x3fffffff). To predstavlja 29
mogućih paralelnih soft-forkova.</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
Prijelazi između stanja</h2>
<h2 lang="zxx">
</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7XwlGBoF7dXqYqOWq13wcvVlgRsF1k1TOds0l2ADDNB6SqMvZmUrnhUlr7HF8j3TgQslDPNeuoaimD1Re3MrDh0Fb4TIYzw8PyEiVf4-TIutBcVZuvIl-CgeVZAM2i2I9j-vLdKn4bW3a/s1600/states.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7XwlGBoF7dXqYqOWq13wcvVlgRsF1k1TOds0l2ADDNB6SqMvZmUrnhUlr7HF8j3TgQslDPNeuoaimD1Re3MrDh0Fb4TIYzw8PyEiVf4-TIutBcVZuvIl-CgeVZAM2i2I9j-vLdKn4bW3a/s640/states.png" width="640" /></a></div>
<div lang="zxx">
</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
Svi blokovi unutar dvotjednog perioda imaju isto stanje. Iduće
stanje ovisi o prethodnom. Prag za prijelaz u stanje LOCKED_IN je
1915 (95%) blokova.Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-67817649703080645382016-04-03T10:53:00.000-07:002016-04-03T10:53:26.493-07:00Trošenje Bitcoin transakcije (dio drugi)<h2>
9. scriptPubKey</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<span lang="zxx">Ovo polje sadrži u</span><span lang="zxx">v</span><span lang="zxx">jete
otključavanja gorenavedenih sredstava usmjerenih na neku bitcoin
adresu. </span><span lang="zxx">Ovo je polje usko vezano uz polje
scriptSig (kao što je opisanu u člancima o Bitcoin skriptama).
</span><span lang="zxx">Zapisuje se u var_string big-endian formatu.
</span><span lang="zxx">Najčešće sadrži skriptu 76a914097072524438d003d23a2f23edb65aae1bb3e46988ac. Napisana je u skriptnom jeziku Bitcoina koji kad se deserijalizira kaže</span><br />
<span lang="zxx">DUP HASH160 <14> 097072524438d003d23a2f23edb65aae1bb3e469 EQUALVERIFY CHECKSIG</span><br />
<span lang="zxx">Detalji su opisani u člancima o Bitcoin skriptama. U ovo se polje prvo upisuje duljina skripte u bajtovima (u heksadecimalnom formatu) te zatim sama skripta.</span><br />
<span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }CODE.cjk { font-family: "Droid Sans Fallback",monospace; }</style>
</span><br />
<div lang="zxx">
<br /></div>
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01<span lang="zxx"> </span></div>
<div lang="zxx">
<span lang="zxx">eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2<br />01000000<br />76a914010966776006953d5567439e5e39f86a0d273bee88ac<br />ffffffff<br />01<br />605af40500000000<br />19<br />76a914097072524438d003d23a2f23edb65aae1bb3e46988ac"</span></div>
<div lang="zxx">
<br /></div>
<br />
<h2>
<span lang="zxx"><div lang="zxx">
<span lang="zxx">10. Polje lock-time</span></div>
</span></h2>
<span lang="zxx"></span><br />
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<br />
<div lang="zxx">
Polje koje se može koristiti za vremensko
zaključavanje transakcije. U slučaju da se transakcija može odmah
potrošiti, polje je prazno. Veličine je četiri bajta te se
zapisuje u little-endian formatu.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
Hex: "01000000<br /> 01<br /> eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2<br /> 01000000<br /> 76a914010966776006953d5567439e5e39f86a0d273bee88ac<br /> ffffffff<br /> 01<br /> 605af40500000000<br /> 19<br /> 76a914097072524438d003d23a2f23edb65aae1bb3e46988ac<br /> 00000000"</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
11. Način potpisivanja transakcine (hashcode)</h2>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Ovom se zastavicom opsiuje kako će se transakcija
potpisivati. Gotovo u svim slučajevima ova zastavica predstavlja
sighash_all, odnosno potpisivanje svih ulaza i izlaza. Zastavica je
veličine osam bajtova zapisanih u little-endian formatu.</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }CODE.cjk { font-family: "Droid Sans Fallback",monospace; }</style>
</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01</div>
<div lang="zxx">
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2<br />01000000<br />76a914010966776006953d5567439e5e39f86a0d273bee88ac<br />ffffffff<br />01<br />605af40500000000<br />19<br />76a914097072524438d003d23a2f23edb65aae1bb3e46988ac<br />00000000<br />01000000"</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
14. Hashiranje transakcije</h2>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }CODE.cjk { font-family: "Droid Sans Fallback",monospace; }</style>
</div>
<span lang="zxx">Goreprikazani oblik transakcije spreman je za
potpisivanje. </span><span lang="zxx">Prije toga transakcija se
sažima dvostrukim korištenjem funkcije SHA256</span><span lang="zxx">(SHA256(tx))</span><span lang="zxx">.
</span><span lang="zxx">Rezultat je</span><br />
<br />
<span lang="zxx">9302bda273a887cb40c13e02a50b4071a31fd3aae3ae04021b0b843dd61ad18e.</span><br />
<br />
<h2>
<span lang="zxx">15. Potpisivanje transakcije</span></h2>
<span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</span><br />
Transakcija se sada potpisuje privatnim ključem primatelja. Za to
se koristi algoritam ECDSA, odnosno digitalni potpis zasnovan na
eliptičkoj krivulji. Taj se potpis zatim enkodira u tzv. strogi DER
format. Ovo je primjer takvog potpisa<br />
<br />
<br />
<div lang="zxx">
0460221009e0339f72c793a89e664a8a932df073962a3f84eda0bd9e02084a6a95</div>
<div lang="zxx">
67f75aa022100bd9cbaca2e5ec195751efdfac164b76250b1e21302e51ca86dd7eb</div>
<div lang="zxx">
d7020cdc06. </div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
16. Popunjavanje polja scriptSig</h2>
<div lang="zxx">
Sada se može ispravno popuniti polje scriptSig iz petog koraka koje je do sada sadržavalo skriptu scriptPubKey. U polje scriptSig upisuje se ukupna duljina polja, duljina i potpis transakcije u DER formatu, hashcode (01 najčešće), duljina javnog ključa te sam javni ključ.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
8c4930460221009e0339f72c793a89e664a8a932df073962a3f84eda0bd9e0208</div>
<div lang="zxx">
4a6a9567f75aa022100bd9cbaca2e5ec195751efdfac164b76250b1e21302e51ca</div>
<div lang="zxx">
86dd7ebd7020cdc0601410450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d</div>
<div lang="zxx">
8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df3885</div>
<div lang="zxx">
5ed6f2ee187e9c582ba6.</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
17. Micanje zastavice hashcode</h2>
<div lang="zxx">
U zadnjem koraku se miče zastavica hashcode s kraja transakcije jer je dodana u polje scriptSig iza potpisa transakcije.</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }CODE.cjk { font-family: "Droid Sans Fallback",monospace; }</style>
</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01</div>
<div lang="zxx">
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2<br />01000000<br />8c 4930460221009e0339f72c793a89e664a8a932df073962a3f84eda0bd9e02084</div>
<div lang="zxx">
a6a9567f75aa022100bd9cbaca2e5ec195751efdfac164b76250b1e21302e51ca</div>
<div lang="zxx">
86dd7ebd7020cdc0601410450863ad64a87ae8a2fe83c1af1a8403cb53f53e486</div>
<div lang="zxx">
d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38</div>
<div lang="zxx">
855ed6f2ee187e9c582ba6<br />ffffffff<br />01<br />605af40500000000<br />19<br />76a914097072524438d003d23a2f23edb65aae1bb3e46988ac<br />00000000" </div>
<span lang="zxx"></span>Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-46972358484248426972016-04-02T00:18:00.000-07:002016-04-02T00:18:30.104-07:00Trošenje Bitcoin transakcije (dio prvi)<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Nakon što primatelj dobije bitcoine od pošiljatelja,
kako se konstruira transakcija koja te bitcoine troši (šalje novom
primatelju)?</div>
<div lang="zxx">
Postupak konstruiranja nove transakcije sastoji se od
više koraka i bit će prikazan u hex(string) formatu.</div>
<br />
<h2>
1. Verzija</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
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".</div>
<div lang="zxx">
Hex: "01000000"</div>
<br />
<h2>
2. Broj ulaza</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
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".</div>
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01"</div>
<br />
<h2>
3. Indeks prethodne transakcije</h2>
<style type="text/css">P { margin-bottom: 0.08in; }CODE.cjk { font-family: "Droid Sans Fallback",monospace; }</style>
<br />
<span lang="zxx">Sada slijedi lista ulaza. Svaki ulaz u
transakciju sastoji se od </span><span lang="zxx">četiri</span><span lang="zxx">
dijela: indeks transakcije čiji se izlaz (odnosno bitcoini vezani uz
taj izlaz) želi potrošiti, indeks</span><span lang="zxx">a</span><span lang="zxx">
izlaza, </span><span lang="zxx">potpisa te oznake niza (sequence)</span><span lang="zxx">.
</span><span lang="zxx">Indeks transakcije je zapravo </span><span lang="zxx">dvostruki
</span><span lang="zxx">SHA256 hash prethodne transakcije. </span><span lang="zxx">To
je polje veličine 32 bajta te se zapisuje u little-endian formatu.
</span><span lang="zxx">Npr. takav hash može izgledati ovako</span><br />
<span lang="zxx">"eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2" </span><br />
<style type="text/css">P { margin-bottom: 0.08in; }CODE.cjk { font-family: "Droid Sans Fallback",monospace; }</style>
<br />
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01<br />
<span lang="zxx">eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2"</span></div>
<br />
<h2>
<span lang="zxx">4. Indeks izlaza prethodne transakcije</span></h2>
<div lang="zxx">
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".</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }CODE.cjk { font-family: "Droid Sans Fallback",monospace; }</style>
</div>
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01</div>
<div lang="zxx">
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2 </div>
<div lang="zxx">
01000000 <code class="western"><span style="font-family: "liberation" serif , serif;"><span lang="zxx"></span></span></code><code class="western"><span style="font-family: "liberation" serif , serif;"><span lang="zxx"></span></span></code><span lang="zxx">"</span></div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
<span lang="zxx">5. Polje scriptSig</span></h2>
<div lang="zxx">
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.</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Polje je varijabilne duljine i zapisano je u var_string
big-endian formatu. Sadrži duljinu skripte u bajtovima te samu
skriptu.</div>
<br />
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01</div>
<div lang="zxx">
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2 </div>
<div lang="zxx">
01000000</div>
<div lang="zxx">
76a914010966776006953d5567439e5e39f86a0d273bee88ac<code class="western"><span style="font-family: "liberation" serif , serif;"><span lang="zxx"></span></span></code><code class="western"><span style="font-family: "liberation" serif , serif;"><span lang="zxx"></span></span></code><span lang="zxx">"</span></div>
<h2 lang="zxx">
<span lang="zxx"> </span></h2>
<h2 lang="zxx">
<span lang="zxx">6. Oznaka niza (sequence)</span></h2>
<div lang="zxx">
<span lang="zxx"></span><style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
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.</div>
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01</div>
<div lang="zxx">
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2 </div>
<div lang="zxx">
01000000</div>
<div lang="zxx">
76a914010966776006953d5567439e5e39f86a0d273bee88ac</div>
<div lang="zxx">
ffffffff<code class="western"><span style="font-family: "liberation" serif , serif;"><span lang="zxx"></span></span></code><code class="western"><span style="font-family: "liberation" serif , serif;"><span lang="zxx"></span></span></code><span lang="zxx">"</span></div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
<span lang="zxx">7. Broj izlaza</span></h2>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
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".</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01</div>
<div lang="zxx">
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2 </div>
<div lang="zxx">
01000000</div>
<div lang="zxx">
76a914010966776006953d5567439e5e39f86a0d273bee88ac</div>
<div lang="zxx">
ffffffff<code class="western"><span style="font-family: "liberation" serif , serif;"><span lang="zxx"></span></span></code><code class="western"><span style="font-family: "liberation" serif , serif;"><span lang="zxx"></span></span></code><span lang="zxx"> </span></div>
<div lang="zxx">
<span lang="zxx">01"</span></div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
<span lang="zxx">8. Iznosi</span></h2>
<div lang="zxx">
<br />
<span lang="zxx">Iznosi vezani uz pojedini izlaz zapisuju se u
satoshijima. Polje je veličine osam bajtova te se prikazuje </span><span lang="zxx">u</span><span lang="zxx">
little-endian formatu. </span><span lang="zxx">Za iznos od 0.999 BTC,
odnosno 99900000 </span><span lang="zxx">satoshija </span><span lang="zxx">to
je 605af40500000000<code><span style="font-family: Liberation Serif, serif;">.</span></code></span><br />
<br />
<div lang="zxx">
Hex: "01000000</div>
<div lang="zxx">
01</div>
<div lang="zxx">
eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2 </div>
<div lang="zxx">
01000000</div>
<div lang="zxx">
76a914010966776006953d5567439e5e39f86a0d273bee88ac</div>
<div lang="zxx">
ffffffff<code class="western"></code><code class="western"></code><span lang="zxx"> </span></div>
<div lang="zxx">
<span lang="zxx">01</span><br />
<span lang="zxx"><span lang="zxx">605af40500000000</span>"</span></div>
<code class="western"><span style="font-family: Liberation Serif, serif;"><span lang="zxx"></span></span></code><br />
</div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-78398273527321616572015-12-25T06:13:00.004-08:002015-12-25T06:13:44.195-08:00Vremenski zaključane transakcije: Primjeri<h2>
Zajamčeni polog (escrow)</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Ako Alice i Bob žele zajedno upravljati poslom,
zajednička sredtva mogu držati u 2-od-2 višepotpisnoj transakciji.
No u slučaju smrti jedne strane, druga strana neće imati pristup
zajedničkim sredstvima. Zato bi mogli zaposili odvjetnika Lennyja da
bude treća strana u slučaju nezgode. No kod 2-od-3 višepotpisne
transakcije, odvjetnik se može urotit s bilokojom stranom te ukrasti
zajednička sredstva. U ovakvom se slučaju može iskoristiti
operator CHECKLOCKTIMEVERIFY u scriptSig dijelu transakcije:</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
IF</div>
<div lang="zxx">
<sad + 3 mjeseca> CHECKLOCKTIMEVERIFY DROP</div>
<div lang="zxx">
<Lennyjev pubkey> CHECKSIGVERIFY</div>
<div lang="zxx">
1</div>
<div lang="zxx">
ELSE</div>
<div lang="zxx">
2</div>
<div lang="zxx">
ENDIF</div>
<div lang="zxx">
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
<Alicin pubkey> <Bobov pubkey> 2
CHECKMULTISIG</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
Ovakva se transakcija može potrošiti u bilokojem
trenutku ovako:</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
0 <Alicin potpis> <Bobov potpis> 0</div>
<div lang="zxx">
Postupak trošenja je sljedeći:</div>
</div>
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
<table cellpadding="4" cellspacing="0" style="width: 119px;">
<colgroup><col width="109"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="109">
<div lang="zxx">
0</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="109">
<div lang="zxx">
Bobov potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="109">
<div lang="zxx">
Alicin potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="109">
<div lang="zxx">
0</div>
</td>
</tr>
</tbody></table>
</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<div lang="zxx">
Ovako izgleda stog nakon pokušaja trošenja gornje
vremenski zaključane transakcije prije isteka roka valjanosti.
Naredba IF provjerava prvi element na stogu te se izvršavanje dalje
nastavlja ovisno o tom elementu. Na vrhu stoga je 0 koja se tretira
kao neistina te se prelazi na ELSE dio naredbe koja na stog stavlja
2.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 120px;">
<colgroup><col width="110"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="110">
<div lang="zxx">
2</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="110">
<div lang="zxx">
Bobov potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="110">
<div lang="zxx">
Alicin potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="110">
<div lang="zxx">
0</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Izgled stoga nakon izvršavanja naredbe IF. Ovo je sada
normalna 2-od-2 višepotpisna transakcija</div>
<div lang="zxx">
0 <Bobov potpis> <Alicin potpis> 2 <Alicin
pubkey> <Bobov pubkey> 2 CHECKMULTISIG</div>
<div lang="zxx">
Zbog buga u naredbu CHECKMULTISIG, m-od-n višepotpisna
transakcija uzima jedan više potpis nego je zapravo potrebno.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
Nakon isteka roka valjanosti ovu je transakciju moguće
potrošiti na sljedeći način:</div>
<div lang="zxx">
0 <Alicin/Bobov potpis> <Lennyjev potpis> 1</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 121px;">
<colgroup><col width="111"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="111">
<div lang="zxx">
1</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="111">
<div lang="zxx">
Lennyje potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="111">
<div lang="zxx">
Alicin/Bobov potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="111">
<div lang="zxx">
0</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Ovako izgleda stog nakon pokušaja trošenja gornje
vremenski zaključane transakcije nakon isteka roka valjanosti. Na
stogu je 1 koji se tretira kao istina te se prelazi na provjeru roka
valjanosti. Rok valjanosti ističe tri mjeseca nakon nastanka
transakcije.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 124px;">
<colgroup><col width="114"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="114">
<div lang="zxx">
sad + 3 mjeseca</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="114">
<div lang="zxx">
Lennyjev potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="114">
<div lang="zxx">
Alicin/Bobov potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="114">
<div lang="zxx">
0</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Na stog se stavlja rok valjanosti te se uspoređuje s
poljem nLockTime transakcije koja taj izlaz želi potrošiti. Budući
da je rok istekao, izlaz se smije potrošiti. Naredba DROP odbacuje
gornji element stoga (u ovom slučaju rok valjanosti).</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
Zatim se uzima Lennyjev javni ključ s kojim naredba
CHECKSIGVERIFY provjerava Lennyjev potpis na stogu. Ako je potpis
ispravan na stog se na kraju stavlja 1.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 124px;">
<colgroup><col width="114"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="114">
<div lang="zxx">
1</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="114">
<div lang="zxx">
Alicin/Bobov potpis</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="114">
<div lang="zxx">
0</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Sada je ovo 1-od-2 višepotpisna transakcija koja se
može potrošiti pomoću Alicinog ili pomoću Bobovog potpisa</div>
<div lang="zxx">
0 Alicin/Bobov potpis 1 <Alicin pubkey> <Bobov
pubkey> 2 CHECKMULTISIG</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
Neinteraktivna vremenski zaključana nadoknada</h2>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
U nekim je protokolima potrebna suradnja dvije strane
da bi se potrošila neka transakcija. U slučaju nedostupnosti jedne
strane, povrat novca (nadoknada) se vremenski zaključati kako bi se
nakon isteka roka valjanosti vratio pošiljatelju. Takva transakcija
u kojoj Alice šalje Bobu sredstva može izgledati ovako</div>
</div>
<div lang="zxx">
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
IF</div>
<div lang="zxx">
<rok_valjanosti> CHECKLOCKTIMEVERIFY DROP</div>
<div lang="zxx">
1</div>
<div lang="zxx">
ELSE</div>
<div lang="zxx">
2</div>
<div lang="zxx">
ENDIF</div>
<div lang="zxx">
<Alicin pubkey> <Bobov pubkey> 2
CHECKMULTISIG</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Slično kao i u prethodnom primjeru, ovakva se
transakcija može prije isteka roka potrošiti s<br /><br />
</div>
<div lang="zxx">
0 <Alicin potpis> <Bobov potpis> 0</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
U slučaju nedostupnosti jedne strane i nakon isteka
roka valjanosti, transakcija se može potrošiti s</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
0 <Alicin/Bobov potpis> 1</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
Plaćanje za objavljivanje podataka</h2>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Postoje usluge koje omogućuju plaćanje za
objavljivanje informacija. Osoba koja objavljuje informaciju prvo
mora dokazati da kriptirani dokument sadrži tražene podatke, a
zatim konstruirati transakciju koja će otkriti ključ za dekripciju
podataka. Trenutačne implementacije takvih sustava omogućuju osobi
koja objavljuje informaciju da nikad ne otkrije tajni ključ. Taj se
nedostatak može riješiti korištenjem naredbe CHECKLOCKTIMEVERIFY:</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
IF</div>
<div lang="zxx">
HASH160 <hash160(tajni_ključ)> EQUALVERIFY</div>
<div lang="zxx">
<pubkey objavljivača> CHECKSIG</div>
<div lang="zxx">
ELSE</div>
<div lang="zxx">
<rok valjanosti> CHECKLOCKTIMEVERIFY DROP</div>
<div lang="zxx">
<pubkey platitelja> CHECKSIG</div>
<div lang="zxx">
ENDIF</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Objavljivač informacije transakciju može potrošiti
ovako:</div>
<div lang="zxx">
<potpis objavljivača> <tajni ključ> 1</div>
</div>
<div lang="zxx">
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 145px;">
<colgroup><col width="135"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="135">
<div lang="zxx">
1</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="135">
<div lang="zxx">
Tajni ključ</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="135">
<div lang="zxx">
Pubkey objavljivača</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Ovako izgleda stog nakon pokušaja trošenja
transakcije. 1 se smatra istinom te se prelazi na verifikaciju tajnog
ključa.</div>
</div>
<div lang="zxx">
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 144px;">
<colgroup><col width="134"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="134">
<div lang="zxx">
Tajni ključ</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="134">
<div lang="zxx">
Pubkey objavljivača</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Gornji element stoga se hashira funkcijom HASH160 te
uspoređuje s hashem podatka u transakciji. U slučaju da su
identični (objavljen je pravi tajni ključ), verificira se potpis
objavljivača te je tajna otkrivena onome tko je platio za nju.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
U slučaju da objavljivač ne objavi tajni ključ,
platitelj može dobit povrat novca nakon isteka roka valjanosti:</div>
</div>
<div lang="zxx">
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
0 <potpis platitelja></div>
</div>
<div lang="zxx">
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 146px;">
<colgroup><col width="136"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="136">
<div lang="zxx">
0</div>
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="136">
<div lang="zxx">
potpis platitelja</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Zbog 0 se pralazi u ELSE dio transakcije koji na stog
stavlja rok valjanosti i uspoređuje ga s poljem nLockTime:</div>
</div>
<div lang="zxx">
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 151px;">
<colgroup><col width="141"></col>
</colgroup><tbody>
<tr>
<td style="border: 1px solid #000000; padding: 0.04in;" valign="TOP" width="141">
Rok valjanosti<br />
</td>
</tr>
<tr>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="141">
Potpis platitelja<br />
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Ako je rok prošao, odbacuje se sa stoga te se
verificira potpis platitelja te on dobiva uplaćeni novac natrag.</div>
<div lang="zxx">
<br /></div>
</div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-29596818391280744972015-12-18T12:18:00.001-08:002015-12-18T12:18:32.985-08:00Vremenski zaključane transakcije (BIP 65)
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Svaka bitcoin transakcija ima polje nLockTime.
Zamišljeno je da sadrži vrijednost koja govori kada se transakcija
može potrošiti u budućnosti. Vrijednost polja može se
interpertirati na dva načina: ako je vrijednost manja od 500.000.000
tretira se kao visina bloka u kojem transakcija postane validna, a
ako je vrijednost veća od toga, tretira se kao datum kada
transakcija postaje validna (broj sekundi od 1. siječnja 1970.).</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Takva se transakcija može uključiti u blok koji je na
zadanoj ili većoj visini, odnosno čije je vrijeme pronalaska veće
ili jednako onome u polju nLockTime. Problem je što se ne može
garantirati da izlazi koje koristi transakcija s popunjem nLockTime
poljem neće prije potrošiti neka druga transakcija.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Zato je definirana naredba <a href="https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki">CHECKLOCKTIMEVERIFY</a> (odnosno
redefinirana je naredba NOP2). Ona služi tome da se zaključaju
pojedini izlazi iz transakcija koji će se potrošiti u budućnosti
te prima jedan parametar: rok valjanosti. Kada se tako zaključani
izlaz želi potrošiti, njegov se rok valjanosti uspoređuje s poljem
nLockTime transakcije koja ga troši. Izlaz će se potrošiti samo
ako je rok valjanosti manji od nLockTime. Transakcije zaključane s
CHECKLOCKTIMEVERIFY mogu se normalno uvrstiti u blok.</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
Primjer zamrzavanja sredstava</h2>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
Slijedi primjer skripte u skriptnom jeziku Bitcoina kojom je
moguće zamrznuti sredstva sve dok ne istekne zadani rok valjanosti:<br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<rok valjanosti> CHECKLOCKTIMEVERIFY DROP DUP HASH160
<pubKeyHash> EQUALVERIFY CHECKSIG<br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Transakcija koja će potrošiti ovaj izlaz mora imati nLockTime
veći od roka valjanosti. Budući da se transakcija s takvim poljem
može tek uključiti u blok čija je visina ili vrijeme veće od
vrijednosti nLockTime, originalna će transakcija ostati nepotrošena
do zadanog vremena. Nakon isteka roka valjanosti, transakcija se
dalje normalno validira.<br />
<br />
<h2>
Zaobilaženje roka valjanosti</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Rok valjanosti moguće je zaobići ako transakcija koja troši
vremenski zaključani izlaz redne brojeve svojih izlaza postavi na
maksimum (0xffffffff). To je zaostatak iz starih verzija protokola
Bitcoin te operacija CHECKLOCKTIMEVERIFY provjerava vrijednosti
rednih brojeva ulaza. Ako redni broj nije maksimum transakcija će
moći normalno potrošiti izlaz ako je prošao rok valjanosti. U
suprotnom, transakcija ne može potrošiti izlaz.Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-3675418652902987242015-12-06T10:38:00.003-08:002015-12-15T11:52:28.761-08:00Detalji coinbase transakcije
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Na početku svakog bloka transakcija nalazi se tzv.
coinbase transakcija. Ona donosi nagradu onome tko je uspješno
izrudario blok. Sama nagrada sastoji se od subvencije za blok
(trenutačno 25 BTC) te od naknada za sve transakcije u bloku.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
Primjer strukture coinbase transakcije je</div>
<div lang="zxx">
<style type="text/css">PRE.cjk { font-family: "Droid Sans Fallback",monospace; }TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 560px;">
<colgroup><col width="245"></col>
<col width="297"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="245">
<div lang="zxx">
Version</div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="297">
<div lang="zxx">
1</div>
</td>
</tr>
<tr>
<td colspan="2" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="550">
<div lang="zxx">
Inputs</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="245">
<div lang="zxx">
Prevoius hash</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="297">
<div lang="zxx">
0</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="245">
<div lang="zxx">
Index</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="297">
<div lang="zxx">
0xFFFFFFFF</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="245">
<div lang="zxx">
ScriptSig</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="297">
<pre class="western" lang="zxx">03dae7052f4249503130302f040e7164560902c8108999000000d3072f425443432f20</pre>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="245">
<div lang="zxx">
Sequence</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="297">
<div lang="zxx">
0</div>
</td>
</tr>
<tr>
<td colspan="2" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" valign="TOP" width="550">
<div lang="zxx">
Outputs</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="245">
<div lang="zxx">
Value</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="297">
<pre class="western" lang="zxx">2510629190</pre>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="245">
<div lang="zxx">
ScriptPubKey</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="297">
<pre class="western" lang="zxx">76a9142c30a6aaac6d96687291475d7d52f4b469f665a688ac</pre>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="245">
<div lang="zxx">
Locktime</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="297">
<div lang="zxx">
0</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
U odnosu na ostale transakcije, coinbase transakcija je
pojednostavljena. Nema referencu na prethodnu transakciju jer stvara
nove bitcoine, a ne preuzima već postojeće. Budući da se ne
referira na prethodnu transakciju, nema niti indeks prethodnog
izlaza.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Coinbase transakcija nije niti potpisana digitalnim
potpisom nego se polje ScriptSig koristi kao tzv. extra nonce polje.
Često polje nonce u zaglavlju transakcije nije dovoljno veliko da bi
se moglo samo koristiti za pretraživanje svih mogućih vrijednosti
noncea. Zato se ono dopunjava poljem ScriptSig u koje se upisuje dio
noncea koji nije stao u zaglavlje. Na taj način rudari dobivaju više
mogućnosti za kombiniranje.</div>
<div lang="zxx">
<br /></div>
<h3 lang="zxx">
BIP34</h3>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Osim što služi kao extra nonce, u prvi bajt polja
ScriptSig zapisuje se i visina bloka u kojem se nalazi coinbase
transakcija. To osigurava da je hash svakog idućeg bloka i
transakcije jedinstven. Format zapisa je broj bajtova u visini te
sama visina zapisana u little endian formatu. U gornjem primjeru to
je "03dae705", odnosno "03" bajta za visinu te
visina u little endian formatu "dae705", odnosno u big
endianu 05e7da te u decimalnom formatu 387034. Blok 227835 je prvi
blok takvog formata te on i svi sljedeći imaju verziju 2.</div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-24964528175183264922015-11-01T12:38:00.000-08:002015-11-01T12:38:13.043-08:00Vrste potpisa bitcoin transakcija<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Bitcoin transakcije sastoje se od ulaza i izlaza. Ulazi
sadrže reference na izlaze prethodnih transakcija koji su pod
kontrolom korisnika te skripte za svaki ulaz koje omogućuju trošenje
sredstava s prethodnih transakcija. Izlazi šalju vrijednosti iz
trenutačne transakcije na adrese drugih korisnika.</div>
<div lang="zxx">
Kada se bitcoin transakcija potpisuje, moguće je
potpisati razne kombinacije ulaza i izlaza. Postoje tri moguće vrste
potpisa, tzv. sighash_all, sighash_none te sighash_single. Uz to, uz
svaki od tri tipa može ići dodatan modifikator anyonecanpay.</div>
<br />
<h2>
SIGHASH_ALL</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Sighash_all najčešća je vrsta potpisa kod koje se
potpisuju svi ulazi i izlazi iz transakcije. Ovaj način potpisivanja
štiti cijelu transakciju od mogućih promjena.</div>
<br />
<h2>
SIGHASH_NONE</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Ovaj način potpisivanja transakcije potpisuje sve
ulaze, ali niti jedan izlaz što omogućuje bilokome da odredi kuda
će se poslati satoshiji iz transakcije.</div>
<br />
<h2>
SIGHASH_SINGLE</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Kod ovakvog se načina potpisivanja potpisuje se točno
jedan izlaz čiji indeks odgovara ulazu specificiranom parametrom.
Dakle, potpisuje se samo jedan ulaz i izlaz. Ostali se izlazi
potpisuju samo djelomično (može im se promijeniti broj u nizu,
engl. Sequence number). Takva transakcija omogućue drugim
korisnicima da dodaju vlastite izlaze u nju.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Ovaj tip potpisa ne bi smio imati više ulaza nego
izlaza, no Bitcoin protokol to ne zabranjuje. Ako se specificira ulaz
koji nema pripadajući izlaz, nepostojećem će se izlazu pridijeliti
hash 0x01.</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
SIGHASH_ANYONECANPAY</h2>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Ovaj modifikator znači da se potpisuje samo ulaz
specificiran parametrom. Ostali korisnici mogu dodavati ulaze po
želji.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
To daje još tri mogućnosti potpisivanja transakcija.</div>
<br />
<h2>
SIGHASH_ALL SIGHASH_ANYONECANPAY</h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<span lang="zxx">Potpisuje sve izlaze i samo jedan ulaz. </span><span lang="zxx">Ovo
omogućuje bilo kome da doda još ulaza u transakciju no ostali ne
mogu promijeniti koliko će se satoshija poslati i na koju adresu.</span><br />
<br />
<h2>
<span lang="zxx">SIGHASH_NONE SIGHASH_ANYONECANPAY</span></h2>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<span lang="zxx">Potpisuje samo jedan ulaz te niti jedan od
izlaza. Omogućuje ostalima da dodaju ulaze i izlaze po želji,
odnosno da potroše transakciju kako žele.</span><br />
<br />
<h2>
<span lang="zxx">SIGHASH_SINGLE SIGHASH_ANYONECANPAY</span></h2>
<span lang="zxx"> Potpisuje samo jedan ulazi i izlaz. Ostalima omogućuje proizvoljno dodavanje ulaza i izlaza.</span>Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-82698452633208531502015-10-18T13:07:00.001-07:002015-12-15T12:05:00.355-08:00Striktni DER potpisi (BIP66)<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
U protokolu Bitcoin digitalni se potpisi enkodiraju u
<a href="https://en.wikipedia.org/wiki/X.690#DER_encoding">DER</a> formatu. DER (distinguished encoding rules) je potskup BER
formata (basic encoding rules) koji služi za enkodiranje podatkovnih
struktura. DER format koristi se za jednoznačno enkodiranje, na
primjer u kriptografskim protokolima.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Za validaciju potpisa transakcija u protokolu Bitcoin
koristila se biblioteka OpenSSL. Budući da je ta biblioteka
dopuštala određena odstupanja od DER formata, propisan je striktni
DER format za enkodiranje potpisa. Taj format ne dopušta odstupanja
te potpis koji nije u striktnom DER formatu nije validan.</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
Striktni DER format</h2>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
Striktni DER format izgleda ovako:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">0x30 [ukupna-duljina] 0x02 [R-duljina] [R-vrijednost] 0x02
[S-duljina] [S-vrijednost][tip potpisa]</span><br />
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<ul>
<li>Svaki DER potpis počinje bajtom 0x30.<br />
</li>
<li>Ukupna-duljina je duljina u bajtovima svega što slijedi, ne
računajući bajt za tip potpisa.<br />
</li>
<li>0x02 je bajt separatora.<br />
</li>
<li>R-duljina je bajt koji predstavlja duljina vrijednosti R u
bajtovima.<br />
</li>
<li>R je vrijednost proizvoljne duljine enkodirana u big-endian
formatu. Predstavlja r vrijednost u algoritmu <a href="https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Signature_generation_algorithm">ECDSA</a>.
Vrijednost ne može počinjati bajtom 0x00, osim ako bajt koji
slijedi nije 0x80 ili veći. Ako je to slučaj, početni bajt mora
biti 0x00.<br />
</li>
<li>S-duljina je bajt koji predstavlja duljina vrijednosti S u
bajtovima.<br />
</li>
<li>S je vrijednost proizvoljne duljine enkodirana u big-endian
formatu. Predstavlja s vrijednost u algoritmu ECDSA. Vrijednost ne
može počinjati bajtom 0x00, osim ako bajt koji slijedi nije 0x80
ili veći. Ako je to slučaj, početni bajt mora biti 0x00.<br />
</li>
<li>Tip potpisa je bajt koji označuje vrstu potpisa. Dozvoljene
su mu vrijednosti 0x01, 0x02, 0x03, 0x81, 0x82 te 0x83.<br />
</li>
</ul>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
Ukupna duljina potpisa je najviše 72 bajta. Svi blokovi čiji rudari prepoznaju BIP66 imaju verziju 3.<br />
<div lang="zxx">
<br /></div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-7277836290142978072015-10-08T07:16:00.001-07:002015-10-08T07:16:06.620-07:00Formati ključeva
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
U protokolu Bitcoin postoje dvije vrste ključeva:
privatni i javni. Privatni je ključ broj u rasponu od 1 do
115792089237316195423570985008687907852837564279074904382605163141518161494336.
Javni ključ generira se iz privatnog množenjem privatnog ključa
generatorom sliptičke krivulje. Rezultat su dva broja, x koordinata
krivulje te y koordinata krivulje. Javni se i privatni ključevi radi
praktičnosti zapisa ne prikauzju uvijek u decimalnom obliku.</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Slijede primjeri različitih oblika zapisa ključeva.
Za primjer privatnog ključa uzet je
</div>
<div lang="zxx">
d =
105627842363267744400190144423808258002852957479547731009248450467191077417570.
Njemu pripadajući javni ključ je
</div>
<div lang="zxx">
Q =
[40052878126280527701260741223305245603564636128202744842713277751919610658249,</div>
<div lang="zxx">
112427920116541844817408230468149218341228927370925731589596315545721129686052]
gdje je prvi broj x koordinata, a drugi y koordinata eliptičke
krivulje.</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
Privatni ključevi</h2>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Slijede formati zapisa privatnih ključeva. Duljina
privatnog ključa je 32 bajta ili 256 bitova.</div>
<div lang="zxx">
<br /></div>
<h3>
Heksadecimalni</h3>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Najčešći format zapisa privatnog ključe je
heksadecimalni. To je ujedno i najjednostavniji zapis jer je privatni
ključ potrebno samo pretvoriti u heksadecimalni oblik. Takav zapis
izgledao bi ovako:</div>
<div lang="zxx">
E9873D79C6D87DC0FB6A5778633389F4453213303DA61F20BD67FC233AA33262.
Njegova duljina je 64 heksadecimalna znaka.</div>
<div lang="zxx">
<br /></div>
<h3>
Heksadecimalni kompresirani</h3>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Još jedan jednostavni format zapisa privatnog ključa
je heksadecimalni kompresirani format. Sastoji se od dodavanja bajta
'0x1' na kraj ključa. Tako bi ključ iz primjera izgledao ovako:
E9873D79C6D87DC0FB6A5778633389F4453213303DA61F20BD67FC233AA3326201.
Duljina mu je 66 heksadecimalna znaka.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Heksadecimalni kompresirani format zapravo je dulji od
normalnog heksadecimalnog formata. Naziva se kompresirani samo zato
što služi za generiranje kompresiranih javnih ključeva koji
umjesto 65 bajtova zauzimaju samo 33 bajta.</div>
<div lang="zxx">
<br /></div>
<h3 lang="zxx">
Wallet Import Format (WIF)</h3>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
WIF je jedan od najčešćih formata zapisa privatnog
ključa. Najčešće ga koriste novčanici za spremanje ključa.
Postupak pretvaranja privatnog ključa u WIF format ima nekoliko
koraka:</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<ol>
<li><div lang="zxx">
Generira se privatni ključ.</div>
</li>
<li><div lang="zxx">
Na početak mu se doda bajt 0x80.</div>
</li>
<li><div lang="zxx">
Taj se niz dva puta hashira algoritmom SHA256.</div>
</li>
<li><div lang="zxx">
Od dobivenog se rezultata uzmu početna četiri
bajta koji će služiti kao zaština suma.</div>
</li>
<li><div lang="zxx">
Ta se četiri bajta dodaju na kraju niza dobivenog
u drugom koraku.</div>
</li>
<li><div lang="zxx">
Dobiveni se niz zatim pretvori u base58check bazu.</div>
</li>
</ol>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<div lang="zxx">
Za ključ iz primjera WIF je
5Kb8kLf9zgWQnogidDA76MzPL6TsZZY36hWXMssSzNydYXYB9KF. Wallet import
format uvijek počinje brojem 5.</div>
<div lang="zxx">
<br /></div>
<h3 lang="zxx">
Kompresirani WIF</h3>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Kompresirani WIF sličan je normalnom WIF zapisu samo
što se dobiva iz kompresiranog privatnog ključa. U koracima
navedenima za dobivanje wallet import formata u drugom je koraku
potrebno dodati i bajt '0x1' na kraj niza uz bajt '0x80' na početku
niza. Rezultat je
L53fCHmQhbNp1B4JipfBtfeHZH7cAibzG9oK19XfiFzxHgAkz6JK. Kompresirani
WIF ključevi počinju s 'K' ili 'L'.</div>
<div lang="zxx">
<br /></div>
<h2 lang="zxx">
Javni ključevi</h2>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Slijede formati zapisa javnih ključeva. Duljina
privatnog ključa je 64 bajta plus bajt prefiksa što daje 512,
odnosno 520 bitova.</div>
<div lang="zxx">
<br /></div>
<h3 lang="zxx">
Heksadecimalni</h3>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<div lang="zxx">
Zapis javnog ključa u heksadecimalnom formatu je: 04
|| x || y. Operator || označuje konkatenaciju, a x i y su x i y
koordinate javnog ključa u heksadecimalnom obliku. Javni ključbi
tad izgledao:</div>
<div lang="zxx">
04588d202afcc1ee4ab5254c7847ec25b9a135bbda0f2bc69ee1a714749fd77dc9f88ff2a00d7e752d44cbe16e1ebcf0890b76ec7c78886109dee76ccfc8445424.
Duljina mu je 130 heksadecimalnih znakova odnosno 65 bajtova
računajući bajt prefiksa '0x4'.</div>
<div lang="zxx">
<br /></div>
<h3 lang="zxx">
Heksadecimalni kompresirani</h3>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<span lang="zxx">Kompresirani javni ključ dobiva se iz
kompresiranog privatnog ključa. Umjesto da se sastoji od x i y
koordinate, dovoljna je samo x koordinata. Y se dobije rješavanjem
jednadžbe eliptičke krivulje </span>(y<sup>2</sup> = x<sup>3</sup>
+ 7) mod p<span lang="zxx">. Da bi se jednoznačno odredio y potrebna
je informacija je li on pozitivan ili negativan (odnosno, u slučaju
konačnog polja, paran ili neparan). Ako je y paran, </span><span lang="zxx">x</span><span lang="zxx">
koordinati dodaje se bajt prefiksa '0x2', ako je neparan dodaje se
'0x3'. </span><span lang="zxx">Kompresirani ključ tada izgleda
ovako:
02588d202afcc1ee4ab5254c7847ec25b9a135bbda0f2bc69ee1a714749fd77dc9. </span><span lang="zxx">U
ovom je slučaju y paran pa je prefiks '0x2'. </span><span lang="zxx">Duljina
mu je 66 znakova, odnosno 33 bajta računajući bajt prefiksa.</span><br />
<span lang="zxx"><br /></span>
<span lang="zxx">Budući da se i kompresirani i nekompresirani
javni ključevi komu koristiti za dobivanje bitcoin adresa te da će
te adrese biti različite, potrebno je paziti koji se ključ koristi.
O tome računa vode bitcoin novčanici koji uglavnom koriste
kompresirani format budući da zauzima manje mjesta.</span><br />
<div lang="zxx">
<br /></div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-36760029156099885732014-12-07T08:53:00.001-08:002014-12-07T08:53:49.840-08:00Mnemonički kod za generiranje determinističkih ključeva (BIP 39)
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Mnemonički kod korisit se za pretvaranje nizova
znamenki u jednoznačno određene riječi engleskog jezika kako bi se
olakšalo njihovo zapisivanje, pamćenje i prenošenje drugim
osobama. Oni se koriste i u generiranju determinističkih novčanika.</div>
<br />
<h2>
Generiranje mnemoničkih kodova</h2>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Mnemonički kod mora enkodirati entropiju u grupama po
32 bita. Što je entropija veća, veća je i sigurnost, no rečenice
su dulje. Propručena veličina entropije (ENT) je 128 do 256 bitova.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Nakon generiranja entropije, generira se zaštitna suma
uzimajući prvih ENT/32 bitova od SHA256(ENT). Drugim riječima,
izračuna se broj grupa od 32 bita (ENT/32) te se zatim uzme toliko
bitova od SHA256 hasha entropije. Zaštitna suma doda se na kraj
generiranih bitova entropije.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Ti se bitovi zatim podijele u grupe duljine 11 bitova.
Svaka grupa predstavlja broj od 0 do 2047 koji predstavljaju indeks u
listi riječi. Te se grupe zatim pretvaraju u riječi i to je
generirani mnemonički kod.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Sljedeća tablica prikazuje odnos duljine entropije
(ENT), duljine zaštitne sume (CS) te duljine generiranog mnemoničkog
koda (MS) u riječima.</div>
<br />
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 201px;">
<colgroup><col width="37"></col>
<col width="33"></col>
<col width="63"></col>
<col width="33"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="37">
ENT<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="33">
CS<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="63">
ENT+CS<br />
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="33">
MS<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="37">
128<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33">
4<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="63">
132<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33">
12<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="37">
160<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33">
5<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="63">
165<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33">
15<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="37">
192<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33">
6<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="63">
198<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33">
18<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="37">
224<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33">
7<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="63">
231<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33">
21<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="37">
256<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33">
8<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="63">
264<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33">
24<br />
</td>
</tr>
</tbody></table>
<br />
<h2>
Lista riječi</h2>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
Idealna lista riječi ima sljedeće karakteristike:<br />
a) Pametan izbor riječi (dovoljno je upisati prva četiri slova
riječi da bi se ona jednoznačno odedila)<br />
b) Izbjegavaju se slične riječi<br />
c) Sortirana lista riječi<br />
Sve riječi moraju biti kodirane u UTF-8 formatu. <a href="https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt">Ovdje</a> je lista takvih riječi.<br />
<br />
<h2>
Korištenje mnemoničkog koda kao sjemena</h2>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
Ako se generirani mnemonički kod želi koristit kao sjeme za
hijerarhijski deterministički novčanik potrebno je koristiti
funkciju PBKDF2. Mnemonički kod koristi se kao lozinka, salt je
riječ “mnemonic” + lozinka, broj iteracija je 2048, a koristi se
HMAC-SHA512.<br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Generiranje sjemena odvojeno je od generiranja koda.</div>
<br />
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-28769614814517963082014-08-09T11:41:00.002-07:002014-08-09T11:41:46.298-07:00Kriptirani privatni ključevi (BIP38)
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Privatne ključeve moguće je kriptirati tako da su
zaštićeni lozinkom. Takav ključ može vidjti bilo tko, no samo
osoba koja zna lozinku može ga dešifrirati. Takva zaštita pogodna
je za kreiranje papirnatih novčanika i fizičkih bitcoina.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Postoje dva načina kriptiranja. Prvi omogućuje da se
bilo koji privatni ključ zaštiti bilo kojom lozinkom. Drugi
omogućuje dijeljeni ključ gdje jedna strana derivira međuključ iz
lozinke, a druga strana derivira konačni ključ i adresu iz
međuključa. Trošenje bitcoina moguće je jedino onome tko zna
lozinku.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Uz svaki se kriptirani ključ sprema i hash
rezultirajuće adrese koji služi za provjeru ispravnosti adrese.</div>
<br />
<h3>
Korištene funkcije</h3>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
<b>AES256Encrypt, AES256Decrpyt</b> – šifriranje i
dešifriranje pomoću AES šifre. Prima ključ od 256 bitova te 16
bajtova ulaza i deterministički daje 16 bajtova izlaza.</div>
<div lang="zxx">
<b>SHA256</b> – Algoritam za hashitanje koji uzima ulaz
proizvoljne duljine te daje fiksni izlaz od 256 bitova (32 bajta).</div>
<div lang="zxx">
<b>Scrypt</b> – Algoritam za deriviranje ključeva (engl.
key derivation algorithm). Parametri: lozinka, salt, n, r, p,
duljina. Kao izlaz daje niz znakova dužine parametra "duljina".</div>
<div lang="zxx">
<b>ECMultiply</b> – množenje na krivulji secp256k1.</div>
<div lang="zxx">
<b>G, N</b> – generator i red generatora eliptičke krivulje
secp256k1.</div>
<div lang="zxx">
<b>Base58Check</b> – alfanumerička baza 58 koja se koristi
za enkodiranje bitcoin adresa.</div>
<div lang="zxx">
<br /></div>
<h3 lang="zxx">
Format kriptiranog ključa</h3>
<h3 lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</h3>
<ol>
<li><div lang="zxx">
Ključ počinje prefiksom 0x0142 ili 0x0143 ovisno
o tome je li korišteno množenje na eliptičkoj krivulji. Kad se na
to primijeni Base58Check, korisnik će vidjeti 6P. Svaki kriptirani
ključ počinje znakovima 6P. 6 zato da se razlikuje od normalnog
privatnog ključa koji uvijek počinju brojem 5. Broj 6 znači da se
radi o kriptiranom ključu koji se dekriptira pomoću metode P. P u
ovom slučaju označuje lozinku (engl. Passphrase).</div>
</li>
<li>37 bajtova sadržaja:</li>
<ol>
<li><div lang="zxx">
zastavica (1 bajt) označuje koristi li se
množenje na krivulji ili ne</div>
</li>
<li><div lang="zxx">
zaštitna suma (4 bajta)
SHA256(SHA256(očekivana_bitcoin_adresa))[0..3]</div>
</li>
<li><div lang="zxx">
16 bajtova ovisno o množenju</div>
</li>
<li><div lang="zxx">
16 bajtova AES šifrirani sadržaj (ovisi o
množenju)</div>
</li>
</ol>
</ol>
<h3 lang="zxx">
Enkripcija bez množenja na eliptičkoj krivulji</h3>
<h3 lang="zxx">
</h3>
<div lang="zxx">
Enkripcija:</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</div>
<ol>
<li><div lang="zxx">
Izračunati bitcoin adresu i uzeti prva četiri
bajta od SHA256(SHA256(adresa)). To je hash_adrese.</div>
</li>
<li><div lang="zxx">
Derivirati ključ iz lozinke pomoću funkcije
scrypt s parametrima n=16384, r=8, p=8, duljina=64. Salt je
hash_adrese. Podijeliti dobivena 64 bajta na dva dijela: polovica1 i
polovica2.</div>
</li>
<li><div lang="zxx">
Napraviti AES256Encrypt(privatni_ključ[0..15] xor
polovica1[0..15], polovica2). Rezultat je enkriptirana_polovica1.</div>
</li>
<li><div lang="zxx">
Napraviti AES256Encrypt(privatni_ključ[16..31]
xor polovica1[16..31], polovica2). Rezultat je
enkriptirana_polovica2.</div>
</li>
</ol>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Konačan je rezultat: Base58Check(0x01 0x42 + zastavica
+ salt + enkriptirana_polovica1 + enkriptirana_polovica2).</div>
<div lang="zxx">
<br /></div>
Dekripcija:<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<ol>
<li><div lang="zxx">
Uzeti enkriptirani ključ i lozinku.</div>
</li>
<li><div lang="zxx">
Izračunati polovica1 i polovica2 korištenjem
algoritma scrypt predajući mu lozinku i hash_adrese.</div>
</li>
<li><div lang="zxx">
Izračunati enkriptirana_polovica1 i
enkriptirana_polovica2 korištenjem AES256Decrypt.</div>
</li>
<li><div lang="zxx">
Iz privatnog ključa izračunati bitcoin adresu.</div>
</li>
<li><div lang="zxx">
Hashirati bitcoin adresu i provjeriti odgovara li
hash_adrese.</div>
</li>
</ol>
<br />
<h3>
Enkripcija s množenjem na eliptičkoj krivulji</h3>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Ovakav način enkripcije omogućuje da se kriptirani
ključ generira poznavajući samo točku na eliptičkoj krivulji i
salt koji je korisnik generirao bez poznavanja lozinke. Osoba koja
zna lozinku naziva se vlasnik i ona generira jedan ili više
međuključeva te i predaje osobi, pisaču, koja će generirati
enkriptirani privatni ključ.</div>
<div lang="zxx">
Enkriptirani privatni ključ može sadržavati broj
čestice i redni broj. Zajedno su duljine 32 bita. Broj čestice je
duljine 20 bitova, a redni broj 12 bitova.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Algoritam kojim vlasnik generira međuključ:</div>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<ol>
<li><div lang="zxx">
Generirati 4 nasumična bajta salt_vlasnika</div>
</li>
<li><div lang="zxx">
Kodirati broj čestice i redni broj u big-endian
formatu: čestica * 4096 + redni_broj. Ta se četiri bajta nazivaju
čestica_redni broj.</div>
</li>
<li><div lang="zxx">
Konkatenirati salt_vlasnika i čestica_redni_broj.
To se naziva entropija_vlasnika. Ako se ne koriste čestica i redni
broj, entropija_vlasnika = salt_vlasnika.</div>
</li>
<li><div lang="zxx">
Generirati ključ iz lozinke pomoću algoritma
scrypt duljine 32 bajta. Ti se bajtovi nazivaju predfaktor.
Napraviti SHA256(SHA256(predfaktor + entropija_vlasnika)). To se
naziva faktor_lozinke. Ako se ne koriste čestica i redni broj,
faktor_lozinke je rezultat izvođenja algoritma scrypt.</div>
</li>
<li><div lang="zxx">
Pomnožiti faktor_lozinke s generatorom eliptičke
krivulje te zapisati u kompresiranom formatu (33 bajta).</div>
</li>
<li><div lang="zxx">
Proslijediti rezultat množenja i salt_vlasnika
pisaču.</div>
</li>
</ol>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Nakon što dobije međuključ od vlasnika, pisač
provodi algoritam:</div>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<ol>
<li><div lang="zxx">
Postavi zastavicu.</div>
</li>
<li><div lang="zxx">
Generira 24 nasumična bajta zvana sjemeb te
napravi SHA256(SHA256()) nad njima. Rezultat se naziva faktorb.</div>
</li>
<li><div lang="zxx">
Pomnoži točku dobivenu od vlasnika sa faktoromb.
Rezltat koristit kao javni ključ iz kojeg se izvede bitcoin adresa.
To se zove generirana_adresa.</div>
</li>
<li><div lang="zxx">
SHA256(SHA256(generirana_adresa))[0..3] =
hash_adrese</div>
</li>
<li><div lang="zxx">
scrypt(sjemeb) duljine 64 bajta, salt je
hash_adrese + entropija_vlasnika</div>
</li>
<li><div lang="zxx">
Podijeliti dobivena 64 bajta na dva dijela:
polovica1 i polovica2.</div>
</li>
<li><div lang="zxx">
Napraviti AES256Encrypt(sjemeb[0..15] xor
polovica1[0..15], polovica2). Rezultat je enkriptirana_polovica1.</div>
</li>
<li><div lang="zxx">
Napraviti
AES256Encrypt(enkriptirana_polovica1[8..15] + sjemeb[16..23] xor
polovica1[16..235], polovica2). Rezultat je enkriptirana_polovica2.</div>
</li>
</ol>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div lang="zxx">
Za konačan rezultat potrebno je napraviti Base58Check
od 0x01 0x43 + zastavica + hash_adrese + entropija_vlasnika +
enkriptirana_polovica1[0..7] + enkriptirana_polovica2.</div>
<br />
Dekripcija:<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<ol>
<li><div lang="zxx">
Prikupiti enkriptirani privatni ključ i lozinku
od korisnika.</div>
</li>
<li><div lang="zxx">
Dobiti faktor_lozinke pomoću algoritma scrypt
koristeći salt_vlasnika i lozinku.</div>
</li>
<li><div lang="zxx">
Dobiti ključ za dekripciju za sjemeb koristeći
scrypt sa hash_adrese, entropija_vlasnika i rezultatom iz prethodnog
koraka.</div>
</li>
<li><div lang="zxx">
Dekriptirati enkriptirana_polovica2 pomoću
AES256Decrpyt da se dobije početnih 8 bajtova sjemeb i završnih 8
bajtova za enkriptirana_polovica1.</div>
</li>
<li><div lang="zxx">
Dekriptirati enkriptirana_polovica1 da se dobije
ostatak sjemeb.</div>
</li>
<li><div lang="zxx">
Iz sjemeb izvesti faktorb.</div>
</li>
<li><div lang="zxx">
Pomnožiti faktor_lozinke i faktorb da se dobije
privatni ključ povezan s generirana_adresa.</div>
</li>
<li><div lang="zxx">
Iz privatnog ključa izvesti bitcoin adresu.</div>
</li>
<li><div lang="zxx">
Provjeriti odgovara li hash_adrese.</div>
</li>
</ol>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-13331695094105928742014-06-26T11:14:00.001-07:002014-06-26T11:14:07.981-07:00Hijerarhijski deterministički novčanici (BIP32)
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Bitcoin novčanici mogu se
podijeliti u dvije generacije. Prva generira privatne ključeve
nasumično, tj. nedeterministički (npr. Bitcoin client ili
Multibit). Novčanici druge generacije privatne ključeve generiraju
iz jednog alfanumeričkog niza znakova, tzv. sjemena (npr. Electrum).
Prednost takvih novčanika je što se ne mora raditi backup svakog
ključa nego je dovoljno napraviti backup samo sjemena iz kojeg se
zatim deterministički generiraju privatni i odgovarajući javni
ključevi.</div>
<br />
<h2>
<span style="font-size: large;"> Hijerarhijski deterministički novčanici</span></h2>
<h2>
<span style="font-size: large;"> </span></h2>
<h2>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h2>
<div lang="zxx">
HD novčanici temelje se na matematici eliptičkih
krivulja. Tipovi podataka koji se koriste su: cijeli brojevi (modulo
red krivulje), koordinate točaka na krivulji i nizovi bajtova.
Funkcije koje će se koristiti su (|| označuje konkatenaciju):</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<ul>
<li><div lang="zxx">
point (p) – vraća koordinate točke koja se
dobije množenjem broja p generatorom krivulje G.</div>
</li>
<li><div lang="zxx">
ser<sub>32</sub>(i) – serijalizira 32-bitni
cijeli broj bez predznaka kao niz od 4 bajta, najznačajniji bajt
prvi</div>
</li>
<li><div lang="zxx">
ser<sub>256</sub>(p) – serijalizira cijeli broj
p kao niz od 32 bajta, najznačajniji bajt prvi</div>
</li>
<li><span lang="zxx">ser</span><sub><span lang="zxx">P</span></sub><span lang="zxx">(P)
– serijalizira točku P kao niz bajtova koristeći <a href="https://bitcointalk.org/index.php?topic=237260.msg2509914#msg2509914">SEC1 kompresirani oblik</a>:
ser</span><sub><span lang="zxx">P</span></sub><span lang="zxx">(P) =
(0x02 ili 0x03) || ser</span><sub><span lang="zxx">256</span></sub><span lang="zxx">(x)</span><br />
</li>
<li><div lang="zxx">
parse<sub>256</sub>(p) – interpretira niz od 32
bajta kao 256-bitni broj, najznačajniji bajt prvi</div>
</li>
</ul>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<div lang="zxx">
U HD novčanicima koriste se tzv. prošireni ključevi.
Ključevi su prošireni s dodatnih 256 bitova entropije i ta se
ekstenzija naziva chain code te se označuje sa "c".
Prošireni privatni ključ je tad par (k, c) gdje je k uobičajeni
privatni ključ, a c je ekstenzija od 256 bitova. Javni ključ je (K,
c) gdje je K uobičajeni javni ključ, K = point(k), a c je chain
code koji može biti isti ili različit od roditeljskog.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx">
Svaki prošireni ključ ima 2<sup>31</sup> normalnih
potključeva (ključeva djece) i 2<sup>31</sup> ojačanih
potključeva. Normalni potključevi koriste indekse od 0 do 2<sup>31</sup>
– 1, a ojačani od 2<sup>31</sup> do 2<sup>32</sup> – 1.
Drugačije zapisano, normalni potključevi su od (k, 0) do (k, 2<sup>31</sup>
– 1), a ojačani od (k, 2<sup>31</sup>) do (k, 2<sup>32</sup> –
1). Odnosno, chain code ojačanih ključeva počinje bitom 1. Vidimo
da svaki prošireni ključ može imati 2<sup>32</sup> ključeva
djece, odnosno 4 294 967 296 potključeva.</div>
<br />
<h3>
Derivacija ključeva djece</h3>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<div lang="zxx">
HD novčanik stablasta je struktura koja omogućuje da
se potključevi (ključevi djeca) deriviraju iz ključeva roditelja.
Iz privatnog roditeljskog ključa moguće je izvesti privatni ključ
dijete, iz javnog roditeljskog ključa javni ključ dijete te iz
privatnog roditeljskog ključa javni ključ dijete.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx">
Funkcije za deriviranje temelje se na HMAC-SHA512 te
koriste indeks koji se označuje s "i". HMAC prima dva
parametra ključ (Key) i podatke (Data) Derivacije ovise o tome radi
li se o normalnom potključu ili o ojačanom.</div>
<br />
<h4 class="western" lang="zxx">
Privatni roditeljski ključ
<style type="text/css">H3 { margin-bottom: 0.08in; }H3.western { font-family: "Liberation Sans",sans-serif; }H3.cjk { font-family: "Droid Sans Fallback"; }P { margin-bottom: 0.08in; }A:link { }</style>
→ privatni ključ dijete</h4>
<div class="western" lang="zxx">
<br /></div>
<div class="western" lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Funkcija CKD</span><span style="font-size: small;"><sub>priv</sub>
(child key derivation) izračunava prošireni privatni potključ iz
proširenog privatnog roditeljskog ključa: CKD<sub>priv</sub>((k<sub>par</sub>,
c<sub>par</sub>),
i) → (k<sub>i</sub>,
c<sub>i</sub>).</span></span></div>
<h3>
</h3>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Algoritam:</span></span></div>
<span style="font-family: inherit;"><span style="font-size: small;">
</span></span><ul>
<li><div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Provjeri je
li i ≥ 2</span><span style="font-size: small;"><sup>31
</sup>(želimo li
derivirati normalan ili ojačani potključ)</span></span></div>
<ul>
<li><div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Ako je, I =
HMAC-SHA512(ključ = c<sub>par</sub>, podaci = 0x00 ||
ser<sub>256</sub>(k<sub>par</sub>) || ser<sub>32</sub>(i))</span></span></div>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Ako nije, I
= HMAC-SHA512(ključ = c<sub>par</sub>, podaci = ser<sub>P</sub>(point(k<sub>par</sub>))
|| ser<sub>32</sub>(i))</span></span></div>
</li>
</ul>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Podijeli I na
dva dijela po 32 bita I<sub>L</sub> te I<sub>R</sub></span></span></div>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Dijete ključ
je k<sub>i</sub> = parse<sub>256</sub>(I<sub>L</sub>) + k<sub>par</sub></span></span></div>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Novi chain
code je I<sub>R</sub></span></span></div>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;"><span style="font-size: small;">Ako je
parse<sub>256</sub>(I<sub>L</sub>) ≥ n ili k<sub>i</sub> = 0, uzmi
novi i</span></span></div>
</li>
</ul>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
<span style="font-family: inherit;">Iz jednog
proširenog roditeljskog privatnog ključa moguće je dobiti 2<sup>32</sup>
privatnih ključeva djece. Polovica tih ključeva su normalni, a
polovica ojačani. Iz tih se ključeva zatim može derivirati daljnih
2<sup>32</sup> ključeva itd.</span></div>
<div lang="zxx">
<br /></div>
<h4 lang="zxx">
<span style="font-family: inherit;">Javni roditeljski ključ </span><span style="font-family: inherit;">
<style type="text/css">H3 { margin-bottom: 0.08in; }H3.western { font-family: "Liberation Sans",sans-serif; }H3.cjk { font-family: "Droid Sans Fallback"; }P { margin-bottom: 0.08in; }A:link { }</style></span>→ <span style="font-family: inherit;">javni ključ dijete</span></h4>
<h4 lang="zxx">
<span style="font-family: inherit;"> </span></h4>
<div lang="zxx">
<span style="font-family: inherit;">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span></div>
<div lang="zxx">
Ojačane ključeve djecu nemoguće je ovako derivirati.
Ovaj algoritam derivira samo normalne ključeve i < 2<sup>31</sup>.
Algoritam <span style="font-family: Liberation Serif, serif;">CKD</span><sub><span style="font-family: Liberation Serif, serif;">pub</span></sub><span style="font-family: Liberation Serif, serif;">((K</span><sub><span style="font-family: Liberation Serif, serif;">par</span></sub><span style="font-family: Liberation Serif, serif;">,
c</span><sub><span style="font-family: Liberation Serif, serif;">par</span></sub><span style="font-family: Liberation Serif, serif;">),
i)</span>:</div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<ul>
<li><div lang="zxx">
<span style="font-family: inherit;">I = HMAC-SHA512(ključ
= c<sub>par</sub>,
podaci = ser<sub>P</sub>(K<sub>par</sub>)
|| ser<sub>32</sub>(i))</span></div>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;">Podijeli I na
dva dijela po 32 bita I<sub>L</sub> te I<sub>R</sub></span></div>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;">Dijete ključ
je K<sub>i</sub> = point(parse<sub>256</sub>(I<sub>L</sub>)) + K<sub>par</sub></span></div>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;">Novi chain
code je I<sub>R</sub></span></div>
</li>
<li><div lang="zxx">
<span style="font-family: inherit;">Ako je
parse<sub>256</sub>(I<sub>L</sub>) ≥ n ili je K<sub>i</sub> točka
u beskonačnosti , uzmi novi i</span></div>
</li>
</ul>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<span style="font-family: inherit;">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span></div>
<div lang="zxx">
<span style="font-family: inherit;">Iz ovog je
vidljivo da je moguće generirati javne podključeve bez generiranja
privatnih ključeva. Odgovarajuće privatne ključeve moguće je
generirati naknadno.</span></div>
<div lang="zxx">
<br /></div>
<h4 lang="zxx">
<span style="font-family: inherit;">Privatni roditeljski ključ </span><span style="font-family: inherit;">
<style type="text/css">H2 { margin-bottom: 0.08in; }H2.western { font-family: "Liberation Sans",sans-serif; font-size: 14pt; font-style: italic; }H2.cjk { font-family: "Droid Sans Fallback"; font-size: 14pt; font-style: italic; }H2.ctl { font-size: 14pt; font-style: italic; }P { margin-bottom: 0.08in; }A:link { }</style></span>→<span style="font-family: inherit;"> javni ključ dijete </span><span style="font-family: inherit;"></span></h4>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Iz proširenog se privatnog ključa dobiva prošireni
javni ključ na sljedeći način:</div>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<ul>
<li><div lang="zxx">
N(k, c) = (point(k), c) gdje je c chain code iz
privatnog ključa</div>
</li>
</ul>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Za dobivanje javnog ključa djeteta iz privatnog
roditeljskog ključa primjenjuje se jedna od dvije funkcije:</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<ul>
<li><div lang="zxx">
N(CKD<sub>priv</sub>(k<sub>par</sub>, c<sub>par</sub>),
i) za sve ključeve</div>
</li>
<li><div lang="zxx">
CKD<sub>pub</sub>(N(k<sub>par</sub>, c<sub>par</sub>),
i) samo za normalne ključeve</div>
</li>
</ul>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Kod korištenja ključeva u aplikaciji, chain code se
zanemaruje.</div>
<div lang="zxx">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikJRdhneBvXimZen4aHKW8Tfgkj8sjUhnvRUVBuhHXyDsv38mj5m865LMOTHK_jdwRBxFR8CI7YDUm3K2UA6kU5cAqxQ_9CCmQORvKW9eClrjYWkcWiGDNit21uKDlGEqJEd_AU5GmhOaW/s1600/derivation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikJRdhneBvXimZen4aHKW8Tfgkj8sjUhnvRUVBuhHXyDsv38mj5m865LMOTHK_jdwRBxFR8CI7YDUm3K2UA6kU5cAqxQ_9CCmQORvKW9eClrjYWkcWiGDNit21uKDlGEqJEd_AU5GmhOaW/s1600/derivation.png" height="197" width="320" /></a></div>
<div lang="zxx">
<br /></div>
<br />
<br />
<br />
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-78786248129505161992014-05-23T10:28:00.000-07:002014-05-23T10:28:50.269-07:00Standardne transakcije
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
<div style="margin-bottom: 0in;">
U Bitcoinu (verziji klijenta 0.9)
postoji pet vrsta standardnih transakcija koje se razvrstavaju prema
formatu izalza. Tih pet vrsta su: plaćanje na javni ključ (pay to
public key, P2PK), plaćanje na hash javnog ključa (pay to publick
key hash, P2PKH), plaćanje na hash skripte (pay to script hash,
P2SH), višepotpisna transakcija te null transakcija</div>
<br />
<h3>
Plaćanje na javni ključ (P2PK)</h3>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Ovakav se način plaćanja izbjagava jer nije siguran. Koristi se
jedino u coinbase transakcijama kad rudaru treba isplatiti nagradu za
točno riješen blok.<br />
<br />
scriptSig: <sig>
<br />
scriptPubKey: <pubKey> OP_CHECKSIG<br />
<br />
<h3>
Plaćanje na hash javnog ključa (P2PKH)</h3>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Ovo je najčešći način plaćanja. Ne koristi se direktno javni
ključ nego bitcoin adresa (hash javnog ključa).<br />
<br />
scriptSig: <sig> <pubKey><br />
scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY
OP_CHECKSIG<br />
<br />
<style type="text/css">H2 { margin-bottom: 0.08in; }H2.western { font-family: "Liberation Sans",sans-serif; font-size: 14pt; font-style: italic; }H2.cjk { font-family: "Droid Sans Fallback"; font-size: 14pt; font-style: italic; }H2.ctl { font-size: 14pt; font-style: italic; }P { margin-bottom: 0.08in; }</style>
<br />
<h3 class="western">
Plaćanje na hash skripte (P2SH)</h3>
<h3 class="western">
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</h3>
Ovo je kompleksniji način plaćanja od gornja dva. Umjesto hash
javnog ključa u skripti se nalazi hash druge skripte. Onaj tko hoće
potrošiti bitcoine iz takve tranaskcije, mora umjesto javnog ključa
dati skriptu koja kad se hashira, odgovara hashu iz potpisa.<br />
<br />
scriptSig: <sig><redeemscript><br />
scriptPubKey: OP_HASH160 <redeemscripthash> OP_EQUAL<br />
<br />
<h3>
Višepotpisna transakcija (multisig)</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</h3>
Transakcije za koje je potrebno m od n potpisa da bi ih se moglo
potrošiti.<br />
<br />
<div lang="zxx">
scriptSig: <sig1> <sig2></div>
<div lang="zxx">
scriptPubKey: OP_2 <pubKey1> <pubKey2>
<pubKey3> OP_3 OP_CHECKMULTISIG</div>
<br />
<h3>
Null transakcija</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }</style>
</h3>
Tranaskcija koja se ne može potrošit inego je označana kao
nevaljala. U nju je moguće dodati malu količinu podataka koju
određeni klijenti mogu interpretirati. Tako rade protokoli izgrađeni
na bitcoinu, npr. Colored coins.<br />
<br />
scriptSig: OP_RETURN <data><br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }</style>
<br />
Sve su ostale transakcije nestandardne. To znači da ako izlaz
nije u jednom od pet gorenabrojenih formata, rudari neće prihvaćati
niti rudariti takve transakcije.<br />
<br />
<h3>
</h3>
<h3>
</h3>
<h3 class="western">
</h3>
<br />
<br />
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-56699020861442926112014-05-17T12:52:00.002-07:002014-05-23T10:11:36.980-07:00Naprednije Bitcoin skripte<h3>
Transakcija s više potpisa</h3>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Transakcije s više potpisa (engl.
multisignature/multisig) zathijevaju više od jednog ključa
(potpisa) da se pristupi bitcoinima, npr. dva od tri.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Primjer 2-od-3: scriptSig: <sig1> <sig2></div>
<div lang="zxx">
scriptPubKey: OP_2 <pubKey1> <pubKey2>
<pubKey3> OP_3 OP_CHECKMULTISIG</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
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.</div>
<br />
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="85*"></col>
<col width="85*"></col>
<col width="85*"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="33%"><div align="CENTER" lang="zxx">
<b>Stog</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="33%"><div align="CENTER" lang="zxx">
<b>Naredba</b></div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="33%"><div align="CENTER" lang="zxx">
<b>Opis</b></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<sig2></div>
<div lang="zxx">
<sig1></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<br /></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33%"><div lang="zxx">
Potpisi se stavljaju na stog.</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<2></div>
<div lang="zxx">
<sig2></div>
<div lang="zxx">
<sig1></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<br /></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33%"><div lang="zxx">
Dodaje se broj potpisa potreban za otključavanje.</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<pubKey3></div>
<div lang="zxx">
<pubKey2></div>
<div lang="zxx">
<pubKey1></div>
<div lang="zxx">
<2></div>
<div lang="zxx">
<sig2></div>
<div lang="zxx">
<sig1></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<br /></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33%"><div lang="zxx">
Dodaju se javni ključevi pomoću koji se
verificiraju potpisi. Potpisi i ključevi verificiraju se u
parovima.</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<3></div>
<div lang="zxx">
<pubKey3></div>
<div lang="zxx">
<pubKey2></div>
<div lang="zxx">
<pubKey1></div>
<div lang="zxx">
<2></div>
<div lang="zxx">
<sig2></div>
<div lang="zxx">
<sig1></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
OP_CHECKMULTISIG</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33%"><div lang="zxx">
Dodaje se broj javnih ključeva. Sad su na stogu svi
potrebni ulazi za provjeru transakcije.</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<1></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="33%"><div lang="zxx">
<br /></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="33%"><div lang="zxx">
Na stogu je rezulat izvršavanja OP_CHECKMULTISIG
naredbe</div>
</td>
</tr>
</tbody></table>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
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.</div>
<br />
<h3>
Odd/Event Bet</h3>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
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.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
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.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Primjer: scriptSig: <Sig><pubKey></div>
<div lang="zxx">
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</div>
<div lang="zxx">
OP_SWAP OP_MOD</div>
<div lang="zxx">
OP_IF</div>
<div lang="zxx">
<a href="https://www.blogger.com/null" name="__DdeLink__5017_80016259"></a> OP_DUP
OP_HASH160 <pubKeyAHash> OP_EQUALVERIFY OP_CHECKSIG</div>
<div lang="zxx">
OP_ELSE</div>
<div lang="zxx">
OP_DUP OP_HASH160 <pubKeyBHash> OP_EQUALVERIFY
OP_CHECKSIG</div>
<div lang="zxx">
OP_ENDIF</div>
<br />
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 666px;">
<colgroup><col width="213"></col>
<col width="214"></col>
<col width="212"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="213"><div align="CENTER" lang="zxx">
<b>Stog</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="214"><div align="CENTER" lang="zxx">
<b>Naredba</b></div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="212"><div align="CENTER" lang="zxx">
<b>Opis</b></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_2DUP</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Na stog se prvo stavljaju svi elementi i gornja se
dva dupliraju.</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_HASH160</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Hashiranje vrha stoga</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<aHash></div>
<div lang="zxx">
<aHash></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_EQUALVERIFY</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Dodavanje hasha i provjera jesu li jednaki</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<7bb...></div>
<div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_HASH160</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Hashiranje vrha stoga</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<bHash></div>
<div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
<br /></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Dodavanja hasha na stog</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<bHash></div>
<div lang="zxx">
<bHash></div>
<div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_EQUALVERIFY</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Provjera jesu li jednaki</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
<br /></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Dodaje se 1 na stog</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<1></div>
<div lang="zxx">
<5aa...></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_LEFT</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Uzima se <1> znak hash <5aa...></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<5></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_SWAP</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Zamijena dva gornja elementa</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<7bb...></div>
<div lang="zxx">
<5></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
<br /></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Na stog se dodaje <1></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<1></div>
<div lang="zxx">
<7bb...></div>
<div lang="zxx">
<5></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_LEFT</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Uzima se <1> znak hash <7bb...></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<7></div>
<div lang="zxx">
<5></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_ADD</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Gornja se dva elementa zbrajaju</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<12></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
<br /></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Dodaje se 2</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<2></div>
<div lang="zxx">
<12></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_SWAP</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Zamjena</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<12></div>
<div lang="zxx">
<2></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_MOD</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Ostatak pri dijeljenju <12> s <2></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<0></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_IF</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Ako je na vrhu element isitni != 0 izvrši sljedeću
naredbu</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_ELSE</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Ako nije (=0)</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="213"><div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="214"><div lang="zxx">
OP_DUP OP_HASH160 <pubKeyBHash> OP_EQUALVERIFY
OP_CHECKSIG</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="212"><div lang="zxx">
Izvrši ovo</div>
</td>
</tr>
</tbody></table>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
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.</div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-70439185704936473562014-05-15T12:19:00.000-07:002015-10-08T01:57:08.143-07:00Matematika ključeva<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Javni i privatni ključevi u
Bitcoin protokolu generiraju se pomoću <a href="http://en.wikipedia.org/wiki/Elliptic_curve">eliptičke krivulje</a>. To su specijalne krivulje
trećeg stupnja definirane nad nekim poljem i najčešći im je
oblik:</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
(1)
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
y<sup>2</sup> = x<sup>3</sup>
+ ax + b</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Gdje su a, b, x, y elementi
nekog polja (realnih brojeva, kompleksnih brojeva, racionalnih
brojeva itd.). Za potrebe kriptografije eliptičke se krivulje
definiraju nad <a href="http://en.wikipedia.org/wiki/Finite_field">konačnim poljima Fp</a><style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>. To su polja koja za razliku
od prije navedenih imaju konačan broj elemenata p. U kriptografiji p
je najčešće neparan prost broj. Tako se jednadžba (1) pretvara u:</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
(2) (y<sup>2</sup> = x<sup>3</sup>
+ ax + b) mod p</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx" style="margin-bottom: 0in;">
Eliptička krivulja koja se
koristi u protokolu Bitcoin ima službeni naziv <a href="http://www.secg.org/sec2-v2.pdf">secp256k1</a> te
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx" style="margin-bottom: 0in;">
ima jednadžbu:</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
(3)
(y<sup>2</sup> = x<sup>3</sup>
+ 7) mod p</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
Parametri krivulje šest su
elemenata T = (p, a, b, G, n, h).</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div style="margin-bottom: 0in;">
<span lang="zxx">p je veličina
konačnog polja nad kojim je krivulja definirana. U ovom je slučaju
p = 2</span><sup><span lang="zxx">256 –</span></sup><span lang="zxx">
2</span><sup><span lang="zxx">32</span></sup><span lang="zxx"> – 2</span><sup><span lang="zxx">9</span></sup><span lang="zxx">
– 2</span><sup><span lang="zxx">8</span></sup><span lang="zxx"> –
2</span><sup><span lang="zxx">7</span></sup><span lang="zxx"> – 2</span><sup><span lang="zxx">6</span></sup><span lang="zxx">
– 2</span><sup><span lang="zxx">4</span></sup><span lang="zxx"> –
1 odnosno u heksadecimalnom obliku p = </span>FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F</div>
<div style="margin-bottom: 0in;">
<span lang="zxx">a i b su već opisani
koeficijenti jednadžbe: a = 0, b = 7.</span></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span></div>
<div style="margin-bottom: 0in;">
<span lang="zxx">G je točka generator eliptičke krivulje,
slično generatoru <a href="http://en.wikipedia.org/wiki/Cyclic_group">cikličke grupe</a>. Ciklička grupa je grupa koju je moguće
generirati iz jednog njezinog elementa. Takav element naziva se
generator grupe i označava s g. Ostali se elementi generiraju
potenciranjem generatora: g</span><sup><span lang="zxx">n</span></sup><span lang="zxx">,
n </span><span style="font-family: Liberation Serif, serif;"><span lang="zxx">Є [0,
p - 1] </span></span>gdje je p broj elemenata u grupi (veličina polja). Za secp256k1:</div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span></div>
<div style="margin-bottom: 0in;">
<span style="font-family: Liberation Serif, serif;"><span lang="zxx">G
= 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B
16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419
9C47D08F FB10D4B8</span></span></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<span style="font-family: Liberation Serif, serif;"><span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span></span></div>
<div style="margin-bottom: 0in;">
Analogno cikličkoj grupi, sve se točke mogu izvesti iz generatora eliptičke krivulje. Mogu se prikazati u dva oblika, kompresiranom i nekompresiranom. To se prepoznaje prema broju na početku generatora. Ako je broj 0x04 kao u gornjem primjeru znači da je format nekompresiran, a ako je broj 0x02 ili 0x03 radi se o kompresiji. U gornjem je primjeru x koordinata točke generatora <span style="font-family: Liberation Serif, serif;"><span lang="zxx">79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B
16F81798, a y </span></span><br />
<span style="font-family: Liberation Serif, serif;"><span lang="zxx">483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419
9C47D08F FB10D4B8.</span></span></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<span style="font-family: Liberation Serif, serif;"><span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span></span></div>
n je red generatora, odnosno broj koji zadovoljava jednadžbu:<br />
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
(4) n ∙ G = 0 (mod p)<br />
<br /></div>
<div style="margin-bottom: 0in;">
U ovom je primjeru n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141.</div>
<div style="margin-bottom: 0in;">
</div>
<div style="margin-bottom: 0in;">
<style type="text/css">P { margin-bottom: 0.08in; }A:link </style><br />
Parametar h je kofaktor, omjer broja točaka na eliptičkoj krivulji i reda generatora te iznosi h = 1.</div>
<div style="margin-bottom: 0in;">
</div>
<div style="margin-bottom: 0in;">
<h3>
Generiranje ključeva</h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<br />
Privatni ključ d koji se koristi za pristup sredstvima na adresi je slučajno odabrani element iz intervala [1, n – 1] gdje je n red generatora:</div>
<div style="margin-bottom: 0in;">
<br />
(5) d Є [0, FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364140]</div>
<div style="margin-bottom: 0in;">
</div>
<div style="margin-bottom: 0in;">
<style type="text/css">P { margin-bottom: 0.08in; }A:li</style><br />
Javni ključ Q dobiva se iz privatnog ključa d pomoću generatorske točke na krivulji:</div>
<div style="margin-bottom: 0in;">
<br />
(6) Q = d ∙ G (mod p)<br />
<br />
Dakle javni ključ Q je zapravo točka na krivulji dobivena matematičkom operacijom <a href="https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication">množenja</a>. Glavna karakteristika ovakvog množenja je da je ono ireverzibilno. Poznajući Q i G <a href="http://en.wikipedia.org/wiki/Discrete_logarithm">nemoguće</a> je dobiti privatni ključ d.</div>
<div style="margin-bottom: 0in;">
<br />
Jednadžba (6) preciznije napisana je:</div>
<div style="margin-bottom: 0in;">
<br />
(7)
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>Q = d ∙ (xG, yG) = (xQ, yQ)<br />
<br />
Koordinate ključa veličine su 32 bajta. U protokolu Bitcoin te se koordinate konkateniraju i dobiva se javni ključ veličina 64 bajta. On se zatim hashiranjem pretvara u adresu na koju se primaju bitcoini.<br />
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
</div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css"> </style></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx" style="margin-bottom: 0in;">
</div>
<div lang="zxx" style="margin-bottom: 0in;">
</div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-78993628542670284422014-05-11T09:05:00.000-07:002014-05-11T09:05:22.674-07:00Osnove Bitcoin skripti
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
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.</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br />
</div>
<div lang="zxx" style="margin-bottom: 0in;">
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.</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br />
</div>
<div lang="zxx" style="margin-bottom: 0in;">
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.</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<h1 lang="zxx" style="margin-bottom: 0in;">
Primjeri skripti</h1>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx" style="margin-bottom: 0in;">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx">
Script sadrži nekoliko desetaka različitih naredbi.
Ovdje će biti opisane samo one najčešće korištene.</div>
<br />
Primjer transakcije:<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
{
</div>
<div lang="zxx">
"hash":"7c40250...",
</div>
<div lang="zxx">
"ver":1,
</div>
<div lang="zxx">
"vin_sz":1,
</div>
<div lang="zxx">
"vout_sz":1,
</div>
<div lang="zxx">
"lock_time":0,
</div>
<div lang="zxx">
"size":224,
</div>
<div lang="zxx">
"in":[
</div>
<div lang="zxx">
{
</div>
<div lang="zxx">
"prev_out":{
</div>
<div lang="zxx">
"hash":"2007aec...",
</div>
<div lang="zxx">
"n":0
</div>
<div lang="zxx">
},
</div>
<div lang="zxx">
<b>"scriptSig":"signature"</b>
</div>
<div lang="zxx">
}
</div>
<div lang="zxx">
],
</div>
<div lang="zxx">
"out":[
</div>
<div lang="zxx">
{
</div>
<div lang="zxx">
"value":"0.31900000",
</div>
<div lang="zxx">
<b>"scriptPubKey":"script"
</b></div>
<div lang="zxx">
}
</div>
<div lang="zxx">
]
</div>
<div lang="zxx">
}</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Detalji transakcije opisani su <a href="http://btc-croatia.blogspot.com/2014/03/transakcije-prvi-dio.html">ovdje</a> i <a href="http://btc-croatia.blogspot.com/2014/03/transakcije-drugi-dio.html">ovdje</a>. U ovom će se postu opisivati boldani dijelovi.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<div lang="zxx">
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.</div>
<br />
<h3>
Nepotrošiva transakcija</h3>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Najjednostavniji primjer transakcije je
nepotrošiva transakcija ili nul-transakcija.</span><br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Primjer: scriptSig: OP_RETURN</span><br />
<span lang="zxx"> scriptPubKey: .....</span><br />
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 396px;">
<colgroup><col width="81"></col>
<col width="120"></col>
<col width="169"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="81">
<div align="CENTER" lang="zxx">
<b>Stog</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="120">
<div align="CENTER" lang="zxx">
<b>Naredba</b></div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="169">
<div align="CENTER" lang="zxx">
<b>Opis</b></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="81">
<div lang="zxx">
Prazan</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="120">
<div lang="zxx">
OP_RETURN</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="169">
<div lang="zxx">
Neispravna transakcija</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<span lang="zxx">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
<a href="https://www.counterparty.co/">Counterparty</a>.</span><br />
<div lang="zxx">
<br /></div>
<h3 lang="zxx">
Bilotko može potrošiti </h3>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<span lang="zxx">Primjer: scriptSig: (prazno)</span><br />
<span lang="zxx"> scriptPubKey: OP_TRUE</span><br />
<br />
<span lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
</span><br />
<table cellpadding="4" cellspacing="0" style="width: 401px;">
<colgroup><col width="81"></col>
<col width="124"></col>
<col width="169"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="81">
<div align="CENTER" lang="zxx">
<b>Stog</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="124">
<div align="CENTER" lang="zxx">
<b>Naredba</b></div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="169">
<div align="CENTER" lang="zxx">
<b>Opis</b></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="81">
<div lang="zxx">
Prazan</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="124">
<div lang="zxx">
OP_TRUE</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="169">
<div lang="zxx">
Stavlja 1 na stog</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="81">
<div lang="zxx">
1</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="124">
<div lang="zxx">
<br />
</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="169">
<div lang="zxx">
Transakcija ispravna</div>
</td>
</tr>
</tbody></table>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">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.</span><br />
<br />
<h3>
Coinbase transakcija</h3>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Ovo je pojednostavljeni primjer općenite
transakcije. Coinbase transakcija donosi nagradu rudaru koji je
uspješno izrudario prethodni blok.</span><br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Primjer: scriptSig: <sig></span><br />
<span lang="zxx"> scriptPubKey: <pubkey> OP_CHECKSIG</span><br />
<br />
<span lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
</span><br />
<table cellpadding="4" cellspacing="0" style="width: 486px;">
<colgroup><col width="92"></col>
<col width="114"></col>
<col width="254"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="92">
<div align="CENTER" lang="zxx">
<b>Stog</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="114">
<div align="CENTER" lang="zxx">
<b>Naredba</b></div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="254">
<div align="CENTER" lang="zxx">
<b>Opis</b></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="92">
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="114">
<div lang="zxx">
OP_CHECKSIG</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="254">
<div lang="zxx">
Provjerava ispravnost potpisa koristeći javni ključ
novog vlasnika</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="92">
<div lang="zxx">
1</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="114">
<div lang="zxx">
<br />
</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="254">
<div lang="zxx">
Potpis ispravan</div>
</td>
</tr>
</tbody></table>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">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.</span><br />
<br />
<h3>
Osnovna transakcija</h3>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Ovo je primjer transakcije s jednim ulazom i
jednim izlazom.</span><br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Primjer: scriptSig: <sig><pubKey></span><br />
<span lang="zxx"> scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash>
OP_EQUALVERIFY OP_CHECKSIG</span><br />
<br />
<span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span><br />
<span lang="zxx">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.</span><br />
<br />
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 504px;">
<colgroup><col width="119"></col>
<col width="149"></col>
<col width="211"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="119">
<div align="CENTER" lang="zxx">
<b>Stog</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="149">
<div align="CENTER" lang="zxx">
<b>Naredba</b></div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="211">
<div align="CENTER" lang="zxx">
<b>Opis</b></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="119">
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="149">
<div lang="zxx">
OP_DUP</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="211">
<div lang="zxx">
Kopira element s vrha stoga.</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="119">
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="149">
<div lang="zxx">
OP_HASH160</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="211">
<div lang="zxx">
RIPEMD160(SHA256(pubKey))</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="119">
<div lang="zxx">
<pubKeyHash></div>
<div lang="zxx">
<pubKeyHash2></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="149">
<div lang="zxx">
<br />
</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="211">
<div lang="zxx">
Na stog se stavlja bitcoin adresa na koju se šalje
(hash javnog ključa)</div>
<div lang="zxx">
<br />
</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="119">
<div lang="zxx">
<pubKeyHash></div>
<div lang="zxx">
<pubKeyHash2></div>
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="149">
<div lang="zxx">
OP_EQUALVERIFY</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="211">
<div lang="zxx">
Provjerava jesu li hash javnog ključa iz ulaza i
bitcoin adresa isti</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="119">
<div lang="zxx">
<pubKey></div>
<div lang="zxx">
<sig></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="149">
<div lang="zxx">
OP_CHECKSIG</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="211">
<div lang="zxx">
Provjerava potpis pomoću javnog ključa</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="119">
<div lang="zxx">
OP_TRUE</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="149">
<div lang="zxx">
<br />
</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="211">
<div lang="zxx">
Transakcija je ispravna</div>
</td>
</tr>
</tbody></table>
<br />
<span lang="zxx"> </span>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Za transakciju iz prethodnog primjera parametri
su:</span><br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">scriptSig:
<304502205014856cdf89da70ad9a4f223bac4e5477da5c6cb69ef2</span><br />
<span lang="zxx">b9f8b5f8548e21307e0221009bfe2698f1eb1c561f41981d8e78c11d9e685a70</span><br />
<span lang="zxx">e682f144ee6c8ab5ecb0497c01>
<042b2d8def903dd62d0c4161ed8d4ccfa5967e11a28e65cb141235b7c27d8e</span><br />
<span lang="zxx">f6aa3bd63be077323cf3d7e0e8895b264b94feb4b40478b431da6f45dfc8e1004f62></span><br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">scriptPubKey: OP_DUP OP_HASH160
a7db6ff121871c65a8924b8e40f160d385515ad7 OP_EQUALVERIFY OP_CHECKSIG</span><br />
<br />
<h3>
Blok geneze</h3>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Skripta za genesis blok: scriptSig: prazno</span><br />
<span lang="zxx"> scripPubKey: OP_HASH256 <hash> OP_EQUAL</span><br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Da bi se transakcija potrošila potrebno je naći
niz znakova koji kad se dva puta hashiraju daju određeni hash
(6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000).</span><br />
<br />
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 497px;">
<colgroup><col width="92"></col>
<col width="130"></col>
<col width="249"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="92">
<div align="CENTER" lang="zxx">
<b>Stog</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="130">
<div align="CENTER" lang="zxx">
<b>Naredba</b></div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="249">
<div align="CENTER" lang="zxx">
<b>Opis</b></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="92">
<div lang="zxx">
Prazan</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="130">
<div lang="zxx">
<br />
</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="249">
<div lang="zxx">
Na stog je potrebno staviti podatke koji će
zadovoljiti hash</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="92">
<div lang="zxx">
<data></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="130">
<div lang="zxx">
OP_HASH256</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="249">
<div lang="zxx">
Podaci se dva puta hashiraju</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="92">
<div lang="zxx">
<hash></div>
<div lang="zxx">
<data_hash></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="130">
<div lang="zxx">
<br />
</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="249">
<div lang="zxx">
Na stogu su generirani hash i hash koji je potrebno
izračunati (6fe...)</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="92">
<div lang="zxx">
<hash></div>
<div lang="zxx">
<data_hash></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="130">
<div lang="zxx">
OP_EQUAL</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="249">
<div lang="zxx">
Provjeri zadovoljava li generirani hash zadani hash</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="92">
<div lang="zxx">
OP_TRUE</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="130">
<div lang="zxx">
<br />
</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="249">
<div lang="zxx">
Transakcija ispravna</div>
</td>
</tr>
</tbody></table>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">Detaljan popis Script naredbi nalazi se <a href="https://en.bitcoin.it/wiki/Script">ovdje</a></span>.Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-85567394375913566392014-05-01T07:28:00.000-07:002014-05-01T07:28:19.872-07:00Anonimnost u protokolu Bitcoin
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Ponekad se može pročitati
da je bitcoin anonimna valuta, odnosno anoniman sustav za plaćanje.
Koliko je zapravo Bitcoin anoniman? Osnovna karakteristika Bitcoina
je da su sve transakcije u sustavu vidljive svima. S druge strane,
sudionici sustava ne moraju odavati svoj identitet ostalima kako bi
mogli sudjelovati u sustavu. Koliko se može zaključiti o
sudionicima sustava analizirajući transakcije i block chain?</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Fergal Reid i Martin
Harrigan objavili su prvo istraživanje anonimnosti u sustavu Bitcoin
[1]. Istraživali su navodnu krađu 25.000 bitcoina objavljenu na
forumu BitcoinTalk. Prije istraživanja Reid i Harrigan smatrali su
da će biti vrlo teško ili čak nemoguće pratiti kretanje određene
svote novca kroz sustav jer su pretpostavljali da će se transakcije
vrlo brzo izgubiti u mreži. Istraživanje je pokazalo da je u
detalje moguće pratit kretanje određenog iznosa bitcoina između
korisnika u mreži.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
U [2] su Dorit Ron i Adi
Shamir objavili analizu block chaina iz svibnja 2012. Zanimalo ih je
kretanje bitcoina kroz mrežu te procjena broja bitcoin korisnika.
Analiza je pokazala da je broj korisnika oko dva i pol milijuna.
Pokazano je i da se kroz mrežu većinom prenose mali iznosi
bitcoina, no i da postoji oko 300 tranaskcija s >50 000 bitcoina
(od kojih je većina potekla od jedne transakcije od 90 000 BTC-a).
Identificirane su adrese koje pripadaju velikim mjenjačnicama te je
oktriveno da većina bitcoina, 75%, ne napušta adresu jednom kad
stigne na nju. Koristili su se dvjema metodama: prva je da su
pretpostavili da ako transakcija prebacuje sredstva s dvaju (ili
više) adresa na novu adresu, te adrese moraju biti u vlasništvu
iste osobe (rafinirali su metodu koju su koristili Reid i Harrigan).
Druga je da su pokušali otkriti change adrese, adrese na koje se
vraća ostatak bitcoina nakon transfera, a koje nisu uvijek iste
polaznoj adresi no pripadaju istom vlasniku.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Elli Androulaki et al.
proveli su istraživanje početkom 2013. u dva dijela [3]. Prvi dio
je bio gotovo identičan goreopisanim analizama. U drugom su dijelu
konstruirali složene modele i simulator za koji tvrde da vjerno
simulira kako korisnici upotrebljavaju bitcoin u stvarnom životu.
Rezultati simulatora pokazuju da je moguće utvrditi geografsku
povezanost korisnika (npr. korištenje bitcoina u fizičkim
dućanima).</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Zaključak ovih istraživanja
je da iako istraživači nisu uspjeli otkriti identitet niti jednog
pojedinca, uspjeli su detaljno pratit kretanja bitcoina kroz mrežu,
otkriti koji skupovi adresa pripadaju kojim mjenjačnicama te su čak
uspjeli (barem teoretski) geografski povezati korisnike protokola
Bitcoin. Čini se da je Bitcoin ipak dovoljno anoniman, no može li
se ta anonimnost još poboljšati?</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Već je sam Satoshi u svom
radu predložio da se radi povećanja anonimnosti za svaku
transakciju generira nova adresa i pripadajući tajni ključ. To može
sakriti podatak tko šalje bitcoine, ali se još uvijek može vidjeti
kome ti bitcoini idu. Problem skrivanja kome se šalju bitcoini može
se riješiti korištenjem tzv. mixing services. Te usluge
dozvoljavaju da im korisnici pošalju bitcoine i adresu na koju žele
da ti bitcoini stignu. Usluga će zatim od svakog korisnika uzeti
malo bitcoina (sve do iznosa koji korisnik želi poslati nekome) te
ukupan iznos poslati na odabranu adresu. To omogućuje skrivanje
relacije između adresa koje šalju bitcoine i adresa koje primaju
bitcoine. Nedostatak je u tome što korisnik mora vjerovati
centraliziranoj usluzi da će dobro i pošteno izmiješati bitcoine.
Problem je i u tome što suluga mora imati dovoljan broj korisnika da
bi mogla uspješno pomiješati bitcoine inače ih je moguće pratiti
[4][5]. Također, ako se pošalje velik iznos bitcoina, vjerojatno je
da se oni neće dobro izmiješati te će ih opet biti moguće pratiti
kroz mrežu.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Uz nabrojene mogućnosti
postoje i ZeroCoin i ZeroCash sustavi koji koriste tzv. zero
knowledge dokaze te pružaju mogućnost distribuiranog "pranja
novca" unutar samog Bitcoin protokola. Takvi sustavi mogu
značajno poboljšati anonimnost transakcija, no još su u razvoju te
se ne zna kakva će im biti budućnost.</div>
<br />
<h3>
Zaključak</h3>
<h3>
</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<div lang="zxx" style="margin-bottom: 0in;">
Napravljeno je nekoliko
istraživanja na temu anonimnosti protokola Bitcoin. Iako niti u
jednom slučaju istraživačni nisu identificirali pojedince koji
slali bitcoine, pokazali su da je poznavaljem makar jednog identiteta
moguće detaljno pratiti njegove transakcije i otkriti koje adrese su
u njegovom vlasništvu. Za Bitcoin korisnike koji žele više
anonimnosti nego što sustav pruža po defaultu, preporučljivo je za
svaku transakciju generirati nove adrese i korsitit pouzdane mixing
usluge.</div>
<br />
<h3>
Literatura</h3>
<h3>
</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<div lang="zxx" style="margin-bottom: 0in; page-break-before: always;">
[1]
Fergal Reid and Martin Harrigan, An Analisys of Anonymity in the
Bitcoin System. arXiv:1107.4524v2 [physics.soc-ph], 2012
<a href="http://arxiv.org/abs/1107.4524">http://arxiv.org/abs/1107.4524</a></div>
<div lang="zxx" style="margin-bottom: 0in;">
<br />
</div>
<div lang="zxx" style="margin-bottom: 0in;">
[2] Dorit Ron and Adi
Shamir, Quantitative Analysis of the Full Bitcoin Transaction Graph.
2012</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br />
</div>
<div lang="zxx" style="margin-bottom: 0in;">
[3] Elli Androulaki ,
Ghassan O. Karame , Marc Roeschlin, Tobias Scherer i Srđan Capkun,
Evaluating User Privacy in Bitcoin. 2013</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br />
</div>
<div lang="zxx" style="margin-bottom: 0in;">
[4] Malte Möser, Anonymity
of Bitcoin Transactions: An Analysis of Mixing Services, 2013</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br />
</div>
<div lang="zxx" style="margin-bottom: 0in;">
[5] Malte Möser, Rainer
Böhme, Dominic Breuker
, An Inquiry Into Money Loundering Tools in
the Bitcoin Network, 2013</div>
<h3>
</h3>
<h3>
</h3>
<br />
<br />
<br />
<br />
<br />
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-42157206779325830672014-04-17T13:15:00.001-07:002014-04-17T13:15:13.347-07:00Merkleovo stablo
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
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.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
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.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs2LVPthKVxi5g8ENRHNktExAAABqWUxWJMIeSu5j_pHXHapdTK_DAG_-N56xUIjongp6LYjgERSnc5uYFe740ucmwMe6kiG-82Js-nFhiPvfBjwfzzxMfaamkR0tsQ3qm1x7vuUwoZsrF/s1600/mt1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs2LVPthKVxi5g8ENRHNktExAAABqWUxWJMIeSu5j_pHXHapdTK_DAG_-N56xUIjongp6LYjgERSnc5uYFe740ucmwMe6kiG-82Js-nFhiPvfBjwfzzxMfaamkR0tsQ3qm1x7vuUwoZsrF/s1600/mt1.png" height="480" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Slika 1</td></tr>
</tbody></table>
<br />
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in; page-break-before: always;">
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.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
Svaka iduća razina stabla
sadrži dvostruko manje čvorova od one prethodne. Ako stablo ima 2<sup>n</sup>
čvorova, algoritam nije teško provesti do kraja. Što se događa
ako je broj čvorova različit od 2<sup>n </sup>? 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).</div>
<br />
<h3>
Merkleovo stablo u protokolu Bitcoin</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<span lang="zxx">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 <a href="https://en.wikipedia.org/wiki/SHA-2">SHA256</a>. Jedna razlika od gornjeg postupka je da se
umjesto jednom, svi podaci hashiraju dva puta da bi se izbjegao <a href="https://en.wikipedia.org/wiki/Length_extension_attack">napadproduživanjem duljine hasha</a>.</span><br />
<br />
<span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span><br />
<div lang="zxx">
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)).</div>
<br />
<h3>
Orezivanje grana Merkleovog stabla</h3>
<h3>
</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<div lang="zxx">
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.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6H1X0FLe5i2VE81n_Y2B4aLKGM7iQl_xjyzrpbfFGDr9U8L8ERRFxcm2n5tU2gCQ0ehyLbH_5dTxV2qxgmsSzGIeSxeEV3MgIcBZ4KjEekIi9zwCdG7uzJ5yA33_9eS4Th_yPHGlHTKKL/s1600/mt2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6H1X0FLe5i2VE81n_Y2B4aLKGM7iQl_xjyzrpbfFGDr9U8L8ERRFxcm2n5tU2gCQ0ehyLbH_5dTxV2qxgmsSzGIeSxeEV3MgIcBZ4KjEekIi9zwCdG7uzJ5yA33_9eS4Th_yPHGlHTKKL/s1600/mt2.png" height="480" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Slika 2</td></tr>
</tbody></table>
<h3>
</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<div lang="zxx" style="page-break-before: always;">
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.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
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:</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
"ea9da84d55ebf07f47def6b9b35ab30fc18b6e980fc618f262724388f2e9c591", </div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
"f8578e6b5900de614aabe563c9622a8f514e11d368caa78890ac2ed615a2300c", </div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
"1632f2b53febb0a999784c4feb1655144793c4e662226aff64b71c6837430791", </div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
"ad4328979dba3e30f11c2d94445731f461a25842523fcbfa53cd42b585e63fcd", </div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
"a904a9a41d1c8f9e860ba2b07ba13187b41aa7246f341489a730c6dc6fb42701", </div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
"dd7e026ac1fff0feac6bed6872b6964f5ea00bd8913a956e6b2eb7e22363dc5c", </div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
"2c3b18d8edff29c013394c28888c6b50ed8733760a3d4d9082c3f1f5a43afa64"</div>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Rudar generira coinbase transakciju te koristeći
gornje transakcije generira Merkleov korijen.</div>
<h3>
</h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<div lang="zxx">
Recimo da je dvostruk hash coinbase transakcije koju je
rudar dobio:</div>
<div lang="zxx">
8300639d3ed0b31c766f4d597839f4cd49cc9bf1572c46c680121dc6bc4090c3</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Sad se konkatenira taj hash 8300... i hash ea9d... te
se taj rezultat hashira:</div>
<div lang="zxx">
061eb6650cd2688b058b48735912279e56d26cf90a79255df707d3edfc8cbb3f</div>
<div lang="zxx">
I dalje 061e...||f857... i dvostruki hash:</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx" style="margin-bottom: 0in;">
b05bcb7fea6b35be774fd3222c72029c0ad655bdbe836751cdf1494d8bd817f0</div>
<div lang="zxx" style="margin-bottom: 0in;">
<br /></div>
<div lang="zxx">
SHA256(SHA256(b05b...||1632...)):</div>
<div lang="zxx">
711ce7c29a166c21106fbb33072891c4a04edbab3af908f7e0429e645303646d</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
SHA256(SHA256(711c...||ad43...)):</div>
<div lang="zxx">
04aae851be411ca558eb48f0d861d5204c568c0614554eb997d6fe80a4178590</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
SHA256(SHA256(04aa...||a904...)):</div>
<div lang="zxx">
c1f30474fac25636b9465ef17276e41a79d368dc1343455194301c2df8949103</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
SHA256(SHA256(c1f3...||dd71)):</div>
<div lang="zxx">
7600625958076fe5243b6378bae5d977372f3ecd5cf549108ddbb626e08cde1d</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
SHA256(SHA256(7600...||2c3b...)):</div>
<div lang="zxx">
6f7b0464b92b6f612bcea205894f77bfb952dea62fb818d639d8ff1dc602db63</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
To je Merkleov korijen za dobiveve čvorove i
generiranu coinbase transakciju.</div>
<br />
<br />
<h3>
</h3>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-37006119972248596182014-04-13T12:03:00.005-07:002014-04-13T12:03:55.453-07:00Rudarenje bitcoina: protokol Stratum
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
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.</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
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).</div>
<div lang="zxx">
<br /></div>
<h3 lang="zxx">
Poruke u protokolu</h3>
<h3 lang="zxx">
</h3>
<h3 lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<div lang="zxx">
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:</div>
<br />
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="128*"></col>
<col width="128*"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="50%">
<div lang="zxx">
id</div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="50%">
<div lang="zxx">
1</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
set_difficulty</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
b4b6693b72a50c7116db18d6497cac52</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
notify</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
ae6812eb4cd7735a302a8a9dd95cf71f</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
extranonce1</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
45fadd2d</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
extranonce2_size</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
4</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
error</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
null</div>
</td>
</tr>
</tbody></table>
<br />
<h3 lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<div lang="zxx">
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.</div>
<br />
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
Rudar zatim pošalje zahtjev za početak rudarenja, a
bazen mu odgovara porukom koja sadrži osnovne podatke za kreiranje
bloka:</div>
<div lang="zxx">
<br /></div>
<div lang="zxx">
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
</div>
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="128*"></col>
<col width="128*"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="50%">
<div lang="zxx">
job_id</div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="50%">
<div lang="zxx">
2dddaca8</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
prev_hash</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
c3a8a906d58a374d5092ba6792ab4d5e38c932f01dc4dcd6000000</div>
<div lang="zxx">
0000000000</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
coinb1</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
01000000010000000000000000000000000000000000000000000</div>
<div lang="zxx">
000000000000000000000ffffffff4803da8204062f503253482f0472b</div>
<div lang="zxx">
b4a5308</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
coinb2</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
2e522cfabe6d6d4183475fab25720b7274cc7decea671073d97e050</div>
<div lang="zxx">
abeababf0a80b44241a3bf804000000000000000000000001eccb6b</div>
<div lang="zxx">
95000000001976a91480ad90d403581fa3bf46086a91b2d9d4125db</div>
<div lang="zxx">
6c188ac00000000</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
merkle_branch</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
c69d0e3aed71cd90f681fa8178766ca3a234f854a0dac42e3ce4a4b1</div>
<div lang="zxx">
c51e8e5f,
...</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
version</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
00000002</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
nbits</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
1900b3aa</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
ntime</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
534abb71</div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
clean_jobs</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
false</div>
</td>
</tr>
</tbody></table>
<div lang="zxx">
<br /></div>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div lang="zxx">
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.</div>
<br />
<h3>
Kreiranje coinbase transakcije</h3>
<h3>
</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<div lang="zxx">
Rudar sad ima sve podatke potrebne za generiranje
coinbase transakcije: <span style="background: #ff0000;">coinb1</span>,
<span style="background: #008000;">extranonce1</span>, <span style="background: #ffd320;">extranonce2</span>
(koji je sam generirao) i <span style="background: #00b8ff;">coinb2</span>.
Transakcija se dobiva konkateniranjem tih vrijednosti:</div>
<br />
<style type="text/css">TD P { margin-bottom: 0in; }P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="128*"></col>
<col width="128*"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0.04in;" width="50%">
<div lang="zxx">
Version</div>
</td>
<td style="border: 1px solid #000000; padding: 0.04in;" width="50%">
<div lang="zxx">
<span style="color: red;">01000000</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Input count</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: red;">01</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Previous hash</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: red;">0000000000000000000000000000000000000000000000000000000</span></div>
<div lang="zxx">
<span style="color: red;">000000000</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Index</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: red;">ffffffff</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Scriptlen</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: red;">0x48 (72)</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Script</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: red;">03da8204062f503253482f0472bb4a5308<span style="color: green;">45fadd2d</span><span style="color: #ff950e;">000017e4</span><span style="color: #00b8ff;">2e522cfa</span></span></div>
<div lang="zxx">
<span style="color: red;"><span style="color: #00b8ff;">be6d6d4183475fab25720b7274cc7decea671073d97e050abeababf0a8</span></span></div>
<div lang="zxx">
<span style="color: red;"><span style="color: #00b8ff;">0b44241a3bf80400000000000000</span></span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Sequence</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: #00b8ff;">00000000</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Output count</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: #00b8ff;">01</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Value</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: #00b8ff;">eccb6b9500000000</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Scriptlen</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: #00b8ff;">19</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Script</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: #00b8ff;">76a91480ad90d403581fa3bf46086a91b2d9d4125db6c188ac</span></div>
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0in; padding-top: 0in;" width="50%">
<div lang="zxx">
Lock time</div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.04in; padding-left: 0.04in; padding-right: 0.04in; padding-top: 0in;" width="50%">
<div lang="zxx">
<span style="color: #00b8ff;">00000000</span></div>
</td>
</tr>
</tbody></table>
<br />
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<div lang="zxx">
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.</div>
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0tag:blogger.com,1999:blog-4672681820531439675.post-84149152883232261442014-04-06T12:30:00.002-07:002014-04-06T12:30:37.216-07:00Rudarenje bitcoina: Pool mining
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<span lang="zxx">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.</span><br />
<br />
<span lang="zxx">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.</span><br />
<br />
<span lang="zxx">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</span><br />
<span lang="zxx">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.</span><br />
<br />
<h3>
Vrste nagrada</h3>
<h3>
</h3>
<h3>
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
</h3>
<span lang="zxx"><b>Prop.</b> - Proportional (proporcionalna). Dodjeljuje
se rudarima proporcionalno broju udjela koji su rudari poslali
bazenu.</span><br />
<span lang="zxx"><b>PPS</b> – 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>.</span><br />
<span lang="zxx"><b>PPLNS</b> – 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.</span><br />
<span lang="zxx"><b>SMPPS</b> – Shared maximum pay per share. Kao PPS
ali ne plaća više nego bazen zaradi.</span><br />
<span lang="zxx"><b>PPLNSG</b> – 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.</span><br />
<span lang="zxx"><b>RSMPPS</b> – Recent shared maximum pay per share.
Slično SMPPS-u, ali prioritizira novopristigle rudare.</span><br />
<span lang="zxx"><b>ESMPPS</b> – Equalized share maximum pay per share.
Kao SMPPPS no izjednačava naplatu među svima koji ju trebaju
primiti.</span><br />
<span lang="zxx"><b>CPPSRB</b> – Capped pay per share with recent
backpay. Kad se pronađe blok, isplati se 25 BTC-a neisplaćenih
udjela.</span><br />
<span lang="zxx"><b>POT</b> – Pay on target (plaća po meti). Isplaćuje
više što je težina rudarenja veća.</span><br />
<span lang="zxx"><b>Bodovi</b> – metoda zasnovana na bodovanju. Slična
proporcionalnoj metodi, ali koristi težinske faktore u ovisnosti o
vremenu.</span><br />
<h3>
</h3>
<br />
Hyperionhttp://www.blogger.com/profile/16342802500647314383noreply@blogger.com0