Kako deluje Bitcoin?

Peter Opara
Blockchain Association
6 min readMay 17, 2020

V prejšnjem prispevku sem opisal koncept bitcoin omrežja. V interesu uporabnikov je poštena izmenjava vrednosti, za katero ni potrebno zaupanje v tretjo osebo ali posrednika. V tej objavi bom predstavil kako poteka izmenjava vrednosti v bitcoin omrežju. Predstavljajmo si, da imamo dva uporabnika, imenujmo ju Anton in Brane. Anton želi Branetu poslati bitcoine. Kaj mora narediti Anton, da lahko pošlje bitcoin? Ko Anton to naredi, kako Brane ve, da je bitcoine prejel?

Vir: bitcoin.org

transákcija -e ž (á)
ekon. poslovno dejanje pri kupoprodajnih odnosih, pri katerem dobi vsaka stran določeno vrednost: izpeljati, opraviti transakcijo; knjižiti transakcije / denarne, devizne transakcije / poslovne transakcije; pren., publ. velikopotezne diplomatske transakcije

Definicija transakcije iz SSKJ pravi, da gre za izmenjavo vrednosti med več stranmi, v kateri vsaka dobi določeno vrednost. V našem primeru ena stran vrednost prejme, druga jo da. Besedo transakcija v kontekstu bitcoin omrežja uporabljamo, ko govorimo o pošiljanju bitcoinov od enega uporabnika do drugega.

Vir: bitcoin.org

Torej, kaj mora Anton narediti, da Branetu pošlje bitcoine? Po pravilih omrežja mora sestaviti transakcijo in jo posredovati v omrežje. To naredi preko popolnega vozlišča. Ta najprej sestavi transakcijo, nato pa jo posreduje naključnim sosednim vozliščem, ki jo naprej posredujejo svojim sosedom, dokler celotno omrežje ne vidi transakcije. Vozlišča transakcije sproti preverjajo in naprej posredujejo le tiste, ki ustrezajo pravilom omrežja. Nepravilne transakcije se ne bodo širile po omrežju in ne bodo potrjene.

Vozlišča transakcije sproti preverjajo in naprej posredujejo le tiste, ki ustrezajo pravilom omrežja.

Transakcija ostane nepotrjena dokler se ne pojavi v potrjenem bloku transakcij. Rudarji zbirajo nepotrjene trasakcije in iz njih in ene dodatne vrednosti (nonce) preko dogovorjene formule izračunajo številko (block hash). Če je ta v območju, ki ustreza pravilom omrežja, je blok transakcij potrjen. V nasprotnem primeru rudar spremeni dodatno vrednost v formuli in poizkusi znova. Ta postopek se imenuje rudarjenje. Rudar izračunano številko in podatke o novem bloku (vse vključene transakcije in dodatno vrednost) sporoči sosednjim vozliščem, ki to posredujejo svojim sosedom in tako naprej. Vsako popolno vozlišče preveri ali je blok pravilno izračunan. Če je blok neveljaven, ga vozlišče ne upošteva, v nasprotnem primeru pa vse transakcije v njem označi za potrjene.

Vir: bitcoin.org

Rudarji zbirajo nepotrjene trasakcije in iz njih in ene dodatne vrednosti (nonce) preko dogovorjene formule izračunajo številko (block hash). Če je ta v območju, ki ustreza pravilom omrežja, je blok transakcij potrjen.

Ko Anton pošlje transakcijo v omrežje, jo Brane vidi v svojem popolnem vozlišču. Vendar pa Anton lahko poslane bitcoine iz prve transakcije še vedno uporabi za drugo transakcijo. Če jo rudarji vključijo v blok pred prvo transakcijo, bo prva avtomatsko neveljavna, saj bitcoini ne morejo biti zapravljeni dvakrat. Brane mora zato počakati, da je prva transakcija vključena v blok in nato Antonu lahko zaupa, da mu je bitcoine zares poslal.

Poglejmo si še, kako mora Anton sestaviti transakcijo, da bo ta veljavna. Osnovni element bitcoin transakcije je izhod transakcije (transaction output). Izhod transakcije je preprosta struktura sestavljena iz številke, ki pomeni količino bitcoinov in pogoja zapravljanja (locking script) pod katerim se lahko ta izhod transakcije uporabi v naslednji transakciji. Podobno kot bančni ček na katerega napišemo vrednost in številko računa prejemnika denarja. V bitcoin transakciji pošiljatelj uporabi izhode prejšnjih transakcij, za katere lahko predstavi dokaz za zapravljanje (unlocking script) in naredi nove izhode transakcije, katere bo lahko zapravil prejemnik.

Shema prikazuje izhod transakcije s podpisom, podobno kot bi napisali bančni ček.

Izhod transakcije (transaction output) je preprosta struktura sestavljena iz številke, ki pomeni količino bitcoinov in pogoja zapravljanja (locking script) pod katerim se lahko ta izhod transakcije uporabi v naslednji transakciji.

