
Šta je dvostruka potrošnja?
Šta je dvostruka potrošnja, zašto je digitalni novac imao taj problem, kako Bitcoin čini da se svaki UTXO potroši samo jednom i koliko potvrda vredi sačekati.
Sadržaj
Najvažnije u nekoliko reči:
- Dvostruka potrošnja je pokušaj da se isti novac potroši dva puta.
- Fajl može da se kopira, pa digitalnom novcu treba neko ko pazi da isti novac ne ode dvaput.
- Banka to radi svojom knjigom. Kod Bitcoina svaki čvor sam proverava da li je UTXO već potrošen.
- Ako dve transakcije troše isti UTXO, u lanac blokova ulazi samo jedna, a druga postaje nevažeća.
- Dok transakcija nije u bloku, pošiljalac može da pokuša da je zameni. Svaka potvrda posle toga čini prevaru težom.
Dvostruka potrošnja (engl. double spending) je pokušaj da se isti novac potroši dva puta.
Sa novčanicom to ne ide. Kad u pekari platiš novčanicom od 1.000 dinara, ona ostaje u kasi, a ti je više nemaš. Istu novčanicu ne možeš da daš i na kiosku preko puta.
U tekstu Šta je UTXO? videli smo da Bitcoin nema račune, nego nepotrošene izlaze transakcija, i da ulaz uvek troši ceo UTXO. Ovde je reč o tome šta se desi kad neko pokuša da isti UTXO potroši dvaput.
Fajl može da se kopira, novčanica ne može

