Adresa, Transakcie

Adresa v sieti Bitcoin


Aby bolo možné prijímať a odosielať platby, musí mať každý účasník nejaký identifikátor svojho konta. Je to systém postavený na asymetrickej kryptografii, každý účasník disponuje privátnym kľúčom a z neho spočítaným verejným kľúčom, z ktorého sa vypočíta adresa. V rámci Bitcoin klienta máte tzv. peňaženku, v ktorej si môžte viesť viacero adries.   Pre tých, ktorí nevedia ako funguje asymetrická kryptorafia, odporúčam aspoň článok na
wikipédii. V skratke - algoritmicky je vygenerovaný privátny a verejný kľúč. Správa podpísaná privátnym kľúčom sa dá overiť iba verejným kľúčom. Verejný kľúč je známy, aby mohol byť overený autor správy, privátny kľúč musí ostať utajený, v opačnom prípade dôjde k strate identity. Je výpočetne veľmi náročné (faktorizácia na prvočísla, eliptické krivky,...) získať z verejného kľúča kľúč privátny. Základom je algoritmus ECDSA, pomocou ktorého je vygenerovaný privátny kľúč o dĺžke 256 bitov. Privátny kľúč je veľmi dôležitý - práve naň sú totiž naviazané všetky platby a voči nemu je držaný zostatok!
Samotná Bitcoin adresa, na ktorú je možné prijímať platby alebo z nej platby odosielať, je generovaná práve z verejného kľúča (a ten je generovaný z privátneho kľúča). Postup je nasledovný:
  • máme 256-bitový privátny kľúč vygenerovaný algoritmom ECDSA z eliptickej krivky Secp256k1 podľa štandardu SEC2 (viac TU).
  • vygenerujeme 520-bitový nekomprimovaný verejný kľúč PubK
  • nad verejným kľúčom spočítame SHA256 hash, výstup - 256-bit číslo S = SHA256(PubK)
  • S prebehneme hashovacou funkcoiu RIPEMD-160, výstupom je 160-bitové číslo R = RIPEMD(S)
  • pred R pridaj číslo verzie, v súčasnosti 0x00, výstup má 168 bitov E = "0x00"+R, kde "+" značí bitovú konkatenáciu
  • spočítaj SHA256 nad E, nad výsledkom znova SHA256, výstup 256-bit D = SHA256(SHA256(E))
  • Z čísla D zober prvých 32 bitov, ktoré predstavujú kontrolný súčet adresy, označ ako C
  • Adresa vznikne spojením E+C (+ je opäť konkatenácia), čím dostávame 200-bitovú Bitcoin adresu.
  • Aby bola lepšie čitateľná, používa sa prevod čísla do formátu base58 (obdoba base64, ale bez znakov l,I,O,0 - malé L a veľké I, nula a veľké O; nakoľko sa podobajú)               
Prefix 0x00, ktorý sme pridali v kroku 5, má v kódovaní base58 špeciálny index 1, preto každá Bitcoin adresa začína týmto číslom. Sieť môže mať najviac 2160 adries, teda približne 1048 účastníkov (limitom je 160-bit RIPEMD hash). Typický príklad adresy je napr.

162ofeqVgtq9egFFF26UUpzJKfCAkiHvrk

Adresu si môže vygenerovať kto chce, nepotrebujete dokonca ani pripojenie k internetu alebo niekam zadávať osobné údaje, obvykle to za Vás obstará klientský program alebo webová služba. Z tohto pohľadu poskytuje Bitcoin anonymitu pri platení (internet treba až pri použití adresy). Navyše môžte používať toľko adries, koľko sa Vám zapáči. Rozsah adries je tak veľký, že je teoreticky nepravdepodobné (ehm, nikdy nehovor nikdy), aby v systéme existovala kolízia, resp. aby dvaja ľudia vygenerovali či už rovnaký privátny kľúč a rovnakú adresu, alebo rovnakú adresu z rôzneho privátneho kľúča. Až do doby, kým niekto nezlomí SHA256 alebo RIPEMD-160...
Aby sa adresa nemusela ručne komplikovane vpisovať do peňaženky pri transakcii, používajú užívatelia tzv. QR kódy. Typický prepis spomenutej adresy v peňaženke do QR kódu je takýto:

qrcode_btc

Transakcie v sieti Bitcoin


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ú.

