Transakcie
Teraz sa bližšie pozrieme na to, ako je celý systém Bitcoin postavený. Máme nejakú svoju adresu, resp. máme privátny kľúč a k nemu prislúchajúci verejný kľúč, alias Bitcoin adriesu. A tú by sme radi použili pri platení, resp. pri získavaní platieb.
Transakcia medzi dvoma adresami je, z technického hľadiska, správa pre Bitcoin sieť obsahujúca vstupy a výstupy - okrem adries, obnosov peňazí taktiež digitálne podpisy, a to nielen podpis od odosielajúcej strany, ale aj z predchádzajúcej transakcie, z ktorej Bitcoiny pochádzajú.
(jednoduchý sled transakcií, resp. presun meny)
Pokiaľ by som od Majiteľa1 obdržal 1BTC nejakou potvrdenou transakciou a chcel by som túto 1BTC poslať Majiteľovi3 (t.j. vytvárame tretiu transakciu ako na obrázku hore), musím do novej transakcie uviesť ako vstup hash z druhej transakcie, podpísať túto novú transakciu svojím privátnym kľúčom (my = Majiteľ2) a priložiť svoj verejný kľúč pre overenie. Na výstupe sa objaví hodnota 1BTC ako počet Satoshi - najmenšia jednotka BTC, ktorá predstavuje 1/108 BTC (jednu stomilióntinu BTC) - teda uvediem číslo 100000000, časové razítko a samozrejme adresa (= hash verejného kľúča) prijímateľa Majiteľ3.
(skladanie viacerých transakcií)
Vznikal by tu ale problém - ak mám 1BTC a chcem poslať napr. len 0.5BTC? Práve preto môže mať transakcia nielen viacero vstupov (skombinovanie prijatých peňazí z niekoľkých iných transakcií), ale aj viacero výstupov. A práve cez výstupy sa rieši napr. to, ako poslať niekomu 0.5BTC pokiaľ mám evidovaú napr. len jedinú transakciu s prijmom 1BTC. Taká transakcia bude mať 2 výstupy - 0.5BTC nasmerujem recipentovi, a zvyšok pošlem sám sebe. To taktiež zamädzuje odoslať z účtu viac, ako sám vlastním - nemôžem odoslať peniaze, ktoré som nikdy neprijal. Pokiaľ by hodnota peňazí na vstupe bola väčšia ako na výstupe, je tento rozdiel považovaný za transakčný poplatok. O tom však v kapitolách venovaných blokom a dolovaniu.
(transakcia v detaile)
Transakcia tiež obsahuje špeciálny skript (rozdelený na 2 časti - pre vstupy a výstupy) napísaný v zásobníkovom skriptovacom jazyku vytvoreného špeciálne pre Bitcoin. Ako implicitný vstup do prvej časti tohto skriptu je verejný kľúč (nie adresa, adresa je hash verejného kľúča) odosielateľa a digitálne podpísaný hash transakcie od odosielateľa (tiež slúži k zisteniu, či nebolo s transakciou manipulované). V prvej vstupnej časti sa digitálny podpis odosielateľa overí jeho verejným kľúčom. Vo výstupnej časti sa pomocou preddefinovanej sady príkazov udáva postup, ako overiť transakciu, teda v podstate "postup" pre získanie peňazí príjemcom, resp. jeho overenie. Obvykle je prijímateľ overený tak, že na vstup skriptu ide jeho podpis transakcie (teda privátnym kľúčom prijímateľa) a verejný kľúč. V skripte sa najprv overí adresa, ktorá vznikne hashom verejného kľúča. Potom sa verejným kľúčom overí digitálny podpis transakcie prijímateľa, čím potvrdí, že je určená jemu.
Teoreticky je možné uviesť taký skript, ktorý povedie k úmyselne neplatnej transakcii, alebo že transkakcia vôbec nevyžaduje overenie. Na druhej strane, je možné vytvoriť transakciu tak, že bude platná len ak bude pospísaná viacerými kľúčami. Existuje dokonca možnosť požadovať heslo pri prijatí transakcie. Množstvo príkazov v jazyku je pomerne veľké, pre detailnejšie informácie viď TU.
Vďaka tomu, že do transakcie môžu vstupovať len také vstupy, ktoré už sami boli výstupom nejakej inej transakcie, nie je možné v systéme náhodne generovať peniaze, nakoľko pôvod všetkých peňazí je vystopovateľný (viac pri blokoch). Transkakcia je odoslaná nezašifrovane (žiadna správa v rámci Bitcoin protokolu nie je šifrovaná, ale len podpísaná) a to do celej Bitcoin siete, takže síce adresy sú anonymné, pohyb peňazí anonymný nie je - všetci vedia všetko. Pokiaľ by človek používal len jednu jedinú adresu a niekomu by sa podarilo zistiť, že je to práve vaša adresa, je možné sa celkom ľahko dohľadať k Vášmu zostatku. Preto sa obvykle používa viac adries v rámci jednej peňaženky, čím sa tento problém dá eliminovať.
Petr