Bitcoini od uporabnika do uporabnika potujejo z izhodi transakcij, ki so lahko poljubne velikosti. Postopek preverjanja transakcij, ki ga vrši vsako popolno vozlišče, zagotavlja, da je seštevek vhodnih in izhodnih bitcoinov v vsaki transakciji enak, v nasprotnem primeru je transakcija neveljavna. Podobno kot banka preveri, da ima komitent vsaj toliko sredstev, kot jih je navedel na čeku.

Ko izhod transakcije uporabimo v novi transakciji, moramo predstaviti dokaz za zapravljanje, ki ustreza pogoju za zapravljanje. Bitcoin omrežje uporablja asimetrično kriptografijo, ki temelji na javnih in zasebnih ključih. Zasebni ključ se uporablja za šifriranje, javni pa za dešifriranje sporočil. Z zasebnim ključem podpišemo transakcijo. Vsak lahko z javnim ključem preveri, da je podpis pravilen. Anton v pogojih za zapravljanje izhoda transakcije navede Branetov javni ključ. Brane bo izhod transakcije lahko zapravil s podpisom, ki ga bo naredil s svojim zasebnim ključem.

Z zasebnim ključem podpišemo transakcijo. Vsak lahko z javnim ključem preveri, da je podpis pravilen.

Stanje bitcoinov v naši denarnici je seštevek vseh vrednosti izhodov transakcij, za katere vemo, da jih lahko zapravimo le mi in še niso bili uporabljeni (unspent transaction output — UTXO). Za izračun stanja mora naša denarnica pregledati vse bitcoin bloke, ki so bili zrudarjeni, da najde izhode transakcij, ki v pogojih zapravljanja navajajo naš javni ključ.

Shema prihazuje bitcoin bloke z izhodi transakcij z našim javnim ključem. Seštevek na desni predstavlja stanje naše denarnice. Pri tem mora denarnica preveriti ali je bil kateri od izhodov že zapravljen, na primer izhod transakcije iz bloka 630000 lahko zapravimo že v bloku 630001.

Transakcija, ki jo Anton odda v omrežje je sestavljena iz vhodnih in izhodnih podatkov. V izhodnih podatkih transakcije Anton naredi nove izhode transakcije, ki jih bo lahko uporabil le Brane. Brane je Antonu posredoval javni ključ, za katerega ima zasebni ključ. Anton navede količino bitcoinov, ki jo pošilja Branetu in v pogojih za zapravljanje tega novega izhoda transakcije navede Branetov javni ključ. Tako je Brane prepričan, da bitcoine lahko zapravi le on. V vhodnih podatkih transakcije mora Anton navesti svoje nezapravljene izhode transakcij. Izhodom transakcij mora dodati dokaz za zapravljanje. To je podpis, ki ga naredi s svojim zasebnim ključem. Vsako popolno vozlišče preveri, če dokaz za zapravljanje res ustreza pogoju za zapravljanje, podobno kot banka preveri, če podpis na čeku ustreza komitentu. V primeru, da Anton želi zapraviti že uporabljene izhode transakcij ali izhode za katere ne more predstaviti pravega dokaza za zapravljanje, to popolno vozlišče prepozna kot neveljavno transakcijo.

Vsako popolno vozlišče preveri, če dokaz za zapravljanje res ustreza pogoju za zapravljanje, podobno kot banka preveri, če podpis na čeku ustreza komitentu.

{
"version": 1,
"locktime": 0,
"vin": [
{
"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
"vout": 0,
"scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.01500000,
"scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": 0.08450000,
"scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
}
]
}

Zgornji primer transakcije v bitcoin omrežju je iz knjige Mastering Bitcoin. Vhodni podatki so v polju "vin", ki vsebuje en izhod transakcije identificiran s polji "txid" in "vout" ter podpisom, kot dokazom za zapravljanje, v polju "scrpitSig". Izhodni podatki so v polju "vout", ki vsebuje dva nova izhoda transakcij, enega za 0.015 bitcoina in enega za 0.0845 bitcoina. Pogoja za zapravljanje sta navedena v polju "scriptPubKey" in predstavljata zahtevo za podpis narejen z javnima ključema ab68025513c3dbd2f7b92a94e0581f5d50f654e7 in 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 (pravzaprav je to RIPEMD-160 hash javnega ključev).

Poenostavljena razlaga kako narediti in preveriti bitcoin transakcijo se morda zdi abstraktna, ker še nisem omenil uporabniškega vmesnika, ki transakcije izvaja. To bo tema prihodnje objave, kjer si bomo pogledali uporabniške vmesnike za hranjenje in pošiljanje bitcoinov med posamezniki. Ti vmesniki se imenujejo bitcoin denarnice (bitcoin wallet).

--

--