Ovo je priča o 184 milijarde bitcoina – kako su nastali, zašto je to bilo moguće, i kamo su nestali.

Varijable

U računalnom programiranju postoji koncept varijable. Varijabla je kao “kutija” u koju možete spremiti neku vrijednost.

Postoje posebne kutije koje spremaju slova, posebne koje spremaju brojke, posebne koje spremaju decimalne brojeve, itd. Npr.:

var a = 5

U gornjem slučaju, a je integer varijabla koja sprema broj 5, baš kao x u matematici u školi s nepoznanicama u jednadžbama. Integer (inteđer) varijable su varijable koje mogu spremati samo cijele brojeve.

Zanimljivost: varijable koje spremaju kombinacije brojki, slova i ostalih znakova zovu se “string” ili “text”, one koje spremaju decimalne brojeve su “float”, one koje spremaju istinu (true) ili neistinu (false) zovu se “boolean”, itd. Postoji mnogo tipova i ovise o programskom jeziku koji se koristi.

Laički rečeno, kad u integer spremamo neki broj, njegova maksimalna vrijednost definirana je količinom memorije u računalu. Primjerice, kod 64-bitnih računala (sva moderna računala) maksimalni integer koji možemo spremiti je 9,223,372,036,854,775,807 a minimalni je -9,223,372,036,854,775,808. Da, to je devet milijuna triljuna u oba smjera – pozitivni i negativni.


Za one koji žele znati više

Kako bitovi funkcioniraju za spremanje brojeva:

Računala mogu spremiti podatke samo u binarnom sustavu: jedinicama i nulama. Npr. binarni broj 0101 je 4-bitni broj (ima 4 bita) i računa se ovako: 0*8 + 1*4 + 0*2 + 1*1 = 5. Binarni brojevi preračunavaju se u decimalne tako da se svaka znamenka s desna na lijevo pomnoži s 2^x gdje je x pozicija bita počevši od 0, i svaka sljedeća je duplo veća: 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, …

Primjer:

01000101001001 =
= 0*2^13 + 1*2^12 + 0*2^11 + 0*2^10 + 0*2^9 + 1*2^8 + 0*2^7 + 1*2^6 + 0*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0
= 0*8192 + 1*4096 + 0*2048 + 0*1024 + 0*512 + 1*256 + 0*128 + 1*64 + 0*32 + 0*16 + 1*8 + 0*4 + 0*2 + 1*1
= 4096 + 256 + 64 + 8 + 1
= 4425

Kod 64 bitnog broja radi se o 64 bita:

0000000000000000000000000000000000000000000000000000000000000000

Svaka od tih nula može biti i 1 i od njih se po gornjoj formuli računa decimalni broj. Najljeviji bit je često rezerviran za predznak – +/-. Time se postiže oznaka pozitivnosti ili negativnosti broja, pa brojevi mogu biti manji od nule.


Ako uzmemo u obzir da stanje bitcoina na nekoj adresi ne može biti negativno (bitcoin ili imate ili ne, ne možete imati negativ), koristi se unsigned integer, tj. jedan dodatni bit od onih 64 bita nije rezerviran za +/- predznak, pa time dobivamo još jedno mjesto – maksimalni broj postaje duplo veći: 18,446,744,073,709,551,615 (osamnaest miljuna triljuna). Pokušaj spremanja broja i za 1 veći od toga (18,446,744,073,709,551,616) uzrokuje “integer overflow” (preljev). Zamislite odometar u autu, brojač za kilometre.

Odometar

Kad on dođe na 999999, još jedan kilometar neće ga prebaciti na 1000000 jer nema mjesta za taj broj, već će se prebaciti nazad na 000000. To se dešava i s integerima u računalu – kada premaše maksimalnu vrijednost dolazi do overflowa.

Bitcoin i integeri

Bitcoin (trenutno) ima 8 decimala. Najmanji fragment Bitcoina zove se Satoshi. Riječ bitcoin postoji samo “pro forma”. Zapravo, kad imate 1 BTC vi imate 100,000,000 (sto miljuna) Satoshija. Teoretski maksimum Bitcoina je 21 miljun, dakle: 2,100,000,000,000,000 (dva kvadriljuna i sto triljuna) Satoshija.

Ako od maksimalnog broja koji može biti spremljen u integer (18,446,744,073,709,551,615) odvojimo zadnjih 8 znamenki kao decimale za BTC sustav, dobivamo cifru od 184,467,440,737.09551615.

Brojevi

Drugim riječima, zbog decimala je u Bitcoin sustavu najveći mogući broj nešto veći od 184 milijarde, umjesto punih osamnaest miljuna triljuna.

No, zašto vas zbunjujemo ovim velikim apstraktnim brojkama?

184 Milijarde Bitcoina

Kada se u Bitcoinu šalju sredstva, programu se kaže “pošalji ovoliko bitcoina na ove adrese”. No 2010., Bitcoin softver je imao jednu kritičnu grešku.

Kod slanja BTCa s jednih adresa na druge (u BTCu je moguće slanje istovremeno s više adresa na više drugih), softver je provjeravao samo finalno ulazno i izlazno stanje, ne i sve matematičke operacije između.

