UTXO vs zůstatky

Dva modely účetnictví a proč Bitcoin a Ethereum volily jinak.

Co se naučíš: Poznáš dva modely účetnictví a proč Bitcoin a Ethereum volily každý jinak.

6 min čtení + cvičeníNavazuje na:🪙 Co znamená vlastnit coin

Existují dva způsoby, jak vést účetnictví bez centrální banky, a dva největší blockchainy zvolily každý jiný. Rozdíl vypadá jako technický detail, ale rozhoduje o soukromí, o tom, co jde snadno naprogramovat, a dokonce o tom, jak vzniká fronta transakcí.


Model 1: UTXO, tedy hotovost

Bitcoin nezná zůstatky. Zná nevyužité výstupy transakcí, zkráceně UTXO. Představ si je jako bankovky různých hodnot ve tvé peněžence.

Když platíš, nemůžeš „odečíst částku". Musíš vzít celé bankovky, utratit je a nechat si vrátit:

Pravidlo je jednoduché: součet vstupů musí být větší nebo roven součtu výstupů a rozdíl si bere miner jako poplatek. Vstup se dá použít právě jednou, což je zároveň to, co brání dvojímu utracení: druhý pokus utratit tentýž vstup uzly odmítnou.


Model 2: zůstatky, tedy bankovní účet

Ethereum a většina novějších sítí vedou u každé adresy zůstatek a transakce ho prostě zvýší nebo sníží. Je to bližší tomu, jak lidé o penězích uvažují, a mnohem snazší se v tom programuje.

Jenže tím vzniká problém, který UTXO nemá: jak zabránit tomu, aby se tatáž transakce zpracovala dvakrát? Řešením je nonce u účtu, tedy pořadové číslo transakce. Každá transakce musí mít o jedna vyšší nonce než předchozí, takže se nedá zopakovat ani přeskočit.


Srovnání

UTXO (Bitcoin)Zůstatky (Ethereum)
Co se ukládáseznam nevyužitých výstupůzůstatek u každé adresy
Ochrana proti opakovánívstup jde utratit jen jednounonce u účtu
Soukromílepší, snadno se používá nová adresahorší, adresa je dlouhodobá identita
Paralelizacedobrá, nezávislé UTXO jde zpracovat souběžněhorší, transakce téhož účtu jdou po sobě
Programovánítěžkopádné, stav se skládá z výstupůpřirozené, kontrakt má vlastní stav
Drobnévznikají a musí se řešitneexistují

Co z toho plyne v praxi

Poplatek u Bitcoinu neplatíš podle částky, ale podle velikosti transakce v bajtech. Když skládáš platbu z padesáti malých UTXO, transakce je velká a drahá, i kdyby šlo o pár korun. Peněženky proto UTXO průběžně konsolidují, ideálně když jsou poplatky nízké.

U Etherea nejdou dvě tvé transakce zpracovat současně, protože musí jít po sobě podle nonce. Když jedna uvízne kvůli nízkému poplatku, blokuje všechny další z téhož účtu. Řeší se to odesláním náhrady se stejnou nonce a vyšším poplatkem.

Soukromí je u UTXO strukturálně lepší, protože je normální dostat každou platbu na novou adresu. U modelu se zůstatky je adresa dlouhodobá a všechno, co jí prošlo, je veřejně propojené. Ani UTXO ale není anonymní: analýza vstupů umí adresy shlukovat, protože transakce s více vstupy obvykle prozradí, že patří jednomu vlastníkovi.


Cvičení

  1. Máš UTXO o hodnotách 0,4, 0,3 a 0,25 a chceš poslat 0,6. Co přesně transakce obsahuje?
  2. Proč je u modelu se zůstatky potřeba nonce, když u UTXO stačí, že vstup jde utratit jednou?
  3. Proč je transakce s mnoha malými vstupy drahá, i když posílá malou částku?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
  1. Dva vstupy a dva výstupy. Vezmeš 0,4 a 0,3, což dá 0,7. Jeden výstup je 0,6 příjemci, druhý je drobné zpět tobě, tedy 0,7 minus 0,6 minus poplatek, například 0,0999. UTXO 0,25 necháš nedotčené. Nejde poslat 0,6 tak, že bys „odečetl": vstupy se utrácejí celé a rozdíl se musí někam vrátit, jinak by ho celý dostal miner.
  2. Protože transakce se zůstatky nespotřebovává nic konkrétního. Zpráva „pošli 5 z A do B" je stejně platná dnes i zítra, takže by ji šlo zopakovat a poslat pětku znovu. Nonce k účtu přidá pořadí, které musí být přesně o jedna vyšší, takže každou transakci lze zpracovat právě jednou a nedá se ani přeskočit pořadí. U UTXO tuhle roli plní samotný vstup, který po utracení zmizí.
  3. Protože se platí za velikost transakce v bajtech, ne za převáděnou částku. Každý vstup nese odkaz na předchozí výstup a podpis, což je řádově sto a více bajtů. Padesát vstupů tedy znamená několikakilobajtovou transakci, a fronta o místo v bloku se draží podle bajtů. Proto se malé částky vyplatí konsolidovat v době nízkých poplatků, dokud to není potřeba.

Shrnutí

  • UTXO se chová jako hotovost: vstupy se utrácejí celé a rozdíl se vrací jako drobné.
  • Model se zůstatky se chová jako účet a proti opakování se brání pořadovým číslem transakce.
  • UTXO má lepší soukromí a paralelizaci, zůstatky se lépe programují a nemají drobné.
  • U Bitcoinu se platí za bajty, ne za částku, takže mnoho malých vstupů je drahé.
  • U Etherea uvízlá transakce blokuje všechny další z téhož účtu, protože nonce musí jít po sobě.
Proč se u Bitcoinu vrací drobné sobě samému?

Protože vstup se utrácí celý a nedá se rozdělit. Transakce musí mít součet výstupů nejvýše roven součtu vstupů, takže zbytek se posílá na vlastní adresu jako další výstup. Kdyby se to neudělalo, rozdíl by si jako poplatek vzal miner.

K čemu je nonce u účtu v modelu se zůstatky?

Zabraňuje tomu, aby šla tatáž podepsaná transakce zpracovat vícekrát, protože zpráva o převodu částky je jinak stále stejně platná. Každá transakce musí mít pořadové číslo přesně o jedna vyšší než předchozí, takže se nedá ani zopakovat, ani přeskočit. V modelu UTXO tuhle roli plní samotný utracený vstup.

Který model má lepší soukromí a proč to neznamená anonymitu?

UTXO, protože je běžné přijímat každou platbu na novou adresu, takže neexistuje jedna dlouhodobá identita. Anonymita to ale není: transakce s více vstupy obvykle prozradí, že ty vstupy patří jednomu vlastníkovi, a analýzou se dají adresy shlukovat do skupin patřících téže osobě.