- Objavljeno datuma
Bitcoin transakcija: uvod i struktura
- Autori
- Ime
- Vladimir Stevic
- X
Uvod
Bitcoin transakcija može da se čini, na prvi pogled, kao složena konstrukcija, ali zapravo njena struktura je jako logična i prilično elegantna. Osnova njenog dizajna je sigurnost, i to sigurnost da prenese određenu vrijednost na decentralizovan način. U ovom tekstu raščlaniću transakciju najbolje što mogu, na njene osnovne elemente. Pokušaću da pribižim čitaocu svaki element i njegovu ulogu.
Prije nego li počnemo, šta je Bitcoin transakcija?
Bitcoin transakcija je proces prenosa vrijednosti (BTC ili bitcoina) sa jedne na drugu adresu, prostim riječnikom prenos novca, uplata ili isplata.
Osnova
Svaka Bitcoin transakcija sadrži u osnovni:
- Input-e (ulazna sredstva)
- Output-e (izlazna sredstva)
Na primjer, račun u vašem supermarketu je bio 20.60 evra, vi dajete novčanicu od 10 i novčanicu od 20 evra. U ovom smislu novčanice od 10 i 20 evra su "input-i" ili ulazna sredstva, dok 20.60 evra je jedan output, te u ovom slučaju kusur koji dobijate nazad, recimo 9.40 evra je drugi output. U praksi Bitcoin mreže, ovdje bi bila jos jedna stvar - kusur, iako je 9.40 evra, vi bi ste dobili samo 9.20, a ostalih 0.20 bi bio fee (naknada) koju plaćamo miner-ima (rudarima) koji "održavaju" Bitcoin mrežu.
Da sumiramo, u našoj transakciji iz supermarketa imali smo:
Input 10 evra (naša novčanica)
Input 20 evra (naša novčanica)
Output 20.60 evra (račun koji plaćamo)
Output 9.20 evra (kusur)
Fee 0.20 evra (fee)
Kada se izvrši ova transakcija, na našu adresu se vraća kusur, output od 0.40 evra i on postaje nova novčanica u našem novčaniku (input) koju ćemo koristiti prilikom nekog sledećeg plaćanja.
Struktura
Pogledajmo kako izgleda raw (sirova) transakcija u svom hex format. Ova transakcija je nasumično izabrana sa stranice mempool.
02000000000101fd04d3685555327e74e11f95a39263a8a71f9f03b5f8d6e362d1fab37ca4
1b880100000000ffffffff0206ab000000000000225120df2c924644277c28bc2595d409cd
73892e8371a7934e829ecbdec6e97a78b867d98b0200000000002251206180d1c503af6bc4
bb78f98a07c240423ce22544bb99f4f4240e8fe76dfea4970140473e7d715f8683854aa67bd
0a3548e2eb88f84674df0112c1124984cfa36c50be369ffc4a94502be199e2857c39fd0c967
3b7472bc17b26b7f98d6d55b77993600000000
Pokušajmo je raščlaniti i razumijeti.
1. Verzija "02000000" (4 bytes)
Prvi dio koji vidimo u transakciji je 02000000 i ona je zauzima 4 byte-a1. Ovaj podatak nam govori da je transakcija verzije broj 2. Verzionisanje prosto služi da prikaže sistemu na koji način da gleda ovu transakciju.
U početku Bitcoin blockchaina bila je verzija 1, osnovna. Nešto kasnije vidimo nove verzije sa dodatnim mogućnostima, recimo u verziji dva možemo poslati transakciju blockchain-u, te mu reći da je želimo konačno izvršiti tek za 2 godine2.
Dodatno za one koje zanima više BIP 68: Relative Locktime & BIP 112: CheckSequenceVerify (CSV).
2. Marker i zastavica "0001" (2 byte)
Marker i zastavica (flag) su prisutni u SegWit transakcijama. Prvi dio, marker 00 označava prisustvo witness podataka, te omogućava sistemu da razdvoji ove podatke od ostatka (standardne) transakcije, dok drugo 01 - flag predstavlja da je transakcija SegWit.
SegWit predstavlja novu strukturu transakcija koja odvaja skriptu i potpis u novu strukturu. Razloga je više, kao što su smanjenje prostora koji će zauzimati transakcija, te određene sigurnosne mjere koje su poboljšane.
Dodatno za one koje zanima više BIP-141
3. Broj input-a "01"
Najprostije rečeno ova oznaka pokazuje koliki je broj ulaznih "novcanica" iz našeg primjera gore. Dakle, ova transakcijama ima jedan input.
4. Input
Da bi smo nastavili sa input-om, neophodno je da razumijemo nekoliko stvari. Vratimo se na primjer plaćanja u marketu. Prilikom plaćanja, rekli smo da dajete dvije novčanice, od 10 i 20 evra. Ove novčanice su inputi.
Hajde da se pozabavimo konkretno novčanicom od 10 evra. Zamislimo da je ova novčanica došla kod nas prije 3 dana kada nam je drug Nikola poslao novac na poklon. U toj transakciji Nikola šalje nama:
Input 50 evra
Output 10 evra za nas
Output 39 evra koje mu vraćamo kao kusur jer nam daje samo 10 evra, ali nema sitno
Ostatak od 1 evra je fee (naknada).
Ova novčanica od 10 evra, u našoj transakciji u marketu sadrži određene informacije:
- ID: Prvenstveno ona ima identifikacioni broj transakcije odakle je došla. U našem primjeru "novčanica" dolazi iz transakcije u kojoj nam Nikola šalje istu.
- Index: Sada kad znamo da naša novčanica dolazi kao output iz transakcije u kojoj nam Nikola šalje novac, trebamo definisati koji je to redni broj output-a (novčanice). U našem slučaju novčanica od 10 evra se nalazi na prvom (nultom) mjestu u output-ima transakcije sa Nikolom.
- ScriptSig: Kada imamo informacije odakle dolazi ova novčanica, koji je redni broj konkretno njen u toj transakciji - potrebno nam je još jedno. Dokaz da novčanica (output) zaista pripada nama. Upravo ovaj dio output-a sadrži naš potpis i našu javnu adresu koja to potvrđuje. Ovaj dio u SegWit transakcijama je prazan, više o ovome na kraju u dodatnom tekstu.
- Sequence: Ovo predstavlja dodatne informacije, da li Nikola može ubrzati prenos novca, koje je minimalno vrijeme da vam stigne transakcija i slično.
Zaključak: Naš input (novčanica od 10 evra) sadrži informacije odakle je ona došla kada je prethodni put bila output. Pogledajmo sad to ukontekstu
4.1 (fd04d...a41b88) Predstavlja hash ili identifikacioni broj transakcije odakle je ova novčanica došla.
4.2 (01000000) Index, ili redni broj na kome se nalazila novčanica u prethodnoj transakciji.
4.3 (00) ScriptSig length, duzina skripte za otključavanje. Ovdje je 0 jer skripta za potvrdu našeg vlasništva u SegWit transakcijama je odvojena od samog inputa, ponovo - više na kraju u dodatnom tekstu.
4.4 (ffffffff) Sequence, broj koji označava da li transakcija može biti uklonjena sa drugom transakciju, zamijenjena.3 Dodatno u BIP 68: Relative Locktime i BIP 125: Replace-by-fee.
5. Broj output-a "02"
Ovo je broj koji nam govori koliko output-a (izlaznih novčanica) sadrži ova transakcija.
6. Output
Izlazne "novčanice", uplate, kojih ima dvije u ovoj transakciji, mi ćemo se objasniti jednu. Ona sadrži:
- 6.1. (06ab000000000000) - vrijednost koju šaljemo (npr 0.5 bitcoin-a).
- 6.2. (22) - ScriptPubKey length, dužinu skripte za otključavanje.
- 6.3. (5120df2c924644277...c6e97a78b867d98b) ScriptPubKey, ova skripta definiše na koji način može da se iskoristi ovaj output. Na primer, ako šaljemo ovu „novčanicu“ Jovani, skripta će osigurati da samo Jovana, sa svojim privatnim ključem, može da pristupi i iskoristi ova sredstva kada bude željela. Skripte obično sadrže:
- 6.3.1. OP CODE-ova4 - niz intrukcija koji određuju na koji način se može potvrditi transakciju
- 6.3.2. Same podatke ili u našem primjeru Jovanin javni ključ
Drugi output možemo isto raščlaniti, ali da se ne ponavljamo, evo dijelova: 0200000000000000, 22, 51206180d1c503a...40e8fe76dfea497.
7. Broj Witness-a u ovoj transakciji "01"
Pokazuje koliko ima Witness podataka u ovoj transakciji, s obzirom da smo potpisali jedan input, dakle imamo jedan potpis.
8. Dužina Witness podataka "40"
Označava koliko je duga konkretna Witness skripta (potpis) koji slijedi odmah poslije.
9. Witness "73e7d715f8683854...f98d6d55b779936"
Sada imamo konkretan Witness script, dakle potpis naše transakcije kao dokaz da smo imali pravo na potrošnju našeg input-a (novčanice), te javni ključ koji pomaže da sistem verifikuje sam potpis.
10. Locktime "00000000"
Na kraju imamo Locktime, koji je u našem slučaju nula. Ovo govori blockchain-u da može odma potvrditi ovu transakciju. Ukoliko bi locktime imao neku vrijednost, to bi značilo da želimo da transakcija bude potvrđena u budućnosti.
Dodatno: Razlika u transakciji prije i poslije SegWit-a (Segregated Witness)
Vidimo da je transakcija koju smo obradili SegWit vrste, hajde da ukratko napraviti presjek prije i posle uvođenja istog.
Prije SegWit-a transakcija izgleda ovako:
[Version][Input Count][Inputs][Output Count][Outputs][Locktime]
Jedan input je bio u sledećoj formi:
[Previous Transaction Hash (txid)][Output Index][ScriptSig][Sequence]
- U ovom slučaju ScriptSig sadrži potpis i javni ključ potrebne za potvrdu prava na sredstva
Poslije, tačnije u SegWit transakcijama struktura je:
[Version][Marker][Flag][Input Count][Inputs][Output Count][Outputs][Witness][Locktime]
- Ovdje vidimo nove stvari, marker i flag koju označavaju da se radi o SegWit transakciji, kao i Witness pred kraj transakcije koji sadrži potpise.
Konkretan input:
[Previous Transaction Hash (txid)][Output Index][ScriptSig][Sequence]
- U ovom slučaju ScriptSig može biti prazan ili sadržavati minimalne informacije, jer su potpisi odvojeni.
Zaključak: SegWit nam donosi odvojene podatke o potpisu i javnom ključu od osnove same transakcije kako bi transakcija zauzimala manje prostora, ali i bila sigurnija.
Footnotes
U heksadecimalnom sistemu svaki broj predstavlja 4 bit-a, u našem heksadecimalnom broju 02000000 je 8 brojeva puta 4 bit-a jednako 32 bit-a (4 byte-a, jer jedan byte je 8 bit-a). ↩
Bitcoin ne poznaje vrijeme u našem kontekstu. Ovdje su blokovi odrednica, okvirno računajući da je svakih 10 minuta novi blok, ukoliko je trenutni blok broj 100.000, te želimo da se transakcija izvrši za 30 minuta, definišemo podatak koji će reći da se transakcija izvrši tek u bloku 100.003, dakle kada prodje 3 bloka (po 10 minuta, 30 minuta ukupno). ↩
U današnjoj implementaciji, sve transakcije su otvorene za tzv RBF (replace by fee). ↩
OP code je kao uputa u Bitcoin-u koji označava koju operaciju treba izvršiti nad novčanicom da bi se ona potvrdila. ↩