transakcie-640x380
(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_transakcii-640x531
(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_schema-640x445
(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ť.

Bloky, verifikácia transakcií


Už v úvode odznelo, že systém Bitcoin je decentralizovaný a teda nemá žiadnu centrálnu autoritu, ktorá by transakcie spravovala. Namiesto toho, systém je distribuovaný medzi množstvo uzlov a tie dokážu spravovať transakcie bez nejakého centrálneho bodu.
V rámci rekapitulácie - transakcia v skratke obsahuje hash predošlej transakcie, digitálny podpis od odosielateľa a jeho verejný kľúč, finančný obnos, adresu prijímateľa a overovací skript.
Bitcoin sieť tvoria okrem účastníkov transakcií taktiež
uzly (nodes). Tie sa obvykle na vytváraní transakcií nepodieľajú, ale ich úlohou je práve udržovať konzistenciu transakcií - vytvárajú tzv bloky, ktoré sú zoskupované do veľkej reťaze blokov (block chain). Táto reťaz tvorí históriu všetkých transakcií, ktoré v systéme nastali. Každý jeden uzol musí mať kópiu block chain, aby na základe histórie vedel, či nová transakcia, ktorú odchytil, je platná alebo nie (či sedia podpisy, alebo napr. či sa nejedná o tzv. double spending (dvojité utrácanie - keď sa potenciálny defraudant snaží použiť prostriedky 2x). Veľkosť tejto reťaze pochopiteľne stále rastie, v súčasnej dobe má, k 1.5.2013, 6864MB, teda rastie o necelé 2GB každým rokom (cca 2-3MB za deň). Pokiaľ uzol pozbiera určité množstvo transakcií, ktoré ešte pred ním nikto nepridal do bloku, môže sa pokúsiť z nich takýto blok zostaviť. Formát bloku je nasledujúci:
  • identifikátor začiatku bloku, vždy 0xD9B4BEF9
  • veľkosť bloku v bajtoch
  • hlavička:
    • verzia bloku
    • hash predchádzajúceho bloku
    • hash všetkých transakcií v bloku (koreň hashovacieho stromu, tzv. Merkle tree)
    • časové razítko (štandardné, teda počet sekúnd od 1.1.1970)
    • tzv. target, cieľ zložitosti
    • nonce (32-bitové číslo), tzv. kryptografická soľ
  • počet transakcií v bloku
  • samotný zoznam transakcií (formát popísaný v predchádzajúcej kapitole)
Vytvoriť obyčajný hash zo všetkých transakcií by bola normálne primitívna a rýchla operácia, čo by však potenciálne predstavovalo bezpečnostnú hrozbu - pokiaľ by bolo jednoduché blok vygenerovať, bolo by možné veľmi jednoduché spamovať po sieti bloky, čím by vznikal chaos. Potenciálne by to mohlo viesť k útokom na sieť s cieľom pripojiť neplatné transakcie do systému. Preto je implementovaný tzv. systém proof-of-work (voľne preložení ako "dôkaz o vykonanej práci"), inšpirovaný systémom HashCash, ktorý napr. zabraňuje spamovaniu. V princípe sa jedná o to poslať správu tak, aby obsahovala nejakú extra informáciu, ktorej pravdivosť je veľmi jednoduché overiť, ale výpočetne náročné spočítať - obvykle to nie je možné dosiahnuť algoritmicky, ale práve hrubou výpočetou silou. Práve spočítanie tejto informácie je dôkaz, že spáva je vierohodná a nebude zahodená.
V systéme Bitcoin ide, v rámci pricípu proof-of-work, o to nájsť taký 256-bitový SHA256 hash bloku transakcií (konkrétne dvojitý hash), ktorý bude čo do hodnoty menší ako tzv. súčasný
target daný zložitosťou. Presne definované - nájdi také náhodné 32-bitové číslo nonce, ktoré po pridaní do transakcie spolu s aktuálnym časovým razítkom spôsobí, že po dvojitom zhashovaní dostaneme číslo (hash), ktoré bude menšie, ako aktuálny cieľ zložitosti - teda obsahuje, pokiaľ uvažujeme little-endian zobrazenie, viac núl zľava, ako je cieľ zložitosti (target). Cieľ sa postupne znižuje, čím zložitosť rastie (zložitosť rastie logaritmicky). Táto úloha nie je algoritmicky riešiteľná a k výsledku je možné sa dopátrať jedine hrubou silou náhodným skúšaním (resp. na algoritmický spôsob sa doteraz neprišlo, nie je teda možné predikovať výsledok hashu resp. výsledok dvojitého hashu transakcie), na druhej strane, overiť riešenie je veľmi jednoduché - spočíta sa dvojitý SHA256 hash bloku a overí sa tým, ktorý je uvedený.
Práve vďaka tomu mechanizmu je v celej sieti uzlov vygenerovaný jeden blok raz za približne 5-10 minút a nedochádza tak k spamovaniu blokov po sieti, nakoľko každý uzol vie veľmi rýchlo spočítať, či nový blok v sieti je platný alebo nie. Aby bola táto doba udržovaná, je zložitosť korigovaná a sa mení v priemere každých 2016 blokov (približne každé 2 týždne). Pokiaľ je však zložitosť nastavená príliš vysoko, môže byť pre ďalší blok zložitosť zlížená (teda target nebude znížený o predpokladanú hodnotu, ale o menšiu) a naopak. V dobe písania článku je aktuálny odhadovaný výkon celej siete približne 70TH/s (Tera hashov za sekundu, teda 7*10
13 hashov za sekundu), hľadanie bloku je naozaj lotéria.
Transakcia je označená za platnú až vtedy, keď je do block chain pridaných ešte niekoľko ďalších blokov, obvykle 6. Teda trvá približne hodinu, kým je transakcia označená ako potvrdená. Niektoré inštitúcie však môžu vyžadovať viacero potvrdení o transakcii, čo je možné veľmi jednoducho odsledovať.
Aby však uzlom stálo za to hľadať takto špecifikovaný hash, je za vytvorenie bloku odmena, ktorú si pripíše majiteľ uzlu na svoj účet. Vtedy do bloku pridá špeciálnu transakciu s adresou, na ktorú sa mu odmena pripíše. Je to zároveň jediný spôsob, ako sa v celom systéme vytvárajú peniaze. Celé sa to podobá ťažbe zlata - človek musí vykonať nejakú prácu na to, aby ho našiel. A keďže to, čo nájde, má nejakú hodnotu (= je po tom dopyt a ľudia to chcú), môže to so ziskom predať. Preto sa procesu hľadania bloku príznačne hovorí dolovanie, resp.
mining, ktorému bude venovaný ďaľší článok. Ďalší spôsob, ako sa uzol (miner) môže dostať k odmene, je transakčný poplatok. Pokiaľ v rámci jednej alebo viacerých transakcií existuje stav, kedy je množstvo BTC na vstupe väčšie ako na výstupe, tento rozdiel pripadá práve majiteľovi uzlu, ktorý spočítal blok s danou transakciou.