Prilikom jedne takve transakcije, pošiljatelj je programu dao sljedeću uputu (pojednostavljeno radi lakšeg razumijevanja):

  • s moje adrese koja ima 50.51 BTC
  • pošalji 92233720368.54277039 na adresu A
  • pošalji 92233720368.54277039 na adresu B
  • pošalji 50.51 BTC na adresu C

Ukupni zbroj transakcija na A i B je 184,467,440,737.08554000. To je točno 997615 Satoshija razlike od maksimalnog broja. Ostali iznosi u transakciji zbrojeni s tim brojem uzrokovali su integer overflow i ukupni prijenos sveo se na slanje samo 50.51 BTC.

Zbrajanje :(

Softver je dakle pogledao ulazna i izlazna stanja.

  • imam ulaz od 50.51 BTC
  • imam izlaz od 50.51 BTC
  • izlaz je manji ili jednak ulazu, dakle transakcije su validne

(u početku transakcijski trošak bio je proizvoljan i zanemariv)

Na adresu A i adresu B poslano je ukupno 184 milijarde potpuno validnih bitcoina, iako ih je u opticaju postojalo jedva nešto više od miljuna.

Rješenje

Satoshi, Theymos, Jeff Garzik i ostali koji su primjetili ovu čudnu transakciju brzo su krenuli u raspravu. U roku od nekoliko sati isprogramiran je patch za tu grešku i dodan u Bitcoin Core softver – node softver koji potpisuje i šalje transakcije. Na forumu je predloženo da svi sudionici BTC mreže prestanu potvrđivati transakcije do kad im se ne ažuriraju nodeovi, a block u kojem se ovaj napad desio odlučili su proglasiti nevalidnim i ignorirati ga, te “putovanjem kroz vrijeme” vratiti stanje na ono kakvo je bilo prije ove transakcije.

Putovanje kroz vrijeme

Čak je postojala i briga da je Bitcoin previše decentraliziran i da tim neće moći imati doseg koji im je potreban da dopru do svih sudionika na vrijeme. Na sreću, Bitcoin sustav je još bio dovoljno mlad da je sve prošlo glatko.

Ideologija

Često ćete od maksimalista čuti da je Ethereum centraliziran oko Vitalika, ili da Ethereum nije pravi blockchain zbog DAO hacka – sličnog incidenta u kojem je 2016. otuđeno 3 miljuna Ethera – tada 15% cijele zalihe. Problem je riješen na isti način – hard forkom koji je vratio stanje u prošlost i vratio sudionicima uloge.

Taj je postupak uzrokovao kreiranje Ethereum Classic forka u kojem su se protivnici mijenjanju do tada nepromjenjive prirode blockchaina odvojili od većine onih (80%) koji su samo željeli zaustaviti očitog negativca.

Je li to bila prava odluka je diskutabilno, no bitno je zapitati se – da je Bitcoin imao toliko korisnika u vrijeme gornjeg incidenta, bi li isto tako došlo do cjepkanja lanca u Bitcoin Classic? Imaju li maksimalisti pravo osuđivati Ethereum samo zato jer Bitcoin nije bio jednako toliko popularan koliko i Ethereum u vrijeme svog hacka? I ako da, koja je to granica popularnosti koja dozvoljava ovakve izmjene?

Vrijedi razmisliti o tome.

Razmislimo...

Osobno svakako smatram da je bolje forkati oko takvih velikih događaja, nego ovo što se trenutno događa u Bitcoinu gdje jednom tjedno izlazi novi fork za “dividende”: Bitcoin Gold, Bitcoin Diamond, Bitcoin Segwit2, itd.

Zaključak

Greške se dešavaju i neke mogu biti katastrofalne za ekosustav ako ih se ostavi nepopravljenima. Neki ideali poput nepromjenjivosti ledgera zaslužuju biti ignorirani za “veće dobro” i dugotrajnu korist zajednice.

Ovaj je popravak bio jedan takav incident – količina BTCa kreirana iz ničega učinila bi preveliku štetu cijelom sustavu, čak i ako bi označili bitcoine s tih adresa kao neupotrebljive u nekoj budućoj verziji softvera. Lakše i dugoročno jeftinije je bilo vratiti stanje u prošlost i to je bila prava odluka.

2 COMMENTS

  1. The difference I see between Bitcoin’s case and Ether’s case is that in Bitcoin’s case, additional Bitcoins were created whereas in Ether’s case funds were stolen. Hard forking because of unwanted massive creation of money seems legitimate, to recover money that was stolen, I don’t know … it would probably make no sense to hard fork each time someone reports their funds have been stolen and I don’t know if a stolen 15% justifies it …

    • I do agree with the distinction there, yes – it’s technical vs political forking. The line between technical and political gets blurrier as time goes by, however. Look at the Segwit / Bitcoin Cash issue. The two sides are still at each other’s throat, each accusing the other of the divide being political and their solution being technical. I think what matters is just going with the winning side *if they are obviously good guys*. In the case of Eth, I chose the Eth side and not ETC because I think the Eth side has morally superior (even if ideologically inferior) developers and leaders, and I want to see where they can take the technology. As you can see, this forking for finance did not get out of hand – the recent Parity problems were just as big in scale, and no fork occurred. But yeah, I do agree with your assessment and distinction, and agree that it’s a tricky thing to define.

LEAVE A REPLY

Please enter your comment!
Please enter your name here