Pošalji prijatelju fotografiju preko Vibera. On je dobio fotografiju, a ona je i dalje u tvom telefonu. Kod fotografije je to dobro. Kod novca bi to bila propast.
Zamisli da je novac fajl, recimo „1000 dinara.txt“. Isti fajl možeš da pošalješ pekaru, pa i kioskaru, i svaki od njih misli da je plaćen. Kopija se ne razlikuje od originala, pa niko ne zna koji je fajl pravi.
Tu muku opisuje i whitepaper u odeljku 2. Primalac ne može sam da proveri da prethodni vlasnik isti novčić nije već potrošio. Uobičajeno rešenje je bila treća strana od poverenja.
Banka rešava problem tako što vodi jedinu knjigu
Kad platiš karticom, banka u svojoj knjizi smanji stanje tvog računa. Ako odmah posle toga istim novcem pokušaš da platiš još nešto, banka vidi da novca više nema i odbije plaćanje. Postoji jedna knjiga i jedan knjigovođa, pa nema spora oko toga šta je bilo prvo.
Whitepaper takvog knjigovođu zove kovnica. Svaka transakcija mora da prođe kroz nju, a cenu tog rešenja kaže jedna rečenica iz istog odeljka: „sudbina celog novčanog sistema zavisi od firme koja vodi kovnicu“. Banka može da odbije tvoju transakciju ili da zatvori račun, a ti o tome ne odlučuješ.
Satoshi je hteo isto, ali bez knjigovođe. Za to su potrebne dve stvari. Sve transakcije moraju da budu javne i svi moraju da se slože kojim su redom stigle. Važi ona koja je bila prva, a kasniji pokušaji se ne broje (odeljak 2).
Kod Bitcoina svaki UTXO može da se potroši samo jednom
Bitcoin ne pita koliko imaš na računu, nego da li UTXO koji trošiš još postoji. Ulaz transakcije pokazuje na tačno jedan raniji izlaz. Kad transakcija sa tim ulazom uđe u blok, taj izlaz više nije nepotrošen. Nestaje sa spiska UTXO-a, a na spisak ulaze novi izlazi te transakcije.
Svaki čvor ima svoju kopiju tog spiska i sam proverava svaku transakciju. Transakcija čiji ulaz nije na spisku je nevažeća, a blok sa takvom transakcijom čvor odbacuje. Tako piše u whitepaperu (odeljak 5, korak 5), a tako radi i Bitcoin Core, program za čvor koji svako može da preuzme (izvorni kod).
Zato dvostruka potrošnja kod Bitcoina izgleda ovako. Pošiljalac potpiše dve transakcije koje troše isti UTXO. Obe su ispravno potpisane i obe izgledaju valjano dok nijedna nije u bloku. Čim jedna uđe u blok, druga postaje nevažeća u svakom čvoru.
Dve transakcije troše isti UTXO, a u lanac ulazi samo jedna
Obe transakcije su potpisane istim ključem i obe su ispravne dok nijedna nije u bloku.
UTXO iz ranije uplate0,005 BTC · 500.000 sat
Transakcija A
Ulaz: isti UTXO, 0,005 BTC · 500.000 sat
- Prodavnici0,003 BTC · 300.000 sat
- Kusur, nazad tebi0,00199 BTC · 199.000 sat
- Naknada rudaru0,00001 BTC · 1.000 sat
Ušla u blok. Prodavnica je plaćena.
Transakcija B
Ulaz: isti UTXO, 0,005 BTC · 500.000 sat
- Nazad tebi, na drugu adresu0,00495 BTC · 495.000 sat
- Naknada rudaru0,00005 BTC · 5.000 sat
Odbijena u svakom čvoru. Njen ulaz pokazuje na UTXO koji više ne postoji.
Izvori: Satoshi Nakamoto, „Bitcoin: A Peer-to-Peer Electronic Cash System“ (otvara se u novom prozoru), 2008, str. 3, odeljak 5, korak 5: blok se prihvata samo ako novac u njemu nije već potrošen; Bitcoin Core 29.0, consensus/tx_verify.cpp (otvara se u novom prozoru), 2025, transakcija čiji ulaz nije među nepotrošenim izlazima je nevažeća (inputs missing/spent). Primer, iznosi su izmišljeni. Mreža bi isto odbacila A da je rudar u blok upisao B.
Redosled transakcija određuje blok, a ne sat
Čvorovi su rasuti po celom svetu, pa poruka ne stiže do svih u isto vreme. Ako pošiljalac obe transakcije pošalje u istoj sekundi, deo čvorova prvo vidi jednu, a deo drugu. Sat tu ne može da presudi, jer čvorovi ne vide isti trenutak.
Presuđuje rudar koji prvi nađe sledeći blok. On u blok upiše jednu od dve transakcije i od tog trenutka svi čvorovi imaju isti odgovor. Druga transakcija više ne može da uđe ni u jedan blok, pa je čvorovi brišu sa spiska transakcija koje čekaju.
Taj redosled je teško promeniti. Blok nastaje uz dokaz o radu, a svaki blok nosi heš prethodnog. Ko hoće da izbaci transakciju iz starog bloka, mora iznova da napravi taj blok i sve blokove posle njega, i to brže od ostatka mreže. Kako su blokovi povezani, objašnjava tekst Šta je blockchain?
Potvrda (engl. confirmation) je blok koji transakciju upiše ili blok koji dođe posle njega. Kad transakcija uđe u blok, ima jednu potvrdu, a svaki sledeći blok dodaje još jednu. Blok nastaje u proseku svakih deset minuta (Bitcoin Core), pa šest potvrda traje oko sat vremena. Bitcoin Core tek posle šeste potvrde piše da je transakcija potvrđena (izvorni kod).
Šta napadač ipak može da pokuša
Pravila ne puštaju isti UTXO u lanac dvaput. Napadač zato ne pokušava da upiše obe transakcije, nego da prevari primaoca oko toga koja će ući. Za to ima tri načina.
Trka dve nepotvrđene transakcije
Prodavac vidi da je transakcija stigla i odmah preda robu. Za to vreme kupac pošalje drugu transakciju, sa istim UTXO-om, na svoju adresu i sa većom naknadom. Rudari prvo uzimaju transakcije koje plaćaju više po virtuelnom bajtu, kako piše u tekstu o UTXO-u, pa druga ima dobre izglede da uđe u blok. Prodavac ostaje i bez robe i bez novca.
Zamena transakcije uz veću naknadu
Zamena uz veću naknadu (engl. Replace-by-Fee, RBF) je pravilo po kome čvor prihvata novu transakciju koja troši isti UTXO kao neka koja još čeka, ako nova plaća veću naknadu. Pravilo ima pošten razlog. Ako tvoja transakcija ima premalu naknadu i danima čeka, možeš da je zameniš istom takvom sa većom naknadom.
Ranije je Bitcoin Core menjao samo transakcije koje su to unapred najavile, po pravilu BIP 125 iz 2015. godine. Od verzije 28.0, izdate 2. oktobra 2024. godine, podrazumevano može da se zameni svaka nepotvrđena transakcija (napomene uz izdanje). Zamena mora da plati više od transakcije koju menja, i ukupno i po virtuelnom bajtu (Bitcoin Core, „Mempool Replacements“).
Za prodavca je nepotvrđena transakcija obećanje, a ne plaćanje. I sam BIP 125 kaže da primalac može da je ne smatra plaćanjem dok ne bude potvrđena.
Prepravka bloka uz veliku računsku snagu
Ostaje najskuplji način. Napadač plati prodavcu, a u tajnosti pravi svoj lanac blokova, u kome umesto tog plaćanja stoji transakcija koja isti UTXO vraća njemu. Ako njegov lanac sustigne i prestigne pošten lanac, čvorovi prelaze na duži, a plaćanje prodavcu nestaje (odeljak 11).
Za to napadaču treba veliki deo ukupne računske snage mreže. Ko ima polovinu snage ili više, pre ili kasnije uspeva. Takav napad se zove napad 51%. Whitepaper računa na to da bi se rudaru sa toliko snage više isplatilo da igra po pravilima nego da ruši sistem u kome i sam drži novac (odeljak 6). Kako rudari dolaze do te snage, piše u tekstu Šta je rudarenje Bitcoina?
Kad napadač ima manje od polovine, šansa zavisi od toga koliko je blokova pošten lanac odmakao. Satoshi je to izračunao u whitepaperu, a ovde je isti račun za napadača sa 10% i sa 30% snage.
Svaki nov blok smanjuje šansu napadača
Koliko je verovatno da napadač ikad sustigne pošten lanac, po broju blokova posle bloka sa tvojom transakcijom.
- Napadač sa 10% snage
- Napadač sa 30% snage
Brojevi sa grafikona
| Blokova posle bloka sa transakcijom | Napadač sa 10% snage | Napadač sa 30% snage |
|---|---|---|
| 1 blok posle, 2 potvrde | 20,46% | 62,77% |
| 2 bloka posle, 3 potvrde | 5,10% | 44,57% |
| 3 bloka posle, 4 potvrde | 1,32% | 32,46% |
| 5 blokova posle, 6 potvrda | 0,091% | 17,74% |
| 10 blokova posle, 11 potvrda | 0,00012% | 4,17% |
Izvor: Satoshi Nakamoto, „Bitcoin: A Peer-to-Peer Electronic Cash System“ (otvara se u novom prozoru), 2008, str. 6-8, odeljak 11, formula i C kod, izračunato za svaki red. Napadač sa polovinom snage ili više uspeva uvek, kako god dugo čekao.
Račun uzima najgori slučaj, da je napadač tajno počeo da radi na svom lancu čim je poslao plaćanje. Sa 10% snage, kad posle bloka sa transakcijom stigne još pet blokova (to je šest potvrda), napadač uspeva otprilike jednom u 1.094 pokušaja, u 0,091% slučajeva. Sa 30% snage šansa je 17,74%, oko jednom u šest. Da bi pala ispod 0,1%, pošten lanac mora da odmakne 24 bloka.
Tri napada i šta ih zaustavlja
Prva dva pada već na jednoj potvrdi. Samo treći traži da se čeka duže.
| Napad | Šta napadač radi | Šta ga zaustavlja |
|---|---|---|
| Trka dve nepotvrđene transakcije | dok prodavac predaje robu, šalje drugu transakciju sa istim UTXO-om, na svoju adresu i sa većom naknadom | jedna potvrda |
| Zamena uz veću naknadu (RBF) | plaćanje koje još čeka menja transakcijom koja isti UTXO troši drugačije | jedna potvrda |
| Prepravka bloka | u tajnosti pravi svoj lanac bez tog plaćanja, dok ne prestigne pošten lanac | više potvrda; napadač sa 10% snage posle šest potvrda uspeva otprilike jednom u 1.094 pokušaja, a sa polovinom snage ili više pre ili kasnije uspeva |
Svaki red sažima jedan odeljak ovog teksta, a izvori su u tom odeljku.
Kad se lanac 2013. podelio na dva, neko je isti novac potrošio dvaput
Rudar sa tada novom verzijom programa, 0.8.0, napravio je 11. marta 2013. veliki blok na visini 225.430. Starije verzije nisu mogle da ga obrade i odbacile su ga. Mreža se podelila na dva lanca. Čvorovi sa verzijom 0.8 gradili su dalje na tom bloku, a starije verzije na svom lancu bez njega (bitcoin.org).
Uzrok nije bio napad, nego greška. Starije verzije su koristile bazu podataka sa ograničenjem koje niko nije primetio, pa nisu mogle da obrade blok sa toliko ulaza (BIP 50). Lanac sa velikim blokom imao je oko 60% računske snage, pa se podela nije razrešila sama. Dve velike grupe rudara koji rade zajedno, BTCGuild i Slush, vratile su svoje čvorove na stariju verziju. Tako je duži postao lanac bez velikog bloka, a one su se, kako piše BIP 50, odrekle značajnog novca.
Dok su postojala dva lanca, jedna transakcija je mogla da bude potvrđena u jednom lancu, a druga, sa istim UTXO-om, u drugom. Neko je to iskoristio i bar jedan veći iznos potrošio dvaput. Po BIP 50, to je uradio neko ko je hteo da proveri da li je moguće, a ne da ukrade. Napad je uspeo iako su obe strane videle transakcije istim redom, verovatno zato što su čvorovi pri vraćanju na stariju verziju ostali bez transakcija koje su čekale.
Dva lanca u martu 2013. i isti novac potrošen dvaput
Šema toka, 11.3.2013. Isprekidani blokovi su lanac koji je napušten.
Sliku možeš da pomeraš levo-desno.
Izvori: bitcoin.org, obaveštenje o podeli lanca (otvara se u novom prozoru), 11.3.2013, veliki blok na visini 225.430; BIP 50 (otvara se u novom prozoru), 2013, oko 60% snage na lancu sa velikim blokom, prelazak BTCGuild i Slush, dvostruka potrošnja. Broj blokova u svakoj grani je nacrtan, ne izmeren. Visine blokova i udeo snage su iz izvora.
Velike menjačnice su brzo obustavile uplate, a BitPay plaćanja. Lanac je posle toga opet bio jedan, a verzija 0.8.1 je dobila pravila koja sprečavaju takve blokove (BIP 50). Pouka iz 2013. je da potvrda vredi onoliko koliko vredi lanac u kome stoji.
Koliko potvrda da sačekaš
Za onoga ko prima novac to izgleda ovako:
- Nepotvrđena transakcija. Može da se zameni drugom, pa je tek obećanje. Za nju ne predaješ ništa što ne smeš da izgubiš.
- Jedna potvrda. Transakcija više ne čeka, pa zamena ne radi. Ostaje samo prepravka bloka, za koju napadaču treba velika računska snaga.
- Šest potvrda. Toliko čeka Bitcoin Core pre nego što transakciju nazove potvrđenom, oko sat vremena. Napadač sa 10% snage tada uspeva otprilike jednom u 1.094 pokušaja.
- Veći iznos, više potvrda. Svaki blok smanjuje šansu napadača, pa onaj ko prima veliki iznos ima razloga da sačeka duže.
Jedan UTXO, jedno trošenje
Ključne lekcije:
- Dvostruka potrošnja je pokušaj da se isti UTXO potroši dvaput. Pravila Bitcoina u lanac puštaju samo jedno trošenje.
- Banka problem rešava svojom knjigom. Bitcoin ga rešava javnim lancem blokova koji svaki čvor sam proverava.
- Redosled transakcija određuje blok, a dokaz o radu čini da se taj redosled teško menja.
- Dok transakcija čeka, može da je zameni druga sa većom naknadom. Zato se računa tek potvrđena transakcija.
Šta dalje?
Dok ne uđe u blok, transakcija čeka u mempoolu, čekaonici nepotvrđenih transakcija. Baš tamo se odigravaju trka i zamena uz veću naknadu. Kako ta čekaonica radi, čitaš u tekstu Šta je mempool?
Novac koji može da se kopira nije novac. Bitcoin dozvoljava da se svaki UTXO potroši samo jednom, a redosled čuva rad cele mreže.
- Šta je dvostruka potrošnja?
Tekst 7 od 14
