<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kripto Početnica]]></title><description><![CDATA[Za sve koji tek ulaze u blokčejn.]]></description><link>https://kripto-pocetnica.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aac7638362f4cfeb6c07be2/ec7c9b7d-64fa-447e-bd12-95b717069e6b.jpg</url><title>Kripto Početnica</title><link>https://kripto-pocetnica.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 14:21:56 GMT</lastBuildDate><atom:link href="https://kripto-pocetnica.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Iluzija pasivnog prihoda od stejkinga: APY naspram inflacije tokena]]></title><description><![CDATA[Da li je kripto stejking zaista pasivan prihod? Može biti pasivan u uskom, operativnom smislu. Možete delegirati tokene, kliknuti nekoliko dugmadi i primati nagrade bez svakodnevnog rada.
Međutim, sa ]]></description><link>https://kripto-pocetnica.hashnode.dev/iluzija-pasivnog-prihoda-od-stejkinga-apy-naspram-inflacije-tokena</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/iluzija-pasivnog-prihoda-od-stejkinga-apy-naspram-inflacije-tokena</guid><category><![CDATA[crypto]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[staking]]></category><category><![CDATA[Staking Crypto]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Web3]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Sun, 27 Sep 2026 23:50:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/f88d01ae-9a7a-41ba-aa90-3e240c516c54.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Da li je kripto stejking zaista pasivan prihod? Može biti pasivan u uskom, operativnom smislu. Možete delegirati tokene, kliknuti nekoliko dugmadi i primati nagrade bez svakodnevnog rada.</p>
<p>Međutim, sa ekonomskog stanovišta, stejking nije automatski prihod, niti automatski znači pasivno uvećavanje bogatstva.</p>
<p>Kontrolna tabla za stejking može pokazati da ste zaradili 12% više tokena. Taj broj sam po sebi ne govori ništa o tome da li:</p>
<ul>
<li><p>Se vaš udeo u ukupnoj ponudi mreže povećao</p>
</li>
<li><p>Je tržišna cena tokena zadržala vrednost</p>
</li>
<li><p>Je nova emisija razvodnila postojeće vlasnike</p>
</li>
<li><p>Su validatori ili platforme odbili provizije</p>
</li>
<li><p>Je vaš kapital ostao likvidan</p>
</li>
<li><p>Je protokol ostvario dovoljno prihoda od naknada da podrži svoje nagrade</p>
</li>
<li><p>Se vaša kupovna moć povećala, izraženo u USD</p>
</li>
</ul>
<p>Glavna zabluda malih investitora je jednostavna: <strong>uvećavanje broja jedinica neke imovine ne znači nužno i uvećavanje bogatstva</strong>.</p>
<p>Visok APY od stejkinga predstavlja stopu raspodele. On govori koliko brzo protokol, pod određenim pretpostavkama, dodeljuje tokene vašem novčaniku. Ne govori odakle je nagrada došla, šta se dogodilo sa ukupnom ponudom niti koliko će nagrada vredeti kada konačno budete mogli da je prodate.</p>
<p>Stejking i dalje može biti ekonomski racionalan. On pomaže u obezbeđivanju mreža koje koriste dokaz o ulogu, odnosno proof-of-stake, a neke mreže ostvaruju značajne prihode od transakcionih naknada. Greška nije u samom stejkingu. Greška je u tretiranju svakog oglašenog APY-a kao da je bankarska kamata, slobodan novčani tok ili garantovani investicioni prinos.</p>
<h2>Tri vrste prinosa koje kripto-investitori često mešaju</h2>
<p>Pre poređenja bankarske kamate sa nagradama od stejkinga, korisno je razdvojiti tri različita merila prinosa.</p>
<h3>1. Nominalni prinos u tokenima</h3>
<p>Ovo meri koliko ste dodatnih jedinica tokena dobili.</p>
<blockquote>
<p>Nominalni prinos u tokenima = krajnje stanje tokena podeljeno početnim stanjem tokena, minus 1</p>
</blockquote>
<p>Ako ste počeli sa 1.000 tokena, a završili sa 1.120, vaš nominalni prinos u tokenima bio je 12%.</p>
<p>To je broj koji većina kontrolnih tabli za stejking stavlja u prvi plan.</p>
<h3>2. Prinos vlasničkog udela prilagođen razvodnjavanju</h3>
<p>Ovo meri da li se vaš procentualni udeo u ukupnoj ponudi tokena mreže povećao ili smanjio.</p>
<blockquote>
<p>Prinos vlasničkog udela prilagođen razvodnjavanju = krajnji procenat ponude podeljen početnim procentom ponude, minus 1</p>
</blockquote>
<p>Ako se broj vaših tokena povećao za 12%, dok je ukupna ponuda porasla za 25%, vaš udeo u mreži se smanjio. Imate više tokena, ali svaki token predstavlja manji deo ukupne monetarne baze.</p>
<h3>3. Prinos spoljne kupovne moći</h3>
<p>Ovo meri šta vaša pozicija može da kupi izvan protokola.</p>
<blockquote>
<p>Prinos portfolija u USD = (1 + neto prinos u tokenima) pomnoženo sa (1 + promena cene tokena), minus 1</p>
</blockquote>
<p>Ako se broj vaših tokena poveća za 12%, ali cena tokena padne za 30%, vaše bogatstvo izraženo u USD smanjuje se za 21,6%, pre poreza, troškova gasa, proklizavanja cene i drugih troškova.</p>
<p>U tradicionalnoj monetarnoj ekonomiji, realni prinos obično znači nominalni prinos prilagođen inflaciji potrošačkih cena. Na kripto-tržištima izraz „realni prinos” koristi se slobodnije. Može da označava:</p>
<ul>
<li><p>Prinos od stejkinga prilagođen inflaciji ponude tokena</p>
</li>
<li><p>Prinos koji se isplaćuje iz naknada protokola, a ne iz emisije tokena</p>
</li>
<li><p>Prinos koji se isplaćuje u navodno stabilnoj ili neinflatornoj imovini</p>
</li>
</ul>
<p>Ova značenja su povezana, ali nisu međusobno zamenljiva.</p>
<h2>1. Bankarska kamata i blokčejn stejking ekonomski se razlikuju</h2>
<p>Bankarska kamata, nagrade od nativnog stejkinga, prinosi od kripto-pozajmljivanja i podsticaji za obezbeđivanje likvidnosti često se prikazuju istim znakom procenta. Takav prikaz skriva činjenicu da potiču iz različitih ekonomskih aktivnosti.</p>
<h3>Bankarska kamata je naknada po osnovu potraživanja iz duga</h3>
<p>Kada se novac položi na bankarski depozitni račun, depozit postaje obaveza banke. Banka koristi depozite i druge izvore finansiranja za finansiranje imovine kao što su krediti, hartije od vrednosti i kamatonosna sredstva.</p>
<p>Zajmoprimci otplaćuju glavnicu i kamatu. Hartije od vrednosti stvaraju kamatni prihod. Banka deo svog prihoda isplaćuje deponentima, a zadržava kamatnu maržu nakon troškova finansiranja, kreditnih gubitaka, operativnih troškova i troškova kapitala.</p>
<p>Federalne rezerve opisuju neto kamatni prihod kao razliku između prihoda koji banka ostvaruje od kredita i druge kamatonosne imovine i kamate koju plaća na depozite i druge izvore finansiranja. U Sjedinjenim Američkim Državama, prihvatljivi depoziti u osiguranim institucijama imaju i regulatornu zaštitu i osiguranje depozita, u okviru važećih ograničenja. Kripto-stejking i kripto-proizvodi koji donose kamatu uglavnom ne pružaju ekvivalentnu zaštitu. (Izvori 1, 2 i 3.)</p>
<p>To ne znači da je bankarska kamata potpuno bezbedna niti da automatski donosi realnu dobit. Ako štedni račun plaća 4%, dok potrošačke cene rastu za 5%, deponent gubi kupovnu moć.</p>
<p>Ključna razlika nalazi se u izvoru i strukturi isplate. Bankarska kamata je trošak finansiranja podržan novčanim tokovima i bilansom stanja finansijske institucije. Ona se obično ne pripisuje programskim povećavanjem broja jedinica valutnog potraživanja pojedinačnog deponenta.</p>
<h3>Proof-of-stake nagrade predstavljaju naknadu za bezbednost mreže</h3>
<p>U proof-of-stake mreži validatori zaključavaju kapital i učestvuju u aktivnostima kao što su:</p>
<ul>
<li><p>Predlaganje blokova</p>
</li>
<li><p>Potvrđivanje validnih blokova</p>
</li>
<li><p>Održavanje dostupnosti mreže</p>
</li>
<li><p>Sprovođenje pravila konsenzusa</p>
</li>
<li><p>Obezbeđivanje ekonomskog kolaterala koji može biti kažnjen u slučaju nedozvoljenog ponašanja</p>
</li>
</ul>
<p>Mreža mora da nadoknadi učesnicima pružanje ovih usluga, kao i prihvatanje rizika od slashing kazni, operativnih rizika, rizika likvidnosti i promena cene tokena.</p>
<p>Ta naknada može dolaziti iz nekoliko izvora:</p>
<ul>
<li><p>Emisije novoiskovanih tokena</p>
</li>
<li><p>Transakcionih naknada</p>
</li>
<li><p>Prioritetnih naknada ili napojnica</p>
</li>
<li><p>Maksimalne vrednosti koja se može izvući, poznate kao MEV</p>
</li>
<li><p>Podsticaja finansiranih iz trezora</p>
</li>
<li><p>Prihoda od aplikacija ili usluga</p>
</li>
</ul>
<p>Dokumentacija Ethereuma, na primer, razlikuje nagrade u novoiskovanom ETH-u od transakcionih napojnica i prihoda od MEV-a. Takođe objašnjava da se osnovna transakciona naknada spaljuje, umesto da se isplaćuje validatorima. To pokazuje zašto investitori moraju da prouče sastav nagrada od stejkinga, umesto da svaki nagradni token tretiraju kao ekonomski identičan. (Izvori 4 i 5.)</p>
<p>Novoiskovana nagrada jeste legitimna naknada za stvarnu uslugu — bezbednost mreže. Ali ona ne predstavlja nužno novo bogatstvo za vlasnike tokena kao grupu. Ako se isplata stvara povećavanjem ponude, budžet za bezbednost delimično se finansira razvodnjavanjem.</p>
<h3>Stejking nije isto što i pozajmljivanje ili kreiranje tržišta</h3>
<p>Kripto-platforme često svrstavaju nekoliko suštinski različitih aktivnosti pod zajednički naziv „zarada”.</p>
<table>
<thead>
<tr>
<th>Proizvod</th>
<th>Ekonomska uloga investitora</th>
<th>Primarni izvor nagrade</th>
<th>Glavni skriveni odbitak</th>
</tr>
</thead>
<tbody><tr>
<td>Bankarski depozit</td>
<td>Poverilac i izvor finansiranja banke</td>
<td>Kamata od kredita, hartija od vrednosti i druge bankarske imovine</td>
<td>Potrošačka inflacija, naknade za račun i neosigurana kreditna izloženost iznad važećih limita</td>
</tr>
<tr>
<td>Nativni proof-of-stake stejking</td>
<td>Pružalac bezbednosti mreže</td>
<td>Nova emisija, transakcione naknade, napojnice i ponekad MEV</td>
<td>Razvodnjavanje tokena, provizija validatora, slashing, volatilnost cene i period odvezivanja</td>
</tr>
<tr>
<td>DeFi pozajmljivanje</td>
<td>Pružalac kapitala za pozajmljivanje</td>
<td>Kamata koju plaćaju zajmoprimci, ponekad dopunjena podsticajima u tokenima</td>
<td>Rizik pametnih ugovora, loš dug, rizik iskorišćenosti kapitala i razvodnjavanje kroz podsticaje</td>
</tr>
<tr>
<td>Obezbeđivanje likvidnosti</td>
<td>Ončejn market mejker</td>
<td>Naknade od trgovanja i mogući podsticaji u tokenima</td>
<td>Privremeni gubitak, nepovoljan izbor, MEV, rizik ugovora i pad vrednosti nagradnog tokena</td>
</tr>
<tr>
<td>Centralizovani kripto-proizvod za zaradu</td>
<td>Poverilac ili ugovorni klijent platforme</td>
<td>Pozajmljivanje, trgovanje, ponovno založno korišćenje imovine ili druge aktivnosti platforme</td>
<td>Rizik druge ugovorne strane, stečaj, obustava povlačenja sredstava i netransparentnost</td>
</tr>
</tbody></table>
<p>Dokumentacija Aavea, na primer, navodi da se prinosi dobavljača kapitala finansiraju kamatama zajmoprimaca, umanjenim za rezervni faktor protokola. To se ekonomski razlikuje od nagrade za stejking koja se prvenstveno finansira novom emisijom tokena. (Izvor 9.)</p>
<p>Isto tako, pružalac likvidnosti koji zarađuje naknade od razmene dobija nadoknadu za pružanje zaliha i prihvatanje rizika trgovanja. Nazivanje sve tri aktivnosti „pasivnim prihodom” uklanja informaciju koja je investitorima najpotrebnija: <strong>ko plaća prinos i zašto?</strong></p>
<h3>Više jedinica ne garantuje veće bogatstvo</h3>
<p>Zamislite da je tržišna vrednost mreže jedna pita.</p>
<p>Broj vaših tokena predstavlja broj parčića koje posedujete. Ukupna ponuda tokena predstavlja broj parčića na koje je pita podeljena.</p>
<p>Ako broj vaših parčića poraste za 12%, dok ukupan broj parčića poraste za 25%, vaš deo pite postaje manji. Postajete bogatiji samo ako sama pita dovoljno poraste da nadoknadi to razvodnjavanje.</p>
<p>To je imenilac koji nedostaje u većini marketinških poruka o visokom APY-u.</p>
<h2>2. Mehanika razvodnjavanja tokena</h2>
<p>U diskusijama o kriptovalutama, „inflacija” obično označava rast ponude tokena. To se razlikuje od inflacije potrošačkih cena, koja meri promene cena robe i usluga.</p>
<p>Važno je nekoliko pokazatelja ponude.</p>
<h3>Bruto emisija</h3>
<p>Bruto emisija predstavlja broj novih tokena stvorenih i distribuiranih tokom određenog perioda.</p>
<p>Ti tokeni mogu biti dodeljeni:</p>
<ul>
<li><p>Validatorima</p>
</li>
<li><p>Delegatorima</p>
</li>
<li><p>Pružaocima likvidnosti</p>
</li>
<li><p>Zajmoprimcima</p>
</li>
<li><p>Programerima</p>
</li>
<li><p>Trezoru protokola</p>
</li>
<li><p>Programima grantova za ekosistem</p>
</li>
</ul>
<h3>Spaljivanje tokena</h3>
<p>Spaljivanjem se tokeni trajno uklanjaju iz ponude.</p>
<p>Neke mreže spaljuju transakcione naknade. Druge koriste prihode protokola za kupovinu i spaljivanje tokena. Spaljivanje može nadoknaditi deo ili celu bruto emisiju, ali investitor mora da proveri stvarni neto efekat.</p>
<h3>Neto rast ukupne ponude</h3>
<blockquote>
<p>Neto rast ukupne ponude = novoizdati tokeni minus spaljeni tokeni, podeljeno početnom ukupnom ponudom</p>
</blockquote>
<p>Ako mreža izda 10 miliona tokena i spali 2 miliona, neto emisija iznosi 8 miliona.</p>
<h3>Rast ponude u opticaju</h3>
<p>Ponuda u opticaju može porasti čak i kada se ne iskuje nijedan novi token.</p>
<p>Ranije stvoreni tokeni mogu ući na tržište putem:</p>
<ul>
<li><p>Otključavanja tokena tima i investitora</p>
</li>
<li><p>Distribucija fondacije</p>
</li>
<li><p>Trošenja sredstava iz trezora</p>
</li>
<li><p>Grantova za ekosistem</p>
</li>
<li><p>Airdrop kampanja</p>
</li>
<li><p>Rudarskih ili stejking rezervi</p>
</li>
<li><p>Alokacija market mejkerima</p>
</li>
</ul>
<p>Otključavanje ne mora povećati ukupnu ponudu, jer tokeni možda već postoje. Međutim, ono povećava količinu dostupnu za trgovanje i potencijalnu prodaju.</p>
<p>Token sa fiksnom maksimalnom ponudom zato može imati značajnu inflaciju ponude u opticaju.</p>
<h3>Učešće u stejkingu</h3>
<p>Odnos između inflacije tokena i APY-a od stejkinga u velikoj meri zavisi od procenta ponude koji je stejkovan.</p>
<p>Pretpostavimo sledeće:</p>
<ul>
<li><p>Ukupna ponuda iznosi 100 tokena</p>
</li>
<li><p>Protokol godišnje stvara 10 novih tokena</p>
</li>
<li><p>Stejkovano je samo 50 tokena</p>
</li>
<li><p>Svih 10 novih tokena dodeljuje se učesnicima u stejkingu</p>
</li>
</ul>
<p>Stopa inflacije ukupne ponude mreže iznosi 10%. Međutim, bruto stopa nagrade na stejkovane tokene iznosi približno 20%, jer se 10 novih tokena deli na samo 50 stejkovanih tokena.</p>
<p>Ta istaknuta stopa od 20% nije nastala ni iz čega. Protokol je povećao ukupnu ponudu za 10%.</p>
<p>Učesnici u stejkingu povećavaju relativni vlasnički udeo na štetu onih koji ne stejkuju. Kada bi svaki vlasnik proporcionalno stejkovao tokene, nagrada bi uglavnom očuvala relativni udeo svakog vlasnika, pre naknada i razlika u poslovanju. Sama emisija ne bi stvorila ukupno novo bogatstvo.</p>
<p>Zbog toga neke nagrade od stejkinga prvenstveno funkcionišu kao <strong>mehanizam zaštite od razvodnjavanja</strong>. Investitori stejkuju zato što bi ih izostanak iz stejkinga još brže razvodnio.</p>
<p>Akademski modeli opisuju nagrade za blokove kao inflatorne transfere između vlasnika sa različitim ponašanjem u stejkingu i različitim investicionim horizontima. Istraživanja proof-of-stake sistema takođe pokazuju da su visoke nominalne stope stejkinga često povezane sa visokom inflacijom, zbog čega su prinosi prilagođeni inflaciji znatno manje privlačni od istaknutih stopa. (Izvori 6, 7 i 8.)</p>
<h3>Konkretan primer: nagrade od 12% i inflacija ponude od 25%</h3>
<p>Razmotrimo hipotetičku mrežu.</p>
<table>
<thead>
<tr>
<th>Pokazatelj</th>
<th>Početak godine</th>
<th>Kraj godine</th>
</tr>
</thead>
<tbody><tr>
<td>Broj tokena investitora</td>
<td>1.000 tokena</td>
<td>1.120 tokena</td>
</tr>
<tr>
<td>Ukupna ponuda tokena</td>
<td>100.000.000 tokena</td>
<td>125.000.000 tokena</td>
</tr>
<tr>
<td>Udeo investitora u ponudi</td>
<td>0,001000%</td>
<td>0,000896%</td>
</tr>
<tr>
<td>Cena tokena</td>
<td>10 USD</td>
<td>Zavisi od tržišne tražnje</td>
</tr>
<tr>
<td>Vrednost portfolija investitora</td>
<td>10.000 USD</td>
<td>Zavisi od cene tokena</td>
</tr>
</tbody></table>
<p>Novčanik investitora pokazuje uspešnu godinu:</p>
<ul>
<li><p>Početno stanje: 1.000 tokena</p>
</li>
<li><p>Nagrada od stejkinga: 120 tokena</p>
</li>
<li><p>Krajnje stanje: 1.120 tokena</p>
</li>
<li><p>Nominalni prinos u tokenima: 12%</p>
</li>
</ul>
<p>Ali ukupna ponuda povećala se za 25%.</p>
<p>Udeo investitora u ponudi promenio se na sledeći način:</p>
<ul>
<li><p>Početni udeo: 1.000 podeljeno sa 100.000.000, odnosno 0,001000%</p>
</li>
<li><p>Krajnji udeo: 1.120 podeljeno sa 125.000.000, odnosno 0,000896%</p>
</li>
<li><p>Promena vlasničkog udela: −10,4%</p>
</li>
</ul>
<p>Investitor je zaradio 12% više jedinica, ali je izgubio 10,4% svog relativnog udela u mreži.</p>
<p>Precizan obračun prinosa prilagođenog razvodnjavanju glasi:</p>
<blockquote>
<p>Prinos prilagođen razvodnjavanju = 1,12 podeljeno sa 1,25, minus 1</p>
</blockquote>
<blockquote>
<p>Prinos prilagođen razvodnjavanju = −10,4%</p>
</blockquote>
<p>Brza aproksimacija oduzela bi inflaciju ponude od 25% od nominalnog prinosa od 12% i dala rezultat od −13 procentnih poena. Ta aproksimacija je korisna za početnu procenu, ali je obračun odnosa precizniji kada su stope visoke.</p>
<h3>Šta se dešava sa cenom tokena?</h3>
<p>Inflacija tokena ne primorava cenu mehanički da padne za isti procenat. Cena zavisi i od ponude i od tražnje.</p>
<p>Osnovni odnos glasi:</p>
<blockquote>
<p>Cena tokena = tržišna vrednost mreže podeljena ponudom tokena u opticaju</p>
</blockquote>
<p>Na početku primera:</p>
<ul>
<li><p>Ponuda: 100 miliona tokena</p>
</li>
<li><p>Cena: 10 USD</p>
</li>
<li><p>Tržišna vrednost mreže: 1 milijarda USD</p>
</li>
</ul>
<p>Ako tržišna vrednost mreže ostane tačno 1 milijarda USD, dok ponuda poraste na 125 miliona tokena, cena postaje:</p>
<blockquote>
<p>1 milijarda USD podeljena sa 125 miliona tokena = 8 USD po tokenu</p>
</blockquote>
<p>To predstavlja pad cene od 20%, a ne od 25%. Razlika postoji zato što poništavanje povećanja ponude od 25% zahteva deljenje sa 1,25.</p>
<p>Krajnja vrednost portfolija investitora bila bi:</p>
<blockquote>
<p>1.120 tokena pomnoženo sa 8 USD = 8.960 USD</p>
</blockquote>
<p>Uprkos zaradi od 12% kroz stejking, investitor gubi 1.040 USD, odnosno 10,4%.</p>
<p>Pretpostavimo sada da slaba tražnja i kontinuirana prodaja obore cenu tokena na 7 USD.</p>
<p>Vrednost portfolija postaje:</p>
<blockquote>
<p>1.120 tokena pomnoženo sa 7 USD = 7.840 USD</p>
</blockquote>
<p>Broj tokena investitora povećao se za 12%, ali je vrednost pozicije izražena u USD pala za 21,6%.</p>
<p>Da bi bio na nuli nakon što zaradi 12% više tokena, cena mora ostati iznad približno 8,93 USD.</p>
<blockquote>
<p>Cena za pokriće troškova = 10 USD podeljeno sa 1,12</p>
</blockquote>
<p>Pad cene veći od približno 10,7% briše celokupan prinos od 12% u tokenima.</p>
<p>Ovaj obračun i dalje ne obuhvata:</p>
<ul>
<li><p>Proviziju validatora</p>
</li>
<li><p>Naknade platforme</p>
</li>
<li><p>Troškove gasa</p>
</li>
<li><p>Troškove preuzimanja i reinvestiranja nagrada</p>
</li>
<li><p>Raspon između kupovne i prodajne cene</p>
</li>
<li><p>Proklizavanje cene</p>
</li>
<li><p>Poreze</p>
</li>
<li><p>Inflaciju potrošačkih cena</p>
</li>
</ul>
<h3>Nemojte dvaput računati inflaciju i pad cene</h3>
<p>Prinos vlasničkog udela prilagođen razvodnjavanju i prinos portfolija u USD odgovaraju na različita pitanja.</p>
<p>Rast ponude koristite da utvrdite da li se vaš udeo u ekonomiji tokena povećao ili smanjio.</p>
<p>Stvarnu tržišnu cenu koristite da utvrdite svoj stvarni tržišni prinos.</p>
<p>Ako je cena tokena već pala kao odgovor na emisije, ponovno oduzimanje pune stope inflacije od realizovanog prinosa u USD značilo bi da deo istog ekonomskog efekta računate dvaput.</p>
<p>Ispravna pitanja su:</p>
<table>
<thead>
<tr>
<th>Pitanje</th>
<th>Relevantno merilo</th>
</tr>
</thead>
<tbody><tr>
<td>Da li se broj mojih tokena povećao?</td>
<td>Nominalni prinos u tokenima</td>
</tr>
<tr>
<td>Da li se moj udeo u mreži povećao?</td>
<td>Prinos od stejkinga u odnosu na rast ponude</td>
</tr>
<tr>
<td>Da li se moje bogatstvo u USD povećalo?</td>
<td>Promena broja tokena u kombinaciji sa promenom njihove cene</td>
</tr>
<tr>
<td>Da li se moja realna kupovna moć povećala?</td>
<td>Prinos u USD prilagođen inflaciji potrošačkih cena i troškovima</td>
</tr>
<tr>
<td>Da li je nagrada bila ekonomski održiva?</td>
<td>Prihod finansiran naknadama u poređenju sa emisijama i ukupnim nagradama</td>
</tr>
</tbody></table>
<h3>Ko finansira inflatorne nagrade od stejkinga?</h3>
<p>Na nivou protokola, budžet za bezbednost ima dva osnovna izvora:</p>
<ol>
<li><p>Korisnici plaćaju mrežne usluge putem naknada.</p>
</li>
<li><p>Vlasnici tokena finansiraju bezbednost kroz monetarno razvodnjavanje.</p>
</li>
</ol>
<p>Kada se nagrade prvenstveno finansiraju novom emisijom, ekonomski teret se raspoređuje nejednako.</p>
<h4>Oni koji ne stejkuju trpe direktno razvodnjavanje</h4>
<p>Vlasnik koji ne učestvuje u stejkingu ne dobija nijedan novoisporučeni token, dok se ukupna ponuda povećava. Njegov relativni udeo opada.</p>
<p>To može pretvoriti stejking iz opcione strategije prihoda u odbrambenu obavezu. Vlasnik ne stejkuje zato što mreža stvara privlačan prinos, već zato što bi ostanak van stejkinga bio još nepovoljniji.</p>
<h4>I učesnici u stejkingu mogu biti razvodnjeni</h4>
<p>Učesnik u stejkingu može zaraditi manje od stope rasta ponude mreže zbog:</p>
<ul>
<li><p>Provizija validatora</p>
</li>
<li><p>Zastoja u radu</p>
</li>
<li><p>Propuštenih potvrda</p>
</li>
<li><p>Slashing kazni</p>
</li>
<li><p>Odloženog reinvestiranja</p>
</li>
<li><p>Pravila o minimalnom stanju</p>
</li>
<li><p>Nejednakog pristupa MEV-u</p>
</li>
<li><p>Naknada platforme</p>
</li>
<li><p>Promena stope učešća u stejkingu</p>
</li>
</ul>
<p>APY veći od nule ne garantuje da će učesnik u stejkingu sačuvati svoj relativni vlasnički udeo.</p>
<h4>Kupci finansiraju prodate nagrade</h4>
<p>Validatori i delegatori često moraju da pretvore nagrade u stabilne kriptovalute ili fiat valutu kako bi platili:</p>
<ul>
<li><p>Hosting i infrastrukturu</p>
</li>
<li><p>Zaposlene i izvođače</p>
</li>
<li><p>Poreze</p>
</li>
<li><p>Upravljanje rizikom</p>
</li>
<li><p>Isplate investitorima</p>
</li>
<li><p>Operativne troškove</p>
</li>
</ul>
<p>Prodaja nagrada sama po sebi nije manipulativna. To je normalno upravljanje trezorom.</p>
<p>Tržišna posledica je ipak važna. Za svaki prodati token mora postojati kupac. Ako je organska tražnja dovoljno snažna, tržište može apsorbovati emisije bez velikog pada. Ako je tražnja slaba, tržišna ravnotežna cena mora pasti dok kupci ne postanu spremni da drže dodatnu ponudu.</p>
<pre><code class="language-mermaid">flowchart LR
    A[Protokol raspodeljuje nagrade od stejkinga] --&gt; B[Validatori i delegatori dobijaju tokene]
    B --&gt; C{Reinvestirati, zadržati ili prodati}
    C --&gt;|Prodati| D[Tokeni ulaze u likvidnost otvorenog tržišta]
    D --&gt; E{Postoji li dovoljna organska tražnja?}
    E --&gt;|Da| F[Emisije su apsorbovane]
    E --&gt;|Ne| G[Tržišna ravnotežna cena pada]
    C --&gt;|Reinvestirati| H[Investitor povećava izloženost tokenu]
</code></pre>
<h4>Veliki vlasnici mogu imati strukturne prednosti</h4>
<p>Institucionalni validatori, rani investitori, fondacije i profesionalne kompanije za stejking mogu imati prednosti koje mali investitori nemaju:</p>
<ul>
<li><p>Niže operativne troškove po tokenu</p>
</li>
<li><p>Veću pouzdanost validatora</p>
</li>
<li><p>Automatizovano preuzimanje nagrada</p>
</li>
<li><p>Pristup MEV infrastrukturi</p>
</li>
<li><p>Niže troškove trgovanja</p>
</li>
<li><p>Mogućnost zaštite od rizika promene cene tokena</p>
</li>
<li><p>Znatno nižu prvobitnu nabavnu cenu</p>
</li>
<li><p>Bolju likvidnost i izvršenje naloga</p>
</li>
<li><p>Profesionalno upravljanje porezima i trezorom</p>
</li>
</ul>
<p>Profesionalni validator može svakodnevno prodavati nagrade, dok glavni ulog ostaje nepromenjen. Rani investitor može ostati profitabilan i pri cenama daleko nižim od ulazne cene novijeg malog investitora.</p>
<p>Nasuprot tome, mali investitori često se podstiču da automatski reinvestiraju nagrade. Reinvestiranje može biti korisno kada je osnovni realni prinos pozitivan. Kada je očekivani realni prinos negativan, reinvestiranje samo povećava izloženost imovini koja gubi vrednost.</p>
<p>Otključavanje tokena ranih investitora takođe treba odvojiti od emisija za stejking. Oba događaja mogu povećati tržišnu ponudu, ali predstavljaju različite tokenomske događaje. Ozbiljna analiza prati ih odvojeno.</p>
<h2>3. Nelikvidnost i zamka perioda odvezivanja</h2>
<p>APY od stejkinga obično se prikazuje na godišnjem nivou. Gubici na kripto-tržištu ne nastaju po godišnjem rasporedu.</p>
<p>Token može izgubiti 30% ili 40% za nekoliko dana, dok se nagrade od stejkinga sporo akumuliraju tokom više meseci. Ako pozicija podleže periodu odvezivanja, odnosno unbonding periodu, vlasnik možda neće moći da reaguje.</p>
<h3>Zašto postoje periodi odvezivanja</h3>
<p>Odvezivanje nije samo nepraktična karakteristika proizvoda. Ono često ima bezbednosnu funkciju.</p>
<p>Protokolu može biti potrebno vreme da otkrije nedozvoljeno ponašanje, obradi izlazak validatora, primeni slashing kazne ili sačuva ekonomske posledice radnji preduzetih dok je validator bio aktivan.</p>
<p>U zavisnosti od mreže i načina stejkinga, periodi čekanja mogu trajati danima ili nedeljama. Prema stanju iz septembra 2026. godine, zvanična dokumentacija novčanika Keplr navodi primere od 21 dana za Cosmos Hub i 14 dana za Osmosis. Neki mrežni modeli i proizvodi za stejking koriste ili su ranije koristili periode koji se približavaju 28 dana. Parametri se mogu promeniti kroz upravljanje protokolom, pa investitori moraju proveriti aktuelna pravila umesto da se oslanjaju na stari članak ili interfejs berze. (Izvor 10.)</p>
<p>Tokom odvezivanja investitori se mogu suočiti sa nekim od sledećih ograničenja:</p>
<ul>
<li><p>Tokeni ne mogu da se prenesu</p>
</li>
<li><p>Tokeni ne mogu da se prodaju</p>
</li>
<li><p>Tokeni ne mogu da se koriste kao kolateral</p>
</li>
<li><p>Nagrade prestaju da se obračunavaju</p>
</li>
<li><p>Izloženost slashing kaznama se nastavlja</p>
</li>
<li><p>Potrebna je posebna transakcija za povlačenje</p>
</li>
<li><p>Redovi za izlazak produžavaju stvarno kašnjenje</p>
</li>
<li><p>Obrada berze ili kastodijana dodaje još vremena</p>
</li>
</ul>
<h3>Matematika sporog prinosa i brzih gubitaka</h3>
<p>Pretpostavimo da token oglašava APY od 12% i ima period odvezivanja od 28 dana.</p>
<p>Kada bi se godišnja stopa od 12% ravnomerno obračunavala tokom 28 dana, u tom periodu bi donela približno 0,87%.</p>
<p>Pad cene tokena od 30% više je od 34 puta veći od nagrade akumulirane tokom 28 dana.</p>
<p>U mnogim sistemima investitori ne dobijaju nagrade tokom odvezivanja. Investitor zato može snositi ceo rizik promene cene, a da tokom izlaznog perioda ne zarađuje ništa.</p>
<p>Razmotrimo duži period držanja:</p>
<ul>
<li><p>Početna pozicija: 1.000 tokena</p>
</li>
<li><p>APY: 12%</p>
</li>
<li><p>Vreme provedeno u stejkingu: dve godine</p>
</li>
<li><p>Krajnje stanje nakon godišnjeg ukamaćivanja: 1.254,4 tokena</p>
</li>
<li><p>Nominalni dobitak u tokenima: 25,44%</p>
</li>
</ul>
<p>Pretpostavimo sada da cena tokena padne za 40% pre nego što investitor uspe da završi izlazak.</p>
<p>Faktor vrednosti portfolija postaje:</p>
<blockquote>
<p>1,2544 pomnoženo sa 0,60 = 0,75264</p>
</blockquote>
<p>Investitor je u gubitku od približno 24,7% u odnosu na prvobitnu vrednost izraženu u USD, čak i nakon dve pune godine nominalnih nagrada od stejkinga.</p>
<p>Višegodišnje akumuliranje tokena može biti izbrisano naglim padom za svega nekoliko dana.</p>
<p>Zbog toga se na kripto-stejkingu može izgubiti novac čak i kada svaka nagrada bude isplaćena tačno onako kako je obećano.</p>
<h3>Likvidnost je ekonomska opcija</h3>
<p>Mogućnost trenutne prodaje ima vrednost. Odricanje od te mogućnosti znači odricanje od opcije da:</p>
<ul>
<li><p>Smanjite izloženost</p>
</li>
<li><p>Zaštitite se od rizika</p>
</li>
<li><p>Otplatite dug</p>
</li>
<li><p>Izbegnete likvidaciju</p>
</li>
<li><p>Premestite kolateral</p>
</li>
<li><p>Pređete u bezbedniju imovinu</p>
</li>
<li><p>Reagujete na zloupotrebu ili hakovanje protokola</p>
</li>
<li><p>Odgovorite na promene upravljanja</p>
</li>
<li><p>Izađete nakon velikog otključavanja tokena</p>
</li>
<li><p>Napustite poziciju kada se promeni rizik validatora ili kastodijana</p>
</li>
</ul>
<p>Duže zaključavanje zato bi trebalo da donese premiju za nelikvidnost. Oglašeni APY možda delimično nadoknađuje izgubljenu fleksibilnost, ali tu naknadu treba proceniti u odnosu na volatilnost tokena.</p>
<p>Premija prinosa od 3 procentna poena nije privlačna ako se vrednost pozicije može promeniti za 20% dok je zarobljena u redu za izlazak.</p>
<h3>Likvidni stejking menja rizik umesto da ga uklanja</h3>
<p>Tokeni likvidnog stejkinga pokušavaju da povrate likvidnost tako što investitorima daju prenosivu potvrdu koja predstavlja stejkovanu imovinu.</p>
<p>To može smanjiti potrebu za čekanjem nativnog perioda odvezivanja pre izlaska. Međutim, uvodi dodatne rizike:</p>
<ul>
<li><p>Rizik pametnih ugovora</p>
</li>
<li><p>Rizik upravljanja protokolom</p>
</li>
<li><p>Koncentraciju validatora</p>
</li>
<li><p>Rizik proročanstava, odnosno oracle sistema</p>
</li>
<li><p>Rizik reda za otkup</p>
</li>
<li><p>Rizik likvidnosti na sekundarnom tržištu</p>
</li>
<li><p>Diskont između prijemnog tokena i osnovne imovine</p>
</li>
<li><p>Rizik mostova na drugim mrežama</p>
</li>
<li><p>Rizik finansijske poluge kada se prijemni token ponovo koristi kao kolateral</p>
</li>
</ul>
<p>Istraživanja derivata likvidnog stejkinga pokazala su da razlika između cene tokena likvidnog stejkinga i njegove osnovne imovine zavisi od faktora koji obuhvataju volatilnost, tržišnu likvidnost, nagrade od stejkinga, rizik koncentracije i ograničenja arbitraže. (Izvor 11.)</p>
<p>Diskont nije samo tehnička zanimljivost. To je tržišna cena trenutne likvidnosti i dodatnih rizika povezanih sa derivatom.</p>
<p>Ako se token likvidnog stejkinga tokom krize trguje uz diskont od 7%, investitor koji odmah izađe može se odreći višemesečnog prihoda od stejkinga. Ako umesto toga sačeka otkup, može se suočiti sa istim rizikom odvezivanja ili čekanja u redu koji je pokušao da izbegne.</p>
<h3>Pitanja na koja treba odgovoriti pre prihvatanja zaključavanja</h3>
<ul>
<li><p>Koliko dana traje nativno odvezivanje?</p>
</li>
<li><p>Da li odbrojavanje počinje odmah?</p>
</li>
<li><p>Da li se tokom odvezivanja zarađuju nagrade?</p>
</li>
<li><p>Može li ulog i dalje biti predmet slashing kazne tokom izlaznog perioda?</p>
</li>
<li><p>Može li upravljanje produžiti ili drugačije promeniti proces izlaska?</p>
</li>
<li><p>Postoji li red za izlazak ili dnevno ograničenje otkupa?</p>
</li>
<li><p>Može li validator ili platforma odložiti povlačenje?</p>
</li>
<li><p>Da li trenutni izlazak zavisi od tokena likvidnog stejkinga?</p>
</li>
<li><p>Koliko je duboko sekundarno tržište tog tokena?</p>
</li>
<li><p>Koliki je bio njegov diskont tokom prethodnih tržišnih kriza?</p>
</li>
<li><p>Da li se stejkovana imovina koristi kao kolateral na drugom mestu?</p>
</li>
<li><p>Može li pad cene izazvati likvidaciju pre završetka odvezivanja?</p>
</li>
</ul>
<p>Period odvezivanja treba tretirati kao deo trajanja i profila rizika investicije, a ne kao nevažan tehnički detalj.</p>
<h2>4. Realni prinos naspram inflatornih emisija</h2>
<p>Izraz „realni prinos” često se koristi u kripto-marketingu bez dosledne definicije.</p>
<p>Stroga analiza koristi najmanje dva odvojena koncepta:</p>
<ol>
<li><p>Prinos u tokenima prilagođen razvodnjavanju</p>
</li>
<li><p>Prinos podržan prihodima ili finansiran naknadama</p>
</li>
</ol>
<p>Nijedan od ova dva koncepta ne garantuje pozitivan prinos u USD.</p>
<h3>Početni obračun realnog prinosa od stejkinga</h3>
<p>Za brzu procenu investitori mogu koristiti:</p>
<blockquote>
<p>Približni realni prinos od stejkinga = nominalni APY od stejkinga minus godišnji neto rast ponude tokena minus godišnje naknade i troškovi</p>
</blockquote>
<p>To je najjednostavnija verzija poređenja APY-a od stejkinga sa inflacijom tokena.</p>
<p>Pretpostavimo da mreža oglašava APY od 18%.</p>
<p>Validator naplaćuje proviziju od 10% na nagrade. Ta provizija ne smanjuje APY za 10 procentnih poena. Ona uzima 10% od nagrade od 18%:</p>
<ul>
<li><p>Bruto APY od stejkinga: 18%</p>
</li>
<li><p>Provizija validatora: 1,8 procentnih poena</p>
</li>
<li><p>Neto APY od stejkinga: 16,2%</p>
</li>
<li><p>Neto rast ponude tokena: 14%</p>
</li>
<li><p>Godišnji troškovi gasa i poslovanja: 0,4%</p>
</li>
</ul>
<p>Približan prinos prilagođen razvodnjavanju iznosi:</p>
<blockquote>
<p>16,2% minus 14% minus 0,4% = 1,8%</p>
</blockquote>
<p>Istaknuta stopa iznosi 18%. Približan realni prinos u tokenima iznosi samo 1,8%.</p>
<h3>Precizniji obračun</h3>
<p>Kada su stope visoke, koristite odnos umesto jednostavnog oduzimanja.</p>
<blockquote>
<p>Precizan prinos prilagođen razvodnjavanju = (1 + neto prinos od stejkinga nakon provizije) podeljeno sa (1 + neto rast ponude), minus 1</p>
</blockquote>
<p>Za isti primer:</p>
<blockquote>
<p>1,162 podeljeno sa 1,14, minus 1 = približno 1,93%</p>
</blockquote>
<p>Nakon oduzimanja procenjenih godišnjih troškova od 0,4%, rezultat iznosi približno 1,53%.</p>
<p>Tačan broj zavisi od vremena isplate nagrada, naplate naknada, emisije i reinvestiranja. Svrha obračuna nije stvaranje lažne preciznosti. Svrha je da pokaže kako oglašeni APY od 18% može predstavljati samo mali jednocifreni rast relativnog vlasničkog udela.</p>
<h3>Pozitivan prinos prilagođen razvodnjavanju i dalje može doneti gubitak u USD</h3>
<p>Pretpostavimo da investitor ostvaruje neto prinos u tokenima od 16,2%, ali cena tokena padne za 20%.</p>
<p>Prinos u USD pre transakcionih troškova iznosi:</p>
<blockquote>
<p>1,162 pomnoženo sa 0,80, minus 1 = −7,04%</p>
</blockquote>
<p>Investitor je povećao relativni vlasnički udeo u poređenju sa pasivnim vlasnicima tokena, ali je i dalje izgubio novac izraženo u USD.</p>
<p>To nije protivrečnost. Investitor je nadmašio razvodnjavanje ponude tokena, dok je sam token izgubio tržišnu vrednost.</p>
<h3>Tri obračuna, tri različita odgovora</h3>
<table>
<thead>
<tr>
<th>Merilo</th>
<th>Na šta odgovara</th>
<th>Relevantni podaci</th>
</tr>
</thead>
<tbody><tr>
<td>Nominalni prinos od stejkinga</td>
<td>Koliko sam dodatnih tokena dobio?</td>
<td>Stopa nagrade i reinvestiranje</td>
</tr>
<tr>
<td>Prinos prilagođen razvodnjavanju</td>
<td>Da li se moj procentualni udeo u ponudi povećao?</td>
<td>Neto stopa nagrade i neto rast ponude</td>
</tr>
<tr>
<td>Prinos portfolija u USD</td>
<td>Da li se moje tržišno bogatstvo povećalo?</td>
<td>Neto prinos u tokenima i promena cene tokena</td>
</tr>
<tr>
<td>Prinos kupovne moći</td>
<td>Mogu li da kupim više robe i usluga?</td>
<td>Prinos u USD, potrošačka inflacija, porezi i troškovi</td>
</tr>
<tr>
<td>Prinos podržan prihodima</td>
<td>Da li je nagrada podržana ekonomskom aktivnošću?</td>
<td>Naknade, kamate zajmoprimaca, prihodi od trgovanja i podsticaji</td>
</tr>
</tbody></table>
<p>Investitori ne bi trebalo da sabijaju sva ova pitanja u jedan APY.</p>
<h2>Odakle održivi kripto-prinos zaista dolazi</h2>
<p>Prinos je ekonomski održiv kada se može utvrditi ko plaća vrednu uslugu i kada isplata može da se nastavi bez beskonačnog razvodnjavanja tokena.</p>
<p>To investiciju ne čini bezbednom. Samo čini izvor prinosa razumljivijim.</p>
<h3>Mrežne naknade</h3>
<p>Korisnici mogu plaćati za:</p>
<ul>
<li><p>Prostor u bloku</p>
</li>
<li><p>Poravnanje transakcija</p>
</li>
<li><p>Izvršavanje pametnih ugovora</p>
</li>
<li><p>Dostupnost podataka</p>
</li>
<li><p>Prioritetno uključivanje</p>
</li>
<li><p>Komunikaciju između različitih blokčejnova</p>
</li>
<li><p>Aplikacione usluge</p>
</li>
</ul>
<p>Ako validatori dobijaju deo tih plaćanja, deo nagrade od stejkinga podržan je stvarnom tražnjom za mrežnim uslugama.</p>
<p>Analizom ipak treba utvrditi gde naknade odlaze. One mogu biti:</p>
<ul>
<li><p>Isplaćene validatorima</p>
</li>
<li><p>Isplaćene pružaocima likvidnosti</p>
</li>
<li><p>Spaljene</p>
</li>
<li><p>Položene u trezor</p>
</li>
<li><p>Zadržane u aplikaciji</p>
</li>
<li><p>Podeljene vlasnicima tokena</p>
</li>
<li><p>Iskorišćene za otkup tokena</p>
</li>
</ul>
<p>Mreža može ostvarivati značajne naknade, a da ih ne raspodeljuje investitorima u njen token.</p>
<h3>Kamate zajmoprimaca</h3>
<p>U protokolu za pozajmljivanje, zajmoprimci plaćaju pristup kapitalu. Dobavljači kapitala dobijaju deo te kamate.</p>
<p>To je sličnije kreditnom posredovanju nego nativnom stejkingu. Dokumentacija Aavea, na primer, objašnjava da se stope za dobavljače kapitala finansiraju kamatama zajmoprimaca i menjaju u skladu sa stopom iskorišćenosti. (Izvor 9.)</p>
<p>Prinos i dalje može biti dopunjen podsticajima u upravljačkim tokenima. Investitori treba da razdvoje:</p>
<ul>
<li><p>Osnovni APY od dobavljanja kapitala, ostvaren plaćanjima zajmoprimaca</p>
</li>
<li><p>Podsticajni APY isplaćen kroz emisije tokena</p>
</li>
</ul>
<p>Pozicija sa ukupnim APY-em od 14% može se sastojati od 4% kamate koju finansiraju zajmoprimci i 10% subvencije u nagradnim tokenima. Te komponente imaju različitu održivost i različite rizike.</p>
<h3>Naknade od trgovanja</h3>
<p>Decentralizovane berze naplaćuju trgovcima izvršavanje razmena. Pružaoci likvidnosti mogu dobiti deo tih naknada.</p>
<p>To jeste stvarno stvaranje prihoda od naknada, ali prihod od naknada nije isto što i neto dobit. Pružaoci likvidnosti mogu izgubiti novac zbog:</p>
<ul>
<li><p>Privremenog gubitka</p>
</li>
<li><p>Nepovoljnog izbora</p>
</li>
<li><p>Arbitraže</p>
</li>
<li><p>Troškova rebalansiranja</p>
</li>
<li><p>MEV-a</p>
</li>
<li><p>Razilaženja cena tokena</p>
</li>
<li><p>Pozicija koje izađu iz zadatog raspona</p>
</li>
<li><p>Neuspeha pametnih ugovora</p>
</li>
</ul>
<p>Fond likvidnosti može ostvariti visoke naknade, dok njegovi pružaoci prolaze lošije nego da su jednostavno držali osnovnu imovinu.</p>
<h3>Prihod od imovine iz stvarnog sveta</h3>
<p>Neki protokoli raspodeljuju prihod povezan sa:</p>
<ul>
<li><p>Državnim hartijama od vrednosti</p>
</li>
<li><p>Korporativnim kreditima</p>
</li>
<li><p>Privatnim zajmovima</p>
</li>
<li><p>Finansiranjem trgovine</p>
</li>
<li><p>Nekretninama</p>
</li>
<li><p>Instrumentima za upravljanje gotovinom</p>
</li>
</ul>
<p>Ekonomski izvor može biti poznat, ali tokenizacija uvodi pravne, kastodijalne, oracle, emitentske, jurisdikcione i rizike otkupa.</p>
<p>Blokčejn omotač ne uklanja osnovni kreditni rizik.</p>
<h3>Emisije tokena</h3>
<p>Nagrade finansirane emisijama predstavljaju subvencije. Postojeći ili budući vlasnici tokena na kraju ih finansiraju kroz razvodnjavanje, trošenje sredstava iz trezora ili povećanje ponude u opticaju.</p>
<p>Subvencije nisu automatski nelegitimne. Mladim mrežama one mogu biti potrebne da:</p>
<ul>
<li><p>Izgrade skup validatora</p>
</li>
<li><p>Privuku likvidnost</p>
</li>
<li><p>Raspodele upravljačka prava</p>
</li>
<li><p>Pokrenu mrežne efekte</p>
</li>
<li><p>Subvencionišu rano korišćenje</p>
</li>
<li><p>Nadoknade učesnicima rad pre razvoja prihoda od naknada</p>
</li>
</ul>
<p>Ključno pitanje je da li subvencionisana aktivnost postaje samoodrživa pre završetka subvencija.</p>
<p>Ako korisnici nestanu čim se nagrade smanje, protokol nije stvorio trajnu tražnju. Samo je iznajmio privremeni kapital.</p>
<p>BIS opisuje rudarenje likvidnosti kao raspodelu upravljačkih tokena radi podsticanja učešća u protokolu, uz razlikovanje tih podsticaja od naknada koje plaćaju stvarni korisnici. (Izvor 12.)</p>
<h3>Praktična tabela izvora prinosa</h3>
<table>
<thead>
<tr>
<th>Izvor prinosa</th>
<th>Ko plaća</th>
<th>Šta ga može učiniti održivim</th>
<th>Glavni rizici</th>
</tr>
</thead>
<tbody><tr>
<td>Mrežne transakcione naknade</td>
<td>Korisnici koji kupuju prostor u bloku ili izvršavanje</td>
<td>Trajna korisnost mreže i ponovljena tražnja</td>
<td>Konkurentske mreže, smanjenje naknada i pad korišćenja</td>
</tr>
<tr>
<td>Kamata na pozajmljivanje</td>
<td>Zajmoprimci</td>
<td>Zdrava tražnja za kreditima i dobro upravljanje kolateralom</td>
<td>Loš dug, neuspešne likvidacije i nagle promene iskorišćenosti</td>
</tr>
<tr>
<td>Naknade DEX berzi</td>
<td>Trgovci</td>
<td>Ponovljen organski obim trgovanja</td>
<td>Privremeni gubitak, nepovoljan izbor i MEV</td>
</tr>
<tr>
<td>Prihod od imovine iz stvarnog sveta</td>
<td>Države, kompanije ili drugi zajmoprimci</td>
<td>Izvršiva potraživanja i ponovljeni novčani tokovi</td>
<td>Kreditni, kastodijalni, pravni, emitentski i rizik otkupa</td>
</tr>
<tr>
<td>Prihod povezan sa MEV-om</td>
<td>Trgovci i mogućnosti određivanja redosleda transakcija</td>
<td>Trajna ončejn aktivnost</td>
<td>Koncentracija, volatilnost i neizvesna raspodela</td>
</tr>
<tr>
<td>Emisije tokena</td>
<td>Postojeći vlasnici, budući kupci ili trezor protokola</td>
<td>Privremeni most ka budućem stvaranju prihoda od naknada</td>
<td>Razvodnjavanje, nagli prestanak podsticaja, privremeni kapital i pritisak na cenu</td>
</tr>
</tbody></table>
<h2>Prihod protokola nije automatski prinos vlasnika tokena</h2>
<p>Jedna od najčešćih grešaka u tokenomici jeste pretpostavka da prihod protokola nužno koristi tokenu.</p>
<p>Protokol može ostvariti 100 miliona USD godišnjih naknada, a sav taj prihod usmeriti:</p>
<ul>
<li><p>Validatorima</p>
</li>
<li><p>Programerima aplikacija</p>
</li>
<li><p>Pružaocima likvidnosti</p>
</li>
<li><p>Centralizovanoj kompaniji</p>
</li>
<li><p>Trezoru protokola</p>
</li>
<li><p>Rezervama osiguranja</p>
</li>
</ul>
<p>Upravljački token možda nema nikakvo ugovorno ili programsko pravo na taj prihod.</p>
<p>Pre nego što prihod protokola nazovete „realnim prinosom”, utvrdite da li token dobija vrednost kroz izričit mehanizam kao što su:</p>
<ul>
<li><p>Direktna raspodela naknada</p>
</li>
<li><p>Otkup tokena</p>
</li>
<li><p>Spaljivanje</p>
</li>
<li><p>Obavezna tražnja za stejkingom</p>
</li>
<li><p>Upotreba kao kolaterala</p>
</li>
<li><p>Trezori za raspodelu prihoda</p>
</li>
<li><p>Upravljanje ekonomski vrednim novčanim tokovima</p>
</li>
</ul>
<p>Čak i ti mehanizmi zahtevaju pažljivu proveru.</p>
<p>Program otkupa može izgledati privlačno dok protokol istovremeno izdaje više tokena nego što kupuje. Spaljivanje može smanjivati ukupnu ponudu, dok otključavanje investitorskih tokena u većoj meri povećava ponudu u opticaju. Zahtev za stejking može stvarati tražnju dok povezana aplikacija posluje sa gubitkom.</p>
<p>Pravo merilo je neto zahvatanje vrednosti, a ne bruto prihod.</p>
<h2>Isplate u stabilnim kriptovalutama ne dokazuju da je prinos realan</h2>
<p>Nagrada isplaćena u USDC-u, USDT-u ili drugoj stabilnoj kriptovaluti i dalje može biti finansirana:</p>
<ul>
<li><p>Prodajom novoizdatih upravljačkih tokena</p>
</li>
<li><p>Trošenjem ograničenih sredstava iz trezora</p>
</li>
<li><p>Zaduživanjem</p>
</li>
<li><p>Leveridžovanim kružnim strategijama</p>
</li>
<li><p>Prilivom novih deponenata</p>
</li>
<li><p>Privremenim promotivnim budžetima</p>
</li>
<li><p>Neodrživim subvencijama za trgovanje</p>
</li>
</ul>
<p>Valuta u kojoj je nagrada iskazana nije njen ekonomski izvor.</p>
<p>Isplata u stabilnoj kriptovaluti može smanjiti izloženost promeni cene nagradnog tokena, ali ne uklanja rizik pametnih ugovora, druge ugovorne strane, solventnosti, likvidnosti ili subvencija.</p>
<h2>Test bez podsticaja</h2>
<p>Jedno od najkorisnijih pitanja pri proceni protokola glasi:</p>
<blockquote>
<p>Šta bi se dogodilo kada bi podsticaji u tokenima sutra bili smanjeni na nulu?</p>
</blockquote>
<p>Potražite dokaze da bi:</p>
<ul>
<li><p>Zajmoprimci nastavili da pozajmljuju</p>
</li>
<li><p>Trgovci nastavili da trguju</p>
</li>
<li><p>Korisnici nastavili da plaćaju transakcione naknade</p>
</li>
<li><p>Likvidnost ostala odgovarajuća</p>
</li>
<li><p>Aplikacije zadržale aktivne korisnike</p>
</li>
<li><p>Validatori mogli da budu plaćeni iz naknada</p>
</li>
<li><p>Prihod protokola ostao pozitivan</p>
</li>
<li><p>Tražnja za tokenom postojala i bez APY kampanje</p>
</li>
</ul>
<p>Ako čitav ekosistem zavisi od novoemitovanih tokena, oglašeni prinos nije dokaz ekonomske produktivnosti. On je deo budžeta za pridobijanje korisnika.</p>
<h2>Zašto visoki APY prinosi iscrpljuju portfolije malih investitora</h2>
<p>Visoki APY prinosi naročito su štetni kada se nekoliko slabosti međusobno pojačava.</p>
<h3>1. Nagrada se meri u tokenu koji gubi vrednost</h3>
<p>Investitor dobija 20% više jedinica, ali cena nagradnog tokena pada za 60%. APY je isplaćen tačno onako kako je oglašeno, ali investitor ipak gubi znatan deo bogatstva.</p>
<h3>2. Protokol oglašava bruto, a ne neto prinos</h3>
<p>Istaknuta stopa može isključivati:</p>
<ul>
<li><p>Proviziju validatora</p>
</li>
<li><p>Naknade platforme</p>
</li>
<li><p>Naknade za učinak</p>
</li>
<li><p>Naknade za povlačenje</p>
</li>
<li><p>Gas</p>
</li>
<li><p>Proklizavanje cene</p>
</li>
<li><p>Troškove mostova</p>
</li>
<li><p>Neuspele transakcije</p>
</li>
<li><p>Troškove reinvestiranja</p>
</li>
</ul>
<p>Male pozicije su naročito ranjive, jer fiksni transakcioni troškovi troše veći procenat kapitala.</p>
<h3>3. Inflacija ponude skrivena je iza istaknute stope</h3>
<p>APY od 20% izgleda privlačno dok investitor ne otkrije da se očekuje povećanje ponude u opticaju od 30%.</p>
<p>Nagrada možda neće nadoknaditi razvodnjavanje.</p>
<h3>4. APY pretpostavlja da će nestabilna stopa trajati celu godinu</h3>
<p>Mnoge kontrolne table godišnje projektuju stopu iz poslednjeg sata, dana, nedelje ili epohe nagrađivanja.</p>
<p>Privremena kampanja podsticaja može prikazati trocifreni APY iako:</p>
<ul>
<li><p>Budžet za nagrade traje samo nekoliko nedelja</p>
</li>
<li><p>Više depozita deliće nagradu na veći kapital</p>
</li>
<li><p>Emisije tokena opadaju prema rasporedu</p>
</li>
<li><p>Upravljanje može promeniti stopu</p>
</li>
<li><p>Obim trgovanja je privremen</p>
</li>
<li><p>Cena nagradnog tokena ubrzano pada</p>
</li>
</ul>
<p>APY je projekcija, a ne obećanje.</p>
<h3>5. Reinvestiranje povećava koncentraciju u istom riziku</h3>
<p>Automatsko reinvestiranje predstavlja se kao pokretač stvaranja bogatstva. Ekonomski gledano, svaka nagrada ponovo se ulaže u isti token ili istu strategiju.</p>
<p>Ako imovina ima negativan očekivani realni prinos, reinvestiranje samo povećava izloženost.</p>
<p>Reinvestiranje ne popravlja lošu tokenomiku.</p>
<h3>6. Zaključavanje uklanja mogućnost upravljanja rizikom</h3>
<p>Investitor polako ostvaruje godišnji prinos, ali ostaje izložen trenutnim događajima kao što su:</p>
<ul>
<li><p>Padovi cena</p>
</li>
<li><p>Zloupotrebe i hakovanja</p>
</li>
<li><p>Gubitak vezanosti stabilne kriptovalute</p>
</li>
<li><p>Kvarovi validatora</p>
</li>
<li><p>Napadi na upravljanje</p>
</li>
<li><p>Nesolventnost berze</p>
</li>
<li><p>Regulatorni događaji</p>
</li>
<li><p>Otključavanja tokena</p>
</li>
<li><p>Navale na povlačenje likvidnosti</p>
</li>
</ul>
<p>APY može biti naknada za prihvatanje ovog rizika, a ne besplatan bonus.</p>
<h3>7. Veliki vlasnici mogu prodavati dok mali investitori nastavljaju da reinvestiraju</h3>
<p>Profesionalni učesnici mogu kontinuirano pretvarati nagrade u novac, štititi glavnicu od rizika ili imati znatno nižu nabavnu cenu.</p>
<p>Mali investitori često tumače pad cene kao priliku da zarade još više tokena. Mehanizam nagrađivanja tako može postati kanal kroz koji likvidna tražnja apsorbuje izlaske vlasnika sa nižom nabavnom cenom.</p>
<p>Takav ishod nije garantovan, ali strukturu podsticaja treba proučiti pre pretpostavke da svi učesnici imaju jednaku korist.</p>
<h3>8. Potraga za prinosom privlači privremeni kapital</h3>
<p>Visoke emisije mogu privući kapital koji nema nikakvu posvećenost dugoročnom korišćenju protokola.</p>
<p>Kada se podsticaji smanje:</p>
<ul>
<li><p>Depoziti odlaze</p>
</li>
<li><p>Ukupna zaključana vrednost opada</p>
</li>
<li><p>Tržišna likvidnost postaje plića</p>
</li>
<li><p>Proklizavanje cene raste</p>
</li>
<li><p>Tražnja za tokenom slabi</p>
</li>
<li><p>Preostali vlasnici imaju veće troškove izlaska</p>
</li>
</ul>
<p>Početni APY stvorio je aktivnost, ali ne nužno i trajnu ekonomiju.</p>
<h2>Praktična kontrolna lista za tokenomiku</h2>
<p>Korisna analiza stejkinga počinje izvorom prinosa, a ne njegovom veličinom.</p>
<table>
<thead>
<tr>
<th>Pitanje</th>
<th>Šta treba izračunati ili proveriti</th>
<th>Mogući znak upozorenja</th>
</tr>
</thead>
<tbody><tr>
<td>Koju aktivnost obavljam?</td>
<td>Nativni stejking, pozajmljivanje, obezbeđivanje likvidnosti, ponovni stejking ili kreditiranje platforme</td>
<td>Platforma koristi izraz „stejking” za nepovezane proizvode pozajmljivanja ili čuvanja imovine</td>
</tr>
<tr>
<td>Ko plaća prinos?</td>
<td>Korisnici mreže, zajmoprimci, trgovci, trezor ili nova emisija tokena</td>
<td>Ne postoji prepoznatljiv platilac niti ekonomska usluga</td>
</tr>
<tr>
<td>Koliki je osnovni prinos?</td>
<td>Odvojite prihod od naknada ili kamate od podsticajnih nagrada</td>
<td>Veći deo APY-a potiče od privremenih emisija</td>
</tr>
<tr>
<td>U kojoj imovini se isplaćuje nagrada?</td>
<td>Osnovna imovina, upravljački token, stabilna kriptovaluta ili prijemni token</td>
<td>Nagrada se isplaćuje u nelikvidnom tokenu sa visokom emisijom</td>
</tr>
<tr>
<td>Kolika je bruto emisija?</td>
<td>Godišnje stvaranje novih tokena podeljeno početnom ponudom</td>
<td>Ponuda raste jednako brzo ili brže od stejkovanih salda</td>
</tr>
<tr>
<td>Koliki je neto rast ponude?</td>
<td>Bruto emisija umanjena za spaljivanja</td>
<td>Marketing ističe spaljivanja, a ignoriše znatno veću emisiju</td>
</tr>
<tr>
<td>Koliko brzo će rasti ponuda u opticaju?</td>
<td>Uključite otključavanja, trošenje trezora, grantove i druge distribucije</td>
<td>Velika otključavanja poklapaju se sa emisijama za stejking</td>
</tr>
<tr>
<td>Koliki procenat ponude je stejkovan?</td>
<td>Uporedite emisiju sa ponudom koja stvarno ima pravo na nagrade</td>
<td>Visok APY je uglavnom posledica niskog učešća</td>
</tr>
<tr>
<td>Kako se APY izračunava?</td>
<td>Period posmatranja, učestalost reinvestiranja, pretpostavljena cena tokena i raspored nagrada</td>
<td>Kratkotrajna stopa nagrade projektuje se neograničeno</td>
</tr>
<tr>
<td>Koje provizije se primenjuju?</td>
<td>Provizija validatora, naknada platforme, naknada za učinak i povlačenje</td>
<td>Naknade se prikazuju kao procenat nagrada bez prikaza uticaja na APY</td>
</tr>
<tr>
<td>Koliki je period odvezivanja?</td>
<td>Nativni period čekanja, red, obrada povlačenja i tretman nagrada</td>
<td>Kapital ne može da izađe u okviru investitorovog vremenskog horizonta rizika</td>
</tr>
<tr>
<td>Koliko je duboka izlazna likvidnost?</td>
<td>Modelirajte uticaj prodaje glavnice i nagrada na cenu</td>
<td>Prikazanu cenu podržava veoma mala stvarna likvidnost</td>
</tr>
<tr>
<td>Da li prihod protokola stiže do tokena?</td>
<td>Proverite raspodele, otkupe, spaljivanja i zahteve za stejking</td>
<td>Prihod postoji, ali vlasnici tokena nemaju ekonomsku korist</td>
</tr>
<tr>
<td>Da li naknade pokrivaju nagrade?</td>
<td>Uporedite ponovljene raspodele finansirane naknadama sa ukupnim nagradama</td>
<td>Nagrade znatno premašuju ponovljene prihode</td>
</tr>
<tr>
<td>Koji su ekstremni rizici?</td>
<td>Slashing, pametni ugovori, oracle sistemi, mostovi, kastodijani, upravljanje i gubitak vezanosti</td>
<td>APY se procenjuje bez modeliranja gubitka glavnice</td>
</tr>
</tbody></table>
<h2>Minimalni model stejkinga sa šest brojeva</h2>
<p>Pre stejkinga investitor bi trebalo da ume da zapiše najmanje šest brojeva.</p>
<h3>1. Neto APY nagrade</h3>
<p>Počnite od oglašenog APY-a, a zatim oduzmite provizije validatora, naknade platforme i realne troškove reinvestiranja.</p>
<h3>2. Neto rast ukupne ponude</h3>
<p>Izmerite novu emisiju nakon spaljivanja.</p>
<h3>3. Rast ponude u opticaju</h3>
<p>Dodajte planirana otključavanja, distribucije iz trezora, grantove i druge prethodno zaključane tokene za koje se očekuje da uđu u opticaj.</p>
<h3>4. Udeo nagrada finansiran naknadama</h3>
<p>Procenite koji procenat nagrada dolazi od korisnika, zajmoprimaca ili trgovaca, umesto iz subvencija u tokenima.</p>
<blockquote>
<p>Udeo nagrada finansiran naknadama = ekonomski ostvarene nagrade podeljene ukupno raspodeljenim nagradama</p>
</blockquote>
<h3>5. Cena tokena za pokriće troškova</h3>
<blockquote>
<p>Krajnja cena za pokriće troškova = početna cena tokena podeljena sa (1 + neto prinos u tokenima)</p>
</blockquote>
<p>Ako token počinje na 10 USD, a neto prinos od stejkinga iznosi 12%, približna cena za pokriće troškova iznosi 8,93 USD.</p>
<p>To pokazuje koliki pad cene tokena nagrada može da apsorbuje pre nego što prinos u USD postane negativan.</p>
<h3>6. Vreme do likvidnosti</h3>
<p>Zabeležite ukupno vreme od odluke o izlasku do dobijanja slobodno prenosive imovine.</p>
<p>Uključite:</p>
<ul>
<li><p>Pokretanje prekida stejkinga</p>
</li>
<li><p>Period odvezivanja</p>
</li>
<li><p>Redove za izlazak validatora</p>
</li>
<li><p>Obradu otkupa</p>
</li>
<li><p>Kašnjenja mostova</p>
</li>
<li><p>Vreme uplate na berzu</p>
</li>
<li><p>Očekivano proklizavanje pri prodaji</p>
</li>
</ul>
<p>Token koji može izgubiti 30% za nedelju dana ne treba procenjivati kao da je kašnjenje izlaska od 28 dana ekonomski nevažno.</p>
<h2>Kako tumačiti rezultat</h2>
<p>Obračuni obično svrstavaju priliku za stejking u jednu od četiri kategorije.</p>
<h3>Zaštita od inflacije</h3>
<p>Prinos od stejkinga približno odgovara rastu ponude nakon naknada.</p>
<p>Investitor prvenstveno štiti postojeću poziciju od razvodnjavanja. Nagradu ne treba opisivati kao značajan pasivni prihod.</p>
<h3>Pozitivan relativni prinos, negativan tržišni prinos</h3>
<p>Prinos od stejkinga premašuje rast ponude, ali cena tokena dovoljno pada da izazove gubitak u USD.</p>
<p>Investitor prolazi bolje od onih koji ne stejkuju, ali i dalje gubi novac.</p>
<h3>Subvencionisani spekulativni prinos</h3>
<p>Veći deo nagrade dolazi iz emisija, trošenja sredstava trezora ili privremenih podsticaja.</p>
<p>Strategija može biti profitabilna ako investitor dobro odabere trenutak ulaska i izlaska, ali prinos zavisi od trajne tražnje za nagradnim tokenom. To nije samofinansirajući tok prihoda.</p>
<h3>Prinos podržan prihodima</h3>
<p>Značajan deo nagrade dolazi iz ponovljenih transakcionih naknada, kamata zajmoprimaca, naknada od trgovanja ili druge ekonomske aktivnosti.</p>
<p>To je ekonomski najjača kategorija, ali i dalje zahteva analizu:</p>
<ul>
<li><p>Održivosti prihoda</p>
</li>
<li><p>Mehanizma kojim token zahvata vrednost</p>
</li>
<li><p>Rizika glavnice</p>
</li>
<li><p>Likvidnosti</p>
</li>
<li><p>Bezbednosti pametnih ugovora</p>
</li>
<li><p>Izloženosti drugoj ugovornoj strani</p>
</li>
<li><p>Tržišne volatilnosti</p>
</li>
</ul>
<p>„Realni prinos” znači da nagrada ima verodostojniji izvor. Ne znači da je investicija niskorizična.</p>
<h2>Ispravan način razmišljanja o APY-u od stejkinga i inflaciji tokena</h2>
<p>Visok APY nije dokaz dobre investicije. Nizak APY nije dokaz loše investicije.</p>
<p>Prinos od stejkinga od 5% na korisnoj mreži sa niskom neto emisijom, snažnom tražnjom za uslugama koje stvaraju naknade, likvidnim izlazom i verodostojnim mehanizmom kojim token zahvata vrednost može biti ekonomski bolji od prinosa od 25% na mreži čija se ponuda u opticaju povećava za 40%.</p>
<p>Ispravan redosled analize je:</p>
<ol>
<li><p>Utvrdite ekonomsku aktivnost.</p>
</li>
<li><p>Utvrdite ko plaća nagradu.</p>
</li>
<li><p>Odvojite naknade i kamate od podsticaja u tokenima.</p>
</li>
<li><p>Izračunajte neto emisiju tokena.</p>
</li>
<li><p>Izračunajte rast ponude u opticaju.</p>
</li>
<li><p>Prilagodite nagradu za provizije i troškove.</p>
</li>
<li><p>Uporedite nagradu sa razvodnjavanjem ponude.</p>
</li>
<li><p>Izračunajte cenu tokena za pokriće troškova.</p>
</li>
<li><p>Testirajte scenario ozbiljnog tržišnog pada.</p>
</li>
<li><p>Procenite celokupan vremenski period izlaska.</p>
</li>
<li><p>Proverite da li prihod protokola zaista koristi tokenu.</p>
</li>
<li><p>Tek na kraju pogledajte APY.</p>
</li>
</ol>
<p>Generička lista „Pet najboljih tokena sa APY-em od 20%” preokreće ovaj redosled. Ona rangira marketinški rezultat pre nego što ispita ekonomske ulazne podatke.</p>
<p>Nagrade od stejkinga nisu same po sebi lažne, a emisija tokena nije sama po sebi prevara. Proof-of-stake mrežama potreban je budžet za bezbednost, naročito tokom ranih faza razvoja.</p>
<p>Ali emisija i dalje predstavlja trošak. Ako naknade ne pokrivaju taj trošak, vlasnici tokena finansiraju ga kroz razvodnjavanje. Ako veliki primaoci prodaju nagrade, kupci na otvorenom tržištu moraju da apsorbuju ponudu. Ako tražnja ne uspe da održi korak, cena tokena pada. Ako su investitori zaključani tokom tog pada, godine nominalnog prinosa mogu nestati pre završetka perioda odvezivanja.</p>
<p>Najkorisniji princip ujedno je i najjednostavniji:</p>
<p><strong>APY meri raspodelu tokena. Stvaranje bogatstva zahteva ekonomsku vrednost, trajnu tražnju, zdravu tokenomiku i održiv način izlaska.</strong></p>
<p>Rast broja tokena može biti pasivan. Rast životnog standarda zahteva mnogo više.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati kriptovalute. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://www.stlouisfed.org/on-the-economy/2026/jun/banking-analytics-lower-asset-yields-squeeze-bank-interest-margins">Julianne Baer, „Banking Analytics: Lower Asset Yields Squeeze Bank Interest Margins”, Federal Reserve Bank of St. Louis, 2026.</a></p>
</li>
<li><p><a href="https://www.fdic.gov/consumer-resource-center/deposit-accounts">Federal Deposit Insurance Corporation, „Deposit Accounts”.</a></p>
</li>
<li><p><a href="https://www.investor.gov/introduction-investing/general-resources/news-alerts/alerts-bulletins/investor-bulletins/investor-bulletin-crypto-asset-interest-bearing-accounts">U.S. Securities and Exchange Commission, „Investor Bulletin: Crypto Asset Interest-Bearing Accounts”.</a></p>
</li>
<li><p><a href="https://ethereum.org/developers/docs/intro-to-ether/">Ethereum.org, „Technical Introduction to Ether”.</a></p>
</li>
<li><p><a href="https://ethereum.org/developers/docs/consensus-mechanisms/pos/">Ethereum.org, „Proof-of-Stake”.</a></p>
</li>
<li><p><a href="https://www.nber.org/papers/w33640">Lin William Cong, Zhiheng He i Ke Tang, „The Tokenomics of Staking”, NBER Working Paper 33640, 2025.</a></p>
</li>
<li><p><a href="https://www.financetheory.org/papers/equilibrium-staking-levels-in-a-proof-of-stake-blockchain-315-1">Kose John, Thomas J. Rivera i Fahad Saleh, „Equilibrium Staking Levels in a Proof-of-Stake Blockchain”.</a></p>
</li>
<li><p><a href="https://arxiv.org/abs/2405.14617">Nicolas Oderbolz, Beatrix Marosvölgyi i Matthias Hafner, „Towards an Optimal Staking Design: Balancing Security, User Growth, and Token Appreciation”.</a></p>
</li>
<li><p><a href="https://www.aave.com/docs/aave-101">Dokumentacija Aave protokola, „Aave 101”.</a></p>
</li>
<li><p><a href="https://help.keplr.app/general-faq/5R3bMyjtr3tXNeJo8ojSDV/staking-and-unstaking/5So5gM41LhR6PfDSbBfvwV">Zvanična podrška novčanika Keplr, „Staking and Unstaking”.</a></p>
</li>
<li><p><a href="https://doi.org/10.1002/fut.22556">Stefan Scharnowski i Hossein Jahanshahloo, „The Economics of Liquid Staking Derivatives: Basis Determinants and Price Discovery”, Journal of Futures Markets, 2025.</a></p>
</li>
<li><p><a href="https://www.bis.org/publ/work1066.htm">Raphael Auer, Bernhard Haslhofer, Stefan Kitzler, Pietro Saggese i Friedhelm Victor, „The Technology of Decentralized Finance”, BIS Working Paper 1066, 2023.</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/stakings-passive-income-mirage-apy-vs-token-inflation-1fbp">Staking's Passive Income Mirage: APY vs Token Inflation</a></p>
]]></content:encoded></item><item><title><![CDATA[Nasleđivanje kripto-imovine: šta se dešava sa novčanicima nakon smrti?
]]></title><description><![CDATA[Planovi za nasleđivanje kripto-imovine propadaju kada se pravno vlasništvo i kriptografska kontrola posmatraju kao ista stvar.
Propisi o nasleđivanju i ostavinskom postupku određuju ko ima pravo na im]]></description><link>https://kripto-pocetnica.hashnode.dev/nasle-ivanje-kripto-imovine-ta-se-de-ava-sa-nov-anicima-nakon-smrti</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/nasle-ivanje-kripto-imovine-ta-se-de-ava-sa-nov-anicima-nakon-smrti</guid><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Sun, 27 Sep 2026 02:10:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/660c3909-8983-4b93-b063-f8f651a2c603.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Planovi za nasleđivanje kripto-imovine propadaju kada se pravno vlasništvo i kriptografska kontrola posmatraju kao ista stvar.</p>
<p>Propisi o nasleđivanju i ostavinskom postupku određuju ko ima pravo na imovinu preminule osobe. Blokčejn određuje da li transakcija sadrži važeći potpis. On ne čita testamente, ne prepoznaje umrlice, ne postupa po nalozima ostavinskih sudova i ne prenosi novčanik na imenovanog naslednika.</p>
<p>Zbog toga izvršilac testamenta može imati pravno ovlašćenje nad kripto-imovinom, a da ipak ne može da je prenese. Nasuprot tome, svako ko dođe do privatnih ključeva može da premesti sredstva, čak i ako na njih nema nikakvo zakonsko pravo.</p>
<p>Nekastodijalni novčanik, odnosno novčanik sa samostalnim čuvanjem ključeva, nije nalog koji neka kompanija može da otključa. Imovina ostaje evidentirana na blokčejnu, dok novčanik upravlja ključevima potrebnim za odobravanje transakcija. Ako se ti ključevi izgube, možda neće postojati postupak za resetovanje lozinke, korisnička podrška niti sudski nalog koji može da ih rekonstruiše.</p>
<p>Praktično rešenje nije da seed frazu, odnosno frazu za oporavak, stavite u testament ili podesite da je usluga u oblaku pošalje imejlom nakon nekoliko meseci neaktivnosti. Pouzdan plan za nasleđivanje kripto-imovine razdvaja četiri stvari:</p>
<ol>
<li><p>Pravno ovlašćenje</p>
</li>
<li><p>Pronalaženje i identifikovanje imovine</p>
</li>
<li><p>Kriptografski oporavak</p>
</li>
<li><p>Kontrolisani prenos ili likvidaciju</p>
</li>
</ol>
<p>Ovaj članak objašnjava kako da izgradite takav sistem, bez potrebe da naslednici postanu stručnjaci za sajber bezbednost.</p>
<p>Ovo su operativne smernice, a ne individualni pravni ili poreski savet. Propisi o zaostavštini, trastovima, imovini i fiducijarnim dužnostima razlikuju se u zavisnosti od jurisdikcije. Advokat treba da prilagodi pravni deo plana propisima koji se primenjuju na vlasnika, zaostavštinu, trast, izvršioca testamenta i korisnike ili naslednike.</p>
<h2>Šta se dešava sa nekastodijalnim novčanikom kada umrete?</h2>
<p>Na blokčejnu se ništa ne dešava automatski.</p>
<p>Adresa nastavlja da postoji. Tokeni ostaju na toj adresi. Pametni ugovori nastavljaju da rade u skladu sa svojim kodom. Staking pozicije, kolateralizovani zajmovi, pozicije likvidnosti i vremenski zaključana imovina mogu ostati aktivni. Blokčejn nema ugrađen način da sazna da je osoba koja kontroliše ključeve preminula.</p>
<p>Ono što će se zatim dogoditi zavisi od modela čuvanja imovine.</p>
<table>
<thead>
<tr>
<th>Pitanje</th>
<th>Kastodijalna berza ili novčanik kojim upravlja pružalac usluge</th>
<th>Nekastodijalni novčanik</th>
</tr>
</thead>
<tbody><tr>
<td>Ko kontroliše ključeve?</td>
<td>Pružalac usluge</td>
<td>Vlasnik novčanika</td>
</tr>
<tr>
<td>Može li kompanija da obnovi pristup?</td>
<td>Potencijalno, u skladu sa svojim procedurama</td>
<td>Uglavnom ne</td>
</tr>
<tr>
<td>Može li izvršilac testamenta da dostavi pravna dokumenta?</td>
<td>Uglavnom može, mada se zahtevi razlikuju</td>
<td>Možda ne postoji pružalac usluge kome bi se obratio</td>
</tr>
<tr>
<td>Šta na kraju odobrava prenos?</td>
<td>Interni sistemi pružaoca usluge</td>
<td>Važeći kriptografski potpis</td>
</tr>
<tr>
<td>Glavni rizik pri nasleđivanju</td>
<td>Pronalaženje naloga, pravni postupak i ograničenja pružaoca usluge</td>
<td>Trajni gubitak ključeva ili njihova neovlašćena upotreba</td>
</tr>
</tbody></table>
<p>Kod kastodijalnog naloga izvršilac testamenta možda će moći da dostavi umrlicu, sudsko rešenje o imenovanju, dokumenta trasta i druge evidencije pružaocu usluge.</p>
<p>Kod nekastodijalnog novčanika ta dokumenta dokazuju ovlašćenje, ali ne stvaraju važeći blokčejn potpis. Nekome su i dalje potrebni odgovarajući privatni ključevi, materijal za oporavak, uređaji za potpisivanje i podaci o konfiguraciji novčanika.</p>
<p>To stvara dva različita oblika kontrole:</p>
<ul>
<li><p><strong>Pravna kontrola:</strong> pravo na upravljanje imovinom ili njeno nasleđivanje</p>
</li>
<li><p><strong>Tehnička kontrola:</strong> sposobnost da se napravi važeća transakcija</p>
</li>
</ul>
<p>Potpun plan nasleđivanja mora da obezbedi oba oblika kontrole.</p>
<h2>Zašto tradicionalni testamenti zakazuju kod imovine na blokčejnu</h2>
<p>Testament je pravno uputstvo, a ne mehanizam za oporavak ključeva.</p>
<p>Tokom ostavinskog postupka originalni testament se uglavnom predaje sudu. Sud utvrđuje da li je dokument punovažan i imenuje izvršioca testamenta ili zastupnika zaostavštine. To lice zatim identifikuje imovinu zaostavštine, rešava dugove i poreske obaveze i raspodeljuje preostalu imovinu.</p>
<p>U Njujorku, na primer, izvršilac testamenta predaje originalni testament, umrlicu, predlog za pokretanje ostavinskog postupka i prateća dokumenta Sudu za zaostavštine. Masačusets uglavnom tretira predmete koji se odnose na zaostavštine i upravljanje njima kao javno dostupne, osim ako je neki spis posebno ograničen ili stavljen pod zaštitu suda. Druge jurisdikcije imaju sopstvena pravila o podnošenju dokumenata i javnom pristupu, ali ostavinski spisi i testamenti često postaju dostupni za uvid ili kopiranje.</p>
<p>Zbog toga je standardni testament jedno od najgorih mesta za objavljivanje:</p>
<ul>
<li><p>Privatnog ključa</p>
</li>
<li><p>Seed fraze ili fraze za oporavak</p>
</li>
<li><p>PIN-a hardverskog novčanika</p>
</li>
<li><p>BIP39 dodatne fraze, odnosno passphrase-a</p>
</li>
<li><p>Dovoljnog broja delova tajne da se dostigne prag za oporavak</p>
</li>
<li><p>Šifrovane seed fraze zajedno sa uputstvima za njeno dešifrovanje</p>
</li>
</ul>
<p>Fraza za oporavak nije samo lozinka. Ona može da omogući potpunu kontrolu nad svakim novčanikom izvedenim iz nje. Objavljivanje takve fraze u ostavinskom spisu funkcionalno je bliže objavljivanju potpisanog blanko čeka nego objavljivanju broja računa.</p>
<p>Čak i kada ostavinski spis nije pretraživ na internetu, možda je i dalje dostupan u zgradi suda ili ga ovlašćeni učesnici mogu kopirati. Svaka osoba i svaki sistem koji obrađuje dokument postaju deo bezbednosnog perimetra.</p>
<h3>Javna adresa nije privatni ključ, ali je ipak osetljiv podatak</h3>
<p>Javna adresa novčanika uglavnom ne može da se koristi za trošenje imovine. Ipak, ona može da otkrije stanje, istoriju transakcija, druge strane u transakcijama, tokene, pozicije u protokolima i buduće prenose.</p>
<p>Objavljivanje adrese sa imovinom velike vrednosti u testamentu može da pretvori ostavinski predmet u spisak potencijalnih meta. Kriminalci mogu da je koriste za identifikovanje naslednika, praćenje aktivnosti zaostavštine, lažno predstavljanje kao korisnička podrška za novčanike ili slanje phishing poruka u trenutku kada započne proces nasleđivanja.</p>
<p>Javne adrese zato treba tretirati kao osetljive inventarske podatke, iako nisu tajni materijal za potpisivanje.</p>
<h3>Šta testament ili trast treba da sadrže</h3>
<p>Dokumenta koja se odnose na zaostavštinu treba da uspostave ovlašćenje i nameru vlasnika, a da pritom ne otkrivaju ključeve.</p>
<p>U zavisnosti od lokalnih propisa i okolnosti vlasnika, advokat će možda morati da uredi ovlašćenje poverenog lica da:</p>
<ul>
<li><p>Pristupi digitalnim uređajima i obezbedi ih</p>
</li>
<li><p>Upravlja digitalnom imovinom i virtuelnim valutama</p>
</li>
<li><p>Pristupi kastodijalnim nalozima i povezanim evidencijama</p>
</li>
<li><p>Angažuje kvalifikovane pravne, poreske, bezbednosne ili blokčejn stručnjake</p>
</li>
<li><p>Plaća mrežne, kastodijalne, skladišne i transakcione naknade</p>
</li>
<li><p>Prenosi imovinu u naturi</p>
</li>
<li><p>Likvidira imovinu kada je to primereno</p>
</li>
<li><p>Upravlja stakingom, pozajmljivanjem, kolateralom, upravljačkim pravima i pozicijama u protokolima</p>
</li>
<li><p>Pribavlja poresku i transakcionu evidenciju</p>
</li>
<li><p>Uspostavi privremeno čuvanje imovine u ime zaostavštine ili trasta</p>
</li>
<li><p>Raspodeljuje imovinu korisnicima ili naslednicima</p>
</li>
<li><p>Postupa tokom nesposobnosti vlasnika, kao i nakon njegove smrti</p>
</li>
</ul>
<p>Dokument može da navede postojanje zasebnog inventara digitalne imovine ili memoranduma o nasleđivanju. Ne treba da sadrži same tajne za oporavak.</p>
<p>Pravno dejstvo zasebnog memoranduma može da se razlikuje. On može biti administrativni vodič, a ne obavezujući dokument kojim se raspolaže imovinom. Advokat za nasledno pravo treba da odluči na koji način će memorandum biti pomenut, čuvan, potvrđen kao autentičan, ažuriran i dostavljen.</p>
<h3>Propisi o digitalnoj imovini ne mogu da rekonstruišu privatne ključeve</h3>
<p>Revidirani jedinstveni zakon o fiducijarnom pristupu digitalnoj imovini pruža poverenim licima okvir za upravljanje digitalnom imovinom, uključujući virtuelne valute i naloge na internetu. On takođe uređuje slučajeve u kojima pružaoci usluga mogu da otkriju digitalnu imovinu ili elektronsku komunikaciju.</p>
<p>To može pomoći kada kompanija kontroliše odgovarajući nalog ili podatke.</p>
<p>Ne rešava, međutim, problem samostalnog čuvanja. Kod nekastodijalnog novčanika možda ne postoji pružalac usluge koji bilo šta može da otkrije ili resetuje. Zakon može da imenuje osobu ovlašćenu da postupa, ali blokčejn će i dalje zahtevati odgovarajući potpis.</p>
<p>Pravilno osnovan i finansiran trast može da poboljša kontinuitet i smanji izloženost ostavinskom postupku. Ipak, on ne uklanja potrebu za testiranim postupkom oporavka ključeva. Nasledni poverenik trasta bez ključeva ima isti tehnički problem kao izvršilac testamenta bez ključeva.</p>
<h2>Bezbednosni problem nasleđivanja</h2>
<p>Plan nasleđivanja mora istovremeno da štiti od nekoliko različitih rizika:</p>
<ul>
<li><p>Krađe dok je vlasnik živ</p>
</li>
<li><p>Trajnog gubitka nakon smrti</p>
</li>
<li><p>Preranog pristupa naslednika ili insajdera</p>
</li>
<li><p>Uništenja jedine fizičke rezervne kopije</p>
</li>
<li><p>Gubitka dodatne fraze ili konfiguracije novčanika</p>
</li>
<li><p>Zabune u vezi sa mrežama, nalozima ili derivacionim putanjama</p>
</li>
<li><p>Kvara hardvera ili zastarevanja softvera</p>
</li>
<li><p>Grešaka izvršioca testamenta</p>
</li>
<li><p>Phishing napada tokom perioda žalosti</p>
</li>
<li><p>Pravnih sporova između naslednika</p>
</li>
<li><p>Nepotpune poreske i transakcione evidencije</p>
</li>
<li><p>Prevelike složenosti zbog koje niko ne može da sprovede plan</p>
</li>
</ul>
<p>Ovi rizici su međusobno suprotstavljeni.</p>
<p>Ako jedna osoba danas dobije kompletnu frazu za oporavak, nasleđivanje postaje jednostavno, ali je bezbednost tokom života vlasnika slabija. Ako niko ne može da pristupi ključu do smrti vlasnika, neka osoba, institucija ili sistem mora da odluči kada pristup treba da bude odobren. Ako su za oporavak potrebni svi delovi tajne, gubitak samo jednog dela uništava ceo plan. Ako je potreban premali broj delova, dogovor i zloupotreba više učesnika postaju lakši.</p>
<p>Ne postoji mehanizam koji bez pouzdane treće strane ili dodatnih tehničkih pretpostavki može istovremeno da garantuje sve sledeće:</p>
<ol>
<li><p>Niko osim vlasnika ne može da pristupi imovini pre njegove smrti.</p>
</li>
<li><p>Naslednici mogu da pristupe imovini odmah nakon smrti.</p>
</li>
<li><p>Nijednoj instituciji ili osobi nije povereno da potvrdi smrt.</p>
</li>
</ol>
<p>Realističan plan prihvata ovaj kompromis i zajedno koristi pravno ovlašćenje, pristup zasnovan na pragu, nezavisna mesta čuvanja i ljudsku proveru.</p>
<h2>Zašto „prekidači za slučaj smrti” zakazuju u praksi</h2>
<p>Automatizovani „prekidač za slučaj smrti”, poznat i kao dead man’s switch, obično funkcioniše ovako:</p>
<ol>
<li><p>Vlasnik čuva tajnu ili podešava automatizovanu transakciju.</p>
</li>
<li><p>Vlasnik mora periodično da potvrđuje da je živ.</p>
</li>
<li><p>Ako potvrda ne stigne, sistem objavljuje informacije ili prenosi imovinu.</p>
</li>
</ol>
<p>Ideja deluje elegantno jer kašnjenje ostavinskog postupka zamenjuje automatizacijom. Problem je u tome što neaktivnost nije dokaz smrti.</p>
<h3>Lažna aktiviranja</h3>
<p>Živi vlasnik može da propusti potvrdu zbog:</p>
<ul>
<li><p>Hospitalizacije</p>
</li>
<li><p>Dužeg putovanja</p>
</li>
<li><p>Boravka u pritvoru ili zatvoru</p>
</li>
<li><p>Gubitka telefona ili bezbednosnog ključa</p>
</li>
<li><p>Filtriranja imejlova</p>
</li>
<li><p>Suspenzije naloga</p>
</li>
<li><p>Zaboravljenih podsetnika u kalendaru</p>
</li>
<li><p>Kognitivnog propadanja</p>
</li>
<li><p>Promene broja telefona</p>
</li>
<li><p>Neuspele autentifikacije</p>
</li>
<li><p>Prirodne katastrofe ili prekida komunikacija</p>
</li>
</ul>
<p>Ako sistem objavljuje privatni ključ, samo jedna propuštena potvrda može da izloži ceo novčanik.</p>
<h3>Izostanak aktiviranja</h3>
<p>Može se dogoditi i suprotno. Sistem možda neće biti aktiviran nakon smrti zato što:</p>
<ul>
<li><p>Uređaj na kome je vlasnik ostao prijavljen nastavlja da se sinhronizuje</p>
</li>
<li><p>Imejl klijent nastavlja da proverava poruke</p>
</li>
<li><p>Automatizovani proces registruje aktivnost na nalogu</p>
</li>
<li><p>Član porodice koristi računar vlasnika</p>
</li>
<li><p>Usluga pogrešno protumači pozadinsku aktivnost kao ljudsku</p>
</li>
<li><p>Napadač kompromituje nalog i namerno ga održava aktivnim</p>
</li>
</ul>
<p>Google-ov Menadžer neaktivnih naloga, na primer, procenjuje signale kao što su prijavljivanje, aktivnost na nalogu, korišćenje Gmaila i provere Android uređaja. Automatska sinhronizacija uređaja takođe može da stvori privid nedavne aktivnosti na nalogu.</p>
<p>Zbog toga je takav sistem koristan za obaveštenja i deljenje odabranih podataka, ali ne predstavlja pouzdan način utvrđivanja smrti.</p>
<h3>Zavisnost od pružaoca usluge u oblaku</h3>
<p>Prekidač zasnovan na usluzi u oblaku zavisi od mnogo više stvari nego što su samo uputstva korisnika. Može da zavisi od toga da:</p>
<ul>
<li><p>Pružalac usluge nastavi da nudi tu funkciju</p>
</li>
<li><p>Nalog ostane otvoren</p>
</li>
<li><p>Adrese za oporavak naloga ostanu važeće</p>
</li>
<li><p>Primalac zadrži isti broj telefona</p>
</li>
<li><p>Pružalac usluge pravilno potvrdi identitet primaoca</p>
</li>
<li><p>Formati za čuvanje podataka ostanu čitljivi</p>
</li>
<li><p>Podaci ne budu izbrisani u skladu sa pravilima o neaktivnosti</p>
</li>
<li><p>Uslovi korišćenja i zakonski zahtevi ostanu usklađeni sa planom</p>
</li>
</ul>
<p>To su prihvatljive zavisnosti za sistem podsetnika ili dostavljanje dokumenata. Opasne su ako je u pitanju jedina kopija seed fraze.</p>
<h3>Rizici pametnih ugovora</h3>
<p>Pametni ugovor može da primeni tajmer, postupak sa starateljima ili pravila oporavka. Pametni nalozi i sistemi apstrakcije naloga mogu da podrže fleksibilna pravila oporavka, više staratelja i programabilni pristup.</p>
<p>Takvi sistemi mogu biti korisni, naročito kada su profesionalno implementirani i stalno održavani. Ipak, ni oni ne znaju da je neka osoba umrla. Oni znaju samo da je:</p>
<ul>
<li><p>Tajmer istekao</p>
</li>
<li><p>Izostala potvrda određenog ključa</p>
</li>
<li><p>Potreban broj staratelja odobrio zahtev</p>
</li>
<li><p>Orakul dostavio određenu tvrdnju</p>
</li>
<li><p>Nastupio unapred definisan uslov transakcije</p>
</li>
</ul>
<p>Pametni ugovor može da sadrži ranjivost, da zavisi od ključa za nadogradnju, releja ili orakula ili da nepredviđeno reaguje u interakciji sa drugim ugovorom. Pametni ugovori mogu da kontrolišu veliku vrednost, teško ih je ispraviti nakon postavljanja i ostaju izloženi greškama u kontroli pristupa, logici, orakulima i integracijama.</p>
<h3>Nova površina za phishing napade</h3>
<p>Sistemi za periodičnu potvrdu stvaraju ponavljajući i predvidiv bezbednosni ritual. Napadači mogu da imitiraju:</p>
<ul>
<li><p>Poruke „Potvrdite da ste živi”</p>
</li>
<li><p>Obaveštenja o verifikaciji novčanika</p>
</li>
<li><p>Zahteve za odobrenje staratelja</p>
</li>
<li><p>Stranice za prijavljivanje na usluge u oblaku</p>
</li>
<li><p>Zahteve za ažuriranje hardverskog novčanika</p>
</li>
<li><p>Transakcije za oporavak putem pametnih ugovora</p>
</li>
</ul>
<p>Primalac koji očekuje vremenski određenu poruku u vezi sa nasleđivanjem verovatnije će poverovati i dobro napravljenoj lažnoj poruci.</p>
<h3>Pravilna uloga automatizacije</h3>
<p>Automatizacija može biti korisna za:</p>
<ul>
<li><p>Podsećanje vlasnika da pregleda plan</p>
</li>
<li><p>Obaveštavanje advokata ili člana porodice nakon dužeg perioda neaktivnosti</p>
</li>
<li><p>Dostavljanje paketa uputstava koji ne sadrži tajne</p>
</li>
<li><p>Identifikovanje izvršioca testamenta i advokata</p>
</li>
<li><p>Pokretanje procesa ljudske provere</p>
</li>
<li><p>Potvrđivanje da inventar imovine postoji</p>
</li>
</ul>
<p>Ne treba automatski da objavi kompletnu seed frazu, privatni ključ ili dovoljan broj delova za dostizanje praga.</p>
<p>Bezbedno pravilo je jednostavno: <strong>automatizaciju koristite za pokretanje postupka nasleđivanja, a ne za dovršavanje kriptografskog prenosa.</strong></p>
<h2>Realističan protokol nasleđivanja kripto-imovine u četiri koraka</h2>
<p>Nijedan sistem nasleđivanja nije doslovno nepogrešiv. Najbliže praktično rešenje jeste plan otporan na greške, bez tajni u javnim spisima, bez jedne fizičke tačke otkaza i bez koraka koji primorava naslednika da improvizuje.</p>
<p>Sledeći protokol u četiri koraka namenjen je ljudima koji nisu programeri i može da se primeni kako na skroman hardverski novčanik, tako i na portfelj velike vrednosti.</p>
<h2>Korak 1: Uspostavite ovlašćenje i napravite mapu imovine bez tajnih podataka</h2>
<p>Počnite razdvajanjem uloga osoba uključenih u plan.</p>
<p>Plan može da obuhvati:</p>
<ul>
<li><p><strong>Vlasnika:</strong> osobu koja trenutno kontroliše imovinu</p>
</li>
<li><p><strong>Povereno lice:</strong> izvršioca testamenta, zastupnika zaostavštine ili naslednog poverenika trasta sa pravnim ovlašćenjem</p>
</li>
<li><p><strong>Tehničkog operatera:</strong> pouzdanu osobu ili stručnjaka koji razume oporavak novčanika</p>
</li>
<li><p><strong>Čuvare delova tajne:</strong> osobe ili institucije koje čuvaju pojedinačne delove za oporavak</p>
</li>
<li><p><strong>Naslednike ili korisnike:</strong> osobe koje imaju zakonsko pravo na imovinu</p>
</li>
<li><p><strong>Advokata i poreskog stručnjaka:</strong> savetnike odgovorne za pravna i poreska pitanja</p>
</li>
</ul>
<p>Kod portfelja velike vrednosti jedna osoba ne bi trebalo automatski da obavlja sve uloge. Naslednik možda nije najbolji izvršilac testamenta. Izvršilac testamenta možda nije tehnički osposobljen za rukovanje hardverskim novčanikom. Tehničkom operateru ne treba dozvoliti da samostalno radi sa dovoljnom količinom materijala za oporavak.</p>
<h3>Napravite tri odvojena sloja informacija</h3>
<p><strong>Sloj 1: Dokumenta zaostavštine</strong></p>
<p>Ona utvrđuju ko ima ovlašćenje i ko prima imovinu. Ne sadrže ključeve, fraze, PIN-ove ni delove tajne.</p>
<p><strong>Sloj 2: Ograničena mapa imovine i oporavka</strong></p>
<p>Ona ovlašćenom poverenom licu govori šta postoji, kako se čuva, koji se standard oporavka primenjuje i gde se nalaze odvojene komponente za oporavak. I dalje ne sadrži dovoljno tajnog materijala za trošenje imovine.</p>
<p><strong>Sloj 3: Tajne za oporavak</strong></p>
<p>To su seed fraza, kriptografski delovi tajne, dodatna fraza ili ključevi za potpisivanje. Čuvaju se van mreže i odvojeno od testamenta i potpune mape imovine.</p>
<h3>Šta mapa imovine treba da sadrži</h3>
<table>
<thead>
<tr>
<th>Polje</th>
<th>Šta treba evidentirati</th>
<th>Bezbednosni tretman</th>
</tr>
</thead>
<tbody><tr>
<td>Oznaka plana</td>
<td>Jedinstven naziv i datum verzije</td>
<td>Nije tajno</td>
</tr>
<tr>
<td>Pravni vlasnik</td>
<td>Fizičko lice, trast, kompanija ili drugi subjekt</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Imovina i mreža</td>
<td>Na primer, određena imovina na Bitcoin, Ethereum ili konkretnoj layer-2 mreži</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Javna adresa</td>
<td>Proverena adresa za prijem ili oznaka naloga</td>
<td>Osetljivo, ali nije tajno</td>
</tr>
<tr>
<td>Vrsta čuvanja</td>
<td>Berza, hardverski novčanik, multisig, pametni nalog ili softverski novčanik</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Softver novčanika</td>
<td>Aplikacija koja se koristi za pregled i upravljanje nalogom</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Hardverski uređaj</td>
<td>Proizvođač i porodica uređaja</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Standard rezervne kopije</td>
<td>BIP39, SLIP39, multisig ili drugi dokumentovani standard</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Status dodatne fraze</td>
<td>Da li dodatna fraza postoji, ali ne i njen sadržaj</td>
<td>Veoma osetljivo</td>
</tr>
<tr>
<td>Podaci o nalogu</td>
<td>Broj naloga, tip skripte, derivaciona putanja ili lokacija deskriptora novčanika</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Pozicije u protokolima</td>
<td>Staking, pozajmljivanje, likvidnost, kolateral, vesting, mostovi ili zaključana upravljačka prava</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Zahtevi za naknade</td>
<td>Izvorna imovina potrebna za plaćanje transakcionih naknada</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Poreska evidencija</td>
<td>Lokacija istorije transakcija, podataka o sticanju i prethodnih prijava</td>
<td>Ograničen pristup</td>
</tr>
<tr>
<td>Kontakti za oporavak</td>
<td>Izvršilac testamenta, advokat, tehnički operater i čuvari delova tajne</td>
<td>Veoma osetljivo</td>
</tr>
<tr>
<td>Poslednja provera</td>
<td>Datum kada su pristup i stanje poslednji put provereni</td>
<td>Ograničen pristup</td>
</tr>
</tbody></table>
<p>Navođenje samo simbola tokena nije dovoljno. Mapa mora da identifikuje mrežu i vrstu pozicije. Stabilni token na jednoj mreži operativno se razlikuje od istog stabilnog tokena na drugoj mreži. Token uložen u protokol za pozajmljivanje razlikuje se od istog tokena koji se nalazi neposredno u novčaniku.</p>
<p>Za svaki novčanik evidentirajte:</p>
<ul>
<li><p>Prvu proverenu adresu za prijem</p>
</li>
<li><p>Mrežu</p>
</li>
<li><p>Naziv naloga ili novčanika</p>
</li>
<li><p>Aplikaciju novčanika</p>
</li>
<li><p>Standard rezervne kopije</p>
</li>
<li><p>Da li se koristi dodatna fraza</p>
</li>
<li><p>Da li novčanik koristi jedan potpis ili multisig</p>
</li>
<li><p>Svaku neuobičajenu derivacionu putanju ili vrstu naloga</p>
</li>
<li><p>Lokaciju konfiguracionih podataka koji nisu tajni</p>
</li>
<li><p>Lokaciju i uslove predaje materijala za oporavak</p>
</li>
</ul>
<p>Inventar može da se čuva u šifrovanom digitalnom dokumentu, na bezbednom portalu advokata ili u zapečaćenom fizičkom paketu. Treba da postoje najmanje dve kopije sa kontrolisanim pristupom.</p>
<p>Metod za dešifrovanje inventara mora da ima sopstveni plan nasleđivanja, ali ne treba da koristi iste pristupne podatke koji kontrolišu kripto-imovinu.</p>
<h2>Korak 2: Uspostavite oporavak zasnovan na pragu i bezbednu hardversku proceduru</h2>
<p>Cilj oporavka zasnovanog na pragu jeste da jedan ukradeni dokument ne bude dovoljan za pražnjenje novčanika, uz istovremenu mogućnost oporavka ako jedno mesto čuvanja bude uništeno.</p>
<h3>Nemojte ručno deliti seed frazu na delove</h3>
<p>Zapisivanje prvih 12 reči na jednom mestu, a poslednjih 12 na drugom, nije pravilan način kriptografske podele tajne.</p>
<p>Ručno deljenje stvara nekoliko problema:</p>
<ul>
<li><p>Svaki fragment otkriva deo originalne tajne.</p>
</li>
<li><p>Možda ne postoji nikakva redundantnost.</p>
</li>
<li><p>Gubitak jednog fragmenta može da onemogući oporavak.</p>
</li>
<li><p>Uputstva mogu biti nejasna.</p>
</li>
<li><p>Naslednici možda neće znati pravilan redosled.</p>
</li>
<li><p>Kratku ili delimično otkrivenu seed frazu možda je lakše napasti.</p>
</li>
<li><p>Podela možda nije kompatibilna sa softverom novčanika.</p>
</li>
<li><p>Ne postoji standardizovan postupak oporavka.</p>
</li>
</ul>
<p>BIP39 definiše kako se mnemonička fraza pretvara u seed materijal za deterministički novčanik. Ne definiše bezbedan način da se ta fraza iseče na fragmente za nasleđivanje.</p>
<p>Koristite priznati standard za kriptografsku podelu tajne ili izvorna multisig pravila.</p>
<h3>Opcija A: Podela tajne zasnovana na standardu</h3>
<p>U pravilnim sistemima podeljenog znanja tajna se matematički deli na više delova. Manji broj delova od propisanog praga ne bi trebalo da otkrije nikakve korisne informacije o ključu koji se rekonstruiše.</p>
<p>SLIP39 je jedna implementacija ovog koncepta prilagođena novčanicima. Omogućava pravljenje više delova za oporavak u obliku reči i određivanje broja potrebnog za oporavak. Postavka 2 od 3 pravi tri dela, od kojih bilo koja dva mogu da oporave novčanik. Jedan deo nije dovoljan.</p>
<p>SLIP39 se razlikuje od BIP39. Novčanik koji podržava standardnu BIP39 frazu od 12 ili 24 reči ne mora nužno da podržava SLIP39 delove. Eksplicitno evidentirajte standard i proverite kompatibilnost sa hardverom za oporavak.</p>
<p>Uobičajene postavke praga obuhvataju:</p>
<table>
<thead>
<tr>
<th>Postavka</th>
<th>Tolerancija na gubitak</th>
<th>Prag kompromitovanja</th>
<th>Operativno opterećenje</th>
</tr>
</thead>
<tbody><tr>
<td>2 od 3</td>
<td>Jedan deo može da bude izgubljen</td>
<td>Napadaču su potrebna dva dela</td>
<td>Nisko</td>
</tr>
<tr>
<td>3 od 5</td>
<td>Dva dela mogu da budu izgubljena</td>
<td>Napadaču su potrebna tri dela</td>
<td>Umereno</td>
</tr>
<tr>
<td>2 od 2</td>
<td>Nijedan deo ne sme da bude izgubljen</td>
<td>Napadaču su potrebna oba dela</td>
<td>Krhko</td>
</tr>
<tr>
<td>1 od 3</td>
<td>Dve kopije mogu da budu izgubljene</td>
<td>Bilo koja kopija daje pristup</td>
<td>Nema zaštite zasnovane na pragu</td>
</tr>
</tbody></table>
<p>Za mnoga domaćinstva postavka 2 od 3 predstavlja najbolju ravnotežu između mogućnosti oporavka i složenosti. Postavka 3 od 5 može biti primerena kada je portfelj dovoljno veliki da opravda više mesta čuvanja i više učesnika.</p>
<p>Izbegavajte pragove koji zahtevaju svaki deo. Plan 3 od 3 može delovati bezbedno, ali gubitak samo jednog dela čini novčanik nepopravljivo nedostupnim.</p>
<h3>Praktična raspodela po modelu 2 od 3</h3>
<p>Jedan od mogućih modela izgleda ovako:</p>
<ul>
<li><p>Deo A nalazi se na bezbednom mestu pod kontrolom vlasnika, uz dokumentovan pravni put kojim izvršilac testamenta može da mu pristupi</p>
</li>
<li><p>Deo B čuva advokat, profesionalni čuvar dokumenata ili drugo nezavisno lice, u skladu sa pisanim pravilima predaje</p>
</li>
<li><p>Deo C nalazi se na geografski odvojenom bezbednom mestu ili kod drugog pouzdanog čuvara</p>
</li>
</ul>
<p>Mesta čuvanja ne treba da budu izložena istom požaru, poplavi, provali ili riziku vezanom za jedno domaćinstvo.</p>
<p>Ako se koristi sef u banci, proverite kako će izvršilac testamenta ili nasledni poverenik trasta moći da mu pristupi. Pravila pristupa se razlikuju, a kašnjenje ostavinskog postupka može učiniti bankarski sef neprikladnim kao jedinu putanju za oporavak.</p>
<p>Struktura 2 od 3 i dalje omogućava bilo kojim dvama čuvarima delova da se dogovore i zloupotrebe pristup. Sistem podele tajne ne zna da li je vlasnik živ niti da li je oporavak pravno odobren.</p>
<p>Kod portfelja sa većim rizikom razmotrite:</p>
<ul>
<li><p>Prag 3 od 5</p>
</li>
<li><p>Institucionalno čuvanje dokumenata</p>
</li>
<li><p>Pisane uslove predaje</p>
</li>
<li><p>Ambalažu koja pokazuje pokušaj otvaranja i evidenciju pregleda</p>
</li>
<li><p>Multisig čuvanje</p>
</li>
<li><p>Profesionalno povereno lice</p>
</li>
<li><p>Regulisanog pružaoca usluge čuvanja za deo imovine ili celokupnu imovinu</p>
</li>
</ul>
<p>Nemojte se oslanjati samo na to da čuvari delova ne znaju jedni za druge. To može da smanji oportunistički rizik, ali nije zamena za kvalitetne kontrole.</p>
<h3>Obeležite delove bez reklamiranja portfelja</h3>
<p>Svaki deo treba da sadrži dovoljno informacija da se spreči zabuna:</p>
<ul>
<li><p>Oznaku plana</p>
</li>
<li><p>Broj dela</p>
</li>
<li><p>Prag za oporavak</p>
</li>
<li><p>Standard rezervne kopije</p>
</li>
<li><p>Datum izrade</p>
</li>
<li><p>Uputstvo da deo nikada ne sme da se fotografiše niti unosi u telefon ili računar</p>
</li>
</ul>
<p>Ne treba da prikazuje:</p>
<ul>
<li><p>Potpun inventar imovine vlasnika</p>
</li>
<li><p>Približnu vrednost novčanika</p>
</li>
<li><p>Sva druga mesta čuvanja</p>
</li>
<li><p>Imena svih čuvara delova</p>
</li>
<li><p>Dodatnu frazu</p>
</li>
<li><p>Javnu adresu koja otkriva portfelj</p>
</li>
</ul>
<p>Papir može biti dovoljan ako se čuva u profesionalno zaštićenom prostoru. Izdržljiv metal može da poboljša otpornost na požar, vodu i fizičko propadanje.</p>
<p>Metal povećava trajnost, ali ne kontroliše pristup. Zakopana metalna ploča i dalje može da bude ukradena, zaboravljena, pronađena tokom građevinskih radova, oštećena ili pravno nedostupna.</p>
<h3>Migracija postojećeg novčanika</h3>
<p>Nemojte postavljati postojeću BIP39 frazu na internet servis koji nudi „deljenje seed fraze”.</p>
<p>Ako trenutni novčanik izvorno ne podržava izabrani standard praga, bezbedniji postupak obično izgleda ovako:</p>
<ol>
<li><p>Napravite novi novčanik na kompatibilnom hardverskom uređaju.</p>
</li>
<li><p>Generišite delove sa pragom direktno na uređaju.</p>
</li>
<li><p>Proverite delove.</p>
</li>
<li><p>Pošaljite mali probni iznos u novi novčanik.</p>
</li>
<li><p>Oporavite novčanik na drugom kompatibilnom uređaju.</p>
</li>
<li><p>Potvrdite da se prikazuje ista proverena adresa.</p>
</li>
<li><p>Pošaljite probni iznos iz novčanika.</p>
</li>
<li><p>Tek tada prenesite glavni iznos.</p>
</li>
</ol>
<p>Neki uređaji nude dokumentovane metode za pravljenje ili menjanje formata rezervne kopije neposredno na uređaju. Ako koristite takvu funkciju, proverite šta se dešava sa starom rezervnom kopijom.</p>
<p>Stara seed fraza može i nakon pravljenja novih delova ostati sposobna da oporavi novčanik. Ne treba je uništavati dok nova putanja oporavka ne bude potpuno testirana, ali je ne treba ni zaboraviti kao nenadgledanu mogućnost pristupa.</p>
<h3>Napravite hardversku putanju oporavka</h3>
<p>Plan nasleđivanja ne treba da zavisi od toga da li će originalni hardverski novčanik preživeti.</p>
<p>Hardver se kvari. Baterije propadaju. Ekrani pucaju. Kablovi nestaju. Firmver se menja. Kompanije prestaju da podržavaju stare uređaje.</p>
<p>Trajna osnova za oporavak jeste standardizovana rezervna kopija sa odgovarajućim metapodacima, a ne originalni uređaj.</p>
<p>Plan treba da navede:</p>
<ul>
<li><p>Porodicu kompatibilnih hardverskih novčanika</p>
</li>
<li><p>Standard rezervne kopije</p>
</li>
<li><p>Zvaničan izvor softvera</p>
</li>
<li><p>Da li se reči za oporavak unose direktno na uređaju</p>
</li>
<li><p>Vrstu naloga ili podatke o derivaciji</p>
</li>
<li><p>Način provere prve adrese za prijem</p>
</li>
<li><p>Način nabavke zamenskog uređaja</p>
</li>
<li><p>Način sprovođenja probnog oporavka</p>
</li>
<li><p>Postupak u slučaju oštećenja originalnog uređaja</p>
</li>
</ul>
<p>Reči za oporavak treba unositi direktno u pouzdan hardverski uređaj, a ne u običan računar, obrazac u internet pregledaču, telefon, dokument u oblaku ili razgovor sa korisničkom podrškom.</p>
<p>Fraza za oporavak daje potpun pristup novčaniku. Nikada ne treba da bude sačuvana u digitalnom obliku niti dostavljena zaposlenima u korisničkoj podršci.</p>
<p>Aktivni hardverski novčanik i delovi za oporavak ne treba da budu na istom mestu. Osoba koja ukrade uređaj ne treba istovremeno da dobije materijal potreban za njegov oporavak ili zaobilaženje zaštite.</p>
<p>Rezervni hardverski uređaj može biti koristan, ali ne treba da ostane inicijalizovan aktivnim novčanikom, osim ako je ta dodatna kopija ključa namerno i odgovarajuće zaštićena. Neinicijalizovan rezervni uređaj, ili uređaj koji se koristi za testiranje pa zatim briše, stvara manju izloženost tokom života vlasnika.</p>
<h3>Proverite rezervnu kopiju pre čuvanja imovine</h3>
<p>Fraza koja nikada nije testirana nije rezervna kopija. Ona je samo pretpostavka.</p>
<p>Koristite:</p>
<ul>
<li><p>Postupak za proveru rezervne kopije koji obezbeđuje proizvođač</p>
</li>
<li><p>Test oporavka na drugom kompatibilnom uređaju</p>
</li>
<li><p>Poseban probni novčanik napravljen istim postupkom</p>
</li>
</ul>
<p>Nemojte brisati jedini funkcionalni uređaj dok materijal za oporavak ne bude proveren.</p>
<p>Proveru rezervne kopije ili probni oporavak treba završiti pre oslanjanja na zapisani materijal za oporavak ili sprovođenja operacije koja može da resetuje uređaj.</p>
<h3>Tretirajte dodatne fraze kao naprednu funkciju</h3>
<p>Opciona BIP39 dodatna fraza, odnosno passphrase, pravi zaseban novčanik iz iste osnovne fraze za oporavak. Ona nije nužno doslovna „25. reč”, a svako veliko i malo slovo, razmak i znak imaju značaj.</p>
<p>Pogrešna dodatna fraza može da otvori važeći, ali potpuno drugačiji novčanik. Softver može da prikaže prazan novčanik umesto poruke o grešci. Ako se dodatna fraza izgubi, sama seed fraza možda neće moći da oporavi željenu imovinu.</p>
<p>Za plan nasleđivanja namenjen osobama bez tehničkog znanja, rezervna kopija sa pragom zasnovana na standardu često je bezbednija od dodavanja passphrase-a.</p>
<p>Ako dodatna fraza već postoji:</p>
<ul>
<li><p>Evidentirajte njeno postojanje u mapi imovine.</p>
</li>
<li><p>Čuvajte njen tačan sadržaj kao zaseban zaštićeni faktor.</p>
</li>
<li><p>Nemojte se oslanjati na nejasan nagoveštaj.</p>
</li>
<li><p>Sačuvajte tačnu upotrebu velikih i malih slova, interpunkcije, razmaka i rasporeda tastature.</p>
</li>
<li><p>Testirajte potpuni oporavak pomoću seed fraze i dodatne fraze.</p>
</li>
<li><p>Obezbedite da učesnici u postupku nasleđivanja mogu da dođu do obe komponente.</p>
</li>
<li><p>Imajte u vidu da dodatna fraza postaje zasebna jedinstvena tačka otkaza ako i sama nije zaštićena redundantno.</p>
</li>
</ul>
<h3>Opcija B: Multisig</h3>
<p>Multisig, odnosno višestruki potpis, nije isto što i podela tajne.</p>
<p>Kod podele tajne više delova rekonstruiše jednu glavnu tajnu. Kada se ona rekonstruiše, taj jedan ključ može da potpisuje transakcije.</p>
<p>Kod multisig sistema nezavisni ključevi potpisuju transakcije u skladu sa pravilima na blokčejnu ili pametnom nalogu. Novčanik 2 od 3 zahteva važeće potpise dva od tri odvojena potpisnika. Ključevi ne moraju da se spajaju.</p>
<table>
<thead>
<tr>
<th>Karakteristika</th>
<th>Podela tajne</th>
<th>Multisig</th>
</tr>
</thead>
<tbody><tr>
<td>Šta je podeljeno?</td>
<td>Tajna za oporavak</td>
<td>Ovlašćenje za potpisivanje</td>
</tr>
<tr>
<td>Šta se dešava tokom oporavka?</td>
<td>Delovi rekonstruišu jedan ključ</td>
<td>Više ključeva potpisuje nezavisno</td>
</tr>
<tr>
<td>Pravila na blokčejnu</td>
<td>Obično se prikazuje kao jedan potpisnik</td>
<td>Pravila praga ili pametni nalog</td>
</tr>
<tr>
<td>Glavna prednost</td>
<td>Jednostavan oporavak novčanika sa više vrsta imovine</td>
<td>Nema potrebe za rekonstrukcijom jedne glavne tajne</td>
</tr>
<tr>
<td>Glavni nedostatak</td>
<td>Čuvari dovoljnog broja delova mogu da rekonstruišu novčanik</td>
<td>Složenija konfiguracija i koordinacija</td>
</tr>
<tr>
<td>Kompatibilnost</td>
<td>Zavisi od standarda rezervne kopije</td>
<td>U velikoj meri zavisi od mreže i podrške novčanika</td>
</tr>
</tbody></table>
<p>Bitcoin multisig može biti veoma otporan, ali pojedinačne seed fraze nisu kompletna rezervna kopija. Novčaniku će možda biti potreban i potpun deskriptor ili ekvivalentna konfiguracija, uključujući javne ključeve, otiske ključeva, tip skripte, prag i podatke o derivaciji.</p>
<p>Obnavljanje multisig novčanika zahteva i odgovarajuće rezervne kopije privatnih ključeva i deskriptor novčanika ili ekvivalentne podatke o supotpisnicima.</p>
<p>Naslednik koji ima dve od tri seed fraze, ali nema odgovarajuću multisig konfiguraciju, možda neće moći da pronađe ili potroši sredstva.</p>
<p>Multisig pametni ugovori i novčanici za društveni oporavak mogu da podrže pravila nasleđivanja na programabilnim mrežama. Oni takođe dodaju zavisnosti od ugovora, nadogradnji, staratelja, releja i aplikacija. Treba ih koristiti samo kada porodica ima dokumentovan put do podrške i kada su ugovori široko pregledani i provereni.</p>
<p>Za osobu koja nije programer i ima imovinu na više mreža, standardizovani hardverski delovi za oporavak mogu biti jednostavniji. Za Bitcoin portfelj velike vrednosti, profesionalno podešen multisig može da pruži snažnije razdvajanje ovlašćenja.</p>
<h2>Korak 3: Napišite operativno uputstvo koje ne pretpostavlja poznavanje kripta</h2>
<p>Tehnički ispravna rezervna kopija i dalje može da zakaže ako porodica ne zna šta je ona, gde da je pronađe ili kako da je bezbedno upotrebi.</p>
<p>Paket uputstava treba da bude napisan za osobu koja nikada nije koristila hardverski novčanik.</p>
<p>Na prvoj strani treba da se nalaze pravila za vanredne situacije, a ne tehnička teorija.</p>
<h3>Uputstva na prvoj strani</h3>
<ol>
<li><p>Ne unosite reči za oporavak u telefon, računar, internet stranicu, dodatak za pregledač, imejl ili čet.</p>
</li>
<li><p>Ne fotografišite, skenirajte, fotokopirajte, diktirajte niti čitajte reči za oporavak naglas.</p>
</li>
<li><p>Ne pokušavajte više puta da pogodite PIN hardverskog novčanika.</p>
</li>
<li><p>Ne resetujte, brišite niti ažurirajte originalni uređaj.</p>
</li>
<li><p>Ne odgovarajte na direktne poruke osoba koje nude oporavak novčanika.</p>
</li>
<li><p>Ne objavljujte javno podatke o imovini.</p>
</li>
<li><p>Obratite se imenovanom izvršiocu testamenta ili naslednom povereniku trasta.</p>
</li>
<li><p>Obratite se imenovanom advokatu i tehničkom operateru koristeći odštampane kontakt podatke.</p>
</li>
<li><p>Ne premeštajte imovinu dok se ne potvrde pravno ovlašćenje i plan odredišta.</p>
</li>
<li><p>Nikada ne dozvolite jednom spoljnom tehničaru da samostalno radi sa dovoljno materijala za kontrolu novčanika.</p>
</li>
</ol>
<p>Ova pravila odnose se na period najvećeg rizika: dane nakon smrti, kada naslednici tuguju, uređaji se prikupljaju, a prevaranti možda već prate javne spise ili čitulje.</p>
<h3>Šta kompletno operativno uputstvo treba da sadrži</h3>
<p><strong>Identitet i ovlašćenje</strong></p>
<ul>
<li><p>Ime izvršioca testamenta ili naslednog poverenika trasta</p>
</li>
<li><p>Ime rezervnog poverenog lica</p>
</li>
<li><p>Kontakt podatke advokata</p>
</li>
<li><p>Kontakt podatke tehničkog operatera</p>
</li>
<li><p>Kontakt podatke poreskog stručnjaka</p>
</li>
<li><p>Dokumenta potrebna pre oporavka</p>
</li>
<li><p>Podatak o tome ko sme da odobri prenos</p>
</li>
</ul>
<p><strong>Pronalaženje imovine</strong></p>
<ul>
<li><p>Inventar novčanika i naloga</p>
</li>
<li><p>Mreže koje se koriste</p>
</li>
<li><p>Javne adrese</p>
</li>
<li><p>Kastodijalne pružaoce usluga</p>
</li>
<li><p>Hardverske uređaje</p>
</li>
<li><p>Pozicije u protokolima</p>
</li>
<li><p>Podatke o stakingu ili periodima zaključavanja</p>
</li>
<li><p>Neizmirene dugove obezbeđene kolateralom</p>
</li>
<li><p>Lokaciju poreske i transakcione evidencije</p>
</li>
</ul>
<p><strong>Arhitekturu oporavka</strong></p>
<ul>
<li><p>Standard rezervne kopije</p>
</li>
<li><p>Broj delova</p>
</li>
<li><p>Prag za oporavak</p>
</li>
<li><p>Lokacije delova</p>
</li>
<li><p>Uslove predaje</p>
</li>
<li><p>Kompatibilni hardver</p>
</li>
<li><p>Podatak o tome da li dodatna fraza postoji</p>
</li>
<li><p>Lokaciju multisig deskriptora ili konfiguracije pametnog naloga</p>
</li>
</ul>
<p><strong>Pravila za odredište</strong></p>
<ul>
<li><p>Da li imovinu treba preneti u naturi, likvidirati ili premestiti kod profesionalnog pružaoca usluge čuvanja</p>
</li>
<li><p>Ko može da odobri odredišnu adresu</p>
</li>
<li><p>Da li treba otvoriti račun zaostavštine ili trasta</p>
</li>
<li><p>Da li naslednik mora da napravi novi hardverski novčanik</p>
</li>
<li><p>Kako se postupa u slučaju maloletnika, trastova ili korisnika sa posebnim potrebama</p>
</li>
<li><p>Koliku slobodu odlučivanja povereno lice ima tokom tržišne volatilnosti</p>
</li>
</ul>
<p><strong>Postupak transakcije</strong></p>
<ul>
<li><p>Način provere odredišne adrese</p>
</li>
<li><p>Mrežu koja treba da se koristi</p>
</li>
<li><p>Da li je potreban memo ili odredišna oznaka</p>
</li>
<li><p>Izvorni token koji se koristi za plaćanje mrežnih naknada</p>
</li>
<li><p>Najveći dozvoljeni iznos probnog prenosa</p>
</li>
<li><p>Koliko treba čekati pre slanja preostalog iznosa</p>
</li>
<li><p>Koju evidenciju treba sačuvati</p>
</li>
</ul>
<p><strong>Bezbednosni postupak</strong></p>
<ul>
<li><p>Telefoni i kamere ostaju van prostorije za oporavak</p>
</li>
<li><p>Nema softvera za daljinski pristup</p>
</li>
<li><p>Nema deljenja ekrana</p>
</li>
<li><p>Ne koriste se sponzorisani rezultati pretrage</p>
</li>
<li><p>Seed fraza se ne unosi u softverske novčanike, osim ako plan to izričito zahteva</p>
</li>
<li><p>Oporavku i prenosu prisustvuju najmanje dve osobe</p>
</li>
<li><p>Odredišne adrese proveravaju se nezavisno</p>
</li>
<li><p>Vodi se pisana evidencija transakcija</p>
</li>
</ul>
<p>Operativno uputstvo treba da koristi jednostavan jezik. Nemojte napisati: „Obnovite HD novčanik i prenesite sve UTXO izlaze.” Navedite tačne radnje koje će izvršilac testamenta videti na ekranu, ko mora da bude prisutan i u kom trenutku postupak mora da se zaustavi radi stručne provere.</p>
<h3>Imenujte tehničkog operatera, ali ograničite njegova ovlašćenja</h3>
<p>Tehnički operater može da pomogne izvršiocu testamenta da:</p>
<ul>
<li><p>Identifikuje odgovarajući hardver</p>
</li>
<li><p>Instalira zvanični softver novčanika</p>
</li>
<li><p>Potvrdi standard rezervne kopije</p>
</li>
<li><p>Rekonstruiše novčanik na bezbednom uređaju</p>
</li>
<li><p>Pronađe naloge i mreže</p>
</li>
<li><p>Pripremi podatke za nepotpisanu transakciju</p>
</li>
<li><p>Proveri zahteve za mrežne naknade</p>
</li>
<li><p>Evidentira identifikatore transakcija</p>
</li>
</ul>
<p>Operater ne treba da:</p>
<ul>
<li><p>Odnosi delove za oporavak kući</p>
</li>
<li><p>Fotografише delove</p>
</li>
<li><p>Samostalno radi sa oporavljenim novčanikom</p>
</li>
<li><p>Bira naslednike</p>
</li>
<li><p>Odlučuje da li će imovina biti likvidirana</p>
</li>
<li><p>Zameni odredišnu adresu svojom ličnom adresom</p>
</li>
<li><p>Zadrži inicijalizovan uređaj nakon završetka postupka</p>
</li>
<li><p>Zahteva plaćanje na neproverenu adresu</p>
</li>
</ul>
<p>Povereno lice ostaje donosilac pravnih odluka. Operater je tehnički pomoćnik čiji rad mora biti kontrolisan.</p>
<h3>Uvežbajte plan</h3>
<p>Plan nasleđivanja treba testirati na tri nivoa.</p>
<p><strong>Pregled dokumentacije</strong></p>
<p>Potvrdite da su imena, brojevi telefona, mesta čuvanja, aplikacije novčanika, adrese i podaci o uređajima i dalje aktuelni.</p>
<p><strong>Simulacija postupka</strong></p>
<p>Vlasnik, povereno lice i tehnički operater zajedno prolaze kroz proceduru bez sastavljanja potrebnog broja delova za oporavak.</p>
<p><strong>Tehnički test oporavka</strong></p>
<p>Pomoću kompatibilnog hardverskog uređaja proverite da li propisani broj delova oporavlja očekivanu prvu adresu za prijem i mali probni iznos.</p>
<p>Pregledajte plan nakon:</p>
<ul>
<li><p>Promene hardverskog novčanika</p>
</li>
<li><p>Preseljenja na novu adresu</p>
</li>
<li><p>Pravljenja nove seed fraze</p>
</li>
<li><p>Dodavanja passphrase-a</p>
</li>
<li><p>Promene praga za oporavak</p>
</li>
<li><p>Otvaranja ili zatvaranja naloga na berzi</p>
</li>
<li><p>Ulaska u novu staking ili DeFi poziciju</p>
</li>
<li><p>Promene izvršioca testamenta, poverenika, advokata ili naslednika</p>
</li>
<li><p>Premeštanja dela na novu lokaciju</p>
</li>
<li><p>Značajne promene softvera novčanika</p>
</li>
</ul>
<p>Svaki paket treba da sadrži broj verzije i datum poslednjeg pregleda. Zastarele kopije treba povući ili jasno označiti kao opozvane, kako naslednici ne bi pratili protivrečna uputstva.</p>
<h2>Korak 4: Sprovedite kontrolisan prenos ili likvidaciju</h2>
<p>Nakon smrti cilj nije da se novčanik preminulog vlasnika koristi neograničeno dugo. Kada se materijal za oporavak sastavi i više osoba učestvuje u procesu, originalni novčanik treba smatrati potencijalno izloženim.</p>
<p>Zaostavština treba da prenese imovinu na nove ključeve, kroz kontrolisan i dokumentovan postupak.</p>
<h3>1. Potvrdite pravno ovlašćenje</h3>
<p>Pre premeštanja imovine utvrdite ko ima zakonsko ovlašćenje da postupa.</p>
<p>U zavisnosti od strukture, to može biti:</p>
<ul>
<li><p>Izvršilac testamenta ili zastupnik zaostavštine koga je imenovao sud</p>
</li>
<li><p>Nasledni poverenik trasta</p>
</li>
<li><p>Drugo ovlašćeno povereno lice</p>
</li>
<li><p>Osoba koja postupa prema pravilima konkretne jurisdikcije za zaostavštine male vrednosti</p>
</li>
</ul>
<p>Posedovanje seed fraze samo po sebi ne ovlašćuje osobu da raspodeljuje imovinu iz zaostavštine. Izvršilac testamenta ili poverenik može imati obaveze prema poveriocima, poreskim organima, naslednicima i sudu.</p>
<h3>2. Obezbedite fizički materijal</h3>
<p>Prikupite i zaštitite:</p>
<ul>
<li><p>Hardverske novčanike</p>
</li>
<li><p>Koverte sa delovima za oporavak</p>
</li>
<li><p>Računare i telefone</p>
</li>
<li><p>Odštampanu evidenciju o novčanicima</p>
</li>
<li><p>Izvode sa berzi</p>
</li>
<li><p>Uputstva za menadžer lozinki</p>
</li>
<li><p>Poresku dokumentaciju</p>
</li>
<li><p>Multisig deskriptore</p>
</li>
<li><p>Evidenciju o pametnim nalozima</p>
</li>
</ul>
<p>Ne uključujte, ne ažurirajte i ne resetujte originalni hardver dok ne utvrdite stanje rezervne kopije.</p>
<h3>3. Popišite i evidentirajte stanje zaostavštine</h3>
<p>Pre prenosa evidentirajte:</p>
<ul>
<li><p>Datum i vreme</p>
</li>
<li><p>Adrese novčanika</p>
</li>
<li><p>Vrste i količine imovine</p>
</li>
<li><p>Mreže</p>
</li>
<li><p>Relevantne pozicije u protokolima</p>
</li>
<li><p>Neizmirene dugove ili kolateral</p>
</li>
<li><p>Staking nagrade koje još nisu primljene</p>
</li>
<li><p>Istoriju transakcija</p>
</li>
<li><p>Dostupne podatke o nabavnoj vrednosti i sticanju</p>
</li>
<li><p>Izvor vrednovanja koji je izabrao poreski stručnjak</p>
</li>
</ul>
<p>Poreski obveznici moraju da čuvaju evidenciju dovoljnu za dokazivanje podataka navedenih u poreskim prijavama. Ona može da obuhvati potvrde o digitalnoj imovini, prodaje, zamene, raspolaganja, prenose, fer tržišnu vrednost i poresku osnovicu.</p>
<p>Nemojte pretpostaviti da će berza ili blokčejn pretraživač pružiti potpunu evidenciju o nabavnoj vrednosti. Sačuvajte originalne datoteke sa transakcijama preminulog vlasnika, podatke izvezene sa berzi, istoriju novčanika i prethodnu poresku dokumentaciju.</p>
<h3>4. Pripremite odredište pre oporavka novčanika</h3>
<p>Odredište treba uspostaviti i nezavisno proveriti pre sastavljanja delova tajne.</p>
<p>Moguća odredišta obuhvataju:</p>
<ul>
<li><p>Privremeni novčanik pod kontrolom zaostavštine ili trasta</p>
</li>
<li><p>Nalog kod regulisanog pružaoca usluge čuvanja, otvoren za zaostavštinu ili trast</p>
</li>
<li><p>Novi hardverski novčanik pod kontrolom naslednika</p>
</li>
<li><p>Ovlašćeni nalog na berzi koji se koristi za likvidaciju</p>
</li>
<li><p>Profesionalno vođenu multisig strukturu</p>
</li>
</ul>
<p>Odredišna adresa treba da bude potvrđena na ekranu odgovarajućeg hardverskog uređaja ili drugim pouzdanim metodom. Dve osobe treba da uporede kompletnu adresu, mrežu i svaki potreban memo ili odredišnu oznaku.</p>
<p>Nemojte se oslanjati na adresu kopiranu iz imejla. Zlonamerni softver koji menja sadržaj clipboarda i kompromitovani nalozi za razmenu poruka mogu da podmetnu adresu napadača.</p>
<h3>5. Sprovedite oporavak uz prisustvo dve osobe</h3>
<p>Koristite:</p>
<ul>
<li><p>Privatnu prostoriju bez kamera</p>
</li>
<li><p>Pouzdan, potpuno ažuriran računar bez nepotrebnog softvera</p>
</li>
<li><p>Zvanični softver novčanika preuzet iz proverenog izvora</p>
</li>
<li><p>Nov ili pouzdan hardverski uređaj</p>
</li>
<li><p>Najmanji potreban broj ovlašćenih učesnika</p>
</li>
<li><p>Pisanu evidenciju događaja</p>
</li>
</ul>
<p>Ažurirajte prazan zamenski uređaj pre unošenja materijala za oporavak. Ako koristite originalni uređaj, izbegavajte promene firmvera dok rezervna kopija ne bude proverena.</p>
<p>Reči za oporavak unesite direktno na hardverskom uređaju. Nakon oporavka:</p>
<ol>
<li><p>Postavite novi PIN uređaja.</p>
</li>
<li><p>Otvorite dokumentovanu aplikaciju novčanika.</p>
</li>
<li><p>Omogućite potrebne mreže.</p>
</li>
<li><p>Potvrdite očekivanu prvu adresu.</p>
</li>
<li><p>Uporedite stanje sa podacima na blokčejnu.</p>
</li>
<li><p>Razrešite sva odstupanja pre potpisivanja bilo čega.</p>
</li>
</ol>
<p>Ako se očekivana adresa ne pojavi, zaustavite postupak. Uzrok može biti:</p>
<ul>
<li><p>Pogrešna dodatna fraza</p>
</li>
<li><p>Pogrešna rezervna kopija</p>
</li>
<li><p>Drugi broj naloga</p>
</li>
<li><p>Druga derivaciona putanja</p>
</li>
<li><p>Nepodržana mreža</p>
</li>
<li><p>Nedostajuća multisig konfiguracija</p>
</li>
<li><p>Pogrešna aplikacija novčanika</p>
</li>
<li><p>Neotkriveni pametni nalog ili pozicija u protokolu</p>
</li>
</ul>
<p>Nemojte nasumično isprobavati različita podešavanja dok je kompletna tajna za oporavak izložena.</p>
<h3>6. Pošaljite probnu transakciju</h3>
<p>Za svaku relevantnu mrežu:</p>
<ol>
<li><p>Proverite odredišnu adresu na prijemnom hardverskom uređaju.</p>
</li>
<li><p>Potvrdite mrežu.</p>
</li>
<li><p>Potvrdite da li je potreban memo ili odredišna oznaka.</p>
</li>
<li><p>Ostavite dovoljno izvorne valute za mrežne naknade.</p>
</li>
<li><p>Pošaljite mali probni iznos.</p>
</li>
<li><p>Sačekajte odgovarajući broj potvrda.</p>
</li>
<li><p>Potvrdite prijem sa odredišne strane.</p>
</li>
<li><p>Evidentirajte identifikator transakcije.</p>
</li>
</ol>
<p>Uspešan test na jednoj mreži ne dokazuje da je druga mreža ili prenos drugog tokena pravilno podešen.</p>
<p>Tokom nasleđivanja izbegavajte nepotrebne mostove, zamene, interakcije sa ugovorima ili uvoz novčanika. Svaka dodatna radnja predstavlja novi mogući izvor greške i novi događaj koji može zahtevati poresku evidenciju.</p>
<h3>7. Prenesite, likvidirajte ili premestite imovinu kod profesionalnog čuvara</h3>
<p>Plan zaostavštine treba da izrazi želje vlasnika, ali i da poverenom licu ostavi dovoljno slobode da reaguje na:</p>
<ul>
<li><p>Volatilnost</p>
</li>
<li><p>Tržišnu likvidnost</p>
</li>
<li><p>Zagušenje mreže</p>
</li>
<li><p>Ograničenja berzi</p>
</li>
<li><p>Sposobnost naslednika da bezbedno čuva imovinu</p>
</li>
<li><p>Poreske zahteve</p>
</li>
<li><p>Rizike čuvanja</p>
</li>
<li><p>Sudske rokove</p>
</li>
<li><p>Zaključavanja u protokolima</p>
</li>
<li><p>Vanredne bezbednosne okolnosti</p>
</li>
</ul>
<table>
<thead>
<tr>
<th>Način raspolaganja</th>
<th>Glavna prednost</th>
<th>Glavni kompromis</th>
</tr>
</thead>
<tbody><tr>
<td>Prenos u naturi</td>
<td>Čuva samu imovinu i izbegava prinudno tempiranje tržišta</td>
<td>Naslednik mora bezbedno da upravlja čuvanjem</td>
</tr>
<tr>
<td>Likvidacija</td>
<td>Pojednostavljuje raspodelu i računovodstvo zaostavštine</td>
<td>Otvara pitanja tržišta, naknada, tajminga i poreza</td>
</tr>
<tr>
<td>Profesionalno čuvanje</td>
<td>Smanjuje obaveze naslednika u vezi sa upravljanjem ključevima</td>
<td>Dodaje naknade, rizik pružaoca usluge i zahteve za otvaranje naloga</td>
</tr>
<tr>
<td>Hibridni pristup</td>
<td>Uravnotežuje likvidnost i zadržavanje izloženosti imovini</td>
<td>Zahteva više odluka i dokumentacije</td>
</tr>
</tbody></table>
<p>Kod prenosa u naturi naslednik treba da primi imovinu na novoj, posebno generisanoj adresi. Oporavljeni novčanik preminulog vlasnika ne treba da postane trajni novčanik naslednika.</p>
<p>Kod likvidacije povereno lice treba, kada je moguće, da koristi pravilno otvoren i ovlašćen nalog na ime zaostavštine ili trasta, umesto da imovinu usmerava preko ličnog naloga naslednika na berzi.</p>
<p>Kod prenosa profesionalnom pružaocu usluge čuvanja, povereno lice treba da proveri:</p>
<ul>
<li><p>Ko je pravni vlasnik naloga</p>
</li>
<li><p>Pravila povlačenja sredstava</p>
</li>
<li><p>Mogućnosti imenovanja naslednika ili naslednog ovlašćenog lica</p>
</li>
<li><p>Tvrdnje i uslove u vezi sa osiguranjem</p>
</li>
<li><p>Podržane vrste imovine i mreže</p>
</li>
<li><p>Naknade</p>
</li>
<li><p>Geografska ograničenja</p>
</li>
<li><p>Mogućnosti čuvanja evidencije</p>
</li>
</ul>
<h3>8. Zaključite postupak oporavka</h3>
<p>Nakon svih odobrenih prenosa:</p>
<ul>
<li><p>Sačuvajte identifikatore transakcija.</p>
</li>
<li><p>Sačuvajte potvrde o trgovini sa berze.</p>
</li>
<li><p>Evidentirajte mrežne naknade i naknade za usluge.</p>
</li>
<li><p>Uskladite završno stanje.</p>
</li>
<li><p>Pratite stare adrese zbog eventualnih kasnijih uplata.</p>
</li>
<li><p>Zadržite pristup samo za praćenje kada je to korisno.</p>
</li>
<li><p>Obrišite privremene uređaje za oporavak koji neće ostati u upotrebi.</p>
</li>
<li><p>Vratite neupotrebljene delove tajne na kontrolisana mesta čuvanja.</p>
</li>
<li><p>Zadržite originalni materijal za oporavak dok povereno lice i advokat ne potvrde da nema dodatne imovine, povraćaja sredstava, nagrada ili potraživanja.</p>
</li>
<li><p>Dokumentujte eventualno uništenje zastarelog materijala za oporavak.</p>
</li>
</ul>
<p>Oporavljeni novčanik treba smatrati potencijalno kompromitovanim nakon postupka, čak i kada se svim učesnicima veruje. Više osoba je posmatralo proces, uređaji su povezivani, a delovi tajne su doneti na isto mesto.</p>
<p>Premeštanje na nove ključeve ponovo uspostavlja manji bezbednosni perimetar.</p>
<h2>Izbor odgovarajuće arhitekture</h2>
<p>Najbezbednija arhitektura nije uvek i najsloženija. Složenost je i sama izvor rizika od gubitka.</p>
<table>
<thead>
<tr>
<th>Vrsta portfelja</th>
<th>Razumna početna arhitektura</th>
<th>Glavno upozorenje</th>
</tr>
</thead>
<tbody><tr>
<td>Mala i jednostavna imovina</td>
<td>Hardverski novčanik, proverena rezervna kopija, ograničen inventar i jasna uputstva za izvršioca testamenta</td>
<td>Jedna rezervna kopija ostaje fizička tačka otkaza</td>
</tr>
<tr>
<td>Značajan portfelj na više mreža</td>
<td>Hardverski novčanik sa dokumentovanim delovima za oporavak 2 od 3, zasnovanim na standardu</td>
<td>Proverite podršku za svaki novčanik i mrežu</td>
</tr>
<tr>
<td>Veliki portfelj usmeren na Bitcoin</td>
<td>Profesionalno pregledan multisig 2 od 3 sa potpunim rezervnim kopijama deskriptora</td>
<td>Konfiguracioni podaci jednako su važni kao seed fraze</td>
</tr>
<tr>
<td>Složena zaostavština sa staking ili DeFi pozicijama</td>
<td>Formalna fiducijarna struktura, specijalizovano operativno uputstvo i profesionalna podrška</td>
<td>Sama seed fraza možda ne objašnjava kako da se pozicije zatvore</td>
</tr>
<tr>
<td>Vlasnik sa naslednicima bez tehničkog znanja</td>
<td>Planirani prenos u profesionalno čuvanje ili nadgledana likvidacija</td>
<td>Izbor pružaoca usluge i kašnjenja pri otvaranju naloga</td>
</tr>
<tr>
<td>Poslovni ili institucionalni trezor</td>
<td>Pravila upravljanja, više potpisnika, dokumentovano nasleđivanje i evidencija aktivnosti</td>
<td>Potrošačke metode čuvanja seed fraza možda nisu dovoljne</td>
</tr>
</tbody></table>
<p>Za novčanik vredan nekoliko stotina USD ili EUR skupo institucionalno rešenje može biti nesrazmerno. Jednostavna, testirana hardverska rezervna kopija i precizan paket uputstava mogu biti bezbedniji od složene šeme koju niko ne uvežbava.</p>
<p>Kako vrednost portfelja raste, troškovi stručnog pravnog pregleda, nezavisnog čuvanja ključeva, multisig sistema ili profesionalnog čuvanja postaju lakše opravdani.</p>
<p>Vrednost nije jedini faktor. Važna je i složenost. Skroman novčanik sa imovinom na nekoliko mreža, u pametnim ugovorima i staking sistemima može da zahteva detaljniji plan od većeg novčanika koji sadrži samo jednu jednostavnu vrstu imovine.</p>
<h2>Operativni troškovi i kompromisi</h2>
<p>Kvalitetan plan nasleđivanja ima i finansijske i administrativne troškove.</p>
<table>
<thead>
<tr>
<th>Komponenta</th>
<th>Obrazac troška</th>
<th>Šta obezbeđuje</th>
<th>Glavni kompromis</th>
</tr>
</thead>
<tbody><tr>
<td>Advokat za nasledno pravo</td>
<td>Početna izrada i periodični pregledi</td>
<td>Važeće ovlašćenje i dokumenta prilagođena jurisdikciji</td>
<td>Profesionalne naknade</td>
</tr>
<tr>
<td>Dodatni hardverski novčanik</td>
<td>Jednokratni trošak opreme</td>
<td>Testiranje oporavka i bezbedan prenos</td>
<td>Još jedan uređaj kojim treba upravljati</td>
</tr>
<tr>
<td>Izdržljiv materijal za rezervnu kopiju</td>
<td>Jednokratni fizički trošak</td>
<td>Otpornost na požar, vodu i propadanje</td>
<td>Ne sprečava krađu</td>
</tr>
<tr>
<td>Bezbedno čuvanje</td>
<td>Jednokratni ili periodični trošak</td>
<td>Fizičko razdvajanje i kontrolu pristupa</td>
<td>Kašnjenja pristupa i zavisnost od pružaoca usluge čuvanja</td>
</tr>
<tr>
<td>Profesionalno povereno lice</td>
<td>Troškovi uspostavljanja i periodične naknade</td>
<td>Neutralno upravljanje i kontinuitet</td>
<td>Institucionalni trošak i potreba za poverenjem</td>
</tr>
<tr>
<td>Multisig koordinator ili pružalac usluge čuvanja</td>
<td>Troškovi uspostavljanja, periodične ili transakcione naknade</td>
<td>Sprovođenje pravila i tehničku podršku</td>
<td>Zavisnost od pružaoca usluge i kompatibilnosti</td>
</tr>
<tr>
<td>Mrežne naknade</td>
<td>Trošak po transakciji</td>
<td>Premeštanje imovine na blokčejnu</td>
<td>Mogu biti nepredvidive</td>
</tr>
<tr>
<td>Troškovi berze</td>
<td>Naknade za trgovanje, raspon cene i naknade za povlačenje</td>
<td>Likvidaciju i raspodelu u fiat valuti</td>
<td>Izloženost tržištu i drugoj ugovornoj strani</td>
</tr>
<tr>
<td>Vreme za uvežbavanje</td>
<td>Periodični administrativni napor</td>
<td>Dokaz da plan funkcioniše</td>
<td>Zahteva disciplinu</td>
</tr>
<tr>
<td>Poreska priprema</td>
<td>Profesionalni trošak kada nastupi relevantan događaj</td>
<td>Podršku za osnovicu, vrednovanje i prijavljivanje</td>
<td>Može biti skupa kada je evidencija loša</td>
</tr>
</tbody></table>
<p>Skriveni trošak je održavanje. Plan postaje opasan kada opisuje novčanik, uređaj, advokata ili mesto čuvanja koji više ne postoje.</p>
<p>Dobar sistem svodi broj zavisnosti na najmanju moguću meru, uz dovoljno redundantnosti da preživi jedan uobičajeni kvar ili gubitak.</p>
<h2>Uobičajene greške pri nasleđivanju kripto-imovine</h2>
<h3>Stavljanje seed fraze u testament</h3>
<p>Time se ostavinski spis može pretvoriti u sredstvo za krađu. Testament treba da uspostavi ovlašćenje, a ne da sadrži podatke koji svakom posedniku daju kontrolu nad imovinom.</p>
<h3>Davanje kompletne seed fraze jednom nasledniku unapred</h3>
<p>To pojednostavljuje nasleđivanje tako što žrtvuje bezbednost tokom života vlasnika. Telefon, dom, odnosi i finansijski pritisci naslednika postaju deo modela pretnji vlasnika.</p>
<h3>Deljenje BIP39 fraze na grupe reči</h3>
<p>To nije podela tajne zasnovana na standardu. Stvara nejasnoće, slabi redundantnost i može da proizvede plan koji nije moguće oporaviti.</p>
<h3>Čuvanje svih delova u istoj zgradi</h3>
<p>Tri koverte u jednom domu predstavljaju tri kopije izložene istom požaru, poplavi, provali ili slučajnom bacanju.</p>
<h3>Zahtevanje svih delova</h3>
<p>Plan 3 od 3 nema toleranciju na gubitak. Jedna izgubljena koverta trajno zaključava novčanik.</p>
<h3>Čuvanje uređaja i rezervne kopije zajedno</h3>
<p>Ukradeni sef, torba ili kutija sa dokumentima mogu napadaču da obezbede i hardver i mehanizam za njegov oporavak.</p>
<h3>Tretiranje hardverskog PIN-a kao plana nasleđivanja</h3>
<p>PIN može da obezbedi jednostavan pristup trenutnom uređaju, ali ne može da oporavi pokvaren, obrisan ili zastareo uređaj.</p>
<h3>Zaboravljanje dodatne fraze</h3>
<p>Ispravna seed fraza sa nedostajućim passphrase-om može da oporavi drugi novčanik. Svaki znak mora da bude sačuvan i testiran.</p>
<h3>Čuvanje multisig seed fraza bez konfiguracije</h3>
<p>Za multisig oporavak mogu biti potrebni deskriptor, javni ključevi supotpisnika, prag, tip skripte, otisci ključeva i podaci o derivaciji.</p>
<h3>Čuvanje glavne seed fraze u imejlu ili običnom skladištu u oblaku</h3>
<p>Šifrovanje može da smanji rizik, ali dodaje zavisnosti od oporavka naloga, pružaoca usluge, zlonamernog softvera, pristupnih podataka i ključa za dešifrovanje.</p>
<p>Naslednik bez tehničkog znanja ne bi trebalo prvo da savlada digitalni bezbednosni sistem kako bi zatim mogao da koristi hardverski bezbednosni sistem.</p>
<h3>Korišćenje automatizovanog prekidača za objavljivanje ključa</h3>
<p>Neaktivnost nije smrt. Lažna aktiviranja i izostanak aktiviranja neizbežni su kada sistem nema pouzdan postupak za potvrdu smrti.</p>
<h3>Neidentifikovanje mreže</h3>
<p>Sam naziv tokena ne govori izvršiocu testamenta gde se imovina nalazi niti koja je valuta potrebna za plaćanje naknada.</p>
<h3>Zanemarivanje stakinga, pozajmljivanja i kolaterala</h3>
<p>Stanje novčanika možda ne prikazuje imovinu uloženu u protokol, zaključanu u ugovoru, delegiranu ili upotrebljenu kao obezbeđenje duga.</p>
<h3>Premeštanje svega bez probne transakcije</h3>
<p>Blokčejn prenosi uglavnom su nepovratni. Mali test može da otkrije pogrešnu mrežu, adresu, memo, novčanik ili konfiguraciju čuvanja pre nego što cela zaostavština bude ugrožena.</p>
<h3>Dozvoljavanje internet „stručnjaku za oporavak” da radi sam</h3>
<p>Tehničar koji vidi kompletnu seed frazu može kasnije ponovo da napravi novčanik. Oporavak treba sprovoditi uz kontrolu dve osobe i neposredan unos na hardverskom uređaju.</p>
<h3>Neažuriranje plana</h3>
<p>Savršen plan za novčanik koji je ispražnjen pre tri godine beskoristan je. Svaka migracija novčanika mora da pokrene pregled plana nasleđivanja.</p>
<h2>Kontrolna lista za vlasnika</h2>
<p>Koristite ovu listu da protokol pretvorite u operativan plan:</p>
<ul>
<li><p>[ ] Odredite izvršioca testamenta, naslednog poverenika trasta, rezervno povereno lice i naslednike.</p>
</li>
<li><p>[ ] Odredite tehničkog operatera koji može da pomogne bez preuzimanja pravnih odluka.</p>
</li>
<li><p>[ ] Zatražite od lokalnog advokata da uredi ovlašćenja za pristup digitalnoj imovini, upravljanje, angažovanje stručnjaka, prenos i likvidaciju.</p>
</li>
<li><p>[ ] Uklonite svaki privatni ključ, seed frazu, dodatnu frazu i PIN iz testamenta.</p>
</li>
<li><p>[ ] Napravite potpun inventar imovine prema mreži, adresi, novčaniku, vrsti čuvanja i poziciji u protokolu.</p>
</li>
<li><p>[ ] Evidentirajte softver novčanika, porodicu hardverskog uređaja, standard rezervne kopije i konfiguraciju naloga.</p>
</li>
<li><p>[ ] Odlučite da li trenutni novčanik treba da ostane sa jednim potpisnikom, koristi podelu tajne ili pređe na multisig.</p>
</li>
<li><p>[ ] Ako koristite delove za oporavak, izaberite prag tolerantan na gubitak, kao što je 2 od 3 ili 3 od 5.</p>
</li>
<li><p>[ ] Generišite delove pomoću dokumentovanog hardverskog postupka ili standardizovanog sistema.</p>
</li>
<li><p>[ ] Čuvajte delove na nezavisnim fizičkim lokacijama.</p>
</li>
<li><p>[ ] Dokumentujte kako izvršilac testamenta može legalno da pribavi potreban broj delova.</p>
</li>
<li><p>[ ] Držite aktivni uređaj odvojeno od materijala za oporavak.</p>
</li>
<li><p>[ ] Testirajte oporavak na kompatibilnom hardverskom uređaju.</p>
</li>
<li><p>[ ] Proverite očekivanu prvu adresu za prijem.</p>
</li>
<li><p>[ ] Pošaljite i prenesite mali probni iznos pre premeštanja glavnog portfelja.</p>
</li>
<li><p>[ ] Napišite kontrolnu listu za vanredne situacije na prvoj strani, namenjenu naslednicima bez tehničkog znanja.</p>
</li>
<li><p>[ ] Dokumentujte odredište, probni prenos i postupke provere uz prisustvo dve osobe.</p>
</li>
<li><p>[ ] Sačuvajte podatke o sticanju, transakcijama, vrednovanju i porezima.</p>
</li>
<li><p>[ ] Sprovedite simulaciju postupka.</p>
</li>
<li><p>[ ] Navedite datum i broj verzije na svakoj kopiji plana.</p>
</li>
<li><p>[ ] Pregledajte plan nakon svake značajne promene novčanika, pravnog statusa, porodice ili načina čuvanja.</p>
</li>
<li><p>[ ] Zakažite redovan pregled čak i kada deluje da se ništa nije promenilo.</p>
</li>
</ul>
<h2>Osnovno načelo</h2>
<p>Nasleđivanje kripto-imovine ne treba da zavisi od objavljivanja privatnog ključa nakon smrti. Treba da zavisi od kontrolisanog postupka koji ovlašćene osobe mogu da sprovedu bez nagađanja.</p>
<p>Testament ili trast odgovara na pitanje <strong>ko</strong> ima ovlašćenje.</p>
<p>Mapa imovine odgovara na pitanje <strong>šta</strong> postoji.</p>
<p>Oporavak zasnovan na pragu odgovara na pitanje <strong>kako</strong> pristup može da se rekonstruiše bez jedne ranjive glavne kopije.</p>
<p>Operativno uputstvo za naslednike odgovara na pitanje <strong>kojim redosledom</strong> treba obaviti posao.</p>
<p>Postupak prenosa odgovara na pitanje <strong>gde</strong> imovina odlazi i kako zaostavština dokumentuje rezultat.</p>
<p>To razdvajanje je ono što tradicionalno planiranje nasleđivanja najčešće propušta. Pravni dokument bez oporavka ključeva stvara vlasništvo bez pristupa. Seed fraza bez pravnih uputstava stvara pristup bez ovlašćenja.</p>
<p>Bezbedan plan nasleđivanja povezuje obe strane, dok tajne drži van ostavinskih spisa, tajmera u oblaku i improvizovanih porodičnih postupaka.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati USDT i USDC. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://www.nycourts.gov/help/when-someone-dies/probate-when-person-dies-will">Njujorški sudovi: ostavinski postupak kada osoba umre sa testamentom</a></p>
</li>
<li><p><a href="https://www.mass.gov/info-details/probate-and-family-court-access-to-public-court-records-frequently-asked-questions">Pravosudni sistem Masačusetsa: pristup javnim spisima Suda za ostavinske i porodične predmete</a></p>
</li>
<li><p><a href="https://courts.ca.gov/es/node/32073">Pravosudni sistem Kalifornije: javni spisi</a></p>
</li>
<li><p><a href="https://www.uniformlaws.org/acts/catalog/current/f">Komisija za jednoobrazne zakone: Revidirani jedinstveni zakon o fiducijarnom pristupu digitalnoj imovini</a></p>
</li>
<li><p><a href="https://csrc.nist.gov/glossary/term/split_knowledge">NIST: podeljeno znanje</a></p>
</li>
<li><p><a href="https://csrc.nist.gov/pubs/sp/800/57/pt1/r5/final">NIST SP 800-57, deo 1, revizija 5: preporuka za upravljanje ključevima</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">Bitcoin predlog za unapređenje 39: mnemonički kod za generisanje determinističkih ključeva</a></p>
</li>
<li><p><a href="https://github.com/satoshilabs/slips/blob/master/slip-0039.md">SatoshiLabs predlog za unapređenje 39: Šamirova podela tajne za mnemoničke kodove</a></p>
</li>
<li><p><a href="https://trezor.io/learn/advanced/standards-proposals/what-is-shamir-backup">Trezor: šta je Shamir Backup?</a></p>
</li>
<li><p><a href="https://trezor.io/guides/backups-recovery/general-standards/how-to-use-a-wallet-backup">Trezor: kako koristiti rezervnu kopiju novčanika</a></p>
</li>
<li><p><a href="https://trezor.io/support/troubleshooting/trezor-suite-issues/troubleshoot-wallet-backup-and-recovery-problems">Trezor: rešavanje problema sa rezervnom kopijom i oporavkom novčanika</a></p>
</li>
<li><p><a href="https://trezor.io/guides/trezor-suite/using-a-passphrase-wallet-in-trezor-suite">Trezor: korišćenje novčanika sa dodatnom frazom</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0380.mediawiki">Bitcoin predlog za unapređenje 380: opšte funkcionisanje deskriptora izlaznih skripti</a></p>
</li>
<li><p><a href="https://support.google.com/accounts/answer/3036546">Pomoć za Google naloge: o Menadžeru neaktivnih naloga</a></p>
</li>
<li><p><a href="https://ethereum.org/roadmap/account-abstraction">Ethereum: apstrakcija naloga</a></p>
</li>
<li><p><a href="https://ethereum.org/developers/docs/smart-contracts/security">Ethereum: bezbednost pametnih ugovora</a></p>
</li>
<li><p><a href="https://ethereum.org/security">Ethereum: bezbednost i sprečavanje prevara</a></p>
</li>
<li><p><a href="https://www.irs.gov/filing/digital-assets">Američka poreska uprava: digitalna imovina</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/crypto-inheritance-what-happens-to-wallets-at-death-44m8">Crypto Inheritance: What Happens to Wallets at Death?</a></p>
]]></content:encoded></item><item><title><![CDATA[Zašto zamene unutar novčanika mogu neprimetno da koštaju korisnike od 3% do 7%]]></title><description><![CDATA[Najskuplji broj na ekranu za zamenu često je upravo onaj koji nikada nije označen.
To je razlika između tržišne vrednosti koju korisnik daje i tržišne vrednosti koju dobije nakon trgovine.
Novčanik mo]]></description><link>https://kripto-pocetnica.hashnode.dev/za-to-zamene-unutar-nov-anika-mogu-neprimetno-da-ko-taju-korisnike-od-3-do-7</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/za-to-zamene-unutar-nov-anika-mogu-neprimetno-da-ko-taju-korisnike-od-3-do-7</guid><category><![CDATA[Bitcoin]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Metamask]]></category><category><![CDATA[Exchange]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[Ethereum]]></category><category><![CDATA[litecoin]]></category><category><![CDATA[Web3]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Sat, 26 Sep 2026 00:24:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/7b664eb2-f4c4-43b5-83b4-c423f4262c72.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Najskuplji broj na ekranu za zamenu često je upravo onaj koji nikada nije označen.</p>
<p>To je razlika između tržišne vrednosti koju korisnik daje i tržišne vrednosti koju dobije nakon trgovine.</p>
<p>Novčanik može sasvim tačno da navede da njegova naknada za zamenu iznosi 0,875%, dok korisnik trgovinu vrednu 1.000 USD završi sa 35 do 70 USD manje ekonomske vrednosti. Ta razlika ne mora da bude tajna naknada. Obično nastaje zato što se nekoliko troškova prikazuje odvojeno, ugrađuje u kurs ili izostavlja iz istaknutog procenta.</p>
<p>Ta razlika je važna.</p>
<p>Korisnici ne gube nužno od 3% do 7% pri svakoj zameni unutar novčanika. Trgovina na likvidnom tržištu i jeftinoj mreži može da košta znatno manje. Međutim, trošak od 3% do 7% postaje potpuno moguć kada se u istoj transakciji pojave naknada novčanika, uticaj na cenu, mrežni trošak, naknada za most i nepovoljno izvršenje.</p>
<p>Naknada je ono što proizvod naplaćuje.</p>
<p>Trošak je ono što korisnik izgubi.</p>
<h2>Naknada nije isto što i trošak</h2>
<p>Zamena unutar novčanika je trgovina tokenima pokrenuta iz kripto-novčanika. Novčanik obično traži ponude od decentralizovanih berzi, agregatora, market mejkera ili pružalaca usluga mosta, bira rutu, dodaje eventualnu naknadu novčanika ili integratora i priprema transakciju koju korisnik treba da potpiše.</p>
<p>Novčanik predstavlja interfejs i sloj za rutiranje. On nije nužno izvor likvidnosti.</p>
<p>Zbog toga poređenje samo objavljene naknade novčanika daje nepotpun odgovor.</p>
<p>Korisnija računica glasi:</p>
<p><code>ukupan gubitak = referentna vrednost ulaza - referentna vrednost izlaza + eksterni troškovi</code></p>
<p>Eksterni troškovi su izdaci koji se plaćaju izvan ponuđenih iznosa tokena, kao što su gas, transakcija odobrenja ili naknada za povlačenje sredstava sa centralizovane berze.</p>
<p>Pretpostavimo da korisnik prodaje imovinu vrednu 1.000 USD, prima tokene vredne 972 USD po istoj referentnoj tržišnoj ceni i zasebno plaća 9 USD za gas.</p>
<p>Ukupan gubitak iznosi:</p>
<p><code>1.000 USD - 972 USD + 9 USD = 37 USD</code></p>
<p>Trošak transakcije iznosio je 3,7%, čak i ako je naknada samog novčanika bila manja od 1%.</p>
<p>Ovde postoji jedna računovodstvena zamka. Ako je naknada već odbijena od ponuđenog izlaznog iznosa, nemojte je dodavati drugi put. Razlika između ulazne i izlazne vrednosti već je sadrži.</p>
<p>Pregled naknada objašnjava gde je vrednost otišla. Poređenje ulazne i izlazne vrednosti govori koliko je ukupno izgubljeno.</p>
<h2>Šta zapravo navode aktuelne stranice sa naknadama</h2>
<p>Istaknuti brojevi koje objavljuju veliki novčanici i interfejsi za trgovanje nisu direktno uporedivi.</p>
<table>
<thead>
<tr>
<th>Ruta</th>
<th>Objavljeni glavni trošak</th>
<th>Troškovi izvan glavnog broja</th>
</tr>
</thead>
<tbody><tr>
<td>MetaMask Swaps</td>
<td>MetaMask naknada od 0,875%</td>
<td>Ponuđeni kurs, uticaj na cenu, mrežna naknada, troškovi rute</td>
</tr>
<tr>
<td>Phantom zamene</td>
<td>0,85% za većinu zamena</td>
<td>Mrežna naknada, uticaj na cenu, troškovi mosta</td>
</tr>
<tr>
<td>Interfejs Uniswap Labsa</td>
<td>0% naknade za interfejs</td>
<td>Naknade pružalaca likvidnosti, uticaj na cenu, mrežni troškovi</td>
</tr>
<tr>
<td>Kraken Pro, prvi nivo</td>
<td>0,40% za maker ili 0,80% za taker naloge</td>
<td>Raspon između kupovne i prodajne cene, uticaj naloga na tržište, uplate i povlačenja</td>
</tr>
<tr>
<td>Kraken Instant Buy</td>
<td>Prikazana naknada plus primenljivi raspon cena</td>
<td>Mogu da se primene i troškovi plaćanja i prenosa</td>
</tr>
</tbody></table>
<p>Zbog toga se rasprave o troškovima zamene često vrte ukrug.</p>
<p>Jedna osoba govori o prihodu novčanika. Druga govori o gasu. Treća meri koliko je tokena stiglo. Sve tri mogu da navedu različite procente i da pritom budu u pravu.</p>
<p>MetaMask svoju strukturu troškova opisuje kroz ponuđeni kurs, mrežnu naknadu i MetaMask naknadu od 0,875%.</p>
<p>Phantom navodi da zamena može da uključuje njegovu naknadu od 0,85%, mrežnu naknadu i uticaj na cenu. Kod međulančanih zamena naknada pružaoca usluge mosta može da bude uračunata u uticaj na cenu, umesto da se prikazuje kao posebna stavka.</p>
<p>Uniswap Labs trenutno ne naplaćuje naknadu za interfejs, ali trgovina i dalje može da uključuje naknade pružalaca likvidnosti, uticaj na cenu i mrežni trošak.</p>
<p>Kraken Pro koristi maker-taker raspored naknada. Na početnom nivou objavljena stopa iznosi 0,40% za maker naloge i 0,80% za taker naloge. To ne uključuje trošak prelaska preko raspona između kupovne i prodajne cene u knjizi naloga, niti prebacivanje imovine na berzu i sa nje.</p>
<p>Nijedan od ovih opisa sam po sebi nije obmanjujući. Oni jednostavno opisuju različite slojeve transakcije.</p>
<h2>Gde odlazi novac koji nedostaje</h2>
<p>Razlika između naknade novčanika manje od 1% i ukupnog gubitka od 3% do 7% obično nastaje kombinovanjem sledećih troškova.</p>
<table>
<thead>
<tr>
<th>Sloj troška</th>
<th>Šta predstavlja</th>
<th>Gde ga korisnik vidi</th>
</tr>
</thead>
<tbody><tr>
<td>Naknada novčanika ili integratora</td>
<td>Prihod koji prikuplja novčanik ili aplikacija</td>
<td>Obično se prikazuje kao procenat</td>
</tr>
<tr>
<td>Naknada pružaoca likvidnosti</td>
<td>Plaćanje pulu ili drugom izvoru likvidnosti</td>
<td>Obično je ugrađena u ponuđeni izlazni iznos</td>
</tr>
<tr>
<td>Odstupanje ponuđenog kursa</td>
<td>Razlika između neutralne tržišne cene i ponuđenog kursa</td>
<td>Često se ne prikazuje kao posebna stavka</td>
</tr>
<tr>
<td>Uticaj na cenu</td>
<td>Pomeranje cene izazvano korisnikovim nalogom</td>
<td>Ponekad se prikazuje kao procenat</td>
</tr>
<tr>
<td>Ostvareno odstupanje</td>
<td>Razlika između ponude i konačnog izvršenja</td>
<td>Poznato je nakon poravnanja</td>
</tr>
<tr>
<td>Mrežni trošak</td>
<td>Plaćanje validatorima ili sekvencerima</td>
<td>Obično se prikazuje u nativnom tokenu</td>
</tr>
<tr>
<td>Trošak odobrenja</td>
<td>Zasebna transakcija kojom se dozvoljava trošenje tokena</td>
<td>Može da se pojavi pre zamene</td>
</tr>
<tr>
<td>Trošak mosta</td>
<td>Naknada za međulančani prenos i izvršenje na odredišnom lancu</td>
<td>Ponekad se grupiše sa uticajem na cenu</td>
</tr>
<tr>
<td>Naknada ili porez tokena</td>
<td>Naknada za prenos koju primenjuje ugovor tokena</td>
<td>Može da bude uključena u ponudu</td>
</tr>
<tr>
<td>Trošak prenosa preko CEX-a</td>
<td>Mrežni trošak uplate i naknada berze za povlačenje</td>
<td>Nalazi se izvan naknade za trgovanje</td>
</tr>
</tbody></table>
<h3>Naknada novčanika</h3>
<p>Ovo je trošak koji je najlakše prepoznati.</p>
<p>Kod zamene vredne 1.000 USD:</p>
<ul>
<li><p>MetaMask naknada od 0,875% iznosi 8,75 USD.</p>
</li>
<li><p>Phantom naknada od 0,85% iznosi 8,50 USD.</p>
</li>
</ul>
<p>Ti iznosi sami po sebi nisu katastrofalni. Problem je u tome što se dodaju troškovima koji bi postojali i bez naknade novčanika.</p>
<p>Ruta novčanika koja naplaćuje 0,875% mora da donese najmanje 8,75 USD kroz bolje rutiranje ili niže troškove izvršenja da bi kod trgovine od 1.000 USD bila bolja od alternative bez naknade.</p>
<h3>Naknada pula ili mesta trgovanja</h3>
<p>Automatizovani market mejker naplaćuje naknadu pružaoca likvidnosti svaki put kada trgovina prolazi kroz pul. Ako ruta prolazi kroz više pulova, može da obuhvati više od jedne takve naknade.</p>
<p>To ne znači automatski da je ruta sa više koraka lošija.</p>
<p>Ruta od tokena A do tokena C preko tokena B i dalje može da bude jeftinija ako posredni pulovi imaju dublju likvidnost. Važno pitanje nije koliko koraka ruta koristi, već koliki izlazni iznos ostaje nakon naknada pulova, uticaja na cenu i gasa.</p>
<p>Centralizovana berza ima drugačiju strukturu, ali je ekonomski efekat sličan. Umesto plaćanja AMM pulu, taker prelazi preko raspona u knjizi naloga i plaća naknadu za trgovanje.</p>
<h3>Odstupanje ponuđenog kursa</h3>
<p>Ljudi ovo često nazivaju rasponom rutiranja ili skrivenim rasponom cena, ali to nije standardizovana protokolska naknada.</p>
<p>Bolje ga je razumeti kao neobjašnjenu razliku između nezavisne referentne cene i kursa koji nudi interfejs.</p>
<p>Ta razlika može da obuhvati:</p>
<ul>
<li><p>Naknade pružalaca likvidnosti</p>
</li>
<li><p>Raspon između kupovne i prodajne cene</p>
</li>
<li><p>Uticaj na cenu</p>
</li>
<li><p>Maržu market mejkera</p>
</li>
<li><p>Troškove pružaoca usluge mosta</p>
</li>
<li><p>Neefikasnost rute</p>
</li>
<li><p>Kratkotrajne razlike u cenama između mesta trgovanja</p>
</li>
<li><p>Troškove gasa ugrađene u ponudu bez potrebe za nativnim gas tokenom</p>
</li>
</ul>
<p>Korisniku nije potrebna savršena oznaka za svaku komponentu. Međutim, interfejs bi trebalo da prikaže ukupnu ekonomsku razliku koja iz njih proizlazi.</p>
<h3>Uticaj na cenu</h3>
<p>Uticaj na cenu predstavlja pomeranje cene koje izaziva sama trgovina.</p>
<p>Zamena vredna 1.000 USD na dubokom ETH-USDC tržištu može jedva da pomeri cenu. Isti nalog od 1.000 USD može da pomeri cenu tokena sa plitkim pulom za nekoliko procentnih poena.</p>
<p>Zbog toga sama veličina transakcije govori veoma malo. Trgovina mora da se uporedi sa količinom i koncentracijom aktivne likvidnosti koja je dostupna po aktuelnoj ceni.</p>
<p>Uticaj na cenu takođe nije isto što i naknada platforme. Novac ne mora da pripadne novčaniku. To je posledica korišćenja likvidnosti duž krive formiranja cene.</p>
<p>Korisnik ipak gubi vrednost, bez obzira na to ko je prima.</p>
<h3>Odstupanje pri izvršenju</h3>
<p>Tolerancija odstupanja, odnosno slippage tolerance, nije naknada.</p>
<p>Ako korisnik postavi maksimalno odstupanje na 1%, transakcija neće automatski koštati 1%. To podešavanje definiše najlošije izvršenje koje je korisnik spreman da prihvati pre nego što transakcija ne uspe i bude poništena.</p>
<p>Stvarni ekonomski gubitak predstavlja ostvareno odstupanje, odnosno razliku između očekivanog izlaznog iznosa i iznosa koji je na kraju primljen.</p>
<p>Ova razlika je važna jer mnogi interfejsi prikazuju toleranciju uočljivije od verovatnog troška izvršenja. Korisnik može da protumači taj broj kao naknadu, iako je zapravo reč o zaštitnoj granici.</p>
<p>Visoka tolerancija ipak stvara rizik. Ona proširuje raspon ishoda koje je korisnik pristao da prihvati, uključujući izvršenje po znatno lošijoj ceni.</p>
<h3>Mrežni troškovi i troškovi odobrenja</h3>
<p>Mrežni troškovi uglavnom ne zavise od veličine trgovine.</p>
<p>Ako zamena zahteva 15 USD za gas, njen procentualni uticaj drastično se menja u zavisnosti od veličine trgovine:</p>
<table>
<thead>
<tr>
<th>Veličina trgovine</th>
<th>Mrežni trošak od 15 USD</th>
</tr>
</thead>
<tbody><tr>
<td>100 USD</td>
<td>15,00%</td>
</tr>
<tr>
<td>250 USD</td>
<td>6,00%</td>
</tr>
<tr>
<td>1.000 USD</td>
<td>1,50%</td>
</tr>
<tr>
<td>5.000 USD</td>
<td>0,30%</td>
</tr>
<tr>
<td>10.000 USD</td>
<td>0,15%</td>
</tr>
</tbody></table>
<p>Zbog toga mala zamena na glavnoj mreži Ethereuma može da izgleda apsurdno skupo čak i kada je kurs razuman.</p>
<p>ERC-20 token može da zahteva i odobrenje pre nego što ugovor za zamenu dobije dozvolu da ga potroši. Ako je to odobrenje zasebna transakcija, ono stvara dodatni mrežni trošak.</p>
<p>Odobrenje treba uračunati samo kada je zaista potrebno. Ako je korisnik već dao dovoljno odobrenje za trošenje, dodavanje hipotetičkog troška novog odobrenja preuveličalo bi trošak trenutne transakcije.</p>
<h3>Međulančano izvršenje</h3>
<p>Međulančana zamena može da sadrži više ekonomskih operacija:</p>
<ol>
<li><p>Zamenu na izvornom lancu</p>
</li>
<li><p>Mrežnu transakciju na izvornom lancu</p>
</li>
<li><p>Naknadu pružaoca usluge mosta</p>
</li>
<li><p>Izvršenje na odredišnom lancu</p>
</li>
<li><p>Još jednu zamenu na odredišnom lancu</p>
</li>
<li><p>Opcionu isporuku tokena za gas na odredišnom lancu</p>
</li>
</ol>
<p>Interfejs sve to može da prikaže kao jednu ponudu.</p>
<p>Time se korisničko iskustvo pojednostavljuje, ali se cena teže proverava. U zavisnosti od pružaoca usluge i novčanika, naknada mosta može da se grupiše sa uticajem na cenu, mrežnim troškom ili konačnim kursom.</p>
<h3>Izvršenje bez nativnog gas tokena</h3>
<p>„Bez gasa” ne znači uvek „bez troška”.</p>
<p>Ponekad novčanik ili druga strana zaista subvencioniše mrežnu naknadu. U drugim slučajevima korisnik plaća podržanim ERC-20 tokenom umesto nativnom imovinom mreže. U sistemima zasnovanim na nameri treća strana koja izvršava nalog može da plati gas na lancu i očekivani trošak uključi u ponuđeni kurs.</p>
<p>Sva tri modela uklanjaju potrebu da korisnik poseduje nativni token za gas. Samo prvi nužno uklanja ekonomski trošak za korisnika.</p>
<p>Za programere je oznaka „nativni token nije potreban” često preciznija od oznake „besplatan gas”.</p>
<h2>Zašto su MetaMask zamene toliko skupe?</h2>
<p>MetaMask zamena počinje naknadom za uslugu od 0,875%.</p>
<p>To je 87,5 baznih poena pre uračunavanja gasa, naknada pulova, uticaja na cenu ili pomeranja pri izvršenju. Kod transakcije od 1.000 USD to stvara početni minus od 8,75 USD u odnosu na rutu koja ne naplaćuje istu naknadu za interfejs.</p>
<p>MetaMask ipak može da pobedi u poređenju.</p>
<p>On pretražuje više izvora likvidnosti i simulira predložene transakcije. Ako taj proces pronađe rutu sa manjim uticajem na cenu, izbegne skup dodatni korak ili odbaci transakciju koja će verovatno biti neuspešna, ostvarena ušteda može da nadmaši naknadu novčanika.</p>
<p>Izbegavanje neuspešne transakcije takođe ima ekonomsku vrednost. Tradicionalna transakcija na lancu može da potroši gas čak i kada ne uspe.</p>
<p>Međutim, kvalitet rute mora da se meri, a ne da se podrazumeva. Ako MetaMask i direktni DEX vraćaju gotovo identične osnovne rute, dodatnih 0,875% obično će učiniti rutu unutar novčanika skupljom.</p>
<p>Odgovor na pitanje „zašto su MetaMask zamene toliko skupe?” zato nije da MetaMask tajno naplaćuje 4%.</p>
<p>Odgovor je da je vidljivih 0,875% samo jedan sloj transakcije čiji ukupan trošak može da bude nekoliko puta veći.</p>
<h2>Šta korisnici podrazumevaju pod „skrivenom naknadom” za Phantom zamene</h2>
<p>Phantom navodi naknadu od 0,85% za većinu zamena.</p>
<p>Kod transakcije od 1.000 USD to iznosi 8,50 USD. Trgovina može da uključi i mrežne troškove i uticaj na cenu.</p>
<p>Do zabune češće dolazi kod prikaza međulančanih transakcija. Phantom navodi da naknada pružaoca usluge mosta može da bude uračunata u uticaj na cenu, umesto da se prikaže kao zasebna naknada mosta.</p>
<p>Trošak jeste dokumentovan, ali oznaka i dalje može da iznenadi korisnike.</p>
<p>Neko ko pročita „uticaj na cenu” može razumno da pretpostavi da taj broj meri samo efekat njegovog naloga na AMM pul. Kod međulančane rute taj broj može da predstavlja mnogo više od toga.</p>
<p>Izraz „skrivena naknada za Phantom zamenu” obično opisuje ovaj problem prikazivanja. Naknada novčanika je vidljiva, ali je deo ostalih troškova rute grupisan u šire kategorije.</p>
<p>Bolji interfejs bi odvojio tržišni uticaj od troškova mosta i izvršenja kad god osnovni pružalac usluge pruža dovoljno informacija za takvu podelu.</p>
<h2>Da li je zamena unutar novčanika jeftinija od DEX agregatora?</h2>
<p>Ponekad jeste, ali ne po pravilu.</p>
<p>Važan detalj je da zamena unutar novčanika i DEX agregator ne pristupaju uvek različitim tržištima. Novčanik u pozadini može da koristi agregator ili sličnu infrastrukturu za rutiranje.</p>
<p>Poređenje se često svodi na:</p>
<ul>
<li><p>Rutu agregatora sa naknadom novčanika</p>
</li>
<li><p>Direktnu DEX rutu bez naknade novčanika</p>
</li>
<li><p>Rutu drugog agregatora sa sopstvenom naknadom integratora</p>
</li>
<li><p>Rutu zasnovanu na nameri, sa gasom uključenim u kurs</p>
</li>
</ul>
<p>Novčanik može da bude jeftiniji ako pronađe znatno bolji put. Može da podeli nalog između više pulova, koristi posredni token, pribavi ponudu market mejkera ili pronađe jeftiniji most.</p>
<p>Međutim, poboljšanje rute mora da bude veće od naknade novčanika i svih dodatnih mrežnih troškova.</p>
<p>Direktni Uniswap nije samo jedan pul. Njegov sistem za rutiranje može da proceni više pulova, verzija protokola, podeljenih ruta, posrednih tokena i mrežnih troškova. Može da odbaci dodatni korak ako očekivano poboljšanje cene ne opravdava dodatni gas.</p>
<p>Ni samostalni agregator nije automatski bez naknade. API servisi kao što je 0x dozvoljavaju integratoru da postavi naknadu aplikacije pomoću parametara kao što je <code>swapFeeBps</code>. Odgovor na zahtev za ponudu može da prikaže tu naknadu kroz polja kao što je <code>fees.integratorFee</code>.</p>
<p>Oznaka proizvoda manje je važna od konačnih brojeva.</p>
<p>Kod trgovine sa tačno definisanim ulazom treba uporediti:</p>
<ul>
<li><p>Očekivani izlazni iznos</p>
</li>
<li><p>Minimalni izlazni iznos</p>
</li>
<li><p>Mrežni trošak</p>
</li>
<li><p>Trošak odobrenja</p>
</li>
<li><p>Naknadu integratora ili novčanika</p>
</li>
<li><p>Trošak mosta</p>
</li>
<li><p>Vreme isteka ponude</p>
</li>
<li><p>Politiku raspodele viška pri izvršenju</p>
</li>
<li><p>Verovatnoću uspešnog izvršenja</p>
</li>
</ul>
<p>Najjeftinija ruta je ona sa najvećom neto izlaznom vrednošću nakon eksternih troškova, a ne ona sa najmanjim reklamiranim procentom.</p>
<h2>Poređenje na primeru 1.000 USD</h2>
<p>Razmotrimo primer fiktivnog korisnika koji poseduje 1.000 USD u USDC-u i želi da kupi token srednje likvidnosti dostupan preko rute unutar novčanika, Uniswapa i Krakena.</p>
<p>Korisnik počinje sa samostalnim čuvanjem sredstava i želi da kupljeni token ponovo bude u njegovom novčaniku.</p>
<p>Pretpostavke su sledeće:</p>
<ul>
<li><p>Ponude se prikupljaju u istom kratkom vremenskom periodu.</p>
</li>
<li><p>Za sve platforme koristi se ista referentna cena u USD.</p>
</li>
<li><p>Potrebno odobrenje tokena već postoji.</p>
</li>
<li><p>Token ne naplaćuje naknadu ili porez na prenos.</p>
</li>
<li><p>Ruta unutar novčanika koristi MetaMask naknadu od 0,875%.</p>
</li>
<li><p>Direktna DEX ruta koristi aktuelnu naknadu interfejsa Uniswap Labsa od 0%.</p>
</li>
<li><p>CEX ruta koristi Kraken Pro taker naknadu od 0,80% na početnom nivou.</p>
</li>
<li><p>Tržišni, mrežni i troškovi prenosa predstavljaju ulazne vrednosti modela, a ne ponude u realnom vremenu.</p>
</li>
</ul>
<table>
<thead>
<tr>
<th>Komponenta troška, USD</th>
<th>Ruta unutar novčanika</th>
<th>Direktni Uniswap</th>
<th>Kraken Pro</th>
</tr>
</thead>
<tbody><tr>
<td>Naknada novčanika, interfejsa ili trgovanja</td>
<td>8,75</td>
<td>0,00</td>
<td>8,00</td>
</tr>
<tr>
<td>Odstupanje ponuđenog kursa zbog likvidnosti</td>
<td>10,00</td>
<td>14,00</td>
<td>3,00</td>
</tr>
<tr>
<td>Mrežni troškovi ili troškovi prenosa</td>
<td>14,00</td>
<td>12,00</td>
<td>11,00</td>
</tr>
<tr>
<td>Pomeranje pri izvršenju</td>
<td>3,00</td>
<td>2,00</td>
<td>1,00</td>
</tr>
<tr>
<td>Ukupan trošak</td>
<td>35,75</td>
<td>28,00</td>
<td>23,00</td>
</tr>
<tr>
<td>Stopa ukupnog troška</td>
<td>3,58%</td>
<td>2,80%</td>
<td>2,30%</td>
</tr>
<tr>
<td>Zadržana ekonomska vrednost</td>
<td>964,25</td>
<td>972,00</td>
<td>977,00</td>
</tr>
</tbody></table>
<p>Samo prvi red koristi aktuelne objavljene rasporede naknada. Ostali redovi predstavljaju izričite pretpostavke koje služe za demonstraciju računice.</p>
<p>Ovaj scenario sadrži nekoliko korisnih pouka.</p>
<h3>Novčanik je pronašao bolju rutu, ali je ipak koštao više</h3>
<p>Modelovana ruta novčanika ima odstupanje zbog likvidnosti od 10 USD, u poređenju sa 14 USD kod direktne Uniswap rute.</p>
<p>Rutiranje novčanika uštedelo je 4 USD.</p>
<p>To nije bilo dovoljno da nadoknadi naknadu novčanika od 8,75 USD i nešto skuplju transakciju. Ruta unutar novčanika ipak je završila sa 7,75 USD lošijim rezultatom od Uniswapa.</p>
<p>Dobro rutiranje ne proizvodi automatski najjeftiniju transakciju. Najpre mora da nadoknadi naknadu aplikacije.</p>
<h3>DEX nije imao naknadu za interfejs, ali nije bio besplatan</h3>
<p>Modelovani ukupni trošak Uniswapa iznosi 28 USD, iako je naknada za interfejs nula.</p>
<p>Korisnik je ipak platio kroz:</p>
<ul>
<li><p>Ekonomiku pula ili rute</p>
</li>
<li><p>Uticaj na cenu</p>
</li>
<li><p>Gas</p>
</li>
<li><p>Pomeranje pri izvršenju</p>
</li>
</ul>
<p>Naknada za interfejs od 0% znači da korisnički interfejs ne dodaje upravo tu naknadu. Ne znači da trgovina nema ekonomski trošak.</p>
<h3>Rezultat na CEX-u zavisi od toga gde se imovina nalazi na početku i na kraju</h3>
<p>Kraken scenario uključuje modelovanih 11 USD troškova prenosa jer korisnik počinje i završava sa samostalnim čuvanjem sredstava.</p>
<p>Ako bi USDC već bio na Krakenu i kupljena imovina mogla tamo da ostane, tih 11 USD nestalo bi iz ovog modela. Ukupan trošak pao bi sa 23 USD na 12 USD, odnosno na 1,2%.</p>
<p>To bi bilo jeftinije, ali više ne bi predstavljalo poređenje pod istim uslovima sa samostalnim čuvanjem sredstava.</p>
<p>Korisnik bi prihvatio:</p>
<ul>
<li><p>Čuvanje sredstava na berzi</p>
</li>
<li><p>Zahteve za verifikaciju naloga</p>
</li>
<li><p>Regionalna ograničenja proizvoda</p>
</li>
<li><p>Pravila povlačenja sredstava</p>
</li>
<li><p>Moguća kašnjenja pri povlačenju</p>
</li>
<li><p>Operativni rizik specifičan za platformu</p>
</li>
</ul>
<p>Profesionalna CEX knjiga naloga može da bude veoma isplativa kada se imovina već nalazi na berzi. Prebacivanje imovine na berzu i sa nje može da poništi deo te prednosti.</p>
<h3>Maker nalog je jeftiniji, ali nije ekvivalentan</h3>
<p>Na aktuelnom početnom nivou Krakena maker nalog ima nižu objavljenu naknadu od taker naloga.</p>
<p>Kompromis predstavlja neizvesnost izvršenja.</p>
<p>Taker nalog se odmah izvršava prema dostupnoj likvidnosti. Maker nalog mora da ostane u knjizi naloga i može da bude izvršen kasnije, delimično ili da uopšte ne bude izvršen. Za to vreme tržište može da se pomeri u nepovoljnom smeru.</p>
<p>Niža naknada predstavlja nadoknadu za pružanje likvidnosti i prihvatanje rizika izvršenja.</p>
<h3>Instant Buy je drugačiji proizvod</h3>
<p>Jednostavan ekran za kupovinu na centralizovanoj berzi ne treba smatrati ekvivalentom profesionalne knjige naloga iste berze.</p>
<p>Dokumentacija za Kraken Instant Buy opisuje prikazanu naknadu i, kada je primenljivo, raspon uključen u cenu. Taj praktičniji tok zato može da bude skuplji od Kraken Pro platforme, iako oba proizvoda nudi ista kompanija.</p>
<p>Kada zamenu unutar novčanika poredite sa centralizovanom berzom, uporedite je sa konkretnim CEX proizvodom koji bi korisnik zaista koristio.</p>
<h2>Kako isti novčanik dostiže trošak od 3% do 7%</h2>
<p>Raspon od 3% do 7% nije univerzalna naknada novčanika. On se pojavljuje kada nekoliko troškova istovremeno postane značajno.</p>
<p>Sledeći primeri koriste naknadu sličnu MetaMask naknadi od 0,875%. Preostali procenti predstavljaju transparentne pretpostavke scenarija.</p>
<table>
<thead>
<tr>
<th>Ilustrativna ruta</th>
<th>Naknada novčanika</th>
<th>Odstupanje ponuđenog kursa</th>
<th>Trošak mreže i mosta</th>
<th>Ostvareno odstupanje</th>
<th>Ukupan trošak</th>
<th>Gubitak na 1.000 USD</th>
</tr>
</thead>
<tbody><tr>
<td>Likvidan par na jeftinoj mreži</td>
<td>0,875%</td>
<td>0,25%</td>
<td>0,10%</td>
<td>0,05%</td>
<td>1,275%</td>
<td>12,75 USD</td>
</tr>
<tr>
<td>Trgovina srednje likvidnosti na glavnoj mreži</td>
<td>0,875%</td>
<td>1,00%</td>
<td>1,40%</td>
<td>0,30%</td>
<td>3,575%</td>
<td>35,75 USD</td>
</tr>
<tr>
<td>Ruta sa tankom likvidnošću ili međulančana ruta</td>
<td>0,875%</td>
<td>3,40%</td>
<td>1,80%</td>
<td>0,70%</td>
<td>6,775%</td>
<td>67,75 USD</td>
</tr>
</tbody></table>
<p>Prva ruta pokazuje zašto bi bilo pogrešno tvrditi da svaka zamena unutar novčanika košta od 3% do 7%.</p>
<p>Druga pokazuje kako naizgled obična transakcija od 1.000 USD može da pređe 3%, a da nijedna pojedinačna naknada ne bude ekstremna.</p>
<p>Treća pokazuje kako ruta sa tankom likvidnošću ili međulančana ruta može da se približi trošku od 7%, iako novčanik i dalje reklamira naknadu manju od 1%.</p>
<p>Ukupan trošak može dodatno da poraste kada:</p>
<ul>
<li><p>Token ima porez na kupovinu, prodaju ili prenos</p>
</li>
<li><p>Potrebno je zasebno odobrenje</p>
</li>
<li><p>Ruta koristi više pulova</p>
</li>
<li><p>Naknade naplaćuju i izvorna i odredišna mreža</p>
</li>
<li><p>Ponuda zastari</p>
</li>
<li><p>Korisnik prihvati preveliko odstupanje</p>
</li>
<li><p>Most nema dovoljno likvidnosti</p>
</li>
<li><p>Transakcija bude izložena nepovoljnom redosledu izvršenja</p>
</li>
<li><p>Trgovina bude mala u odnosu na fiksne mrežne troškove</p>
</li>
</ul>
<h2>Zašto programeri ipak ugrađuju zamene u novčanike</h2>
<p>Ako zamene unutar novčanika mogu da koštaju više, zašto ih uopšte ugrađivati u proizvod?</p>
<p>Zato što najjeftinija teorijska ruta nije uvek ruta koju korisnik može uspešno da završi.</p>
<p>Zamislite korisnika koji:</p>
<ul>
<li><p>Poseduje USDC u ugrađenom novčaniku</p>
</li>
<li><p>Nema ETH niti drugi nativni token za gas</p>
</li>
<li><p>Potreban mu je ETH da bi koristio neku aplikaciju</p>
</li>
<li><p>Nema spreman nalog na berzi</p>
</li>
<li><p>Ne želi da prebacuje sredstva preko drugog novčanika</p>
</li>
</ul>
<p>Bez integrisane zamene korisnik mora da napusti aplikaciju, pronađe izvor ETH-a, kopira adresu, prenese imovinu, sačeka potvrdu i vrati se u aplikaciju.</p>
<p>Zamena bez potrebe za nativnim gas tokenom ili sa uključenim gasom može da pretvori deo postojećeg USDC stanja u ETH, a da korisnik ne mora prvo da nabavi ETH.</p>
<p>Ruta možda ne nudi apsolutno najbolju cenu izvršenja. Ipak može da bude ekonomski racionalna jer rešava blokiran radni tok.</p>
<p>Drugi opravdani slučajevi upotrebe uključuju:</p>
<ul>
<li><p>Pretvaranje uplate u imovinu koju aplikacija zahteva</p>
</li>
<li><p>Plaćanje računa u određenom stabilnom tokenu</p>
</li>
<li><p>Rebalansiranje portfolija u ugrađenom novčaniku</p>
</li>
<li><p>Nabavku tokena za gas na odredišnom lancu</p>
</li>
<li><p>Objedinjavanje malih stanja različitih tokena</p>
</li>
<li><p>Završavanje međulančane kupovine u jednom toku</p>
</li>
<li><p>Izbegavanje ručne interakcije sa nepoznatim ugovorima</p>
</li>
</ul>
<p>Vrednost proizvoda nije samo u „jednom kliku manje”. Reč je o manjem broju prilika da korisnik kopira pogrešnu adresu, izabere pogrešan lanac, odobri pogrešan ugovor ili odustane od transakcije.</p>
<p>Kompromis je u tome što praktičnost može da oteža proveru kvaliteta izvršenja.</p>
<h2>Tok integracije koji uzima troškove u obzir</h2>
<p>Zamenu unutar novčanika treba posmatrati kao proizvod za izvršenje trgovine, a ne samo kao dugme povezano sa API-jem za ponude.</p>
<h3>1. Definišite stvarnu nameru korisnika</h3>
<p>Pre nego što zatražite ponudu, utvrdite:</p>
<ul>
<li><p>Da li je tačno definisan ulazni ili izlazni iznos</p>
</li>
<li><p>Izvorni lanac</p>
</li>
<li><p>Odredišni lanac</p>
</li>
<li><p>Token koji se prodaje</p>
</li>
<li><p>Token koji se kupuje</p>
</li>
<li><p>Da li se primalac razlikuje od pošiljaoca</p>
</li>
<li><p>Da li je potreban gas na odredišnom lancu</p>
</li>
<li><p>Da li korisnik na kraju mora samostalno da čuva sredstva</p>
</li>
<li><p>Da li prednost imaju cena, brzina ili sigurnost izvršenja</p>
</li>
</ul>
<p>Međulančano plaćanje koje zahteva da na odredište stigne tačno 100 USDC nije isti problem kao zamena u portfoliju kojom se prodaje tačno 100 USDC.</p>
<h3>2. Istovremeno zatražite indikativne cene</h3>
<p>Ponude treba tražiti približno u isto vreme.</p>
<p>Ako od jednog pružaoca usluge zatražite ponudu odmah, a od drugog 30 sekundi kasnije, tržišno kretanje može pogrešno da izgleda kao razlika u kvalitetu rutiranja.</p>
<p>To je naročito važno kod volatilne imovine ili imovine sa slabim obimom trgovanja.</p>
<p>Tipičan EVM tok koji koristi 0x Swap API v2 može da počne zahtevom <code>GET /swap/allowance-holder/price</code> radi dobijanja indikativne cene. Čvrsta, izvršiva ponuda zatim može da se zatraži preko <code>GET /swap/allowance-holder/quote</code>.</p>
<p>Čvrsta ponuda može da sadrži:</p>
<ul>
<li><p><code>buyAmount</code></p>
</li>
<li><p><code>minBuyAmount</code></p>
</li>
<li><p><code>totalNetworkFee</code></p>
</li>
<li><p><code>fees.integratorFee</code></p>
</li>
<li><p><code>issues.allowance</code></p>
</li>
<li><p><code>route</code></p>
</li>
<li><p><code>transaction</code></p>
</li>
</ul>
<p>Tačna polja razlikuju se među pružaocima usluga, ali ekonomska normalizacija treba da bude dosledna.</p>
<h3>3. Normalizujte jedinice tokena i referentne cene</h3>
<p>Iznosi tokena koje vraća API obično su izraženi u osnovnim jedinicama.</p>
<p>USDC iznos mora da se konvertuje pomoću šest decimalnih mesta. Tipičan ERC-20 token može da koristi 18, ali programeri treba da pročitaju stvarne metapodatke tokena umesto da to pretpostavljaju.</p>
<p>Nakon konverzije, vrednujte ulaz i izlaz pomoću sinhronizovanih referentnih cena.</p>
<p>Za pošteno poređenje:</p>
<ul>
<li><p>Koristite isti izvor referentnih cena</p>
</li>
<li><p>Koristite istu vremensku oznaku ili uzak vremenski period</p>
</li>
<li><p>Koristite istu valutu za poređenje</p>
</li>
<li><p>Zabeležite relevantan blok kada je to moguće</p>
</li>
<li><p>Ne poredite poslednju cenu trgovine na CEX-u sa izvršivom ponudom na lancu</p>
</li>
</ul>
<p>Srednja cena ili složena referentna cena obično je korisnija od cene poslednje transakcije.</p>
<h3>4. Odvojite ugrađene i eksterne troškove</h3>
<p>Većina ponuđenih izlaznih iznosa već odražava neku kombinaciju naknada platforme, naknada pulova, uticaja na cenu i naknada pružaoca usluge.</p>
<p>Te troškove ne treba ponovo dodavati prilikom izračunavanja ukupnog gubitka.</p>
<p>Eksterni troškovi mogu da uključuju:</p>
<ul>
<li><p>Gas koji se plaća zasebno</p>
</li>
<li><p>Potrebno odobrenje</p>
</li>
<li><p>Zasebnu transakciju mosta</p>
</li>
<li><p>CEX naknadu za povlačenje</p>
</li>
<li><p>Transakciju na odredišnom lancu koja nije uključena u rutu</p>
</li>
</ul>
<p>Ako se gas odbija od tokena koji se prodaje ili je već uključen u ponudu, onda nije eksterni trošak.</p>
<h3>5. Proverite postojeće odobrenje pre nego što zatražite novo</h3>
<p>Kod ERC-20 trgovine proverite da li je trenutno odobrenje dovoljno.</p>
<p>Nemojte automatski tražiti neograničeno odobrenje i nemojte unapred upisivati adresu ovlašćenog ugovora kopiranu iz starog vodiča za integraciju. Koristite adresu vraćenu u aktuelnoj ponudi ili odgovoru za odobrenje i proverite je prema važećoj dokumentaciji pružaoca usluge.</p>
<p>Tok odobravanja utiče i na bezbednost i na troškove. Zasebno odobrenje dodaje još jedan potpis, još jednu transakciju i još jednu potencijalnu tačku neuspeha.</p>
<h3>6. Simulirajte kompletnu transakciju</h3>
<p>Najveći ponuđeni izlazni iznos bezvredan je ako će transakcija verovatno biti neuspešna.</p>
<p>Simulacija treba da proveri:</p>
<ul>
<li><p>Stanja tokena</p>
</li>
<li><p>Odobrenja</p>
</li>
<li><p>Očekivane promene stanja</p>
</li>
<li><p>Zahteve za gas</p>
</li>
<li><p>Poništavanja ugovora</p>
</li>
<li><p>Minimalni izlazni iznos</p>
</li>
<li><p>Ponašanje poreza ili naknade na prenos</p>
</li>
<li><p>Nepodržane mehanizme tokena</p>
</li>
<li><p>Izvršenje na odredištu, kada je dostupno</p>
</li>
</ul>
<p>Nešto lošija ponuda sa visokom verovatnoćom poravnanja može da bude ekonomski bolja od optimistične ponude koja često ne uspeva.</p>
<h3>7. Uporedite očekivani i najgori dozvoljeni ishod</h3>
<p>Kompaktna pomoćna funkcija za troškove može da obezbedi doslednu računicu:</p>
<pre><code class="language-ts">type QuoteEconomics = {
  inputUsd: number;
  expectedOutputUsd: number;
  minimumOutputUsd: number;
  externalCostsUsd: number;
};

export function summarizeQuote(quote: QuoteEconomics) {
  if (quote.inputUsd &lt;= 0) {
    throw new Error("inputUsd must be positive");
  }

  const expectedLossUsd =
    quote.inputUsd -
    quote.expectedOutputUsd +
    quote.externalCostsUsd;

  const worstCaseLossUsd =
    quote.inputUsd -
    quote.minimumOutputUsd +
    quote.externalCostsUsd;

  return {
    expectedLossUsd,
    expectedLossBps:
      (expectedLossUsd / quote.inputUsd) * 10_000,
    expectedRetainedUsd:
      quote.inputUsd - expectedLossUsd,
    worstCaseLossUsd,
    worstCaseLossBps:
      (worstCaseLossUsd / quote.inputUsd) * 10_000,
  };
}
</code></pre>
<p><code>expectedOutputUsd</code> i <code>minimumOutputUsd</code> treba vrednovati pomoću istog vremenskog perioda referentnih cena koji se koristi za <code>inputUsd</code>.</p>
<p><code>externalCostsUsd</code> mora da sadrži samo troškove koji već nisu uračunati u ponuđeni izlazni iznos.</p>
<p>Time se dobijaju dva korisna broja:</p>
<ul>
<li><p>Očekivani ukupni trošak</p>
</li>
<li><p>Najveći dozvoljeni ukupni trošak</p>
</li>
</ul>
<p>Drugi broj često je korisniji od samostalnog prikazivanja tolerancije odstupanja.</p>
<h3>8. Rangirajte rute prema neto vrednosti</h3>
<p>Nemojte rangirati rute samo prema vrednosti <code>buyAmount</code>.</p>
<p>Ruta koja vraća više izlaznih tokena može istovremeno da zahteva:</p>
<ul>
<li><p>Skupo odobrenje</p>
</li>
<li><p>Složeniju i skuplju transakciju</p>
</li>
<li><p>Gas na odredišnom lancu</p>
</li>
<li><p>Zasebnu operaciju mosta</p>
</li>
<li><p>Više vremena i veću izloženost promeni cene</p>
</li>
</ul>
<p>Bolja početna metrika glasi:</p>
<p><code>neto primljena vrednost = očekivana izlazna vrednost - eksterni troškovi</code></p>
<p>Rizik, vreme izvršenja i verovatnoću neuspeha zatim treba prikazati kao zasebne dimenzije.</p>
<h3>9. Jasno prikažite naknadu aplikacije</h3>
<p>API servisi agregatora mogu da dozvole integrisanoj aplikaciji da doda sopstvenu naknadu.</p>
<p>Na primer, 0x pruža parametre kao što su <code>swapFeeBps</code>, <code>swapFeeRecipient</code> i <code>swapFeeToken</code>. Kada se koriste, nastala naknada integratora može da bude vraćena u odgovoru na zahtev za ponudu.</p>
<p>Ta naknada nikada ne treba da bude skrivena iza generičke oznake za mrežne troškove.</p>
<p>Isti princip važi za višak pri trgovini, koji se ponekad naziva pozitivnim odstupanjem. Ako se izvršenje poboljša nakon što korisnik potpiše transakciju, aplikacija treba da ima jasnu politiku o tome ko dobija to poboljšanje.</p>
<p>Ako pružalac usluge nudi podešavanje kao što je <code>tradeSurplusRecipient</code>, programeri treba da ga posmatraju kao ekonomsku odluku o proizvodu, a ne samo kao opciju API-ja.</p>
<h3>10. Uskladite podatke nakon poravnanja</h3>
<p>Kvalitet ponude ne može da se meri isključivo podacima dostupnim u trenutku njenog dobijanja.</p>
<p>Sačuvajte dovoljno informacija da biste mogli da uporedite očekivano i ostvareno izvršenje:</p>
<ul>
<li><p>Ponuđeni izlazni iznos</p>
</li>
<li><p>Minimalni izlazni iznos</p>
</li>
<li><p>Stvarni izlazni iznos</p>
</li>
<li><p>Procenjeni mrežni trošak</p>
</li>
<li><p>Stvarni mrežni trošak</p>
</li>
<li><p>Ponuđenu rutu</p>
</li>
<li><p>Izvršenu rutu</p>
</li>
<li><p>Vreme ponude</p>
</li>
<li><p>Vreme poravnanja</p>
</li>
<li><p>Referentne cene</p>
</li>
<li><p>Eksplicitna polja sa naknadama</p>
</li>
<li><p>Status transakcije</p>
</li>
<li><p>Razlog neuspeha, kada je dostupan</p>
</li>
</ul>
<p>Ostvareni ukupni trošak treba da postane metrika proizvoda.</p>
<p>Bez ovog usklađivanja tim može da zna da su korisnici završili zamene, a da pritom ne bude svestan da su redovno plaćali 300 ili 500 baznih poena više od očekivanog.</p>
<h2>Šta pouzdan ekran za zamenu treba da prikaže</h2>
<p>Korisniku ne bi trebalo da bude potrebna tabela da bi otkrio umanjenje vrednosti od 4%.</p>
<p>Koristan ekran za potvrdu treba da odgovori na tri pitanja.</p>
<h3>Šta ću verovatno dobiti?</h3>
<p>Prikažite:</p>
<ul>
<li><p>Očekivani izlazni iznos tokena</p>
</li>
<li><p>Očekivanu referentnu vrednost</p>
</li>
<li><p>Efektivni kurs</p>
</li>
<li><p>Starost ponude ili vreme isteka</p>
</li>
<li><p>Rutu ili pružaoca usluge</p>
</li>
</ul>
<h3>Koji je najgori prihvatljiv ishod?</h3>
<p>Prikažite:</p>
<ul>
<li><p>Minimalni primljeni iznos</p>
</li>
<li><p>Minimalni primljeni iznos u referentnoj valuti</p>
</li>
<li><p>Toleranciju odstupanja</p>
</li>
<li><p>Uslove pod kojima će transakcija biti poništena</p>
</li>
</ul>
<p>Očekivani izlazni iznos i minimalni izlazni iznos nikada ne treba prikazivati kao da predstavljaju isti broj.</p>
<h3>Koliko plaćam?</h3>
<p>Prikažite:</p>
<ul>
<li><p>Naknadu novčanika ili integratora</p>
</li>
<li><p>Naknadu za likvidnost ili pružaoca usluge, kada je dostupna</p>
</li>
<li><p>Uticaj na cenu</p>
</li>
<li><p>Procenjeni mrežni trošak</p>
</li>
<li><p>Trošak odobrenja, ako je potrebno</p>
</li>
<li><p>Trošak mosta</p>
</li>
<li><p>Trošak odredišnog lanca</p>
</li>
<li><p>Porez ili naknadu tokena</p>
</li>
<li><p>Očekivani ukupni trošak kao procenat i u referentnoj valuti</p>
</li>
</ul>
<p>Kod međulančane rute gas na izvornom lancu, trošak mosta, gas na odredišnom lancu i uticaj zamene na odredišnom lancu treba razdvojiti kad god pružalac ponude te informacije učini dostupnim.</p>
<p>Ako je naknada mosta grupisana sa uticajem na cenu, interfejs to treba jasno da navede razumljivim jezikom.</p>
<h2>Uobičajene greške pri poređenju troškova zamene</h2>
<h3>Posmatranje samo reklamiranog procenta</h3>
<p>Interfejs sa naknadom od 0% može da proizvede lošiji rezultat od novčanika sa naknadom od 0,875% ako njegova ruta ima znatno veći uticaj na cenu ili mrežni trošak.</p>
<p>Važi i obrnuto. Bolje rutiranje ne garantuje da će naknada novčanika biti nadoknađena.</p>
<h3>Posmatranje tolerancije odstupanja kao naknade</h3>
<p>Podešavanje odstupanja na 1% ne dokazuje da je korisnik izgubio 1%.</p>
<p>Nakon poravnanja izmerite stvarni izlazni iznos u odnosu na očekivani.</p>
<h3>Poređenje ponuda prikupljenih u različito vreme</h3>
<p>Cena tokena može da se promeni dovoljno za nekoliko sekundi da preokrene prividni poredak dve platforme.</p>
<p>Tražite ponude istovremeno i koristite isti vremenski period referentnih cena.</p>
<h3>Zanemarivanje početne i krajnje lokacije imovine</h3>
<p>CEX trgovina koja počinje i završava se na berzi nije direktno uporediva sa zamenom kod koje korisnik samostalno čuva sredstva.</p>
<p>Uključite uplate, povlačenja i mrežne troškove ako je stvarni cilj korisnika da završi sa imovinom u sopstvenom novčaniku.</p>
<h3>Dvostruko uračunavanje ugrađenih naknada</h3>
<p>Ako je naknada novčanika već smanjila ponuđeni izlazni iznos, njeno ponovno dodavanje preuveličaće gubitak.</p>
<p>Isto pravilo važi za:</p>
<ul>
<li><p>Gas uključen u ponudu bez potrebe za nativnim gas tokenom</p>
</li>
<li><p>Naknade mosta uračunate u uticaj na cenu</p>
</li>
<li><p>Naknade ili poreze tokena uključene u očekivani izlazni iznos</p>
</li>
<li><p>CEX naknade odbijene od primljene imovine</p>
</li>
</ul>
<h3>Zanemarivanje troškova neuspešnih transakcija</h3>
<p>Neuspešna tradicionalna transakcija na lancu i dalje može da potroši gas.</p>
<p>Simulacija, privatno rutiranje i izvršenje zasnovano na nameri mogu da pruže stvarnu ekonomsku vrednost čak i kada ne poboljšavaju prikazani kurs.</p>
<h3>Automatsko povećavanje tolerancije odstupanja</h3>
<p>Povećavanje tolerancije može da smanji broj neuspešnih transakcija, ali istovremeno proširuje raspon cena koje je korisnik pristao da prihvati.</p>
<p>Kod tokena sa tankom likvidnošću povećavanje tolerancije bez provere dubine pula ili naknada tokena može da pretvori problem rutiranja u mnogo veći ostvareni gubitak.</p>
<h2>Stvarni kompromisi različitih mesta trgovanja</h2>
<table>
<thead>
<tr>
<th>Mesto trgovanja</th>
<th>Glavna prednost</th>
<th>Glavni rizik troška</th>
<th>Najbolja primena</th>
</tr>
</thead>
<tbody><tr>
<td>Zamena unutar novčanika</td>
<td>Jednostavan tok sa samostalnim čuvanjem, simulacija, apstrakcija gasa</td>
<td>Naknada novčanika i grupisani prikaz troškova</td>
<td>Korisnici kojima su najvažniji završetak transakcije i praktičnost</td>
</tr>
<tr>
<td>Direktni DEX interfejs</td>
<td>Samostalno čuvanje uz manje naknada na nivou aplikacije</td>
<td>Gas, likvidnost pula, odobrenja, uticaj na cenu</td>
<td>Likvidni parovi na istom lancu sa dobrom direktnom rutom</td>
</tr>
<tr>
<td>DEX agregator</td>
<td>Pristup fragmentisanoj likvidnosti i podeljenim rutama</td>
<td>Naknade integratora i rutiranje koje zahteva mnogo gasa</td>
<td>Veće ili manje direktne trgovine kod kojih je rutiranje važno</td>
</tr>
<tr>
<td>CEX Pro knjiga naloga</td>
<td>Duboka likvidnost, limit nalozi, predvidljiv raspored naknada</td>
<td>Čuvanje sredstava, verifikacija, uplate i povlačenja</td>
<td>Listirana imovina kada se sredstva već nalaze na berzi</td>
</tr>
<tr>
<td>CEX instant kupovina</td>
<td>Jednostavan tok konverzije</td>
<td>Prikazana naknada plus ugrađeni raspon cena</td>
<td>Korisnici kojima je jednostavnost važnija od optimizacije izvršenja</td>
</tr>
</tbody></table>
<p>Ne postoji kategorija koja je uvek najjeftinija.</p>
<p>Direktni DEX može da pobedi kod likvidnog para na jeftinoj mreži.</p>
<p>CEX knjiga naloga može da pobedi kada se imovina već nalazi na berzi.</p>
<p>Agregator može da pobedi kada je likvidnost fragmentisana.</p>
<p>Zamena unutar novčanika može da bude racionalan izbor kada korisnik nema token za gas, potrebna mu je međulančana ruta ili bi u suprotnom odustao od transakcije.</p>
<p>Ispravan odgovor zavisi od početne pozicije korisnika, odredišta, veličine trgovine i njegove spremnosti da prihvati čuvanje sredstava kod treće strane ili dodatnu operativnu složenost.</p>
<h2>Broj koji programeri treba da mere</h2>
<p>Korisnici ne gube neprimetno od 3% do 7% zato što svaki novčanik sadrži jednu tajnu naknadu od 7%.</p>
<p>Gube zato što se više manjih troškova sabira, dok interfejs svaki prikazuje na drugom mestu, pod drugom oznakom ili unutar kursa.</p>
<p>Reklamirana naknada jeste korisna, ali nije konačna cena.</p>
<p>Iskrenija metrika glasi:</p>
<p><code>ostvarena ulazna vrednost - ostvarena izlazna vrednost + eksterni troškovi</code></p>
<p>Kada se dosledno meri, taj broj odgovara na pitanja koja korisnici zaista postavljaju:</p>
<ul>
<li><p>Zašto su MetaMask zamene toliko skupe?</p>
</li>
<li><p>Da li je zamena unutar novčanika jeftinija od DEX-a?</p>
</li>
<li><p>Da li je Phantom naknada zaista iznosila samo 0,85%?</p>
</li>
<li><p>Da li je agregator dovoljno poboljšao izvršenje da opravda svoju naknadu?</p>
</li>
<li><p>Da li bi CEX bio jeftiniji nakon troškova uplata i povlačenja?</p>
</li>
</ul>
<p>Za programere stopa uspešno završenih zamena nije dovoljna. Tok sa jednim dodirom može da ima odličnu stopu konverzije, dok korisnicima neprimetno pruža loše izvršenje.</p>
<p>Bolja metrika proizvoda je ostvareni ukupni trošak izražen u baznim poenima i izmeren prema sinhronizovanoj referentnoj ceni.</p>
<p>Zamenu unutar novčanika može da vredi koristiti. Ona može da ukloni potrebu za nativnim tokenom za gas, smanji prebacivanje između aplikacija, spreči greške koje se mogu izbeći i završi tok koji bi u suprotnom propao.</p>
<p>Ipak, i dalje treba da dokaže da njena praktičnost vredi svoje cene.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati USDT i USDC. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://support.metamask.io/manage-crypto/move-crypto/swap/user-guide-swaps/">MetaMask centar za pomoć: Korisnički vodič za zamene</a></p>
</li>
<li><p><a href="https://help.phantom.com/articles/5985106844435">Phantom pomoć: Zamena kriptovaluta u Phantomu</a></p>
</li>
<li><p><a href="https://help.phantom.com/articles/53467684967443">Phantom pomoć: Razumevanje EVM transakcija bez nativnog gas tokena</a></p>
</li>
<li><p><a href="https://help.phantom.com/articles/27085326202515">Phantom pomoć: Podešavanje parametara zamene</a></p>
</li>
<li><p><a href="https://support.uniswap.org/hc/en-us/articles/20131678274957-What-are-Uniswap-Labs-fees">Uniswap Labs: Koje naknade naplaćuje Uniswap Labs?</a></p>
</li>
<li><p><a href="https://support.uniswap.org/hc/en-us/articles/8671539602317-What-is-price-impact">Uniswap Labs: Šta je uticaj na cenu?</a></p>
</li>
<li><p><a href="https://support.uniswap.org/hc/en-us/articles/46932289118733-How-does-routing-work">Uniswap Labs: Kako funkcioniše rutiranje?</a></p>
</li>
<li><p><a href="https://support.uniswap.org/hc/en-us/articles/17544708791821-Are-there-network-costs-for-UniswapX">Uniswap Labs: Da li UniswapX ima mrežne troškove?</a></p>
</li>
<li><p><a href="https://docs.0x.org/api-reference/api-overview">0x dokumentacija: Pregled API-ja</a></p>
</li>
<li><p><a href="https://docs.0x.org/api-reference/evm-ap-is/swap/allowanceholder-getprice">0x dokumentacija: Allowance Holder endpoint za cenu</a></p>
</li>
<li><p><a href="https://docs.0x.org/api-reference/evm-ap-is/swap/allowanceholder-getquote">0x dokumentacija: Allowance Holder endpoint za ponudu</a></p>
</li>
<li><p><a href="https://docs.0x.org/evm/0x-swap-api/guides/monetize-your-app-using-swap">0x dokumentacija: Monetizacija EVM integracije za zamene</a></p>
</li>
<li><p><a href="https://www.kraken.com/features/fee-schedule">Kraken: Raspored naknada za spot trgovanje kriptovalutama</a></p>
</li>
<li><p><a href="https://support.kraken.com/articles/360060101312-faq-s-about-buying-instantly">Kraken podrška: Upravljanje kupovinama i Instant Buy naknade</a></p>
</li>
<li><p><a href="https://support.kraken.com/hc/articles/360000767986-cryptocurrency-withdrawal-fees-and-minimums">Kraken podrška: Naknade i minimalni iznosi za povlačenje kriptovaluta</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/why-in-wallet-swaps-can-quietly-cost-users-3-to-7-38an">Why In-Wallet Swaps Can Quietly Cost Users 3% to 7%</a></p>
]]></content:encoded></item><item><title><![CDATA[Ispod haube: 8 kripto prevara za početnike u Srbiji]]></title><description><![CDATA[Kripto prevare retko počinju hakovanjem blokčejna. Mnogo češće počinju oglasom, porukom na Telegramu, lažnim razgovorom za posao ili interfejsom koji izgleda dovoljno uverljivo da korisnik sam autoriz]]></description><link>https://kripto-pocetnica.hashnode.dev/ispod-haube-8-kripto-prevara-za-po-etnike-u-srbiji</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/ispod-haube-8-kripto-prevara-za-po-etnike-u-srbiji</guid><category><![CDATA[crypto]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[Bitcoin]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Scam Awareness]]></category><category><![CDATA[fraud detection]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Mon, 21 Sep 2026 23:02:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/0cc78143-ac40-4c29-87db-521af4969da9.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Kripto prevare retko počinju hakovanjem blokčejna. Mnogo češće počinju oglasom, porukom na Telegramu, lažnim razgovorom za posao ili interfejsom koji izgleda dovoljno uverljivo da korisnik sam autorizuje štetnu radnju.</p>
<p>To je važna razlika za developere.</p>
<p>Ako napadač ukrade seed frazu, dobije neograničen <code>allowance</code> ili ubedi korisnika da pošalje sredstva na njegovu adresu, protokol može da radi potpuno ispravno. Transakcija je validno potpisana, konsenzus je postignut, a sredstva su ipak izgubljena.</p>
<p>Problem zato nije samo u smart contract kodu. Nalazi se i u korisničkom interfejsu, obradi transakcija, upozorenjima, korisničkoj podršci, evidenciji događaja i načinu na koji proizvod reaguje na rizično ponašanje.</p>
<p>U Srbiji ovaj problem nije teorijski. Nacionalni CERT upozorava na prevare povezane sa ulaganjem u kriptovalute i platforme za „brzu zaradu“, dok su Europol i Eurojust dokumentovali organizovane pozivne centre iz Srbije koji su korisnike usmeravali ka lažnim investicionim platformama. U akciji iz januara 2023. uhapšeno je 15 osoba, od kojih 14 u Srbiji, a među zaplenjenom imovinom bili su hardverski novčanici sa kriptovalutama vrednim približno milion USD.</p>
<p>Osam obrazaca u nastavku nisu zvanična statistička klasifikacija. To je praktičan threat model sastavljen od prevara na koje upozoravaju domaće institucije i napada koji proizlaze iz načina na koji savremeni novčanici, tokeni i decentralizovane aplikacije rade.</p>
<h2>Zajednička arhitektura prevare</h2>
<p>Većina kripto prevara izgleda različito samo na površini. Ispod nje se obično nalazi isti workflow:</p>
<ol>
<li><p>Napadač pronalazi korisnika preko oglasa, društvene mreže, aplikacije za upoznavanje ili kompromitovanog naloga.</p>
</li>
<li><p>Gradi kredibilitet pomoću lažnog autoriteta, grupe navodno zadovoljnih korisnika ili male početne isplate.</p>
</li>
<li><p>Korisnika navodi da kupi kriptovalutu preko legitimne menjačnice.</p>
</li>
<li><p>Sredstva zatim prebacuje na lažnu platformu, napadačevu adresu ili zlonamerni smart contract.</p>
</li>
<li><p>Interfejs prikazuje izmišljeni profit ili nagradu.</p>
</li>
<li><p>Povlačenje sredstava se uslovljava dodatnom uplatom, „porezom“, verifikacijom ili novim zadatkom.</p>
</li>
<li><p>Kada korisnik odbije da uplati još novca, nalog se zaključava.</p>
</li>
<li><p>Nakon toga se često pojavljuje druga grupa koja naplaćuje navodni povraćaj izgubljenih sredstava.</p>
</li>
</ol>
<p>Ovaj model je korisniji od liste sumnjivih domena. Domen može nestati za nekoliko sati, ali redosled događaja ostaje gotovo isti.</p>
<h2>1. Lažne investicione platforme i pozivni centri</h2>
<p>Najpoznatiji obrazac počinje oglasom koji obećava pristup automatizovanom trgovanju, ekskluzivnom investicionom programu ili navodno naprednom kripto sistemu.</p>
<p>Korisnik ne mora odmah da uplati novac. Dovoljno je da ostavi ime i broj telefona.</p>
<p>Nakon toga ga kontaktira „broker“, „account manager“ ili „finansijski savetnik“. Prva uplata je obično dovoljno mala da ne izazove ozbiljan otpor. Dashboard zatim prikazuje rast portfolija, uspešne pozicije i profit koji zapravo ne postoji.</p>
<p>U operaciji koju su Europol i Eurojust sproveli 11. januara 2023. kriminalne grupe koristile su oglase na društvenim mrežama da dovedu korisnike na lažne sajtove za ulaganje u kriptovalute. Žrtve su najpre ulagale manje trocifrene iznose, a prikazani lažni rast vrednosti služio je kao argument za veće uplate.</p>
<h3>Kako platforma izgleda legitimno</h3>
<p>Lažnoj platformi nije potreban pravi trading engine. Dovoljan je:</p>
<ul>
<li><p>obrazac za uplatu;</p>
</li>
<li><p>tabela sa generisanim transakcijama;</p>
</li>
<li><p>grafikon čiji se podaci čuvaju u lokalnoj bazi;</p>
</li>
<li><p>administratorski panel za ručno menjanje salda;</p>
</li>
<li><p>kontrola kojom operator može da odobri malu probnu isplatu;</p>
</li>
<li><p>chat ili telefonski kanal kojim se korisnik navodi na sledeću uplatu.</p>
</li>
</ul>
<p>Korisnik vidi broj koji raste i zaključuje da se iza njega nalazi stvarna pozicija na tržištu. U stvarnosti, frontend možda nikada nije poslao nalog bilo kojoj berzi.</p>
<h3>Šta developer može da ugradi</h3>
<p>Ako proizvod usmerava korisnike ka spoljnim provajderima, provera ne treba da se svodi na logo ili tekst u footeru.</p>
<p>Za pružaoce usluga povezanih sa virtuelnim valutama u Srbiji postoji javni registar Narodne banke Srbije. Registar ne garantuje profit niti eliminiše sve poslovne rizike, ali omogućava proveru da li određeni domaći pružalac ima dozvolu za tu vrstu usluge.</p>
<p>Korisno je proveravati:</p>
<ul>
<li><p>da li se domen podudara sa domenom pravnog lica;</p>
</li>
<li><p>da li je primalac uplate ista kompanija koja se predstavlja korisniku;</p>
</li>
<li><p>da li platforma prikazuje proverljiv <code>txHash</code>;</p>
</li>
<li><p>da li je moguć mali test povlačenja bez razgovora sa „brokerom“;</p>
</li>
<li><p>da li se od korisnika traži instalacija softvera za udaljeni pristup;</p>
</li>
<li><p>da li se povlačenje uslovljava dodatnom uplatom.</p>
</li>
</ul>
<p>Poslednji signal je naročito jak. Legitiman trošak može biti odbijen od postojećeg salda. Zahtev da korisnik pošalje novi depozit kako bi „otključao“ sopstveni novac tipičan je obrazac prevare.</p>
<h2>2. Telegram i WhatsApp task prevare</h2>
<p>Task prevara se predstavlja kao jednostavan posao: lajkovanje videa, ocenjivanje proizvoda, optimizacija sadržaja ili izvršavanje zadataka u aplikaciji.</p>
<p>Početni zadaci ponekad zaista donesu malu isplatu. To nije dokaz da sistem radi. Ta isplata je deo troška akvizicije žrtve.</p>
<p>Nakon nekoliko uspešnih zadataka korisnik dobija „premium“ zadatak. Da bi ga započeo, mora da uplati sopstveni novac, često u kriptovaluti. Aplikacija zatim prikazuje proviziju koju nije moguće povući bez još jedne uplate.</p>
<p>Američka Federalna trgovinska komisija opisuje isti obrazac: neočekivana ponuda za posao, jednostavni zadaci, rast izmišljenog salda i zahtev da korisnik uplati kriptovalutu kako bi nastavio ili povukao navodnu zaradu. Nacionalni CERT Srbije je sličan mehanizam opisao u upozorenju o platformama za „brzu zaradu“, ličnim brokerima, mentorima i investiranju u kriptovalute.</p>
<h3>Tehnički trag</h3>
<p>Task platforma obično ima nekoliko prepoznatljivih osobina:</p>
<ul>
<li><p>saldo nije povezan sa stvarnim platnim sistemom;</p>
</li>
<li><p>status zadatka menja administratorski nalog;</p>
</li>
<li><p>ista adresa prima uplate većeg broja korisnika;</p>
</li>
<li><p>novi zadaci se otključavaju tek nakon depozita;</p>
</li>
<li><p>korisnik ne može da izveze istoriju naloga;</p>
</li>
<li><p>kompanija nema proverljive klijente ni poslovnu dokumentaciju;</p>
</li>
<li><p>komunikacija se premešta sa javne platforme na privatnu grupu.</p>
</li>
</ul>
<h3>Šta ugraditi u proizvod</h3>
<p>Ako razvijaš referral, rewards ili marketplace sistem, isti mehanizmi mogu biti zloupotrebljeni i u legitimnom proizvodu.</p>
<p>Korisne mere uključuju:</p>
<ul>
<li><p>ograničenje nagrada za novootvorene naloge;</p>
</li>
<li><p>detekciju više naloga povezanih sa istim uređajem ili izvorom sredstava;</p>
</li>
<li><p>odloženu isplatu kod naglog rasta aktivnosti;</p>
</li>
<li><p>jasno odvajanje depozita od zarađenog salda;</p>
</li>
<li><p>zabranu workflowa u kojem korisnik mora da uplati novac da bi primio zaradu;</p>
</li>
<li><p>evidenciju ko je i kada promenio stanje naloga.</p>
</li>
</ul>
<p>Najvažnije pitanje nije da li aplikacija prikazuje saldo, već iz kog proverljivog događaja je taj saldo nastao.</p>
<h2>3. Prevare zasnovane na poverenju i emotivnom odnosu</h2>
<p>Ovaj obrazac se često naziva relationship investment scam ili confidence-enabled investment fraud. Izraz „pig butchering“ i dalje se koristi, ali precizniji naziv opisuje suštinu: napadač prvo gradi odnos, a tek kasnije uvodi ulaganje.</p>
<p>Kontakt može početi navodno pogrešnim brojem, porukom na LinkedInu, aplikacijom za upoznavanje ili razgovorom u investicionoj grupi.</p>
<p>Napadač ne traži novac odmah. Nedeljama gradi kredibilitet, deli fotografije, razgovara o poslu i povremeno pominje sopstvene uspešne investicije. Tek kada uspostavi poverenje, predlaže platformu na kojoj će „pomoći“ korisniku da trguje.</p>
<p>Lažna platforma može dozvoliti jednu malu isplatu. Cilj nije da korisnik zaradi, već da zaključi da je sistem provereno funkcionalan i uplati znatno veći iznos.</p>
<h3>Zašto klasičan KYC nije dovoljan</h3>
<p>KYC proverava identitet korisnika koji otvara nalog. Ne proverava da li taj korisnik postupa pod tuđim uticajem.</p>
<p>Sa stanovišta berze ili novčanika, korisnik može biti potpuno legitiman:</p>
<ul>
<li><p>prijavio se sa svog uređaja;</p>
</li>
<li><p>prošao proveru identiteta;</p>
</li>
<li><p>kupio kriptovalutu svojim novcem;</p>
</li>
<li><p>potpisao transakciju sopstvenim ključem.</p>
</li>
</ul>
<p>Rizik se nalazi u kontekstu, a ne nužno u identitetu.</p>
<h3>Mogući signali rizika</h3>
<p>Proizvod može da registruje kombinaciju sledećih događaja:</p>
<ul>
<li><p>potpuno nova odredišna adresa;</p>
</li>
<li><p>neuobičajeno veliki iznos u odnosu na istoriju naloga;</p>
</li>
<li><p>kupovina i trenutno povlačenje celog iznosa;</p>
</li>
<li><p>promena uređaja neposredno pre transakcije;</p>
</li>
<li><p>više neuspelih pokušaja kopiranja ili izmene adrese;</p>
</li>
<li><p>korisnik u podršci pominje mentora, savetnika ili porez za povlačenje.</p>
</li>
</ul>
<p>Nijedan signal pojedinačno ne dokazuje prevaru. Kombinacija može opravdati dodatnu potvrdu, kratko odlaganje ili upozorenje napisano jezikom koji opisuje konkretan scenario.</p>
<p>Generičko „kriptovalute su rizične“ uglavnom se ignoriše. Upozorenje „Ako vam je ovu adresu poslao broker koga ste upoznali preko Telegrama, ne šaljite sredstva pre nezavisne provere“ mnogo je korisnije.</p>
<h2>4. Lažna podrška i krađa seed fraze</h2>
<p>Početnik koji naiđe na problem obično traži pomoć tamo gde se već nalazi: u komentarima, Telegram grupi, Discord serveru ili na društvenoj mreži.</p>
<p>Napadači prate upravo takve poruke.</p>
<p>Nekoliko minuta nakon pitanja „Zašto mi transakcija ne prolazi?“ korisniku se javlja nalog sa logotipom poznatog novčanika. Lažni agent zatim šalje obrazac za „sinhronizaciju“, „verifikaciju“ ili „oporavak“ novčanika.</p>
<p>Obrazac traži seed frazu, privatni ključ ili pristup ekranu.</p>
<p>Kod self-custody novčanika seed fraza nije lozinka koju podrška može da resetuje. Ona je osnova iz koje se izvode privatni ključevi. Ko je poseduje može da rekonstruiše novčanik i potpisuje transakcije bez dodatne saglasnosti vlasnika.</p>
<p>Zvanična dokumentacija MetaMaska izričito navodi da podrška nikada ne traži Secret Recovery Phrase i da se ona ne unosi na veb-sajt.</p>
<h3>Zašto detekcija broja reči nije dovoljno dobra</h3>
<p>Ponekad se predlaže da aplikacija prepozna niz od 12 ili 24 reči i blokira unos. To može sprečiti deo slučajnog deljenja, ali nije pouzdana bezbednosna kontrola.</p>
<p>Takva provera proizvodi i lažno pozitivne i lažno negativne rezultate:</p>
<ul>
<li><p>nije svaka rečenica od 12 reči seed fraza;</p>
</li>
<li><p>ne koriste svi sistemi iste dužine;</p>
</li>
<li><p>napadač može da traži reči pojedinačno;</p>
</li>
<li><p>korisnik može da pošalje fotografiju;</p>
</li>
<li><p>seed može biti podeljen kroz više poruka.</p>
</li>
</ul>
<p>Bolji pristup je kombinacija:</p>
<ul>
<li><p>upozorenja pored svakog polja za podršku;</p>
</li>
<li><p>automatskog maskiranja sumnjivog sadržaja;</p>
</li>
<li><p>zabrane trajnog čuvanja takvih unosa;</p>
</li>
<li><p>obuke agenata podrške;</p>
</li>
<li><p>jasnog pravila da nijedan zaposleni nema workflow koji zahteva privatni ključ ili seed frazu.</p>
</li>
</ul>
<p>Ako je seed fraza već otkrivena, promena lozinke novčanika nije dovoljna. Preostala sredstva treba prebaciti u nov novčanik formiran na bezbednom uređaju.</p>
<h2>5. Wallet draineri i zlonamerna odobrenja</h2>
<p>Korisnik ne mora da otkrije seed frazu da bi izgubio tokene. Dovoljno je da odobri smart contractu pravo da ih prenosi.</p>
<p>Kod ERC-20 tokena funkcija <code>approve</code> postavlja koliko određeni <code>spender</code> sme da potroši u ime vlasnika. Funkcija <code>allowance</code> vraća preostali odobreni iznos, a <code>transferFrom</code> omogućava prenos u okviru tog odobrenja.</p>
<p>Legitimne decentralizovane aplikacije koriste ovaj mehanizam da bi izvršile swap, depozit ili plaćanje. Wallet drainer koristi isti standard, ali korisnika navodi da odobri zlonamernog primaoca.</p>
<p>Napad obično stiže kroz:</p>
<ul>
<li><p>lažni airdrop;</p>
</li>
<li><p>klonirani mint sajt;</p>
</li>
<li><p>poruku da token uskoro ističe;</p>
</li>
<li><p>lažnu proveru podobnosti;</p>
</li>
<li><p>kompromitovani nalog poznatog projekta;</p>
</li>
<li><p>oglas koji vodi na domen sličan originalnom.</p>
</li>
</ul>
<h3>Problem neograničenog allowancea</h3>
<p>Aplikacije često traže veoma veliki ili praktično neograničeni <code>allowance</code> da korisnik ne bi plaćao mrežnu naknadu za svako novo odobrenje. To poboljšava UX, ali povećava posledice kompromitovanja.</p>
<p>Čak i ako korisnik odvoji novčanik od sajta, ranije odobrenje ostaje zapisano u stanju smart contracta. Prekid WalletConnect sesije ili zatvaranje taba ne poništava <code>allowance</code>.</p>
<p>Kod potpisa je situacija dodatno komplikovana. EIP-712 omogućava potpisivanje strukturiranih podataka koji mogu biti čitljiviji od sirovog heksadecimalnog sadržaja, ali strukturiran prikaz nije automatski dokaz da je zahtev bezbedan. Korisnik i dalje mora da vidi domen, <code>chainId</code>, ugovor koji verifikuje potpis i stvarnu nameru operacije.</p>
<h3>Šta prikazati pre potpisa</h3>
<p>Dobar interfejs ne treba da kaže samo „Potpisujete poruku“.</p>
<p>Treba da objasni:</p>
<ul>
<li><p>koji ugovor dobija ovlašćenje;</p>
</li>
<li><p>koji token je obuhvaćen;</p>
</li>
<li><p>maksimalan iznos;</p>
</li>
<li><p>da li odobrenje ističe;</p>
</li>
<li><p>da li primalac ranije postoji u istoriji korisnika;</p>
</li>
<li><p>šta druga strana može da uradi nakon potpisa;</p>
</li>
<li><p>da li transakcija prenosi sredstva odmah ili samo daje buduće pravo prenosa.</p>
</li>
</ul>
<p>Ako proizvod zna da korisnik odobrava neograničenu potrošnju, to ne treba sakriti iza tehničke vrednosti poput maksimalnog <code>uint256</code> broja.</p>
<h2>6. Address poisoning</h2>
<p>Address poisoning ne pokušava da ukrade privatni ključ. Napadač pokušava da kontaminira istoriju transakcija adresom koja liči na adresu koju korisnik već koristi.</p>
<p>Pretpostavimo da korisnik redovno šalje sredstva na:</p>
<pre><code class="language-text">0x12a4...91bf
</code></pre>
<p>Napadač generiše adresu sa sličnim početkom i krajem:</p>
<pre><code class="language-text">0x12a4...91bf
</code></pre>
<p>Skraćeni prikaz može biti isti, dok su karakteri u sredini potpuno različiti. Napadač zatim sa te adrese pošalje malu ili bezvrednu transakciju. Cilj je da korisnik kasnije kopira pogrešnu adresu iz istorije.</p>
<p>MetaMask ovaj napad opisuje kao pokušaj da se korisnik navede da kopira adresu koja liči na prethodno korišćenu, ali pripada napadaču.</p>
<h3>Greška u dizajnu, ne u kriptografiji</h3>
<p>Kriptografske adrese jesu jedinstvene. Problem nastaje kada ih UI prikazuje kao nekoliko početnih i završnih karaktera.</p>
<p>Za prikaz stanja to može biti prihvatljivo. Za potvrdu slanja velikog iznosa nije.</p>
<p>Korisne zaštite su:</p>
<ul>
<li><p>imenik pouzdanih primalaca;</p>
</li>
<li><p>prikaz više karaktera kod nove adrese;</p>
</li>
<li><p>posebno upozorenje kada se adresa samo delimično podudara sa ranijim primaocem;</p>
</li>
<li><p>zabrana kopiranja adrese direktno iz neproverenog token transfera;</p>
</li>
<li><p>test transakcija pre slanja velikog iznosa;</p>
</li>
<li><p>potvrda primaoca drugim komunikacionim kanalom.</p>
</li>
</ul>
<p>Jednostavan string similarity algoritam može pomoći, ali ne sme samostalno blokirati transakcije. Napadač može namerno generisati sličnu adresu, ali i legitimne adrese ponekad slučajno dele početne ili završne karaktere.</p>
<h2>7. Lažni tokeni, airdropovi i pump grupe</h2>
<p>Naziv i simbol tokena nisu jedinstveni identifikatori.</p>
<p>Napadač može da napravi novi ERC-20 ugovor sa istim nazivom i simbolom kao poznati token. Može da emituje <code>Transfer</code> događaje, dodeli saldo poznatim adresama ili pošalje lažni token velikom broju korisnika.</p>
<p>To ne znači da su vlasnici tih adresa kupili token niti da iza njega postoji legitiman projekat. Stanje tokena kontroliše njegov smart contract.</p>
<p>Zvanična dokumentacija Ethereum projekta upozorava da lažni token može koristiti naziv i simbol legitimnog tokena, dok je adresa ugovora ono što ih zaista razlikuje.</p>
<h3>Airdrop kao ulaz u drainer</h3>
<p>Samo pojavljivanje nepoznatog tokena u novčaniku obično nije dovoljno da napadač preuzme sredstva. Rizik nastaje kada korisnik:</p>
<ul>
<li><p>otvori URL iz naziva ili opisa tokena;</p>
</li>
<li><p>pokuša da ga proda preko sajta koji preporučuje napadač;</p>
</li>
<li><p>odobri ugovoru pristup drugim tokenima;</p>
</li>
<li><p>potpiše poruku čije posledice ne razume;</p>
</li>
<li><p>plati navodnu naknadu za otključavanje.</p>
</li>
</ul>
<p>Zbog toga novčanik ne treba automatski da tretira svaki primljeni token kao vrednu imovinu. Nepoznati tokeni mogu biti skriveni ili označeni dok se ne utvrde ugovor, likvidnost i poreklo.</p>
<h3>Pump grupe koriste drugi mehanizam</h3>
<p>U pump-and-dump grupama organizatori unapred kupuju token sa slabom likvidnošću. Zatim objavljuju „signal“ stotinama korisnika. Cena raste jer grupa istovremeno kupuje, a organizatori prodaju svoj ranije stečen saldo.</p>
<p>Korisnicima izgleda kao da je signal bio tačan. U stvari, njihova kupovina je bila izlazna likvidnost za organizatore.</p>
<p>Proizvod može da prikaže:</p>
<ul>
<li><p>koncentraciju tokena po adresama;</p>
</li>
<li><p>dubinu likvidnosti;</p>
</li>
<li><p>očekivani price impact;</p>
</li>
<li><p>starost ugovora;</p>
</li>
<li><p>mogućnost prodaje;</p>
</li>
<li><p>privilegije vlasnika ugovora;</p>
</li>
<li><p>da li ugovor može da pauzira transfere ili menja naknade.</p>
</li>
</ul>
<p>Ovi signali ne dokazuju prevaru, ali korisniku daju bolju sliku od samog grafikona cene.</p>
<h2>8. Lažni servisi za povraćaj sredstava</h2>
<p>Nakon prve prevare često sledi druga.</p>
<p>Napadač ili povezana grupa javljaju se žrtvi sa tvrdnjom da su pronašli sredstva, identifikovali vlasnika adrese ili dobili sudski nalog. Za povraćaj navodno treba platiti trošak istrage, porez, mrežnu naknadu ili depozit.</p>
<p>Ponekad se predstavljaju kao advokatska kancelarija, regulator, policijska jedinica ili blockchain forenzičari. FBI je posebno upozorio na lažne pravne kancelarije koje ciljaju osobe prethodno oštećene kripto prevarama.</p>
<p>Na javnom blokčejnu moguće je pratiti transakcije, ali to nije isto što i kontrolisati sredstva.</p>
<p>Ako su sredstva stigla do centralizovane menjačnice, postoji mogućnost da nadležni organi zatraže identifikaciju naloga ili zamrzavanje. Ako su prebačena na adresu čiji ključ kontroliše napadač, nijedan privatni „recovery agent“ ne može jednostavno poništiti potvrđenu transakciju.</p>
<p>Tvrdnja da je povraćaj zagarantovan treba da se tretira kao signal visokog rizika.</p>
<h2>Kako izgleda razuman risk engine</h2>
<p>Zaštita ne mora da počne skupom platformom za blockchain analitiku. Prva verzija može da bude skup objašnjivih pravila zasnovanih na događajima koje proizvod već poseduje.</p>
<pre><code class="language-ts">type RiskContext = {
  unsolicitedContact: boolean;
  firstTimeRecipient: boolean;
  unusualAmount: boolean;
  depositRequiredForWithdrawal: boolean;
  unlimitedTokenAllowance: boolean;
  remoteAccessRequested: boolean;
  seedPhraseRequested: boolean;
  addressResemblesKnownRecipient: boolean;
};

const weights: Record&lt;keyof RiskContext, number&gt; = {
  unsolicitedContact: 10,
  firstTimeRecipient: 10,
  unusualAmount: 15,
  depositRequiredForWithdrawal: 35,
  unlimitedTokenAllowance: 20,
  remoteAccessRequested: 30,
  seedPhraseRequested: 100,
  addressResemblesKnownRecipient: 30,
};

function calculateRisk(context: RiskContext): number {
  return Object.entries(context).reduce((score, [signal, active]) =&gt; {
    if (!active) return score;
    return score + weights[signal as keyof RiskContext];
  }, 0);
}

function riskAction(score: number) {
  if (score &gt;= 100) return "block-and-escalate";
  if (score &gt;= 50) return "step-up-confirmation";
  if (score &gt;= 25) return "show-contextual-warning";
  return "allow";
}
</code></pre>
<p>Ovaj kod nije model za detekciju prevare i težine nisu univerzalne. Poenta je u arhitekturi:</p>
<ul>
<li><p>signal ima jasno poreklo;</p>
</li>
<li><p>odluka može da se objasni;</p>
</li>
<li><p>pravilo može da se testira;</p>
</li>
<li><p>pragovi mogu da se kalibrišu;</p>
</li>
<li><p>događaj može da se sačuva za kasniju istragu.</p>
</li>
</ul>
<p>U produkciji bi svaki signal trebalo da sadrži vreme, izvor, verziju pravila i nivo pouzdanosti. Bez toga je teško objasniti zašto je transakcija usporena ili blokirana.</p>
<h2>Preporučeni workflow za kripto proizvod</h2>
<p>Praktična implementacija može da se podeli na pet slojeva.</p>
<h3>1. Prikupljanje signala</h3>
<p>Prikupljaju se samo podaci relevantni za konkretnu operaciju:</p>
<ul>
<li><p>poreklo sesije;</p>
</li>
<li><p>starost naloga;</p>
</li>
<li><p>promena uređaja;</p>
</li>
<li><p>istorija primaoca;</p>
</li>
<li><p>vrsta ugovora;</p>
</li>
<li><p>iznos tokena;</p>
</li>
<li><p>traženi <code>allowance</code>;</p>
</li>
<li><p>rezultat simulacije transakcije;</p>
</li>
<li><p>poznati indikatori kompromitacije;</p>
</li>
<li><p>prethodna upozorenja koja je korisnik ignorisao.</p>
</li>
</ul>
<p>Više podataka ne znači automatski i bolju zaštitu. Telemetrija koja nema definisanu svrhu povećava troškove, regulatorni rizik i posledice eventualnog curenja.</p>
<h3>2. Normalizacija</h3>
<p>Ista adresa može postojati na različitim mrežama, a isti domen može imati više poddomena i internacionalizovanih zapisa.</p>
<p>Pre poređenja treba normalizovati:</p>
<ul>
<li><p><code>chainId</code>;</p>
</li>
<li><p>format adrese;</p>
</li>
<li><p>checksummed prikaz gde je primenljiv;</p>
</li>
<li><p>Unicode i Punycode domene;</p>
</li>
<li><p>vremenske zone;</p>
</li>
<li><p>vrednosti tokena i broj decimala.</p>
</li>
</ul>
<p>Posebno je opasno porediti samo simbol tokena. <code>USDT</code> ili <code>ETH</code> u interfejsu nisu dovoljni da identifikuju ugovor i mrežu.</p>
<h3>3. Objašnjiva odluka</h3>
<p>Upozorenje treba da kaže šta je pronađeno:</p>
<blockquote>
<p>Ova adresa ranije nije korišćena i veoma liči na adresu kojoj ste već slali sredstva. Proverite celu adresu pre nastavka.</p>
</blockquote>
<p>To je korisnije od poruke:</p>
<blockquote>
<p>Transakcija je rizična.</p>
</blockquote>
<p>Korisnik mora da zna koju pretpostavku treba da proveri.</p>
<h3>4. Proporcionalna frikcija</h3>
<p>Nije svaki rizik razlog za blokadu.</p>
<p>Moguće reakcije su:</p>
<ul>
<li><p>informativna poruka;</p>
</li>
<li><p>dodatni ekran sa detaljima;</p>
</li>
<li><p>ponovno unošenje dela adrese;</p>
</li>
<li><p>potvrda na drugom uređaju;</p>
</li>
<li><p>kratko odlaganje;</p>
</li>
<li><p>razgovor sa podrškom;</p>
</li>
<li><p>privremena blokada;</p>
</li>
<li><p>eskalacija security timu.</p>
</li>
</ul>
<p>Previše upozorenja stvara alert fatigue. Posle nekoliko generičkih poruka korisnik razvija naviku da sve potvrđuje bez čitanja.</p>
<h3>5. Audit trail</h3>
<p>Za svaku rizičnu operaciju korisno je sačuvati:</p>
<ul>
<li><p>ID korisnika ili pseudonimizovani identifikator;</p>
</li>
<li><p>vreme događaja;</p>
</li>
<li><p>mrežu i adresu;</p>
</li>
<li><p><code>txHash</code>, ako postoji;</p>
</li>
<li><p>aktivirana pravila;</p>
</li>
<li><p>prikazano upozorenje;</p>
</li>
<li><p>odluku korisnika;</p>
</li>
<li><p>verziju risk enginea.</p>
</li>
</ul>
<p>Ovo nije samo materijal za istragu. Bez kvalitetnog audit loga nije moguće proceniti da li upozorenja zaista sprečavaju gubitke ili samo ometaju legitimne korisnike.</p>
<h2>Koliko ovakva zaštita košta</h2>
<p>Ne postoji jedna cena jer različiti slojevi rešavaju različite probleme.</p>
<p>Osnovna pravila, kontekstualna upozorenja, provera nove adrese i audit log mogu se izgraditi unutar postojeće aplikacije. Glavni trošak je vreme product, frontend, backend i security tima.</p>
<p>Čitanje stanja tokena i <code>allowance</code> vrednosti može koristiti postojeću RPC infrastrukturu. Poništavanje odobrenja je on-chain transakcija i zato korisnik plaća mrežnu naknadu.</p>
<p>Simulacija transakcija, reputacija domena, detekcija wallet drainera i praćenje tokova sredstava mogu se kupiti kao spoljne usluge ili izgraditi interno. Samostalna implementacija smanjuje zavisnost od jednog dobavljača, ali zahteva održavanje čvorova, indeksera, pravila i izvora podataka.</p>
<p>Najskuplja greška često nije račun za infrastrukturu, već pogrešna odluka proizvoda:</p>
<ul>
<li><p>previše stroga pravila blokiraju legitimne korisnike;</p>
</li>
<li><p>previše blaga pravila propuštaju očiglednu prevaru;</p>
</li>
<li><p>nejasna upozorenja stvaraju lažan osećaj sigurnosti;</p>
</li>
<li><p>oznaka „bezbedno“ može se protumačiti kao garancija.</p>
</li>
</ul>
<p>Zato je bolje prikazivati konkretne signale nego donositi apsolutne presude.</p>
<h2>Incident response u prvih nekoliko sati</h2>
<p>Ako je korisnik već stupio u interakciju sa prevarom, najpre treba utvrditi šta je kompromitovano.</p>
<h3>Ako je poslat samo novac</h3>
<p>Sačuvati:</p>
<ul>
<li><p><code>txHash</code>;</p>
</li>
<li><p>mrežu;</p>
</li>
<li><p>adresu primaoca;</p>
</li>
<li><p>iznos i token;</p>
</li>
<li><p>vreme transakcije;</p>
</li>
<li><p>komunikaciju sa napadačem;</p>
</li>
<li><p>URL, domen i korisničke naloge;</p>
</li>
<li><p>potvrde kupovine ili povlačenja sa menjačnice.</p>
</li>
</ul>
<p>Ako su sredstva poslata sa centralizovane menjačnice ili ka njoj, incident treba odmah prijaviti toj platformi. Brzina je važna jer se sredstva mogu prebaciti kroz više adresa.</p>
<h3>Ako je odobren zlonamerni ugovor</h3>
<p>Treba proveriti i opozvati aktivna token odobrenja. Samo odvajanje novčanika od sajta ne uklanja <code>allowance</code>.</p>
<p>Ako postoji sumnja da je napadač dobio seed frazu ili privatni ključ, opozivanje odobrenja nije dovoljno. Preostalu imovinu treba premestiti u nov novčanik čiji ključevi nisu izvedeni iz kompromitovanog seeda.</p>
<h3>Ako je kompromitovan uređaj</h3>
<p>Uređaj ne treba koristiti za formiranje novog novčanika dok se ne proveri ili ponovo instalira. U suprotnom, novi ključevi mogu završiti kod istog napadača.</p>
<p>Treba promeniti povezane lozinke, prekinuti aktivne sesije i uključiti višefaktorsku autentifikaciju tamo gde je dostupna.</p>
<h3>Prijava u Srbiji</h3>
<p>Nacionalni CERT prima prijave fizičkih lica, malih i srednjih preduzeća i operatora važnih IKT sistema. Formular predviđa unos indikatora kompromitacije kao što su domeni, URL-ovi, IP adrese i hash vrednosti. Na stranici za prijavu nalazi se i upućivanje na platformu „Sajber straža“ Ministarstva unutrašnjih poslova za slučajeve sumnje na visokotehnološki kriminal.</p>
<p>Prijava ne garantuje povraćaj sredstava, ali stvara trag koji može povezati više žrtava, domena, naloga i adresa sa istom operacijom.</p>
<h2>Šta bi trebalo da ostane u proizvodu</h2>
<p>Najbolja zaštita za početnike nije još jedan modal sa upozorenjem da su kriptovalute rizične.</p>
<p>Korisniku treba pomoći u trenutku kada donosi konkretnu odluku:</p>
<ul>
<li><p>kada prvi put šalje sredstva novoj adresi;</p>
</li>
<li><p>kada adresa liči na onu iz istorije;</p>
</li>
<li><p>kada ugovor traži neograničen <code>allowance</code>;</p>
</li>
<li><p>kada potpis proizvodi ovlašćenje umesto obične prijave;</p>
</li>
<li><p>kada token nema proverljiv ugovor ili likvidnost;</p>
</li>
<li><p>kada se povlačenje uslovljava dodatnom uplatom;</p>
</li>
<li><p>kada podrška traži podatak koji legitimna podrška nikada ne sme da traži.</p>
</li>
</ul>
<p>Kripto prevare nisu samo problem edukacije. One su problem dizajna sistema.</p>
<p>Dobar proizvod ne pretpostavlja da će korisnik prepoznati svaki socijalni inženjering, pročitati svaki karakter adrese ili razumeti razliku između povezivanja novčanika, potpisa poruke, token odobrenja i prenosa sredstava.</p>
<p>On tu razliku prikazuje pre nego što korisnik napravi nepovratnu grešku.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati USDT i USDC. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://www.europol.europa.eu/media-press/newsroom/news/call-centres-selling-fake-crypto-taken-down-in-bulgaria-serbia-and-cyprus">Call centres selling fake crypto taken down in Bulgaria, Serbia and Cyprus, Europol</a></p>
</li>
<li><p><a href="https://www.eurojust.europa.eu/news/takedown-fraudulent-cryptocurrency-network-bulgaria-cyprus-and-serbia">Takedown of fraudulent cryptocurrency network in Bulgaria, Cyprus and Serbia, Eurojust</a></p>
</li>
<li><p><a href="https://cert.rs/rs/obavestenje/1420-Prevare-u-vezi-sa-ulaganjima-u-kriptovalute.html">Prevare u vezi sa ulaganjima u kriptovalute, Nacionalni CERT Republike Srbije</a></p>
</li>
<li><p><a href="https://www.nbs.rs/sr/ciljevi-i-funkcije/nadzor-nad-finansijskim-institucijama/digital-imo/reg_di/index.html">Registar pružalaca usluga povezanih s virtuelnim valutama, Narodna banka Srbije</a></p>
</li>
<li><p><a href="https://consumer.ftc.gov/consumer-alerts/2024/11/task-scams-create-illusion-making-money">Task scams create the illusion of making money, Federal Trade Commission</a></p>
</li>
<li><p><a href="https://www.ic3.gov/AnnualReport/Reports/2023_IC3CryptocurrencyReport.pdf">Confidence-Enabled Cryptocurrency Investment Fraud, FBI Internet Crime Complaint Center</a></p>
</li>
<li><p><a href="https://support.metamask.io/stay-safe/safety-in-web3/what-are-metamasks-official-support-channels">MetaMask’s official support channels, MetaMask Help Center</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-20">ERC-20 Token Standard, Ethereum Improvement Proposals</a></p>
</li>
<li><p><a href="https://ethereum.org/guides/how-to-revoke-token-access">How to revoke smart contract access to your crypto funds, ethereum.org</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-712">EIP-712: Typed structured data hashing and signing</a></p>
</li>
<li><p><a href="https://support.metamask.io/id/stay-safe/protect-yourself/wallet-and-hardware/address-poisoning-scams">Address poisoning scams, MetaMask Help Center</a></p>
</li>
<li><p><a href="https://ethereum.org/guides/how-to-id-scam-tokens">How to identify scam tokens, ethereum.org</a></p>
</li>
<li><p><a href="https://www.ic3.gov/PSA/2025/PSA250813">Fictitious Law Firms Targeting Cryptocurrency Scam Victims, FBI Internet Crime Complaint Center</a></p>
</li>
<li><p><a href="https://www.cert.rs/rs/prijava.html">Prijavi incident, Nacionalni CERT Republike Srbije</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/"><strong>Volet Srbija</strong></a></p>
</li>
</ol>
<p><em>English version:</em> Tehničku analizu i threat-modeling na engleskom pročitajte na Dev.to: <a href="https://dev.to/kriptomuza/30-crypto-scams-every-web3-developer-must-threat-model-40dk">30 Crypto Scams Every Web3 Developer Must Threat-Model</a></p>
]]></content:encoded></item><item><title><![CDATA[Menjačnica ili novčanik: gde tvoj kripto zaista živi]]></title><description><![CDATA[Kada aplikacija menjačnice prikaže 1.42 ETH, a wallet ekstenzija prikaže isti iznos, interfejsi izgledaju slično. Ispod njih rade dva fundamentalno različita sistema.
Na menjačnici najčešće poseduješ ]]></description><link>https://kripto-pocetnica.hashnode.dev/menja-nica-ili-nov-anik-gde-tvoj-kripto-zaista-ivi</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/menja-nica-ili-nov-anik-gde-tvoj-kripto-zaista-ivi</guid><category><![CDATA[Blockchain]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[wallet]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[blockchain security]]></category><category><![CDATA[Bitcoin]]></category><category><![CDATA[Ethereum]]></category><category><![CDATA[Cryptocurrency]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Mon, 21 Sep 2026 22:22:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/47db80b3-a585-4025-9c6d-cf4febd513f7.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Kada aplikacija menjačnice prikaže <code>1.42 ETH</code>, a wallet ekstenzija prikaže isti iznos, interfejsi izgledaju slično. Ispod njih rade dva fundamentalno različita sistema.</p>
<p>Na menjačnici najčešće poseduješ stavku u internom ledgeru operatora. Menjačnica kontroliše ključeve, bira kada će napraviti blockchain transakciju i određuje da li povlačenje može da bude izvršeno.</p>
<p>U self-custody novčaniku kontrolišeš mehanizam kojim se transakcija autorizuje. To može biti privatni ključ, hardverski uređaj, skup potpisa ili smart account sa sopstvenim pravilima.</p>
<p>Blockchain ne zna da si se prijavio mejlom, da je KYC odobren niti da Coinbase, Kraken ili neka druga platforma u internoj bazi vodi stanje na tvoje ime. Blockchain vidi adrese, skripte, smart contract naloge, potpise i promene stanja.</p>
<p>Za developera ova razlika nije filozofska. Ona određuje:</p>
<ul>
<li><p>ko može da zaustavi isplatu</p>
</li>
<li><p>gde se nalazi tajna koja kontroliše sredstva</p>
</li>
<li><p>šta se dešava kada API nije dostupan</p>
</li>
<li><p>kako se sprečavaju duple isplate</p>
</li>
<li><p>ko plaća mrežnu proviziju</p>
</li>
<li><p>kako se radi oporavak posle incidenta</p>
</li>
<li><p>koji sistem je izvor istine</p>
</li>
<li><p>koliko infrastrukture moraš sam da izgradiš</p>
</li>
</ul>
<h2>Kratak odgovor: gde je kripto</h2>
<p>Kripto nije fizički smešten u aplikaciji, browser ekstenziji, hardverskom uređaju ili fajlu sa seed frazom.</p>
<p>Na blockchainu postoji stanje koje određuje pod kojim uslovima određena sredstva mogu da budu potrošena. Novčanik čuva ili koristi podatke potrebne da zadovolji te uslove.</p>
<p>Kod Ethereum externally owned account, ili EOA naloga, kontrola se dokazuje potpisom napravljenim odgovarajućim privatnim ključem. Kod smart accounta pravila autorizacije izvršava ugovor. Kod Bitcoina wallet prati nepotrošene izlaze, odnosno UTXO skup, i pravi transakciju koja zadovoljava uslove njihovog trošenja.</p>
<p>Zato je preciznije reći:</p>
<blockquote>
<p>Novčanik ne čuva coine. Novčanik čuva ili koristi autoritet za njihovo trošenje.</p>
</blockquote>
<p>Ako je kripto na menjačnici, korisnik obično ne poseduje taj autoritet. Menjačnica ga poseduje, dok korisniku kroz internu evidenciju priznaje određeno stanje.</p>
<h2>Šta se zapravo dešava na menjačnici</h2>
<p>Centralizovana menjačnica je kombinacija više sistema:</p>
<ul>
<li><p>sistema naloga i identiteta</p>
</li>
<li><p>KYC i risk servisa</p>
</li>
<li><p>internog finansijskog ledgera</p>
</li>
<li><p>trading enginea</p>
</li>
<li><p>servisa za depozite</p>
</li>
<li><p>servisa za povlačenja</p>
</li>
<li><p>hot, warm i cold wallet infrastrukture</p>
</li>
<li><p>procesa za usaglašavanje internih i onchain stanja</p>
</li>
</ul>
<p>Kada korisnik A na menjačnici proda <code>0.1 BTC</code> korisniku B, ne mora da postoji Bitcoin transakcija. Trading engine izvršava nalog, a interni ledger menja stanja korisnika.</p>
<p>Pojednostavljeno, rezultat može da izgleda ovako:</p>
<pre><code class="language-text">user_a.BTC -= 0.1
user_a.EUR += 5_800

user_b.EUR -= 5_800
user_b.BTC += 0.1
</code></pre>
<p>Ovi brojevi su ilustracija promene stanja, ne tržišna cena.</p>
<p>Za blockchain se ništa nije promenilo. BTC može ostati na istoj adresi koju kontroliše menjačnica. Promenio se samo interni odnos između korisnika i operatora platforme.</p>
<p>Onchain transakcija je obično potrebna tek kada:</p>
<ul>
<li><p>korisnik deponuje sredstva sa spoljne adrese</p>
</li>
<li><p>korisnik povlači sredstva na spoljnu adresu</p>
</li>
<li><p>menjačnica konsoliduje depozite</p>
</li>
<li><p>menjačnica premešta likvidnost između svojih walleta</p>
</li>
<li><p>menjačnica dopunjava hot wallet iz bezbednijeg skladišta</p>
</li>
</ul>
<h3>Depozitna adresa nije nužno mesto čuvanja</h3>
<p>Kada menjačnica dodeli korisniku depozitnu adresu, to ne znači da će sredstva trajno ostati na toj adresi.</p>
<p>Adresa pre svega može služiti za atribuciju. Sistem prati dolazne transakcije i povezuje ih sa internim korisničkim nalogom. Posle dovoljnog broja potvrda, interni ledger knjiži depozit, a sredstva mogu biti prebačena u zajednički wallet.</p>
<p>Na nekim mrežama atribucija se radi jedinstvenom adresom. Na drugim se koristi zajednička adresa uz dodatni identifikator, kao što su memo, tag ili destination tag.</p>
<p>Zbog toga integracija ne sme da modeluje depozit kao običan par:</p>
<pre><code class="language-text">asset + address
</code></pre>
<p>Pouzdaniji model uključuje najmanje:</p>
<pre><code class="language-text">asset + network + address + optional_memo
</code></pre>
<p><code>USDC</code> na Ethereumu, Base mreži i drugom podržanom lancu nisu ista ruta depozita, iako aplikacija svuda može prikazivati simbol <code>USDC</code>.</p>
<h2>Stanje na menjačnici nije isto što i onchain stanje</h2>
<p>Ako API menjačnice vrati da nalog ima <code>10 ETH</code>, to ne znači da postoji blockchain adresa sa tačno <code>10 ETH</code> rezervisana samo za tog korisnika.</p>
<p>To znači da interni sistem menjačnice priznaje određeno stanje nalogu. Sredstva mogu biti:</p>
<ul>
<li><p>raspoređena preko više walleta</p>
</li>
<li><p>objedinjena sa sredstvima drugih korisnika</p>
</li>
<li><p>delom u hot walletu</p>
</li>
<li><p>delom u hladnijem skladištu</p>
</li>
<li><p>u procesu konsolidacije</p>
</li>
<li><p>rezervisana zbog otvorenih naloga ili povlačenja</p>
</li>
</ul>
<p>Ovo je razlog zbog kojeg API menjačnice i blockchain explorer odgovaraju na različita pitanja.</p>
<p>API menjačnice odgovara na pitanje:</p>
<blockquote>
<p>Koliko interni sistem platforme priznaje ovom nalogu?</p>
</blockquote>
<p>Blockchain node odgovara na pitanje:</p>
<blockquote>
<p>Koje stanje trenutno postoji na ovom lancu i pod kojim uslovima može biti promenjeno?</p>
</blockquote>
<p>Ni jedno ni drugo samo po sebi nije dovoljno za finansijsko usaglašavanje aplikacije.</p>
<h2>Šta je onda novčanik</h2>
<p>Termin wallet se koristi za nekoliko različitih stvari:</p>
<ol>
<li><p>Aplikaciju koja prikazuje stanje i istoriju.</p>
</li>
<li><p>Key store koji čuva šifrovani privatni ključ.</p>
</li>
<li><p>Signer koji potpisuje transakcije.</p>
</li>
<li><p>Sistem za derivaciju više naloga iz jednog seed materijala.</p>
</li>
<li><p>Smart account sa programabilnim pravilima.</p>
</li>
<li><p>Servis koji kombinuje custody, policy engine i API.</p>
</li>
</ol>
<p>Klasičan full-service wallet obavlja najmanje četiri posla:</p>
<ul>
<li><p>generiše ili uvozi ključ</p>
</li>
<li><p>izvodi adresu iz javnog ključa</p>
</li>
<li><p>čita stanje sa mreže</p>
</li>
<li><p>pravi i potpisuje transakcije</p>
</li>
</ul>
<p>Ti poslovi ne moraju biti u istom procesu.</p>
<p>Bezbednija serverska arhitektura često ih razdvaja:</p>
<pre><code class="language-mermaid">flowchart LR
    A[Aplikacioni servis] --&gt; B[Transaction builder]
    B --&gt; C[Policy engine]
    C --&gt; D[Signer ili multisig]
    D --&gt; E[Broadcaster]
    E --&gt; F[Blockchain node]
    F --&gt; G[Indexer]
    G --&gt; H[Reconciliation worker]
    H --&gt; A
</code></pre>
<p>Aplikacioni servis zna da korisniku treba isplatiti određeni iznos. Signer ne mora da zna ništa o korisničkoj sesiji. On dobija predlog transakcije i potpisuje ga samo ako su zadovoljena pravila.</p>
<p>Ovo razdvajanje smanjuje mogućnost da kompromitovani web server automatski postane i kompromitovani treasury.</p>
<h2>Privatni ključ nije isto što i seed fraza</h2>
<p>Privatni ključ je tajna kojom se potpisuje za jedan konkretan nalog.</p>
<p>Seed fraza je ljudski čitljiv zapis materijala iz kojeg deterministički mogu da se izvedu mnogi ključevi. BIP-39 definiše postupak kojim se entropija predstavlja nizom reči i pretvara u binarni seed. Taj seed zatim može da se koristi u hijerarhijskim determinističkim walletima.</p>
<p>To donosi praktičnu prednost: jedan backup može obnoviti veliki skup adresa.</p>
<p>Istovremeno povećava blast radius. Ako neko dođe do seed fraze, često nije kompromitovan samo jedan nalog već čitavo stablo naloga izvedenih iz tog seeda.</p>
<p>Seed zato nije:</p>
<ul>
<li><p>lozinka za aplikaciju</p>
</li>
<li><p>vrednost za <code>.env</code> na web serveru</p>
</li>
<li><p>recovery code koji može biti promenjen</p>
</li>
<li><p>podatak koji treba poslati telemetry sistemu</p>
</li>
<li><p>string koji treba odštampati u CI logu</p>
</li>
</ul>
<p>Ako korisnik izgubi lozinku menjačnice, postoji procedura oporavka identiteta. Ako izgubi jedinu kopiju self-custody seeda i nema drugi recovery mehanizam, ne postoji centralni sistem koji može da izda novi pristup postojećim sredstvima.</p>
<h2>Potpis je stvarna granica kontrole</h2>
<p>Kod self-custody sistema aplikacija ne bi trebalo da traži privatni ključ korisnika. Ona priprema zahtev, a wallet prikazuje šta se potpisuje.</p>
<p>Na EVM mrežama browser walleti često izlažu provider interfejs zasnovan na EIP-1193 standardu. Aplikacija šalje RPC zahtev provideru, a wallet odlučuje da li će tražiti potvrdu korisnika i izvršiti operaciju.</p>
<p>Minimalna integracija može da izgleda ovako:</p>
<pre><code class="language-ts">interface Eip1193Provider {
    request(args: {
        method: string;
        params?: readonly unknown[] | object;
    }): Promise&lt;unknown&gt;;

    on(event: string, listener: (...args: unknown[]) =&gt; void): void;
}

async function connectWallet(provider: Eip1193Provider) {
    const accounts = await provider.request({
        method: "eth_requestAccounts",
    }) as string[];

    const chainId = await provider.request({
        method: "eth_chainId",
    }) as string;

    if (!accounts[0]) {
        throw new Error("Wallet nije vratio aktivan nalog");
    }

    return {
        address: accounts[0],
        chainId,
    };
}
</code></pre>
<p>Aplikacija ovde dobija javnu adresu i identifikator mreže. Ne dobija privatni ključ.</p>
<p>Produkcijska integracija mora da reaguje i na događaje kao što su promena naloga i promena mreže. Nije bezbedno pretpostaviti da će adresa sa početka sesije ostati aktivna do kraja checkout ili signing procesa.</p>
<p>Wallet takođe nije automatski izvor istine za poslovne podatke. To što je korisnik povezao adresu dokazuje samo da je wallet izložio tu adresu aplikaciji. Za dokaz kontrole obično je potreban challenge koji korisnik potpisuje, uz nonce i ograničen rok važenja.</p>
<h2>Bezbedan lokalni eksperiment sa potpisom</h2>
<p>Potpisivanje može da se isproba lokalno, bez slanja transakcije i bez korišćenja stvarnih sredstava. Sledeći primer koristi <code>ethers</code> v6 i efemerni wallet:</p>
<pre><code class="language-ts">import { randomUUID } from "node:crypto";
import { Wallet, verifyMessage } from "ethers";

const wallet = Wallet.createRandom();
const challenge = `wallet-demo:${randomUUID()}`;

const signature = await wallet.signMessage(challenge);
const recoveredAddress = verifyMessage(challenge, signature);

console.log({
    expected: wallet.address,
    recovered: recoveredAddress,
    valid: recoveredAddress === wallet.address,
});
</code></pre>
<p>Primer demonstrira osnovnu ideju: backend može iz potpisa i originalne poruke da rekonstruiše adresu potpisnika.</p>
<p>U stvarnoj autentikaciji challenge treba da sadrži najmanje:</p>
<ul>
<li><p>domen aplikacije</p>
</li>
<li><p>jednokratni nonce</p>
</li>
<li><p>vreme izdavanja</p>
</li>
<li><p>rok važenja</p>
</li>
<li><p>očekivani chain ili drugi kontekst, kada je relevantan</p>
</li>
<li><p>opis namene potpisa</p>
</li>
</ul>
<p>Potpis poruke ne sme automatski da se tretira kao odobrenje za proizvoljnu transakciju. UI mora jasno razlikovati prijavljivanje, davanje dozvole token ugovoru i slanje sredstava.</p>
<h2>EOA, multisig, MPC i smart account nisu ista stvar</h2>
<p>Rečenica „koristimo wallet” ne govori dovoljno o sigurnosnom modelu.</p>
<h3>EOA sa jednim ključem</h3>
<p>Jedan privatni ključ može samostalno da potpiše transakciju.</p>
<p>Prednosti:</p>
<ul>
<li><p>jednostavan model</p>
</li>
<li><p>široka kompatibilnost</p>
</li>
<li><p>nizak integracioni overhead</p>
</li>
<li><p>lako lokalno testiranje</p>
</li>
</ul>
<p>Mane:</p>
<ul>
<li><p>jedan ključ predstavlja single point of failure</p>
</li>
<li><p>kompromitovanje ključa znači direktnu mogućnost trošenja</p>
</li>
<li><p>nema ugrađenog approval workflowa</p>
</li>
<li><p>rotacija ključa uglavnom znači prelazak na novi nalog</p>
</li>
</ul>
<p>EOA sa ključem u environment promenljivoj možda jeste tehnički self-custody, ali nije nužno dobra custody arhitektura.</p>
<h3>Hardverski wallet</h3>
<p>Ključ se nalazi u specijalizovanom uređaju i potpis se obavlja bez izlaganja ključa aplikacionom računaru.</p>
<p>To smanjuje rizik ekstrakcije ključa, ali ne rešava sve probleme. Korisnik i dalje može potpisati zlonamernu ili pogrešno prikazanu transakciju. Bezbednost zavisi i od toga šta uređaj može jasno da prikaže pre potpisa.</p>
<h3>Multisig</h3>
<p>Za izvršenje je potreban prag potpisa, na primer dva od tri vlasnika.</p>
<p>Na EVM mrežama multisig je često implementiran kao smart account. Account čuva listu vlasnika i threshold, proverava potpise i tek zatim izvršava poziv.</p>
<p>Prednosti:</p>
<ul>
<li><p>nema jednog obaveznog potpisnika</p>
</li>
<li><p>moguće je odvojiti tehničku i poslovnu kontrolu</p>
</li>
<li><p>uređaj jednog potpisnika može biti izgubljen bez gubitka treasuryja</p>
</li>
<li><p>approval proces može odgovarati organizacionim pravilima</p>
</li>
</ul>
<p>Mane:</p>
<ul>
<li><p>više operativnih koraka</p>
</li>
<li><p>skuplje onchain izvršenje od jednostavnog EOA transfera</p>
</li>
<li><p>potrebno je upravljati vlasnicima i pragom</p>
</li>
<li><p>pogrešna promena konfiguracije može zaključati sredstva</p>
</li>
</ul>
<h3>MPC</h3>
<p>Multi-party computation deli proces potpisivanja između više strana tako da kompletan privatni ključ ne mora postojati na jednom mestu.</p>
<p>MPC nije sinonim za multisig.</p>
<p>Kod multisiga mreža ili smart contract vidi i proverava više potpisa. Kod threshold MPC sistema rezultat prema mreži može izgledati kao jedan standardni potpis, iako je interno nastao saradnjom više učesnika.</p>
<p>Ta razlika utiče na:</p>
<ul>
<li><p>kompatibilnost sa protokolima</p>
</li>
<li><p>onchain trošak</p>
</li>
<li><p>audit trag</p>
</li>
<li><p>recovery model</p>
</li>
<li><p>zavisnost od MPC infrastrukture</p>
</li>
</ul>
<h3>Smart account</h3>
<p>Smart account je nalog čija pravila autorizacije izvršava kod.</p>
<p>Pored više potpisnika, može podržavati:</p>
<ul>
<li><p>limite po periodu</p>
</li>
<li><p>session keys</p>
</li>
<li><p>allowlist odredišta</p>
</li>
<li><p>recovery module</p>
</li>
<li><p>batching</p>
</li>
<li><p>sponzorisanje mrežnih provizija</p>
</li>
<li><p>različite uloge za predlaganje i izvršenje</p>
</li>
</ul>
<p>Programabilnost donosi fleksibilnost, ali i novu površinu napada. Greška u modulu, policyju ili upgrade mehanizmu može biti jednako ozbiljna kao kompromitovan privatni ključ.</p>
<h2>Realan use-case: stablecoin isplate saradnicima</h2>
<p>Zamislimo SaaS platformu koja jednom nedeljno isplaćuje nekoliko stotina saradnika u stablecoinu.</p>
<p>Sistem prima fiat prihod, konvertuje deo sredstava, obračunava obaveze i šalje stablecoin na adrese saradnika.</p>
<p>Naizgled jednostavan zahtev otvara veliki broj pitanja:</p>
<ul>
<li><p>Ko bira mrežu?</p>
</li>
<li><p>Ko proverava da adresa pripada očekivanoj mreži?</p>
</li>
<li><p>Šta ako je token simbol isti na više mreža?</p>
</li>
<li><p>Ko finansira native token potreban za gas?</p>
</li>
<li><p>Šta ako transakcija ostane pending?</p>
</li>
<li><p>Kada isplatu smatramo konačnom?</p>
</li>
<li><p>Kako sprečavamo duplu isplatu posle timeouta?</p>
</li>
<li><p>Kako dokazujemo šta je korisnik uneo?</p>
</li>
<li><p>Kako se radi refund?</p>
</li>
<li><p>Ko odobrava veliku isplatu?</p>
</li>
<li><p>Šta ako je exchange API dostupan, ali su povlačenja privremeno zaustavljena?</p>
</li>
</ul>
<p>Postoje tri razumna modela.</p>
<h2>Model 1: isplate preko menjačnice</h2>
<p>Aplikacija drži operativna sredstva na poslovnom nalogu menjačnice i preko API-ja zahteva povlačenja.</p>
<pre><code class="language-mermaid">flowchart LR
    A[Payroll servis] --&gt; B[Interni ledger]
    B --&gt; C[Approval i risk]
    C --&gt; D[Exchange API]
    D --&gt; E[Menjačnica]
    E --&gt; F[Blockchain]
    F --&gt; G[Adresa saradnika]
</code></pre>
<h3>Prednosti</h3>
<p>Menjačnica preuzima:</p>
<ul>
<li><p>upravljanje privatnim ključevima</p>
</li>
<li><p>održavanje node infrastrukture</p>
</li>
<li><p>izbor i dopunjavanje hot walleta</p>
</li>
<li><p>emitovanje transakcije</p>
</li>
<li><p>deo fee managementa</p>
</li>
<li><p>praćenje podržanih mreža</p>
</li>
</ul>
<p>Tim može relativno brzo da dođe do produkcionog workflowa.</p>
<h3>Nedostaci</h3>
<p>Aplikacija zavisi od:</p>
<ul>
<li><p>dostupnosti API-ja</p>
</li>
<li><p>statusa poslovnog naloga</p>
</li>
<li><p>limita povlačenja</p>
</li>
<li><p>risk i compliance odluka operatora</p>
</li>
<li><p>dostupnosti konkretne mreže</p>
</li>
<li><p>interne obrade povlačenja</p>
</li>
<li><p>promena API-ja i pravila autentikacije</p>
</li>
</ul>
<p>API odgovor da je zahtev prihvaćen nije isto što i onchain potvrda. Menjačnica može prvo kreirati interni transfer objekat, zatim obraditi proveru i tek kasnije emitovati blockchain transakciju.</p>
<p>Zato status <code>accepted</code> ili <code>pending</code> ne sme automatski značiti <code>paid</code>.</p>
<h2>Model 2: self-custody hot wallet</h2>
<p>Backend kontroliše operativni wallet i sam šalje transakcije.</p>
<pre><code class="language-mermaid">flowchart LR
    A[Payroll servis] --&gt; B[Queue]
    B --&gt; C[Policy engine]
    C --&gt; D[Signer]
    D --&gt; E[RPC node]
    E --&gt; F[Blockchain]
    F --&gt; G[Indexer]
    G --&gt; H[Reconciliation]
</code></pre>
<h3>Prednosti</h3>
<p>Tim kontroliše:</p>
<ul>
<li><p>trenutak slanja</p>
</li>
<li><p>fee strategiju</p>
</li>
<li><p>batching</p>
</li>
<li><p>nonce management</p>
</li>
<li><p>zamenu pending transakcije</p>
</li>
<li><p>izbor RPC i indexing provajdera</p>
</li>
<li><p>način potvrđivanja settlementa</p>
</li>
</ul>
<h3>Nedostaci</h3>
<p>Tim je odgovoran za:</p>
<ul>
<li><p>zaštitu ključeva</p>
</li>
<li><p>dostupnost signera</p>
</li>
<li><p>dopunjavanje native gas tokena</p>
</li>
<li><p>nonce konkurentnost</p>
</li>
<li><p>monitoring mempoola</p>
</li>
<li><p>recovery proceduru</p>
</li>
<li><p>incident response</p>
</li>
<li><p>proveru token ugovora i mreže</p>
</li>
</ul>
<p>Najopasnija greška je povezati javni API server direktno sa neograničenim ključem treasury walleta.</p>
<p>Ako napadač dobije remote code execution na aplikacionom serveru, cilj arhitekture mora biti da i dalje ne može proizvoljno da prebaci sva sredstva.</p>
<p>To zahteva policy granicu između aplikacije i signera.</p>
<h2>Model 3: hibridni treasury</h2>
<p>Hibridna arhitektura koristi više nivoa:</p>
<ul>
<li><p>menjačnicu za konverziju i fiat tokove</p>
</li>
<li><p>mali hot wallet za automatizovane isplate</p>
</li>
<li><p>multisig ili drugi zaštićeni account za rezervu</p>
</li>
<li><p>periodično dopunjavanje operativnog walleta</p>
</li>
<li><p>limite po transakciji i periodu</p>
</li>
</ul>
<pre><code class="language-mermaid">flowchart TD
    A[Fiat prihod] --&gt; B[Menjačnica]
    B --&gt; C[Operativni hot wallet]
    D[Multisig rezerva] --&gt; C
    C --&gt; E[Automatske isplate]
    E --&gt; F[Korisničke adrese]
    C --&gt; G[Alarm za nizak saldo]
    G --&gt; H[Predlog dopune]
    H --&gt; D
</code></pre>
<p>Ovaj model ograničava štetu.</p>
<p>Ako je hot wallet kompromitovan, izložen je njegov trenutni operativni saldo, a ne cela rezerva. Ako menjačnica blokira povlačenje, postojeća sredstva u hot walletu i dalje mogu da pokriju deo obaveza.</p>
<p>Cena je složeniji reconciliation između najmanje tri sistema:</p>
<ul>
<li><p>internog poslovnog ledgera</p>
</li>
<li><p>stanja na menjačnici</p>
</li>
<li><p>onchain walleta</p>
</li>
</ul>
<p>Za većinu ozbiljnih payment i treasury sistema ovo je realniji model od čistog „sve na menjačnici” ili „jedan private key na serveru”.</p>
<h2>Workflow za integraciju sa menjačnicom</h2>
<p>API konkretne menjačnice se razlikuje, ali pouzdan workflow ima slične faze.</p>
<h3>1. Modeluj asset i network odvojeno</h3>
<p>Nemoj koristiti samo ticker kao identitet sredstva.</p>
<pre><code class="language-ts">type AssetRoute = {
    asset: "USDC";
    network: "ethereum" | "base";
    contractAddress?: string;
    decimals: number;
};
</code></pre>
<p>U ozbiljnijem sistemu ove vrednosti ne treba nekritički hardkodovati. Konfiguracija mora biti verzionisana i proverena prema dokumentaciji provajdera i podacima mreže.</p>
<h3>2. Razdvoji API dozvole</h3>
<p>Ključ za čitanje stanja ne treba automatski da ima pravo povlačenja.</p>
<p>Ako platforma podržava granularne dozvole, napravi odvojene identitete za:</p>
<ul>
<li><p>read-only reporting</p>
</li>
<li><p>trading</p>
</li>
<li><p>kreiranje povlačenja</p>
</li>
<li><p>administraciju adresa</p>
</li>
<li><p>reconciliation worker</p>
</li>
</ul>
<p>IP allowlist nije zamena za zaštitu tajne, ali može smanjiti površinu napada.</p>
<h3>3. Koristi interni idempotency ključ</h3>
<p>Mrežni timeout ne govori da li je zahtev izvršen.</p>
<p>Sledeći scenario je čest:</p>
<ol>
<li><p>Aplikacija pošalje zahtev za povlačenje.</p>
</li>
<li><p>Menjačnica prihvati zahtev.</p>
</li>
<li><p>HTTP odgovor ne stigne zbog prekida veze.</p>
</li>
<li><p>Worker ponovi zahtev.</p>
</li>
<li><p>Nastanu dva povlačenja.</p>
</li>
</ol>
<p>Ako API podržava idempotency ili client reference, koristi ga. Ako ne podržava, potreban je interni state machine i provera udaljenog stanja pre retryja.</p>
<h3>4. Ne mapiraj HTTP status direktno na finansijski status</h3>
<p><code>200 OK</code> znači da je API poziv obrađen. Ne znači nužno da je primalac dobio sredstva.</p>
<p>Minimalni model statusa može izgledati ovako:</p>
<pre><code class="language-ts">type PayoutStatus =
    | "created"
    | "awaiting_approval"
    | "submitting"
    | "provider_accepted"
    | "broadcast"
    | "confirming"
    | "settled"
    | "rejected"
    | "failed"
    | "manual_review";
</code></pre>
<p><code>failed</code> takođe nije uvek konačan. Ako ne znaš da li je provajder prihvatio zahtev, realan status je <code>manual_review</code> ili druga eksplicitna kategorija neizvesnosti.</p>
<h3>5. Usaglasi provider transfer i onchain transakciju</h3>
<p>Čuvaj odvojeno:</p>
<ul>
<li><p>sopstveni payout ID</p>
</li>
<li><p>provider transfer ID</p>
</li>
<li><p>transaction hash</p>
</li>
<li><p>asset</p>
</li>
<li><p>network</p>
</li>
<li><p>destination address</p>
</li>
<li><p>memo ili tag</p>
</li>
<li><p>bruto iznos</p>
</li>
<li><p>provider fee</p>
</li>
<li><p>network fee, kada je dostupan</p>
</li>
<li><p>vreme kreiranja</p>
</li>
<li><p>vreme emitovanja</p>
</li>
<li><p>vreme settlementa</p>
</li>
</ul>
<p>Jedna provider operacija ne mora uvek da odgovara tačno jednoj onchain transakciji. Menjačnica može batchovati više povlačenja u jednu transakciju.</p>
<p>Zbog toga <code>provider_transfer_id</code> i <code>transaction_hash</code> nisu isti tip identifikatora.</p>
<h2>Workflow za self-custody integraciju</h2>
<p>Kod self-custody sistema aplikacija preuzima više odgovornosti, ali dobija bolju kontrolu nad procesom.</p>
<h3>1. Kreiraj intent, ne transakciju</h3>
<p>Poslovni servis prvo treba da kreira nameru:</p>
<pre><code class="language-text">Isplati 250 USDC korisniku 1842 na Base mreži.
</code></pre>
<p>Tek posebna komponenta prevodi intent u konkretnu blockchain transakciju.</p>
<p>To omogućava proveru:</p>
<ul>
<li><p>poslovne obaveze</p>
</li>
<li><p>korisničke adrese</p>
</li>
<li><p>mreže</p>
</li>
<li><p>token ugovora</p>
</li>
<li><p>limita</p>
</li>
<li><p>duplih zahteva</p>
</li>
<li><p>compliance pravila</p>
</li>
<li><p>trenutnog stanja walleta</p>
</li>
</ul>
<h3>2. Rezerviši sredstva u internom ledgeru</h3>
<p>Nemoj čekati blockchain da bi sprečio dvostruko trošenje na nivou aplikacije.</p>
<p>Kada payout uđe u obradu, iznos treba prebaciti iz <code>available</code> u <code>reserved</code>. Posle settlementa prelazi u <code>paid</code>. Ako se operacija bezbedno otkaže, rezervacija se vraća.</p>
<p>Blockchain stanje samo po sebi ne zna koji deo salda si već obećao drugim korisnicima.</p>
<h3>3. Napravi transakciju deterministički</h3>
<p>Transaction builder dobija odobren intent i formira:</p>
<ul>
<li><p>odredišnu adresu</p>
</li>
<li><p>količinu u atomic units</p>
</li>
<li><p>calldata za token transfer</p>
</li>
<li><p>chain ID</p>
</li>
<li><p>nonce</p>
</li>
<li><p>fee parametre</p>
</li>
<li><p>rok važenja, kada format to podržava</p>
</li>
</ul>
<p>Finansijske iznose ne treba čuvati u JavaScript <code>number</code> tipu. Koristi integer vrednosti u najmanjoj jedinici ili proverenu decimalnu biblioteku.</p>
<h3>4. Proveri policy pre potpisa</h3>
<p>Signer ili servis ispred njega treba da proveri:</p>
<ul>
<li><p>da li je chain dozvoljen</p>
</li>
<li><p>da li je token contract dozvoljen</p>
</li>
<li><p>maksimalni iznos</p>
</li>
<li><p>dnevni limit</p>
</li>
<li><p>odredišnu adresu</p>
</li>
<li><p>broj isplata u batchu</p>
</li>
<li><p>očekivani calldata selector</p>
</li>
<li><p>vezu sa odobrenim payout intentom</p>
</li>
</ul>
<p>Signer koji slepo potpisuje bilo koji payload nije sigurnosna granica. On je samo udaljeni privatni ključ.</p>
<h3>5. Broadcast nije settlement</h3>
<p>Posle emitovanja transakcija može biti:</p>
<ul>
<li><p>u mempoolu</p>
</li>
<li><p>privremeno nevidljiva nekim nodeovima</p>
</li>
<li><p>zamenjena drugom transakcijom sa istim nonceom</p>
</li>
<li><p>uključena u blok</p>
</li>
<li><p>privremeno uključena pa uklonjena reorganizacijom</p>
</li>
<li><p>uspešno uključena, ali sa neuspešnim izvršenjem smart contract poziva</p>
</li>
</ul>
<p>Zato treba razlikovati:</p>
<pre><code class="language-text">signed -&gt; broadcast -&gt; included -&gt; confirmed -&gt; settled
</code></pre>
<p>Na EVM mreži receipt sa statusom neuspeha znači da je transakcija uključena, ali operacija nije uspela. Mrežna provizija je ipak potrošena.</p>
<h3>6. Reconciliation mora biti nezavisan od request procesa</h3>
<p>HTTP handler koji inicira isplatu ne treba da čeka konačnost mreže.</p>
<p>Pozadinski worker treba periodično da:</p>
<ul>
<li><p>preuzima receipt</p>
</li>
<li><p>proverava broj potvrda</p>
</li>
<li><p>dekodira relevantne evente</p>
</li>
<li><p>upoređuje očekivani i stvarni token transfer</p>
</li>
<li><p>detektuje zamenjene ili nestale transakcije</p>
</li>
<li><p>ažurira interni ledger</p>
</li>
<li><p>podiže alarm kada stanje nije moguće automatski objasniti</p>
</li>
</ul>
<h2>Nonce i UTXO menjaju način rada</h2>
<p>EVM i Bitcoin walleti ne rešavaju konkurentnost na isti način.</p>
<h3>EVM account model</h3>
<p>EOA transakcije koriste sekvencijalni nonce. Dve paralelne transakcije sa istog naloga ne smeju nekontrolisano da izaberu isti nonce.</p>
<p>Ako deset workera istovremeno pita node za trenutni nonce, svi mogu dobiti isti rezultat. Potreban je centralizovan nonce manager, serijalizacija ili drugi koordinacioni mehanizam.</p>
<p>Jedna zaglavljena transakcija sa nižim nonceom može zadržati kasnije transakcije tog naloga.</p>
<h3>Bitcoin UTXO model</h3>
<p>Bitcoin transakcija bira konkretne nepotrošene izlaze kao inpute. Konkurentnost znači sprečiti da dva workera pokušaju da potroše isti UTXO.</p>
<p>Wallet mora da rešava:</p>
<ul>
<li><p>coin selection</p>
</li>
<li><p>rezervaciju inputa</p>
</li>
<li><p>change output</p>
</li>
<li><p>procenu veličine transakcije</p>
</li>
<li><p>fee rate</p>
</li>
<li><p>praćenje nepotvrđenog changea</p>
</li>
</ul>
<p>Zbog toga „pošalji iznos” nije ista backend operacija na svim blockchainima. Apstrakcija koja potpuno skriva model mreže često počne da curi čim dođu batching, fee bumping i paralelne isplate.</p>
<h2>Koliko košta menjačnica, a koliko novčanik</h2>
<p>Ne postoji jedan broj koji daje pošten odgovor. Trošak ima više slojeva.</p>
<h3>Trošak menjačnice</h3>
<p>Ukupan trošak može uključivati:</p>
<ul>
<li><p>trading fee</p>
</li>
<li><p>spread</p>
</li>
<li><p>fee za povlačenje</p>
</li>
<li><p>network-specific fee</p>
</li>
<li><p>minimalni iznos povlačenja</p>
</li>
<li><p>trošak neuspelih ili ručno obrađenih zahteva</p>
</li>
<li><p>vreme čekanja i zaključan kapital</p>
</li>
<li><p>razvoj i održavanje integracije</p>
</li>
<li><p>compliance i operativne troškove</p>
</li>
</ul>
<p>Fee za povlačenje ne mora odgovarati stvarnom network feeju konkretne transakcije. Menjačnica može koristiti fiksnu tarifu, dinamičku tarifu ili batching.</p>
<p>Zbog toga cenu treba meriti kao:</p>
<pre><code class="language-text">ukupan trošak provajdera / broj uspešno završenih isplata
</code></pre>
<p>U obračun treba uključiti i operativni rad, ne samo stavku koju API vrati kao fee.</p>
<h3>Trošak self-custody sistema</h3>
<p>Onchain trošak zavisi od mreže.</p>
<p>Na EVM mrežama osnovni odnos je:</p>
<pre><code class="language-text">transaction fee = gas used * effective gas price
</code></pre>
<p>Token transfer je smart contract poziv i obično zahteva više gasa od jednostavnog transfera native tokena. Smart account, multisig i batch poziv imaju drugačiji profil potrošnje.</p>
<p>Na Bitcoinu se fee tipično određuje veličinom transakcije i fee rateom:</p>
<pre><code class="language-text">transaction fee = virtual size * fee rate
</code></pre>
<p>Broj inputa i outputa zato direktno utiče na cenu. Wallet sa velikim brojem sitnih UTXO izlaza može imati skupu konsolidaciju čak i kada je ukupan saldo visok.</p>
<p>Pored network feeja, self-custody sistem ima trošak:</p>
<ul>
<li><p>RPC i indexing infrastrukture</p>
</li>
<li><p>HSM, MPC ili signer servisa</p>
</li>
<li><p>hardverskih uređaja</p>
</li>
<li><p>audita</p>
</li>
<li><p>monitoringa</p>
</li>
<li><p>incident response procesa</p>
</li>
<li><p>bezbednog backup i recovery sistema</p>
</li>
<li><p>razvoja reconciliation logike</p>
</li>
</ul>
<p>Self-custody uklanja deo zavisnosti od menjačnice, ali ne pretvara infrastrukturu u besplatnu.</p>
<h2>Najveće greške u implementaciji</h2>
<h3>Jedan status <code>completed</code></h3>
<p>Finansijska operacija ima više faza. Jedan boolean <code>completed</code> gubi informaciju potrebnu za retry i istragu incidenta.</p>
<h3>Ticker kao jedini identitet sredstva</h3>
<p><code>USDC</code> bez mreže i contract adrese nije dovoljno precizan identitet.</p>
<h3>Privatni ključ na istom serveru kao javni API</h3>
<p>Kompromitovanje aplikacije tada automatski postaje kompromitovanje sredstava.</p>
<h3>Retry bez idempotency zaštite</h3>
<p>Timeout nije dokaz neuspeha. Slepo ponavljanje može napraviti duplu isplatu.</p>
<h3>Oslanjanje samo na webhook</h3>
<p>Webhook može kasniti, biti dupliran ili ne stići. Potreban je periodični polling i reconciliation.</p>
<h3>Oslanjanje samo na polling</h3>
<p>Polling bez događaja povećava kašnjenje i opterećenje. Dobar sistem koristi događaje za brzinu, a periodično usaglašavanje za tačnost.</p>
<h3>Knjiženje depozita posle prve pojave transakcije</h3>
<p>Transakcija koja je viđena nije isto što i potvrđena transakcija. Politika potvrda treba da zavisi od mreže, vrednosti i prihvatljivog rizika.</p>
<h3>Logovanje potpunog request payloadа</h3>
<p>Payload može sadržati API potpise, adrese, memo vrednosti ili druge osetljive podatke. Signer logovi su posebno osetljivi.</p>
<h3>Nema procedure za kompromitovanje</h3>
<p>„Ključ je u HSM-u” nije kompletan incident plan. Potrebno je unapred znati:</p>
<ul>
<li><p>kako se zaustavljaju isplate</p>
</li>
<li><p>kako se povlače dozvole</p>
</li>
<li><p>kako se rotiraju operativni walleti</p>
</li>
<li><p>ko donosi odluku</p>
</li>
<li><p>kako se obaveštavaju zavisni servisi</p>
</li>
<li><p>kako se proverava šta je potpisano</p>
</li>
</ul>
<h2>Menjačnica i wallet imaju različite izvore istine</h2>
<p>Pouzdana arhitektura eksplicitno definiše autoritet za svaku vrstu podatka.</p>
<table>
<thead>
<tr>
<th>Podatak</th>
<th>Primarni izvor</th>
</tr>
</thead>
<tbody><tr>
<td>Obaveza prema korisniku</td>
<td>Interni poslovni ledger</td>
</tr>
<tr>
<td>Stanje naloga na menjačnici</td>
<td>API i izveštaji menjačnice</td>
</tr>
<tr>
<td>Onchain stanje</td>
<td>Blockchain node ili provereni indexer</td>
</tr>
<tr>
<td>Status poslovnog odobrenja</td>
<td>Interni approval sistem</td>
</tr>
<tr>
<td>Dokaz emitovanja</td>
<td>Transaction hash i mreža</td>
</tr>
<tr>
<td>Dokaz izvršenja</td>
<td>Receipt, status i relevantni događaji</td>
</tr>
<tr>
<td>Kontrola nad sredstvima</td>
<td>Ključ, threshold signer ili smart account policy</td>
</tr>
</tbody></table>
<p>Greška nastaje kada se jedan sistem koristi za pitanje na koje nije dizajniran da odgovori.</p>
<p>Blockchain ne zna za neisplaćenu fakturu. Interni ledger ne može dokazati da je transakcija uključena u blok. Exchange API ne dokazuje da korisnik kontroliše odredišnu adresu.</p>
<h2>Kako izabrati model</h2>
<p>Menjačnica ima smisla kada su dominantni zahtevi:</p>
<ul>
<li><p>česta konverzija fiat i kripto sredstava</p>
</li>
<li><p>mali tim i kratko vreme integracije</p>
</li>
<li><p>ograničeno iskustvo sa key managementom</p>
</li>
<li><p>potreba za poslovnim izveštajima provajdera</p>
</li>
<li><p>prihvatljiva zavisnost od operatora</p>
</li>
</ul>
<p>Self-custody ima smisla kada su dominantni zahtevi:</p>
<ul>
<li><p>direktna kontrola vremena i pravila isplate</p>
</li>
<li><p>interakcija sa smart contractima</p>
</li>
<li><p>potreba za batchingom ili programabilnim treasuryjem</p>
</li>
<li><p>smanjenje zavisnosti od jednog provajdera</p>
</li>
<li><p>mogućnost ulaganja u signer, monitoring i recovery infrastrukturu</p>
</li>
</ul>
<p>Multisig ili smart account ima smisla kada:</p>
<ul>
<li><p>sredstva pripadaju organizaciji</p>
</li>
<li><p>jedna osoba ne treba samostalno da ih kontroliše</p>
</li>
<li><p>postoje poslovna pravila odobravanja</p>
</li>
<li><p>potreban je audit trag odluka</p>
</li>
<li><p>operativni zastoj jednog potpisnika ne sme biti fatalan</p>
</li>
</ul>
<p>Hibridni model je često najbolji kada sistem istovremeno ima fiat tokove, automatizovane isplate i veću rezervu.</p>
<h2>Praktična matrica odluke</h2>
<table>
<thead>
<tr>
<th>Pitanje</th>
<th>Menjačnica</th>
<th>Hot wallet</th>
<th>Multisig ili smart account</th>
</tr>
</thead>
<tbody><tr>
<td>Ko drži ključ</td>
<td>Operator</td>
<td>Aplikacioni tim</td>
<td>Više vlasnika ili definisani moduli</td>
</tr>
<tr>
<td>Brzina početne integracije</td>
<td>Obično najveća</td>
<td>Srednja</td>
<td>Najmanja</td>
</tr>
<tr>
<td>Automatizacija</td>
<td>Ograničena API pravilima</td>
<td>Visoka</td>
<td>Visoka, uz approval overhead</td>
</tr>
<tr>
<td>Rizik zamrzavanja</td>
<td>Postoji</td>
<td>Ne na nivou operatora</td>
<td>Ne na nivou operatora</td>
</tr>
<tr>
<td>Rizik krađe ključa</td>
<td>Prebačen operatoru</td>
<td>Direktan</td>
<td>Raspodeljen, zavisi od konfiguracije</td>
</tr>
<tr>
<td>Recovery naloga</td>
<td>Procedura operatora</td>
<td>Sopstveni backup</td>
<td>Zamena vlasnika ako policy dozvoljava</td>
</tr>
<tr>
<td>Interakcija sa protokolima</td>
<td>Ograničena</td>
<td>Direktna</td>
<td>Direktna i programabilna</td>
</tr>
<tr>
<td>Onchain fee kontrola</td>
<td>Delimična</td>
<td>Direktna</td>
<td>Direktna</td>
</tr>
<tr>
<td>Operativna složenost</td>
<td>Niža</td>
<td>Visoka</td>
<td>Visoka</td>
</tr>
<tr>
<td>Pogodno za rezervu</td>
<td>Ograničeno modelom poverenja</td>
<td>Slabo bez dodatnih kontrola</td>
<td>Često najprikladnije</td>
</tr>
</tbody></table>
<h2>Minimalan eksperiment koji zaista nešto pokazuje</h2>
<p>Za razumevanje razlike nisu potrebna stvarna sredstva.</p>
<p>Dovoljno je napraviti mali testni workflow:</p>
<ol>
<li><p>Lokalno generisati efemerni wallet.</p>
</li>
<li><p>Potpisati challenge i verifikovati adresu.</p>
</li>
<li><p>Povezati browser wallet preko EIP-1193 providera.</p>
</li>
<li><p>Prebaciti wallet na test mrežu.</p>
</li>
<li><p>Napraviti transfer bez emitovanja i pregledati njegova polja.</p>
</li>
<li><p>Potpisati test transakciju u walletu.</p>
</li>
<li><p>Emitovati je samo na test mreži.</p>
</li>
<li><p>Pratiti prelaze <code>broadcast</code>, <code>included</code> i <code>confirmed</code>.</p>
</li>
<li><p>U bazi sačuvati intent odvojeno od transaction hasha.</p>
</li>
<li><p>Simulirati timeout posle emitovanja i proveriti da retry ne pravi novu isplatu.</p>
</li>
</ol>
<p>Najvažniji deo nije uspešna transakcija. Najviše se nauči kada se namerno testiraju neizvesna stanja:</p>
<ul>
<li><p>RPC timeout posle broadcasta</p>
</li>
<li><p>promena aktivnog wallet naloga</p>
</li>
<li><p>pogrešan chain ID</p>
</li>
<li><p>nedovoljno native tokena za gas</p>
</li>
<li><p>transakcija sa preniskim fee parametrima</p>
</li>
<li><p>dupliran webhook</p>
</li>
<li><p>provider transfer bez transaction hasha</p>
</li>
<li><p>neuspešan contract poziv uključen u blok</p>
</li>
</ul>
<p>To su situacije u kojima razlika između demo aplikacije i finansijskog sistema postaje očigledna.</p>
<h2>Konačna razlika nije UI, već autoritet</h2>
<p>Menjačnica i novčanik mogu prikazivati isti broj i isto dugme <code>Send</code>, ali iza tog dugmeta ne postoji ista operacija.</p>
<p>Na menjačnici šalješ instrukciju operatoru. Operator proverava nalog, interne limite i sopstvena pravila, pa zatim eventualno potpisuje onchain transakciju svojim ključevima.</p>
<p>Kod self-custody walleta potpis nastaje pod kontrolom korisnika ili organizacionog policyja. Mreža proverava potpis ili pravila smart accounta bez potrebe da poznaje identitet korisnika iz poslovne baze.</p>
<p>Zato pitanje „gde ti je kripto” zapravo znači:</p>
<blockquote>
<p>Ko trenutno može da proizvede validnu autorizaciju za trošenje, pod kojim pravilima i bez čije dozvole?</p>
</blockquote>
<p>Ako je odgovor „menjačnica”, imaš jednostavniju integraciju i operativnu zavisnost.</p>
<p>Ako je odgovor „jedan privatni ključ na serveru”, imaš tehničku kontrolu i vrlo koncentrisan rizik.</p>
<p>Ako je odgovor „izolovan signer sa limitima” ili „multisig sa jasno definisanim recoveryjem”, već gradiš custody arhitekturu, a ne samo wallet integraciju.</p>
<p>Dobar sistem ne bira između menjačnice i novčanika ideološki. Bira granicu poverenja, automatizacije i odgovornosti koju tim može realno da održava.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati USDT i USDC. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="http://Ethereum.org">Ethereum.org</a>, „Ethereum accounts”, pregled EOA i contract naloga, privatnih ključeva i odnosa između naloga i walleta. <a href="https://ethereum.org/developers/docs/accounts">Dokumentacija</a></p>
</li>
<li><p><a href="http://Ethereum.org">Ethereum.org</a>, „Transactions”, struktura, potpisivanje i emitovanje Ethereum transakcija. <a href="https://ethereum.org/developers/docs/transactions">Dokumentacija</a></p>
</li>
<li><p><a href="http://Ethereum.org">Ethereum.org</a>, „Gas and fees”, model obračuna mrežnih provizija. <a href="https://ethereum.org/developers/docs/gas">Dokumentacija</a></p>
</li>
<li><p>Ethereum Improvement Proposals, EIP-1193, standardni JavaScript Provider API. <a href="https://eips.ethereum.org/EIPS/eip-1193">Specifikacija</a></p>
</li>
<li><p>Ethers.js v6, dokumentacija za <code>Wallet</code>, signere i rad sa ključevima. <a href="https://docs.ethers.org/v6">Dokumentacija</a></p>
</li>
<li><p>Bitcoin Developer Guide, struktura transakcija i UTXO model. <a href="https://developer.bitcoin.org/devguide/transactions.html">Dokumentacija</a></p>
</li>
<li><p>Bitcoin Developer Guide, wallet programi, signing i razdvajanje mrežnih i potpisnih komponenti. <a href="https://developer.bitcoin.org/devguide/wallets.html">Dokumentacija</a></p>
</li>
<li><p>Bitcoin Improvement Proposals, BIP-39, mnemonic kod za determinističko generisanje ključeva. <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">Specifikacija</a></p>
</li>
<li><p>Safe dokumentacija, vlasnici, threshold i verifikacija potpisa u Safe Smart Account modelu. <a href="https://docs.safe.global/advanced/smart-account-concepts">Dokumentacija</a></p>
</li>
<li><p>Safe dokumentacija, kreiranje, potpisivanje i izvršavanje transakcija sa offchain prikupljanjem potpisa. <a href="https://docs.safe.global/core-api/transaction-service-guides/transactions">Dokumentacija</a></p>
</li>
<li><p>Coinbase Exchange API, evidencija depozita i povlačenja na nivou exchange naloga. <a href="https://docs.cdp.coinbase.com/api-reference/exchange-api/rest-api/accounts/get-single-account-transfer">Dokumentacija</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/"><strong>Volet Srbija</strong></a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/wallets-exchanges-and-blockchains-three-layers-of-one-system-5368">Wallets, Exchanges, and Blockchains: Three Layers of One System</a></p>
]]></content:encoded></item><item><title><![CDATA[Kripto novčanici: seed fraza kao skupi UX anti-pattern]]></title><description><![CDATA[Novčanik nije ekran sa stanjem
Kada developer prvi put integriše kripto novčanik, problem obično izgleda jednostavno:

poveži wallet

pročitaj adresu

pripremi transakciju

zatraži potpis

sačekaj pot]]></description><link>https://kripto-pocetnica.hashnode.dev/kripto-nov-anici-seed-fraza-kao-skupi-ux-anti-pattern</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/kripto-nov-anici-seed-fraza-kao-skupi-ux-anti-pattern</guid><category><![CDATA[crypto]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[blockchain security]]></category><category><![CDATA[blockchain development company]]></category><category><![CDATA[Bitcoin]]></category><category><![CDATA[Cryptocurrency]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Mon, 21 Sep 2026 00:02:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/c1d8007b-99ec-450a-8d08-3e7f272ada4a.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Novčanik nije ekran sa stanjem</h2>
<p>Kada developer prvi put integriše kripto novčanik, problem obično izgleda jednostavno:</p>
<ol>
<li><p>poveži wallet</p>
</li>
<li><p>pročitaj adresu</p>
</li>
<li><p>pripremi transakciju</p>
</li>
<li><p>zatraži potpis</p>
</li>
<li><p>sačekaj potvrdu</p>
</li>
</ol>
<p>Taj workflow je tehnički tačan, ali skriva najteži deo sistema. Kripto novčanik nije samo interfejs za potpisivanje transakcija. On je kombinacija identiteta, autorizacije, čuvanja ključeva, recovery politike, mrežne konfiguracije i korisničkog interfejsa za nepovratne operacije.</p>
<p>Kod klasične web aplikacije korisnik može da izgubi lozinku, promeni uređaj i kontaktira podršku. Kod standardnog self-custody novčanika isti događaji mogu značiti trajan gubitak pristupa imovini.</p>
<p>Seed fraza je nastala kao elegantno rešenje za backup determinističkog novčanika. Problem je što smo backup format pretvorili u onboarding mehanizam i od korisnika očekujemo da razume njegove posledice pre nego što je uopšte video vrednost proizvoda.</p>
<p>Tu počinje većina UX problema.</p>
<p>Novi korisnik ne odustaje zato što ne razume kriptografiju. Odustaje zato što mu proizvod, nekoliko sekundi nakon instalacije, saopštava da će jedna greška možda zauvek uništiti njegov nalog. Zatim mu pokazuje dvanaest reči, upozorava ga da ih nikome ne pokaže i nastavlja kao da je upravo rešio problem identiteta.</p>
<p>Nije ga rešio. Samo ga je prebacio na korisnika.</p>
<h2>Šta je zapravo seed fraza</h2>
<p>Seed fraza nije lozinka i ne predstavlja listu privatnih ključeva. Ona je prenosiva reprezentacija entropije iz koje wallet može deterministički da izvede seed, a zatim čitavo stablo ključeva.</p>
<p>Kod BIP-39 procesa početna entropija ima od 128 do 256 bitova. Na nju se dodaje checksum, rezultat se deli na grupe od po 11 bitova, a svaka grupa postaje indeks u listi od 2.048 reči. Dvanaest reči tipično predstavlja 128 bitova entropije i 4 bita checksuma. Dvadeset četiri reči predstavljaju 256 bitova entropije i 8 bitova checksuma.</p>
<p>Mnemonic se zatim pomoću <code>PBKDF2-HMAC-SHA512</code> funkcije, sa 2.048 iteracija, pretvara u seed od 512 bitova. BIP-39 podržava i dodatnu passphrase vrednost, ali svaka passphrase proizvodi validan seed. Pogrešna passphrase zato često ne daje jasnu grešku, već potpuno drugi, obično prazan novčanik.</p>
<p>Dobijeni seed može da se koristi kao ulaz za BIP-32 hijerarhijski deterministički wallet. Umesto da aplikacija nezavisno generiše i čuva svaki privatni ključ, iz jednog root materijala izvodi se stablo naloga i adresa.</p>
<p>Pojednostavljeno:</p>
<pre><code class="language-text">entropija
    -&gt; mnemonic i checksum
    -&gt; BIP-39 seed
    -&gt; BIP-32 master key
    -&gt; derivation path
    -&gt; account
    -&gt; adrese i privatni ključevi
</code></pre>
<p>Zbog toga kompromitovanje seed fraze nije isto što i kompromitovanje jedne lozinke. Napadač ne dobija pristup jednoj aplikaciji. Dobija materijal iz kog može ponovo da izvede ključeve, često na drugom uređaju, bez dodatnog odobrenja legitimnog korisnika.</p>
<p>PIN, biometrija i lokalna wallet lozinka najčešće štite aplikaciju ili lokalno šifrovani keystore. Ne menjaju činjenicu da seed može da rekonstruiše wallet izvan tog uređaja.</p>
<p>To je detalj koji korisnički interfejsi često ne objašnjavaju dovoljno jasno.</p>
<h2>Zašto je seed fraza istovremeno dobra i loša</h2>
<p>Seed fraza ima osobine koje su veoma vredne:</p>
<ul>
<li><p>ne zahteva centralni recovery server</p>
</li>
<li><p>može da se čuva potpuno offline</p>
</li>
<li><p>omogućava determinističko izvođenje velikog broja ključeva</p>
</li>
<li><p>može da posluži za migraciju između kompatibilnih wallet implementacija</p>
</li>
<li><p>recovery ne zavisi od dostupnosti originalnog proizvođača aplikacije</p>
</li>
</ul>
<p>Za iskusnog korisnika koji razume key management, to je moćan i relativno jednostavan mehanizam.</p>
<p>Problem nastaje kada se ista arhitektura predstavi kao podrazumevano rešenje za svaku vrstu korisnika i svaki iznos.</p>
<p>Seed fraza od korisnika istovremeno zahteva dve suprotne stvari:</p>
<ul>
<li><p>mora da bude dostupna kada dođe do gubitka uređaja</p>
</li>
<li><p>ne sme da bude dostupna nikome osim vlasniku</p>
</li>
</ul>
<p>Ako je korisnik drži samo na telefonu, nema pravi backup. Ako je sinhronizuje u cloud kao običnu belešku, povećava udaljenu površinu napada. Ako postoji samo na jednom papiru, fizičko oštećenje ili gubitak postaju recovery problem. Ako napravi više kopija, raste broj lokacija koje napadač može da pronađe.</p>
<p>To je bezbednosni problem bez prirodnog odgovora za prosečnog korisnika. Dobro rešenje zavisi od vrednosti imovine, threat modela, uređaja, domaćinstva, nasleđivanja i tolerancije na komplikovan recovery.</p>
<p>Wallet onboarding, međutim, sve to pokušava da završi jednim checkboxom: „Sačuvao sam frazu”.</p>
<h2>Mentalni model korisnika je drugačiji od modela protokola</h2>
<p>Korisnik u wallet ulazi sa iskustvom drugih aplikacija. Očekuje nalog, lozinku, biometriju i mogućnost resetovanja pristupa.</p>
<p>Self-custody sistem ima drugačiju semantiku:</p>
<table>
<thead>
<tr>
<th>Korisnički pojam</th>
<th>Ono što korisnik često očekuje</th>
<th>Ono što wallet zapravo radi</th>
</tr>
</thead>
<tbody><tr>
<td>Lozinka</td>
<td>Dokaz identiteta na serveru</td>
<td>Otključava lokalne podatke ili aplikaciju</td>
</tr>
<tr>
<td>PIN</td>
<td>Rezervni način pristupa nalogu</td>
<td>Lokalna zaštita jednog uređaja</td>
</tr>
<tr>
<td>Biometrija</td>
<td>Identitet korisnika</td>
<td>Dozvola uređaju da oslobodi lokalni ključ</td>
</tr>
<tr>
<td>Seed fraza</td>
<td>Recovery kod sličan backup kodovima</td>
<td>Root materijal za rekonstrukciju ključeva</td>
</tr>
<tr>
<td>Adresa</td>
<td>Stabilan username</td>
<td>Identifikator naloga na određenom protokolu</td>
</tr>
<tr>
<td>Mreža</td>
<td>Nevidljiva infrastruktura</td>
<td>Deo konteksta svake transakcije</td>
</tr>
<tr>
<td>Potpis</td>
<td>Potvrda da korisnik želi da nastavi</td>
<td>Kriptografska autorizacija konkretne poruke</td>
</tr>
</tbody></table>
<p>Istraživanje predstavljeno na konferenciji CHI 2025, koje je uključilo intervjue i anketu sa 643 ispitanika, pokazalo je ozbiljna nerazumevanja seed fraza. Deo učesnika smatrao je da su username i password dovoljni za migraciju walleta na novi uređaj, a mnogi su seed frazu tretirali kao lozinku koju mogu sami da izaberu ili kasnije resetuju.</p>
<p>To nije problem koji se može rešiti dužim tekstom ispod input polja. Ako arhitektura zahteva da korisnik razume key derivation kako bi bezbedno završio onboarding, proizvod je postavio pogrešan nivo apstrakcije.</p>
<h2>UX zamka broj jedan: odgovornost dolazi pre vrednosti</h2>
<p>Tipičan non-custodial onboarding traži od korisnika da uradi najodgovorniju stvar u celom životnom ciklusu naloga pre nego što je video šta proizvod radi.</p>
<p>Korisnik još nema sredstva. Nije izvršio transakciju. Ne zna da li će se vratiti u aplikaciju. Ipak mora da:</p>
<ul>
<li><p>razume da seed nije lozinka</p>
</li>
<li><p>napravi backup</p>
</li>
<li><p>proceni bezbednost mesta na kom ga čuva</p>
</li>
<li><p>potvrdi redosled reči</p>
</li>
<li><p>prihvati posledice trajnog gubitka</p>
</li>
</ul>
<p>To je obrnuto od dobrog product flowa.</p>
<p>U dobrom onboardingu korisnik prvo dobija minimalnu vrednost, zatim postepeno ulaže više poverenja i truda. Kod seed-first walleta najveći kognitivni i bezbednosni trošak dolazi na samom početku.</p>
<p>Preskakanje backupa nije dobro rešenje. Forsiranje backupa pre prve korisne akcije takođe nije dobro rešenje. Problem se ne rešava izborom boljeg modalnog prozora, već drugačijom arhitekturom naloga i progresivnim povećavanjem bezbednosti.</p>
<h2>UX zamka broj dva: wallet lozinka stvara lažan osećaj recoveryja</h2>
<p>Mnogi walleti traže lokalnu lozinku odmah nakon kreiranja seed fraze. Korisnik zato prirodno zaključuje da ta lozinka pripada njegovom nalogu.</p>
<p>U praksi ona često samo šifruje lokalni vault ili kontroliše pristup wallet aplikaciji na tom uređaju.</p>
<p>Posledice postaju vidljive tek nakon problema:</p>
<ul>
<li><p>korisnik instalira wallet na novom uređaju i otkriva da lozinka nije dovoljna</p>
</li>
<li><p>briše browser profil i gubi lokalno sačuvane podatke</p>
</li>
<li><p>menja telefon i očekuje standardni login</p>
</li>
<li><p>kontaktira podršku verujući da postoji serverski reset</p>
</li>
<li><p>nalazi seed backup, ali ne zna derivation path ili dodatnu passphrase</p>
</li>
</ul>
<p>Dobro dizajniran wallet mora eksplicitno da razdvoji najmanje tri pojma:</p>
<ol>
<li><p>otključavanje aplikacije</p>
</li>
<li><p>autorizaciju transakcije</p>
</li>
<li><p>rekonstrukciju naloga na novom uređaju</p>
</li>
</ol>
<p>Ako iste vizuelne obrasce koristimo za sva tri događaja, korisnik će ih smatrati istim bezbednosnim slojem.</p>
<h2>UX zamka broj tri: „Connect wallet” nije login</h2>
<p>Za developera je wallet konekcija često zamena za OAuth dugme. Korisnik poveže adresu, backend dobije potpis i aplikacija kreira sesiju.</p>
<p>Ali wallet konekcija nije stabilan identitet bez dodatnih pravila.</p>
<p>Korisnik može da:</p>
<ul>
<li><p>promeni aktivni account</p>
</li>
<li><p>promeni mrežu</p>
</li>
<li><p>isključi wallet sa sajta</p>
</li>
<li><p>poveže istu adresu preko drugog providera</p>
</li>
<li><p>koristi smart account čija se autorizaciona politika kasnije promeni</p>
</li>
<li><p>koristi različite adrese na različitim mrežama</p>
</li>
</ul>
<p>EIP-1193 zato standardizuje događaje kao što su <code>accountsChanged</code>, <code>chainChanged</code>, <code>connect</code> i <code>disconnect</code>. Aplikacija koja pročita adresu samo prilikom mountovanja komponente i zatim je tretira kao trajni identitet implementirala je happy path, ne wallet integraciju.</p>
<p>Minimalna reakcija na promene može da izgleda ovako:</p>
<pre><code class="language-ts">type RequestArguments = {
    method: string;
    params?: unknown[] | Record&lt;string, unknown&gt;;
};

type Eip1193Provider = {
    request(args: RequestArguments): Promise&lt;unknown&gt;;
    on(event: string, listener: (...args: unknown[]) =&gt; void): void;
    removeListener(
        event: string,
        listener: (...args: unknown[]) =&gt; void
    ): void;
};

export function observeWallet(
    provider: Eip1193Provider,
    onInvalidate: () =&gt; void
) {
    const handleAccountsChanged = () =&gt; onInvalidate();
    const handleChainChanged = () =&gt; onInvalidate();
    const handleDisconnect = () =&gt; onInvalidate();

    provider.on("accountsChanged", handleAccountsChanged);
    provider.on("chainChanged", handleChainChanged);
    provider.on("disconnect", handleDisconnect);

    return () =&gt; {
        provider.removeListener(
            "accountsChanged",
            handleAccountsChanged
        );
        provider.removeListener("chainChanged", handleChainChanged);
        provider.removeListener("disconnect", handleDisconnect);
    };
}
</code></pre>
<p>Važna ideja nije konkretan framework. Važno je da svaka promena accounta ili chaina poništava pretpostavke prethodne sesije.</p>
<p>Ako aplikacija koristi potpis kao login, challenge treba da bude jednokratan, vremenski ograničen i vezan za očekivani domen, adresu i mrežni kontekst. Potpisivanje proizvoljnog stringa nije zamena za pažljivo dizajniran authentication protokol.</p>
<h2>UX zamka broj četiri: korisnik ne potpisuje ono što vidi</h2>
<p>Korisnik obično vidi dugme „Kupi”, „Mintuj”, „Potvrdi” ili „Nastavi”. Wallet zatim može da prikaže:</p>
<ul>
<li><p>hex podatke</p>
</li>
<li><p>adresu ugovora</p>
</li>
<li><p>nepoznat method selector</p>
</li>
<li><p>procenjeni gas</p>
</li>
<li><p>token approval</p>
</li>
<li><p>typed data poruku</p>
</li>
<li><p>upozorenje da simulacija nije dostupna</p>
</li>
</ul>
<p>Iz ugla protokola, korisnik autorizuje precizno definisanu operaciju. Iz ugla korisnika, potpisuje posledicu opisanu u aplikaciji.</p>
<p>Razlika između te dve reprezentacije je prostor u kom nastaju phishing, approval prevare i nenamerne transakcije.</p>
<p>Najopasniji UI nije nužno onaj koji prikazuje premalo podataka. Interfejs može da prikaže mnogo tehničkih detalja i da i dalje ne objasni posledicu.</p>
<p>Korisniku je važnije:</p>
<ul>
<li><p>koja sredstva mogu da napuste nalog</p>
</li>
<li><p>ko ih dobija</p>
</li>
<li><p>da li je approval ograničen ili neograničen</p>
</li>
<li><p>da li operacija važi jednom ili ostaje aktivna</p>
</li>
<li><p>na kojoj mreži se izvršava</p>
</li>
<li><p>da li se akcija može opozvati</p>
</li>
<li><p>šta će se dogoditi ako deo batcha ne uspe</p>
</li>
</ul>
<p>Wallet confirmation treba tretirati kao bezbednosni proizvod, ne kao JSON viewer.</p>
<h2>UX zamka broj pet: mreža i gas cure kroz apstrakciju</h2>
<p>Za korisnika koji prvi put koristi onchain aplikaciju, mreža je uglavnom implementacioni detalj. Za aplikaciju je ona deo identiteta stanja, adresa, tokena i transakcije.</p>
<p>Otuda poznat onboarding scenario:</p>
<ol>
<li><p>korisnik ima odgovarajući token</p>
</li>
<li><p>token je na pogrešnoj mreži</p>
</li>
<li><p>wallet nema native asset za gas</p>
</li>
<li><p>aplikacija traži promenu mreže</p>
</li>
<li><p>wallet prikazuje novo upozorenje</p>
</li>
<li><p>korisnik dolazi do bridgea</p>
</li>
<li><p>bridge uvodi novi potpis, novu naknadu i čekanje</p>
</li>
</ol>
<p>Svaki korak može biti tehnički opravdan. Zajedno predstavljaju proizvod koji od korisnika zahteva da razume infrastrukturu pre nego što obavi osnovnu radnju.</p>
<p>Account abstraction ne uklanja cenu izvršavanja, ali omogućava da se promeni način na koji je korisnik doživljava. Paymaster može da plati gas za <code>UserOperation</code>, aplikacija može da sponzoriše prve akcije, a smart account može da grupiše više poziva.</p>
<p>„Gasless” ipak ne znači da transakcija nema cenu. Znači da trošak nije direktno naplaćen korisniku u native tokenu. Plaća ga aplikacija, paymaster ili neki drugi ekonomski učesnik.</p>
<p>To je važna razlika i za arhitekturu i za poslovni model.</p>
<h2>Zašto početnici odustaju</h2>
<p>Početnik retko odustaje zbog jedne katastrofalne UX greške. Češće odustaje zbog niza malih trenutaka u kojima aplikacija traži odluku bez dovoljno konteksta.</p>
<p>Tipičan niz izgleda ovako:</p>
<ul>
<li><p>ne zna koji wallet da izabere</p>
</li>
<li><p>browser prijavljuje više instaliranih providera</p>
</li>
<li><p>nije siguran da li „connect” daje aplikaciji pristup sredstvima</p>
</li>
<li><p>dobija adresu koju ne može da proveri pogledom</p>
</li>
<li><p>mora da izabere mrežu</p>
</li>
<li><p>nema token za gas</p>
</li>
<li><p>potpisuje poruku čiju svrhu ne razume</p>
</li>
<li><p>transakcija ostaje u stanju „pending”</p>
</li>
<li><p>explorer izgleda kao interna developerska alatka</p>
</li>
<li><p>podrška ne može da poništi operaciju</p>
</li>
</ul>
<p>U klasičnoj aplikaciji neizvesnost se često rešava pokušajem. Korisnik klikne, vrati se nazad ili resetuje stanje.</p>
<p>Kod kripto novčanika UI istovremeno poručuje dve stvari:</p>
<ul>
<li><p>„Ne brini, jednostavno je.”</p>
</li>
<li><p>„Ako pogrešiš, sredstva možda neće moći da se vrate.”</p>
</li>
</ul>
<p>Ta kontradikcija proizvodi paralizu, ne poverenje.</p>
<h2>Seedless ne znači trustless, niti automatski bezbednije</h2>
<p>Industrija često koristi termin „seedless wallet”, ali on više opisuje korisničko iskustvo nego precizan trust model.</p>
<p>Seed može biti zamenjen različitim sistemima:</p>
<ul>
<li><p>passkey credentialom</p>
</li>
<li><p>smart account validatorom</p>
</li>
<li><p>MPC ili threshold signing protokolom</p>
</li>
<li><p>višestrukim uređajima</p>
</li>
<li><p>guardian recoveryjem</p>
</li>
<li><p>cloud backupom šifrovanog key sharea</p>
</li>
<li><p>custodial servisom</p>
</li>
<li><p>kombinacijom navedenih mehanizama</p>
</li>
</ul>
<p>Svaka opcija premešta poverenje. Nijedna ga magično ne uklanja.</p>
<p>Pravo pitanje zato nije: „Da li wallet ima seed frazu?”</p>
<p>Bolja pitanja su:</p>
<ul>
<li><p>ko može da autorizuje transakciju</p>
</li>
<li><p>šta se događa kada korisnik izgubi telefon</p>
</li>
<li><p>može li jedna kompromitovana strana da preuzme nalog</p>
</li>
<li><p>može li recovery servis da odbije oporavak</p>
</li>
<li><p>može li korisnik da promeni recovery politiku</p>
</li>
<li><p>postoji li izlaz iz sistema bez dozvole provajdera</p>
</li>
<li><p>može li se ključ ili account migrirati</p>
</li>
<li><p>koje komponente moraju biti dostupne da bi korisnik trošio sredstva</p>
</li>
</ul>
<p>To je threat model koji developer treba da razume pre nego što izabere wallet SDK.</p>
<h2>Passkeys: bolji UX, drugačiji rizici</h2>
<p>Passkey koristi WebAuthn public-key credential. Privatni ključ generiše i čuva authenticator, dok relying party dobija javni ključ i potpisane authentication assertion podatke. Credential je vezan za relying party kontekst, a korisnik ga najčešće aktivira biometrijom, PIN-om uređaja ili security keyem.</p>
<p>Za korisnika to može da izgleda kao poznata sistemska potvrda:</p>
<pre><code class="language-text">Potvrdi pomoću Face ID-a
</code></pre>
<p>Iza tog ekrana nalazi se asimetrična kriptografija, ali korisnik ne mora da prepisuje root secret na papir.</p>
<p>To rešava nekoliko seed problema:</p>
<ul>
<li><p>nema reči koje korisnik može da pošalje phishing sajtu</p>
</li>
<li><p>privatni ključ ne mora da bude dostupan JavaScript aplikaciji</p>
</li>
<li><p>autorizacija može da koristi secure hardware uređaja</p>
</li>
<li><p>onboarding koristi poznat sistemski interfejs</p>
</li>
<li><p>credential može da zahteva user verification</p>
</li>
</ul>
<p>Ali uvodi nove probleme:</p>
<ul>
<li><p>WebAuthn credential je vezan za relying party i origin pravila</p>
</li>
<li><p>sinhronizacija passkeya zavisi od platforme i korisničkog naloga</p>
</li>
<li><p>cross-device recovery zavisi od izabranog authenticator modela</p>
</li>
<li><p>promena domena ili infrastrukture mora biti pažljivo planirana</p>
</li>
<li><p>browser i mobilne aplikacije mogu zahtevati različite integracione tokove</p>
</li>
<li><p>passkey sam po sebi ne definiše onchain recovery politiku</p>
</li>
</ul>
<p>Passkeys obično koriste P-256, odnosno <code>secp256r1</code>, dok tradicionalni Ethereum EOA potpisi koriste <code>secp256k1</code>. Smart account može da implementira P-256 ili WebAuthn verifikaciju, a mreže koje podržavaju odgovarajući precompile mogu to raditi efikasnije. Podrška nije identična na svakoj mreži, pa je treba proveravati, ne pretpostavljati.</p>
<p>Passkey zato nije drop-in zamena za EOA privatni ključ. On postaje naročito koristan kada account ima programabilnu verifikacionu logiku.</p>
<h2>Smart accounts: recovery kao deo aplikacione logike</h2>
<p>Externally owned account, EOA, tradicionalno je kontrolisan jednim privatnim ključem. Ko ima ključ, može da potpisuje. Ko ga izgubi, gubi kontrolu.</p>
<p>Smart account menja tu pretpostavku. Autorizacija više ne mora da bude fiksirana na jednu ECDSA proveru. Account može da definiše:</p>
<ul>
<li><p>više signera</p>
</li>
<li><p>threshold pravila</p>
</li>
<li><p>passkey verifikaciju</p>
</li>
<li><p>dnevne ili pojedinačne limite</p>
</li>
<li><p>vremenski zaključan recovery</p>
</li>
<li><p>guardians</p>
</li>
<li><p>session ključeve ograničenog opsega</p>
</li>
<li><p>batch izvršavanje</p>
</li>
<li><p>pravila za sponzorisanje gasa</p>
</li>
</ul>
<p>ERC-4337 uvodi <code>UserOperation</code>, bundlere, <code>EntryPoint</code> i opcione paymastere bez potrebe da osnovni Ethereum konsenzus bude izmenjen za svaki wallet feature.</p>
<p>Pojednostavljen tok izgleda ovako:</p>
<pre><code class="language-mermaid">flowchart LR
    A[Korisnik potvrđuje akciju] --&gt; B[Wallet kreira UserOperation]
    B --&gt; C[Signer ili passkey potpisuje]
    C --&gt; D[Bundler proverava i grupiše operacije]
    D --&gt; E[EntryPoint poziva smart account]
    E --&gt; F[Account validira potpis i politiku]
    F --&gt; G[Izvršava se poziv]
    P[Paymaster] --&gt; D
</code></pre>
<p>Ovo ne uklanja potrebu za ključevima. Uklanja pretpostavku da jedan nepromenljivi ključ mora zauvek biti kompletan identitet naloga.</p>
<p>EIP-7702 rešava srodan, ali drugačiji problem. Omogućava EOA nalogu da delegira izvršavanje kodu i time dobije deo ponašanja programabilnog naloga. Međutim, delegacija sama po sebi ne uklanja rizik originalnog EOA ključa. Ako seed ostaje root autoritet za novu delegaciju, njegov kompromis i dalje može imati ozbiljne posledice.</p>
<h2>MPC i threshold signing: nema jednog kompletnog ključa</h2>
<p>Kod MPC ili threshold signing arhitekture, potpisivanje je raspodeljeno između više učesnika ili uređaja. Ideja je da jedna komponenta ne mora sama da poseduje kompletan privatni ključ dovoljan za autorizaciju.</p>
<p>Praktičan sistem može, na primer, koristiti:</p>
<ul>
<li><p>jedan share na korisnikovom uređaju</p>
</li>
<li><p>jedan recovery share u zaštićenom servisu</p>
</li>
<li><p>jedan dodatni share na drugom uređaju ili kod organizacije</p>
</li>
</ul>
<p>Određeni prag učesnika zajednički proizvodi validan potpis.</p>
<p>To može da smanji rizik od jednog ukradenog fajla ili jednog kompromitovanog uređaja. Ipak, „MPC” ne govori dovoljno o modelu kontrole.</p>
<p>Dva proizvoda mogu koristiti sličnu kriptografiju, a imati potpuno različite osobine:</p>
<ul>
<li><p>u jednom korisnik kontroliše dovoljan broj shareova</p>
</li>
<li><p>u drugom je servis neophodan za svaku transakciju</p>
</li>
<li><p>treći dozvoljava export ili rekonstrukciju</p>
</li>
<li><p>četvrti vezuje recovery za proveru identiteta</p>
</li>
<li><p>peti može da zamrzne ili odbije potpisivanje</p>
</li>
</ul>
<p>Zato MPC ne treba automatski izjednačavati sa self-custodyjem. Važno je ko kontroliše shareove, kako izgleda recovery, postoji li vendor-independent izlaz i šta se događa kada provajder nestane.</p>
<h2>Realan use-case: loyalty aplikacija bez kripto rituala</h2>
<p>Zamislimo loyalty aplikaciju u kojoj korisnik dobija digitalni membership asset nakon prve kupovine.</p>
<p>Blockchain može imati smisla ako je potrebno da asset bude prenosiv, proverljiv izvan originalne aplikacije ili upotrebljiv kod više partnera. Korisnik, međutim, ne dolazi zbog blockchaina. Dolazi zbog popusta, pristupa događaju ili statusa članstva.</p>
<p>Klasičan flow bi mogao da izgleda ovako:</p>
<ol>
<li><p>instaliraj ekstenziju</p>
</li>
<li><p>napravi wallet</p>
</li>
<li><p>zapiši seed frazu</p>
</li>
<li><p>vrati se na aplikaciju</p>
</li>
<li><p>poveži wallet</p>
</li>
<li><p>promeni mrežu</p>
</li>
<li><p>nabavi native token</p>
</li>
<li><p>potvrdi mint</p>
</li>
<li><p>sačekaj finalizaciju</p>
</li>
</ol>
<p>Svaki korak je tehnički razumljiv. Ceo workflow je proizvodno neprihvatljiv za korisnika koji želi membership karticu.</p>
<p>Alternativna arhitektura:</p>
<ol>
<li><p>korisnik otvara aplikaciju</p>
</li>
<li><p>kreira passkey sistemskim dijalogom</p>
</li>
<li><p>backend registruje javni credential i povezuje ga sa profilom</p>
</li>
<li><p>aplikacija izračunava ili kreira smart account</p>
</li>
<li><p>korisnik potvrđuje izdavanje membership asseta</p>
</li>
<li><p>paymaster sponzoriše inicijalnu operaciju</p>
</li>
<li><p>bundler šalje <code>UserOperation</code></p>
</li>
<li><p>aplikacija prikazuje rezultat u jeziku proizvoda</p>
</li>
<li><p>dodatni recovery metod podešava se pre povećanja vrednosti naloga</p>
</li>
</ol>
<p>Korisnik je i dalje vlasnik onchain accounta ako je sistem tako dizajniran. Razlika je u tome što nije morao da nauči infrastrukturu pre prve korisne radnje.</p>
<h3>Gde recovery ulazi u workflow</h3>
<p>Recovery ne bi trebalo potpuno odlagati. Treba ga proporcionalno uvoditi.</p>
<p>Moguća politika:</p>
<table>
<thead>
<tr>
<th>Faza naloga</th>
<th>Dozvoljene operacije</th>
<th>Bezbednosni zahtev</th>
</tr>
</thead>
<tbody><tr>
<td>Novi nalog</td>
<td>Prijem membership asseta</td>
<td>Jedan passkey</td>
</tr>
<tr>
<td>Aktiviran nalog</td>
<td>Male, ograničene transakcije</td>
<td>Verifikovan uređaj</td>
</tr>
<tr>
<td>Nalog sa većom vrednošću</td>
<td>Transfer vrednih asseta</td>
<td>Drugi passkey ili dodatni faktor</td>
</tr>
<tr>
<td>Recovery</td>
<td>Zamena signera</td>
<td>Guardian prag i vremensko kašnjenje</td>
</tr>
<tr>
<td>Kritične promene</td>
<td>Promena recovery politike</td>
<td>Više faktora i obaveštenje</td>
</tr>
</tbody></table>
<p>Ovo je isti princip koji koriste ozbiljni finansijski sistemi: rizik operacije određuje potrebnu jačinu autentikacije.</p>
<p>Kripto aplikacije često rade suprotno. Zahtevaju maksimalnu ceremoniju za prazan nalog, a zatim dozvole veoma rizičan potpis kroz isti confirmation ekran.</p>
<h2>Kako bi developer trebalo da bira wallet model</h2>
<p>Ne postoji univerzalno najbolja wallet arhitektura. Izbor zavisi od proizvoda i vrednosti koja će se nalaziti na nalogu.</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Glavna prednost</th>
<th>Glavni rizik</th>
<th>Dobar izbor za</th>
</tr>
</thead>
<tbody><tr>
<td>EOA sa seed frazom</td>
<td>Jednostavan protokol i široka kompatibilnost</td>
<td>Jedan root secret i težak recovery</td>
<td>Iskusne korisnike i interoperabilnost</td>
</tr>
<tr>
<td>Hardware wallet</td>
<td>Izolovano potpisivanje</td>
<td>Složen onboarding i fizički recovery</td>
<td>Veće iznose i treasury</td>
</tr>
<tr>
<td>Passkey smart account</td>
<td>Poznat UX i programabilna autorizacija</td>
<td>Zavisnost od account koda i passkey recoveryja</td>
<td>Consumer aplikacije</td>
</tr>
<tr>
<td>MPC ili threshold wallet</td>
<td>Nema jednog kompletnog key storea</td>
<td>Kompleksan trust model i infrastruktura</td>
<td>Timove, organizacije i managed onboarding</td>
</tr>
<tr>
<td>Custodial wallet</td>
<td>Najpoznatiji recovery flow</td>
<td>Korisnik nema punu samostalnu kontrolu</td>
<td>Regulisane ili početničke proizvode</td>
</tr>
<tr>
<td>Multisig</td>
<td>Jasna raspodela kontrole</td>
<td>Operativna koordinacija signera</td>
<td>Treasury i organizacije</td>
</tr>
</tbody></table>
<p>Najveća greška je izabrati model prema najlakšem SDK quickstartu.</p>
<p>Wallet infrastruktura ostaje deo proizvoda mnogo duže od inicijalne integracije. Menjanje account modela nakon što korisnici već imaju sredstva zahteva migraciju, novu autorizaciju, kompatibilnost sa postojećim protokolima i pažljivu komunikaciju.</p>
<h2>Kako integracija izgleda u praksi</h2>
<p>Kod passkey smart account sistema potrebno je posmatrati najmanje pet slojeva.</p>
<h3>1. Credential sloj</h3>
<p>Ovaj sloj kreira i koristi passkey. Browser ili mobilna platforma komunicira sa authenticatorom, dok aplikacija čuva credential ID, javni ključ i potrebne metapodatke.</p>
<p>Privatni ključ ne bi trebalo da napušta authenticator.</p>
<h3>2. Account sloj</h3>
<p>Smart contract definiše ko može da potpisuje i koja pravila važe. To može biti jedan P-256 signer, kombinacija signera ili modularni sistem validatora i recovery pravila.</p>
<p>Ovde nastaje najveći deo bezbednosnog rizika specifičnog za proizvod. Greška u account kodu ne pogađa samo jednu transakciju, već autorizacioni model svih korisnika te implementacije.</p>
<h3>3. Transport i bundler sloj</h3>
<p>Kod ERC-4337 arhitekture <code>UserOperation</code> se šalje bundleru. Bundler simulira validaciju, grupiše operacije i poziva <code>EntryPoint</code>.</p>
<p>Aplikacija mora pravilno da razlikuje najmanje:</p>
<ul>
<li><p>lokalnu grešku pri pripremi</p>
</li>
<li><p>neuspešnu simulaciju</p>
</li>
<li><p>odbijanje potpisa</p>
</li>
<li><p>odbijanje paymastera</p>
</li>
<li><p>bundler grešku</p>
</li>
<li><p>onchain revert</p>
</li>
<li><p>operaciju koja je poslata, ali još nije uključena</p>
</li>
<li><p>operaciju uključenu u reorganizovan blok</p>
</li>
</ul>
<p>Jedna generička poruka „Transaction failed” nije dovoljna za podršku niti za debugging.</p>
<h3>4. Sponsorship sloj</h3>
<p>Paymaster odlučuje koje operacije želi da finansira. U realnom sistemu to obično zahteva pravila kao što su:</p>
<ul>
<li><p>maksimalan broj sponzorisanih akcija</p>
</li>
<li><p>dozvoljeni target ugovori</p>
</li>
<li><p>dozvoljeni function selectori</p>
</li>
<li><p>maksimalna vrednost operacije</p>
</li>
<li><p>zaštita od replaya i automatizovane zloupotrebe</p>
</li>
<li><p>budžet po korisniku ili vremenskom periodu</p>
</li>
</ul>
<p>Paymaster koji potpisuje proizvoljan calldata nije onboarding alat. On je javno dostupan budžet bez dobre kontrole trošenja.</p>
<h3>5. Recovery sloj</h3>
<p>Recovery je odvojena funkcionalnost, ne sekundarni login ekran.</p>
<p>Potrebno je definisati:</p>
<ul>
<li><p>uslove za pokretanje recoveryja</p>
</li>
<li><p>učesnike koji ga odobravaju</p>
</li>
<li><p>vremensko kašnjenje</p>
</li>
<li><p>način otkazivanja zlonamernog zahteva</p>
</li>
<li><p>obaveštenja na postojećim uređajima</p>
</li>
<li><p>rotaciju starog signera</p>
</li>
<li><p>ponašanje aktivnih session ključeva</p>
</li>
<li><p>audit trag promene autorizacije</p>
</li>
</ul>
<p>Ako je recovery lakši od obične prijave, postaje najlakši put za napadača. Ako je previše težak, ne rešava problem gubitka uređaja.</p>
<h2>Session ključevi menjaju UX, ali povećavaju odgovornost</h2>
<p>Aplikacija koja traži biometrijsku potvrdu za svaki mali potez u igri ili svaku loyalty akciju brzo postaje neupotrebljiva.</p>
<p>Smart account može da dozvoli privremeni session ključ sa ograničenim pravima, na primer:</p>
<ul>
<li><p>važi 30 minuta</p>
</li>
<li><p>može da poziva samo jedan ugovor</p>
</li>
<li><p>može da koristi samo određene funkcije</p>
</li>
<li><p>ne može da prenosi tokene</p>
</li>
<li><p>ima maksimalni ukupni limit</p>
</li>
<li><p>može biti opozvan glavnim signerom</p>
</li>
</ul>
<p>To omogućava UX bliži normalnoj aplikaciji bez davanja neograničenog pristupa session ključu.</p>
<p>Ali implementacija mora da proverava ograničenja onchain ili kroz pouzdanu account politiku. Frontend provera nije bezbednosna granica. Ako privatni session ključ može da kreira proizvoljan calldata, UI ograničenje nema značaj nakon kompromitovanja klijenta.</p>
<h2>Koliko ovakav sistem košta</h2>
<p>Ne postoji jedna cena kripto novčanika. Trošak se sastoji od više kategorija, a deo koji korisnik ne vidi i dalje neko plaća.</p>
<h3>Onchain trošak</h3>
<p>Smart account operacije mogu uključiti:</p>
<ul>
<li><p>deployment accounta</p>
</li>
<li><p>validaciju potpisa</p>
</li>
<li><p><code>EntryPoint</code> izvršavanje</p>
</li>
<li><p>paymaster validaciju</p>
</li>
<li><p>dodatni calldata</p>
</li>
<li><p>batch izvršavanje</p>
</li>
<li><p>recovery i rotaciju signera</p>
</li>
</ul>
<p>Trošak zavisi od mreže, account implementacije, vrste potpisa i sadržaja operacije.</p>
<p>L2 mreže uglavnom smanjuju cenu u odnosu na Ethereum L1, ali trošak nije nula i može zavisiti od cene objavljivanja podataka na osnovni sloj.</p>
<h3>Sponsorship budžet</h3>
<p>Ako proizvod nudi gasless onboarding, potrebno je pratiti:</p>
<ul>
<li><p>prosečan trošak aktiviranog korisnika</p>
</li>
<li><p>odnos sponzorisanih i uspešnih operacija</p>
</li>
<li><p>bot i Sybil aktivnost</p>
</li>
<li><p>broj ponovljenih neuspešnih pokušaja</p>
</li>
<li><p>trošak po zadržanom korisniku</p>
</li>
<li><p>maksimalnu dnevnu obavezu paymastera</p>
</li>
</ul>
<p>Sponzorisanje prve vredne akcije često ima više smisla od sponzorisanja svakog klika bez ograničenja.</p>
<h3>Infrastruktura</h3>
<p>Managed rešenja mogu naplaćivati:</p>
<ul>
<li><p>kreiranje ili broj aktivnih walleta</p>
</li>
<li><p>potpisivanje</p>
</li>
<li><p>bundler zahteve</p>
</li>
<li><p>paymaster servis</p>
</li>
<li><p>RPC saobraćaj</p>
</li>
<li><p>MPC ili HSM operacije</p>
</li>
<li><p>analitiku i monitoring</p>
</li>
<li><p>enterprise podršku</p>
</li>
</ul>
<p>Cene se menjaju i razlikuju među provajderima, pa ih treba proveriti neposredno pre arhitektonske odluke. Važnije od početne cene je pitanje šta se događa sa postojećim accountima ako se provajder promeni.</p>
<h3>Audit i operativna bezbednost</h3>
<p>Custom smart account, recovery modul i paymaster uvode kod koji kontroliše sredstva ili budžet. Trošak zato uključuje:</p>
<ul>
<li><p>eksterni audit</p>
</li>
<li><p>interne review procese</p>
</li>
<li><p>monitoring</p>
</li>
<li><p>incident response</p>
</li>
<li><p>upravljanje upgrade ključevima</p>
</li>
<li><p>testiranje migracije</p>
</li>
<li><p>testiranje recoveryja</p>
</li>
<li><p>održavanje nakon promene mrežnih standarda</p>
</li>
</ul>
<p>Najjeftiniji wallet SDK može biti veoma skup ako korisnički account ne može bezbedno da napusti njegov ekosistem.</p>
<h2>Trade-off koji account abstraction ne uklanja</h2>
<p>Programabilni nalozi rešavaju deo UX problema, ali dodaju nove failure modove.</p>
<p>Kod EOA modela glavni problem je ključ. Kod smart accounta problem može biti bilo koja od sledećih komponenti:</p>
<ul>
<li><p>signer</p>
</li>
<li><p>validator modul</p>
</li>
<li><p>recovery modul</p>
</li>
<li><p>proxy ili upgrade mehanizam</p>
</li>
<li><p>factory</p>
</li>
<li><p>bundler dostupnost</p>
</li>
<li><p>paymaster politika</p>
</li>
<li><p>frontend koji konstruiše operaciju</p>
</li>
<li><p>servis koji čuva credential metapodatke</p>
</li>
</ul>
<p>To ne znači da je EOA bezbedniji. Znači da je smart account složeniji sistem koji zahteva ozbiljnije inženjerstvo.</p>
<p>Account abstraction je alat za izražavanje boljih bezbednosnih pravila. Ne garantuje da će ta pravila biti dobra.</p>
<h2>Šta treba meriti tokom razvoja</h2>
<p>Wallet funnel ne treba meriti samo kroz broj konekcija.</p>
<p>Korisnije metrike su:</p>
<ul>
<li><p>procenat korisnika koji razumeju šta se upravo kreira</p>
</li>
<li><p>uspešnost prve onchain akcije</p>
</li>
<li><p>vreme do prve korisne akcije</p>
</li>
<li><p>broj promene mreže pre uspeha</p>
</li>
<li><p>procenat odbijenih potpisa</p>
</li>
<li><p>broj neuspešnih simulacija</p>
</li>
<li><p>procenat korisnika bez sredstava za gas</p>
</li>
<li><p>uspešnost dodavanja drugog recovery faktora</p>
</li>
<li><p>uspešnost recovery testa</p>
</li>
<li><p>procenat korisnika koji umeju da razlikuju lokalni PIN od recovery metoda</p>
</li>
<li><p>broj support zahteva po aktiviranom walletu</p>
</li>
</ul>
<p>Važno je testirati i neuspešne tokove.</p>
<p>Pitajte test korisnika da:</p>
<ul>
<li><p>promeni uređaj</p>
</li>
<li><p>izgubi pristup glavnom passkeyu</p>
</li>
<li><p>poveže pogrešan account</p>
</li>
<li><p>ostane bez gasa</p>
</li>
<li><p>odbije potpis</p>
</li>
<li><p>promeni mrežu tokom procesa</p>
</li>
<li><p>pokrene recovery</p>
</li>
<li><p>otkaže zlonameran recovery</p>
</li>
<li><p>objasni šta će se dogoditi pre nego što potvrdi operaciju</p>
</li>
</ul>
<p>Happy path pokazuje da integracija radi. Failure path pokazuje da li proizvod može bezbedno da se koristi.</p>
<h2>Praktična pravila za bolji wallet UX</h2>
<h3>Ne prikazuj seed bez stvarne potrebe</h3>
<p>Ako proizvod zahteva seed, objasni njegovu funkciju pre prikazivanja, ne samo zabranu deljenja. Nemoj ga prikazivati u analytics događajima, logovima, crash reportovima, screenshot previewju ili clipboard flowu bez jasnog razloga.</p>
<h3>Ne nazivaj lokalnu lozinku „wallet recovery” mehanizmom</h3>
<p>Korisnik mora jasno da zna šta lozinka štiti i šta ne može da oporavi.</p>
<h3>Prikaži posledicu potpisa</h3>
<p>Umesto „Sign message”, prikaži nameru:</p>
<ul>
<li><p>prijavljuješ se na ovaj domen</p>
</li>
<li><p>odobravaš trošenje do određenog iznosa</p>
</li>
<li><p>prenosiš konkretan asset</p>
</li>
<li><p>aktiviraš session do određenog vremena</p>
</li>
<li><p>dodaješ novi recovery uređaj</p>
</li>
</ul>
<p>Wallet i aplikacija treba da se slažu oko iste semantike.</p>
<h3>Smanji broj odluka, ne količinu bezbednosti</h3>
<p>Sakrivanje mreže ima smisla ako je aplikacija može bezbedno odabrati. Skrivanje recipienta ili iznosa nema.</p>
<p>Dobra apstrakcija uklanja odluke koje korisnik ne mora da donese, ali zadržava vidljivost posledica.</p>
<h3>Recovery testiraj pre nego što postane potreban</h3>
<p>Recovery koji nikada nije testiran samo je teorija. Korisniku se može ponuditi simulacija ili kontrolisani test dodavanja novog uređaja bez izlaganja stvarnih sredstava.</p>
<h3>Dizajniraj izlaz pre ulaza</h3>
<p>Pre integracije proveri:</p>
<ul>
<li><p>može li korisnik da izveze ili migrira kontrolu</p>
</li>
<li><p>može li promeniti wallet provajdera</p>
</li>
<li><p>šta ostaje funkcionalno bez originalnog frontenda</p>
</li>
<li><p>postoji li dokumentovan recovery bez vendor podrške</p>
</li>
<li><p>može li account promeniti signer</p>
</li>
<li><p>ko kontroliše upgrade</p>
</li>
</ul>
<p>Ako izlaz ne postoji, proizvod možda ne nudi self-custody, već nalog vezan za određenu infrastrukturu.</p>
<h2>Seed fraza nije zastarela, ali više nije dovoljan odgovor</h2>
<p>Seed fraza rešava konkretan kriptografski i operativni problem: kako preneti dovoljno materijala da se deterministički wallet ponovo izvede bez centralnog servera.</p>
<p>Ona ne rešava sama po sebi:</p>
<ul>
<li><p>bezbedno čuvanje</p>
</li>
<li><p>krađu kroz phishing</p>
</li>
<li><p>gubitak uređaja</p>
</li>
<li><p>nasleđivanje</p>
</li>
<li><p>promenu autorizacione politike</p>
</li>
<li><p>ograničenje sesije</p>
</li>
<li><p>potpisivanje razumljivo ljudima</p>
</li>
<li><p>gas onboarding</p>
</li>
<li><p>zaštitu od greške korisnika</p>
</li>
</ul>
<p>Najvažnija promena u modernom wallet dizajnu nije nestanak ključeva. Ključevi su i dalje tu. Promena je u tome što jedan root secret više ne mora da bude jedina nepromenljiva granica između korisnika i trajnog gubitka.</p>
<p>Passkeys donose poznatu i hardverski podržanu autorizaciju. Smart accounts omogućavaju programabilna pravila i rotaciju signera. MPC raspodeljuje kontrolu između više komponenti. Paymasteri menjaju način plaćanja transakcija. Session ključevi smanjuju broj prekida tokom upotrebe.</p>
<p>Svaki od tih mehanizama ima cenu i novi trust model. Ipak, daju developeru nešto što klasičan seed-only wallet nema: prostor da bezbednost prilagodi riziku konkretne operacije.</p>
<p>Najbolji wallet UX zato nije onaj koji korisniku objašnjava blockchain sa najviše strpljenja. Najbolji wallet UX je onaj koji od korisnika ne zahteva da postane stručnjak za key management kako bi bezbedno uradio jednostavnu stvar.</p>
<p>Za developera, koristan početni eksperiment nije još jedan „Connect wallet” ekran. Korisnije je napraviti mali prototip sa passkey signerom, smart accountom, jednom sponzorisanom akcijom i stvarnim recovery scenarijem. Tek kada recovery radi na izgubljenom uređaju, može se reći da je napravljen novčanik, a ne samo interfejs za happy path.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati USDT i USDC. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">BIP-39: Mnemonic code for generating deterministic keys</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki">BIP-32: Hierarchical Deterministic Wallets</a></p>
</li>
<li><p><a href="https://doi.org/10.1145/3706598.3713209">Of Secrets and Seedphrases: Conceptual Misunderstandings and Security Challenges for Seed Phrase Management among Cryptocurrency Users</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-1193">EIP-1193: Ethereum Provider JavaScript API</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-4337">ERC-4337: Account Abstraction Using Alt Mempool</a></p>
</li>
<li><p><a href="https://www.w3.org/TR/webauthn/">Web Authentication: An API for accessing Public Key Credentials, Level 3</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-7951">EIP-7951: Precompile for secp256r1 Curve Support</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-7702">EIP-7702: Set Code for EOAs</a></p>
</li>
<li><p><a href="https://ethereum.org/roadmap/account-abstraction/">Ethereum.org: Account abstraction</a></p>
</li>
<li><p><a href="https://docs.openzeppelin.com/contracts/5.x/learn/webauthn-smart-accounts">OpenZeppelin Contracts: WebAuthn Smart Accounts</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-5792">EIP-5792: Wallet Call API</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-6963">EIP-6963: Multi Injected Provider Discovery</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/"><strong>Volet Srbija</strong></a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/crypto-wallets-seed-phrases-and-ux-traps-for-developers-1611">Crypto Wallets: Seed Phrases and UX Traps for Developers</a></p>
]]></content:encoded></item><item><title><![CDATA[Arbitrum, Optimism i Base: tri različita L2 sistema]]></title><description><![CDATA[Arbitrum, Optimism i Base često se pojavljuju u istoj kategoriji: Ethereum Layer 2 mreže sa EVM kompatibilnošću i nižim naknadama.
To je dobar početak, ali loš završetak objašnjenja.
Iz perspektive je]]></description><link>https://kripto-pocetnica.hashnode.dev/arbitrum-optimism-i-base-tri-razli-ita-l2-sistema</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/arbitrum-optimism-i-base-tri-razli-ita-l2-sistema</guid><category><![CDATA[Arbitrum]]></category><category><![CDATA[optimism]]></category><category><![CDATA[base]]></category><category><![CDATA[crypto]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[blockchain development company]]></category><category><![CDATA[layer2]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Sun, 20 Sep 2026 23:09:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/879222b3-ed3b-405f-bc7b-aa0faf357c40.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Arbitrum, Optimism i Base često se pojavljuju u istoj kategoriji: Ethereum Layer 2 mreže sa EVM kompatibilnošću i nižim naknadama.</p>
<p>To je dobar početak, ali loš završetak objašnjenja.</p>
<p>Iz perspektive jednostavnog Solidity ugovora, ove mreže zaista izgledaju slično. Koriste ETH za gas, podržavaju Ethereum JSON-RPC, rade sa Foundryjem, Hardhatom, <code>viem</code> i <code>ethers</code> bibliotekama, a korisnik ih obično dodaje u isti wallet.</p>
<p>Ispod tog interfejsa nalaze se različiti sistemi.</p>
<p>Arbitrum One koristi Nitro arhitekturu i sopstveni rollup protokol. OP Mainnet koristi OP Stack, skup modularnih komponenti za pokretanje optimistic rollupa. Base je takođe napravljen na OP Stacku, ali je zasebna mreža sa svojim stanjem, sekvencerom, ekonomijom, korisnicima i dodatnim infrastrukturnim slojevima.</p>
<p>Zbog toga ovo nije poređenje tri RPC endpointa.</p>
<p>Praktična pitanja su:</p>
<ul>
<li><p>kako svaka mreža formira i potvrđuje blokove</p>
</li>
<li><p>ko određuje redosled transakcija</p>
</li>
<li><p>kako se stanje može proveriti preko Ethereuma</p>
</li>
<li><p>od čega se sastoji transakciona naknada</p>
</li>
<li><p>koliko traje povlačenje sredstava na Ethereum</p>
</li>
<li><p>koje mrežne specifičnosti ulaze u aplikacioni kod</p>
</li>
<li><p>za kakav proizvod svaka mreža ima smisla</p>
</li>
</ul>
<p>Dokumentacija i tehnički detalji navedeni u članku provereni su 21. septembra 2026.</p>
<h2>Šta Ethereum Layer 2 zapravo radi</h2>
<p>Ethereum L1 obezbeđuje izvršavanje, konsenzus i dostupnost podataka, ali je prostor u bloku ograničen. Kada mnogo korisnika želi da pošalje transakciju, oni se kroz gas cenu nadmeću za isti resurs.</p>
<p>Optimistic rollup razdvaja izvršavanje od konačnog poravnanja.</p>
<p>U pojednostavljenom obliku tok izgleda ovako:</p>
<ol>
<li><p>Korisnik potpisuje L2 transakciju.</p>
</li>
<li><p>Sekvencer prihvata transakciju i određuje njeno mesto u redosledu.</p>
</li>
<li><p>Transakcija se izvršava u L2 okruženju.</p>
</li>
<li><p>Korisnik brzo dobija L2 potvrdu.</p>
</li>
<li><p>Podaci potrebni za rekonstrukciju L2 lanca objavljuju se na Ethereumu.</p>
</li>
<li><p>Rollup protokol objavljuje tvrdnje o L2 stanju.</p>
</li>
<li><p>Neispravno stanje može biti osporeno prema pravilima protokola.</p>
</li>
</ol>
<p>Aplikacija dobija brzo izvršavanje, dok Ethereum služi kao sloj za dostupnost podataka, proveru i konačno poravnanje.</p>
<p>Iz toga sledi da L2 transakcija nema samo jedan status.</p>
<p>Transakcija može biti:</p>
<ul>
<li><p>prihvaćena od sekvencera</p>
</li>
<li><p>uključena u L2 blok</p>
</li>
<li><p>objavljena kao deo podataka na Ethereumu</p>
</li>
<li><p>izvedena iz potvrđenih L1 podataka</p>
</li>
<li><p>povezana sa finalizovanim Ethereum blokom</p>
</li>
</ul>
<p>Za društvenu aplikaciju može biti dovoljno da transakcija bude uključena na L2. Za veliki withdrawal, kreditiranje kolaterala ili treasury operaciju potreban je stroži kriterijum.</p>
<p>To je zajednička osnova Arbitrum, Optimism i Base mreže. Implementacija te osnove nije ista.</p>
<h2>Arbitrum: Nitro kao poseban rollup sistem</h2>
<p>Arbitrum nije naziv jednog blockchaina.</p>
<p>Arbitrum ekosistem obuhvata više mreža i tehnologija, ali za standardni dApp deployment najvažniji je <strong>Arbitrum One</strong>, optimistic rollup koji koristi Nitro arhitekturu.</p>
<p>Arbitrum One mainnet koristi chain ID <code>42161</code>, Arbitrum Sepolia koristi <code>421614</code>, a gas se plaća u ETH. ARB je governance token i ne koristi se kao nativni gas asset.</p>
<p>Za EVM developera početno iskustvo izgleda poznato:</p>
<ul>
<li><p>Solidity ugovori</p>
</li>
<li><p>Ethereum ABI</p>
</li>
<li><p>standardni događaji i logovi</p>
</li>
<li><p><code>eth_call</code></p>
</li>
<li><p><code>eth_estimateGas</code></p>
</li>
<li><p><code>eth_sendRawTransaction</code></p>
</li>
<li><p>ERC-20, ERC-721 i ERC-1155</p>
</li>
<li><p>Foundry i Hardhat</p>
</li>
<li><p>standardni wallet adapteri</p>
</li>
</ul>
<p>Ipak, Arbitrum One nije samo Geth instanca sa kraćim blokovima.</p>
<h3>Kako radi Arbitrum Nitro</h3>
<p>Nitro je druga generacija Arbitrum rollup arhitekture. Njegov izvršni sloj zasnovan je na Ethereum kompatibilnom execution engineu, dok ArbOS dodaje funkcije potrebne za rad L2 sistema.</p>
<p>Arhitektura se može posmatrati kroz nekoliko delova:</p>
<ul>
<li><p>sekvencer prima i uređuje korisničke transakcije</p>
</li>
<li><p>execution engine izvršava EVM operacije</p>
</li>
<li><p>ArbOS obrađuje L2 specifične funkcije</p>
</li>
<li><p>batch poster objavljuje podatke na Ethereum</p>
</li>
<li><p>validator proverava izvedeno stanje</p>
</li>
<li><p>rollup protokol rešava eventualne sporove</p>
</li>
</ul>
<p>Sekvencer omogućava brzo korisničko iskustvo. Kada prihvati transakciju, aplikacija može skoro odmah dobiti receipt i prikazati rezultat.</p>
<p>Međutim, sekvencerova potvrda nije isto što i Ethereum finalnost.</p>
<p>Podaci o transakciji moraju postati dostupni preko L1, a stanje mora proći kroz rollup protokol. Zbog toga backend ne bi trebalo da koristi samo boolean vrednost <code>confirmed</code>.</p>
<p>Korisniji model je:</p>
<pre><code class="language-text">sequenced -&gt; posted_to_l1 -&gt; confirmed -&gt; finalized
</code></pre>
<p>Aplikacija ne mora svako od ovih stanja da prikazuje korisniku. Interno ipak treba da zna šta smatra dovoljnim nivoom sigurnosti.</p>
<h3>Zašto ArbOS postoji</h3>
<p>Na Ethereumu execution client izvršava transakcije prema pravilima Ethereum protokola. Arbitrumu su potrebna dodatna pravila za L1 i L2 komunikaciju, obračun troškova podataka, sistemske poruke i upravljanje rollup okruženjem.</p>
<p>Ta pravila obezbeđuje ArbOS.</p>
<p>Za većinu Solidity ugovora ArbOS ostaje nevidljiv. Ugovor i dalje vidi <code>msg.sender</code>, <code>msg.value</code>, storage, calldata i standardne EVM operacije.</p>
<p>ArbOS postaje važan kada aplikacija:</p>
<ul>
<li><p>procenjuje L1 komponentu naknade</p>
</li>
<li><p>šalje poruke između Arbitrum mreže i Ethereuma</p>
</li>
<li><p>proverava L1 podatke iz L2 ugovora</p>
</li>
<li><p>koristi Arbitrum sistemske precompile ugovore</p>
</li>
<li><p>radi sa retryable ticket mehanizmom</p>
</li>
<li><p>zavisi od posebnih svojstava Arbitrum lanca</p>
</li>
</ul>
<p>Čim ugovor direktno koristi Arbitrum sistemski interfejs, više nije potpuno prenosiv na drugu EVM mrežu.</p>
<p>To nije nužno problem. Problem je kada tim tu zavisnost ne tretira kao arhitektonsku odluku.</p>
<h3>Retryable tickets i L1 prema L2 poruke</h3>
<p>Slanje obične transakcije direktno na Arbitrum One nije isto što i slanje poruke sa Ethereum L1 mreže ka Arbitrumu.</p>
<p>Za L1 prema L2 komunikaciju Arbitrum koristi retryable tickets. Oni predstavljaju poruke koje treba izvršiti na L2, uz parametre kao što su:</p>
<ul>
<li><p>ciljna L2 adresa</p>
</li>
<li><p>calldata</p>
</li>
<li><p>vrednost koja se šalje</p>
</li>
<li><p>sredstva za L2 gas</p>
</li>
<li><p>refund adrese</p>
</li>
<li><p>ograničenje gasa</p>
</li>
</ul>
<p>Korisnik ili aplikacija najčešće ne treba ručno da implementira ceo protokol. Zvanični bridge alati i SDK apstrakcije postoje upravo zato što pogrešna procena gasa ili pogrešna refund adresa mogu ostaviti poruku neizvršenom.</p>
<p>Važna posledica je da L1 prema L2 operacija ima najmanje dva relevantna događaja:</p>
<ol>
<li><p>transakcija je prihvaćena na Ethereumu</p>
</li>
<li><p>odgovarajuća poruka je izvršena na Arbitrumu</p>
</li>
</ol>
<p>Backend koji prati samo L1 receipt može prerano zaključiti da je čitava operacija završena.</p>
<h3>Koliko košta transakcija na Arbitrumu</h3>
<p>Arbitrum transakciona naknada ima dve osnovne komponente:</p>
<ul>
<li><p>trošak izvršavanja na Arbitrumu</p>
</li>
<li><p>trošak objavljivanja podataka na Ethereumu</p>
</li>
</ul>
<p>L2 deo zavisi od količine gasa koju EVM izvršavanje potroši i trenutne Arbitrum gas cene.</p>
<p>L1 deo zavisi od količine podataka koje transakcija dodaje rollup batchu i trenutnog troška objavljivanja tih podataka. ArbOS u procenu uključuje očekivani trošak L1 data komponente.</p>
<p>Zbog kompresije batcha dve transakcije sa sličnom količinom calldata podataka ne moraju proizvesti potpuno isti efektivni trošak.</p>
<p>Zato nije dovoljno računati:</p>
<pre><code class="language-text">gasUsed * gasPrice
</code></pre>
<p>i pretpostaviti da je to kompletno objašnjenje ekonomije transakcije.</p>
<p>Za slanje standardne transakcije wallet i biblioteka uglavnom će dobiti odgovarajuću procenu preko RPC-a. Poseban obračun postaje važan kada aplikacija:</p>
<ul>
<li><p>sponzoriše korisnički gas</p>
</li>
<li><p>prikazuje fee breakdown</p>
</li>
<li><p>poredi cenu operacija između mreža</p>
</li>
<li><p>planira veliki broj automatizovanih transakcija</p>
</li>
<li><p>koristi sopstveni relayer</p>
</li>
</ul>
<p>Cena nije fiksna i ne treba je hardkodovati u korisničkom interfejsu.</p>
<h3>Povlačenje sredstava sa Arbitrum One mreže</h3>
<p>Deposit sa Ethereuma na Arbitrum i withdrawal sa Arbitrum mreže na Ethereum nisu simetrične operacije.</p>
<p>L1 prema L2 deposit može se završiti relativno brzo nakon Ethereum transakcije i izvršavanja odgovarajuće L2 poruke.</p>
<p>Standardni L2 prema L1 withdrawal prolazi kroz duži proces:</p>
<ol>
<li><p>korisnik inicira withdrawal na Arbitrumu</p>
</li>
<li><p>L2 poruka se registruje u stanju mreže</p>
</li>
<li><p>odgovarajuća tvrdnja o stanju objavljuje se na Ethereumu</p>
</li>
<li><p>prolazi period u kojem stanje može biti osporeno</p>
</li>
<li><p>poruka postaje izvršiva na L1</p>
</li>
<li><p>korisnik ili relayer izvršava završnu L1 transakciju</p>
</li>
</ol>
<p>U standardnom optimistic toku treba računati na približno sedam dana pre završnog izvršenja na Ethereumu.</p>
<p>Fast bridge može korisniku isplatiti sredstva ranije, ali tada korisnik ne preskače protokolsko čekanje. Dobavljač likvidnosti preuzima čekanje i naplaćuje uslugu.</p>
<h3>Stylus menja programski sloj, ne samo sintaksu</h3>
<p>Arbitrum Stylus omogućava pisanje smart contracta u jezicima kao što su Rust, C i C++, uz kompajliranje u WebAssembly i interoperabilnost sa EVM ugovorima.</p>
<p>To otvara nekoliko mogućnosti:</p>
<ul>
<li><p>korišćenje Rust tipova i ekosistema</p>
</li>
<li><p>ponovna upotreba dela postojećeg koda</p>
</li>
<li><p>efikasnije izvršavanje pojedinih računskih operacija</p>
</li>
<li><p>kombinovanje Solidity i Stylus ugovora</p>
</li>
</ul>
<p>Solidity ugovor može pozvati Stylus ugovor, a Stylus ugovor može komunicirati sa EVM contractima.</p>
<p>Ipak, Stylus nije automatski razlog za prepisivanje postojeće aplikacije.</p>
<p>Tim uvodi:</p>
<ul>
<li><p>novi build pipeline</p>
</li>
<li><p>novi programski model</p>
</li>
<li><p>dodatnu audit površinu</p>
</li>
<li><p>manji broj auditora sa specifičnim iskustvom</p>
</li>
<li><p>nove pretpostavke o alatima i bibliotekama</p>
</li>
</ul>
<p>Stylus ima smisla kada postoji konkretna korist, na primer složenija računarska logika ili postojeći Rust kod koji se može bezbedno prilagoditi smart contract okruženju.</p>
<h3>Realan Arbitrum use-case</h3>
<p>Arbitrum je prirodan izbor za aplikaciju koja treba da komunicira sa postojećim DeFi protokolima i likvidnošću na Arbitrum One mreži.</p>
<p>Zamislimo automatizovani treasury sistem koji:</p>
<ol>
<li><p>prima stablecoin uplate</p>
</li>
<li><p>deo sredstava menja za drugi asset</p>
</li>
<li><p>koristi lending protokol za kratkoročnu likvidnost</p>
</li>
<li><p>periodično povlači višak sredstava na Ethereum</p>
</li>
<li><p>vodi interni ledger svih operacija</p>
</li>
</ol>
<p>Solidity deo može biti relativno mali. Teži deo je infrastruktura:</p>
<ul>
<li><p>provera tačnih token adresa</p>
</li>
<li><p>zaštita od slippagea</p>
</li>
<li><p>praćenje oracle podataka</p>
</li>
<li><p>indeksiranje događaja</p>
</li>
<li><p>monitoring pozicija</p>
</li>
<li><p>razlikovanje L2 potvrde od L1 finalnosti</p>
</li>
<li><p>upravljanje withdrawal periodom</p>
</li>
<li><p>održavanje ETH balansa za gas</p>
</li>
</ul>
<p>Prednost Arbitrum mreže u takvom slučaju nije apstraktna tvrdnja da je „brža”. Prednost je postojanje protokola i likvidnosti koje aplikacija zaista koristi.</p>
<h3>Arbitrum trade-off</h3>
<p>Arbitrum One pruža poznato EVM iskustvo, relativno niske transakcione troškove i pristup razvijenom L2 ekosistemu.</p>
<p>Cena toga je dodatni sistemski sloj.</p>
<p>Developer mora razumeti:</p>
<ul>
<li><p>sekvencer i njegovu dostupnost</p>
</li>
<li><p>Nitro i ArbOS specifičnosti</p>
</li>
<li><p>retryable tickets</p>
</li>
<li><p>L1 i L2 fee komponente</p>
</li>
<li><p>optimistic withdrawal period</p>
</li>
<li><p>Arbitrum specifične precompile ugovore</p>
</li>
<li><p>razliku između sekvencerske potvrde i Ethereum finalnosti</p>
</li>
</ul>
<p>Ako aplikacija koristi samo obične EVM funkcije, većina složenosti može ostati u infrastrukturi. Ako koristi cross-chain poruke i sistemske ugovore, Arbitrum postaje deo poslovne logike.</p>
<h2>Optimism: OP Mainnet kao referentni OP Stack chain</h2>
<p>Naziv Optimism često se koristi za nekoliko različitih stvari.</p>
<ul>
<li><p><strong>OP Mainnet</strong> je konkretna Ethereum L2 mreža.</p>
</li>
<li><p><strong>OP Stack</strong> je skup softverskih komponenti za izgradnju L2 mreža.</p>
</li>
<li><p><strong>Optimism Collective</strong> je širi governance i finansijski sistem.</p>
</li>
<li><p><strong>Superchain</strong> je ekosistem OP Stack mreža koje usvajaju zajedničke standarde.</p>
</li>
</ul>
<p>Kada aplikacija izvršava transakciju na „Optimismu”, ona u praksi najčešće koristi OP Mainnet.</p>
<p>OP Mainnet ima chain ID <code>10</code>, OP Sepolia koristi <code>11155420</code>, a gas se plaća u ETH. OP token nije gas token.</p>
<h3>OP Stack je modularan sistem</h3>
<p>OP Stack ne predstavlja jedan monolitni program. Sistem je podeljen na komponente sa različitim odgovornostima.</p>
<p>Najvažnije su:</p>
<ul>
<li><p>execution client koji izvršava EVM transakcije</p>
</li>
<li><p>rollup node koji izvodi L2 lanac iz L1 podataka</p>
</li>
<li><p>sequencer koji određuje redosled novih L2 transakcija</p>
</li>
<li><p>batcher koji objavljuje podatke na Ethereum</p>
</li>
<li><p>proposer koji objavljuje tvrdnje o izlaznom stanju</p>
</li>
<li><p>fault proof komponente koje omogućavaju osporavanje neispravnog stanja</p>
</li>
</ul>
<p>Uobičajena OP Stack implementacija koristi <code>op-geth</code> kao execution client i <code>op-node</code> kao consensus odnosno rollup komponentu.</p>
<p><code>op-geth</code> održava EVM stanje i izvršava transakcije. <code>op-node</code> prati Ethereum, obrađuje podatke koje je batcher objavio i iz njih izvodi kanonski L2 lanac.</p>
<p>Ovo razdvajanje je važno.</p>
<p>OP Mainnet blok nije kanonski samo zato što ga je određeni RPC endpoint vratio. Nezavisni rollup node može da uzme podatke sa Ethereuma, primeni protokolska pravila i proveri da li je L2 lanac pravilno izveden.</p>
<h3>Derivation je centralni OP Stack koncept</h3>
<p>OP Stack koristi derivation pipeline za rekonstrukciju L2 lanca iz Ethereum podataka.</p>
<p>Na visokom nivou rollup node:</p>
<ol>
<li><p>čita Ethereum blokove</p>
</li>
<li><p>pronalazi relevantne deposit transakcije i batch podatke</p>
</li>
<li><p>dekodira kanale i batcheve</p>
</li>
<li><p>grupiše podatke prema L1 origin blokovima</p>
</li>
<li><p>proizvodi payload atribute</p>
</li>
<li><p>prosleđuje ih execution engineu</p>
</li>
<li><p>proverava da li se dobijeno stanje slaže sa pravilima lanca</p>
</li>
</ol>
<p>To znači da je Ethereum više od mesta na kojem se povremeno čuva hash.</p>
<p>Podaci objavljeni na L1 omogućavaju nezavisnom nodeu da rekonstruiše L2 istoriju. Sekvencer pruža brzu putanju do novih blokova, ali L1 derivation određuje proverljivi lanac.</p>
<h3>Unsafe, safe i finalized blokovi</h3>
<p>Jedna od najvažnijih OP Stack razlika za backend developera jeste eksplicitno razlikovanje statusa L2 headova.</p>
<p><strong>Unsafe head</strong> predstavlja najnoviji lanac koji je sekvencer proizveo. Transakcija može biti vidljiva i izvršena, ali podaci još ne moraju biti objavljeni na Ethereumu.</p>
<p><strong>Safe head</strong> predstavlja L2 lanac koji je moguće izvesti iz podataka objavljenih na L1.</p>
<p><strong>Finalized head</strong> predstavlja deo L2 lanca izveden iz finalizovanih Ethereum blokova.</p>
<p>Ovi statusi nisu samo terminologija za node operatore.</p>
<p>Zamislimo backend koji prihvata stablecoin depozit i odmah omogućava korisniku povlačenje drugog asseta.</p>
<p>Ako backend prihvati unsafe stanje bez limita, preuzima rizik da sekvencerov pogled na lanac neće postati safe. Ako uvek čeka finalized stanje, korisničko iskustvo može postati nepotrebno sporo.</p>
<p>Praktično rešenje je politika zasnovana na riziku:</p>
<ul>
<li><p>mali iznos može biti knjižen nakon rane L2 potvrde</p>
</li>
<li><p>srednji iznos može čekati safe status</p>
</li>
<li><p>veliki iznos može čekati finalized status ili ručnu proveru</p>
</li>
</ul>
<p>Status transakcije nije poslovna odluka. To je signal koji poslovna logika treba da protumači.</p>
<h3>Kako se obračunava OP Mainnet naknada</h3>
<p>OP Mainnet transakcija može uključivati više komponenti:</p>
<ul>
<li><p>L2 execution fee</p>
</li>
<li><p>L1 data fee</p>
</li>
<li><p>eventualne dodatne fee parametre definisane aktuelnom konfiguracijom mreže</p>
</li>
</ul>
<p>L2 execution fee zavisi od potrošenog gasa i L2 base fee vrednosti.</p>
<p>L1 data fee pokriva trošak objavljivanja podataka na Ethereumu. Posle EIP-4844 nadogradnje, OP Stack može koristiti blob prostor za objavljivanje podataka, pa cena zavisi i od aktuelnog blob fee tržišta.</p>
<p>Trošak zato nije konstanta.</p>
<p>Dve funkcije koje troše približno isti EVM gas mogu imati različitu ukupnu cenu ako jedna šalje znatno više calldata podataka.</p>
<p>Ovo postaje važno kod:</p>
<ul>
<li><p>batch operacija</p>
</li>
<li><p>multisend ugovora</p>
</li>
<li><p>velikih dokaza i potpisa</p>
</li>
<li><p>calldata intenzivnih oracle ažuriranja</p>
</li>
<li><p>account abstraction operacija</p>
</li>
<li><p>contract deploymenta</p>
</li>
</ul>
<p>Optimizovanje samo Solidity izvršavanja nije uvek dovoljno. Na rollupu su format i veličina podataka deo ekonomije aplikacije.</p>
<h3>Fault proofs</h3>
<p>Optimistic rollup pretpostavlja da je objavljeno stanje validno dok se uspešno ne dokaže suprotno.</p>
<p>OP Stack fault proof sistem razdvaja tvrdnju o rezultatu izvršavanja od procesa kojim se ta tvrdnja osporava. Challenger može pokrenuti spor ako smatra da je predloženo stanje izvedeno protivno pravilima protokola.</p>
<p>Za aplikacionog developera fault proof nije API koji poziva pri svakoj transakciji.</p>
<p>Njegov značaj je sistemski:</p>
<ul>
<li><p>omogućava proveru predloženog stanja</p>
</li>
<li><p>smanjuje potrebu za poverenjem u jednog operatora</p>
</li>
<li><p>definiše sigurnosni model L2 prema L1 izlaza</p>
</li>
<li><p>utiče na withdrawal period</p>
</li>
</ul>
<p>Ipak, sama činjenica da fault proofs postoje ne znači da je svaki deo mreže potpuno decentralizovan. Treba odvojeno proveriti:</p>
<ul>
<li><p>ko upravlja sekvencerom</p>
</li>
<li><p>ko može nadograditi sistemske ugovore</p>
</li>
<li><p>postoje li security council ovlašćenja</p>
</li>
<li><p>koliko traje upgrade delay</p>
</li>
<li><p>pod kojim uslovima korisnik može prisilno poslati transakciju</p>
</li>
<li><p>ko može učestvovati u challenge procesu</p>
</li>
</ul>
<h3>OP Standard Bridge</h3>
<p>Standard Bridge služi za prenos ETH-a i podržanih ERC-20 tokena između Ethereuma i OP Mainneta.</p>
<p>Kod ERC-20 tokena važno je razumeti odnos između lokalnog i udaljenog tokena.</p>
<p>Token na jednoj mreži može biti:</p>
<ul>
<li><p>zaključan u bridge ugovoru</p>
</li>
<li><p>predstavljen odgovarajućim tokenom na drugoj mreži</p>
</li>
<li><p>spaljen prilikom povratka</p>
</li>
<li><p>otključan na originalnoj mreži</p>
</li>
</ul>
<p>Simbol tokena nije dovoljan za identifikaciju. Backend mora znati:</p>
<pre><code class="language-text">chain ID + contract address + remote token address
</code></pre>
<p>Standardni withdrawal sa OP Mainneta prema Ethereumu takođe prolazi kroz višefazni optimistic proces.</p>
<p>U aplikacionom interfejsu nije dovoljno prikazati da je withdrawal „poslat”. Korisnije je prikazati konkretno stanje:</p>
<pre><code class="language-text">initiated -&gt; ready to prove -&gt; proven -&gt; ready to finalize -&gt; finalized
</code></pre>
<p>Korisnik možda mora da izvrši više od jedne transakcije. Ako aplikacija koristi relayer koji to radi umesto njega, trošak i odgovornost samo su premešteni na backend.</p>
<h3>Zašto je OP Mainnet zanimljiv developeru</h3>
<p>OP Mainnet ima smisla kada aplikacija želi da radi direktno na mreži koja predstavlja centralni produkcioni primer OP Stack arhitekture.</p>
<p>To je posebno korisno za tim koji planira:</p>
<ul>
<li><p>deployment na više OP Stack chainova</p>
</li>
<li><p>rad sa Superchain standardima</p>
</li>
<li><p>sopstveni OP Stack chain</p>
</li>
<li><p>standardizovanu cross-chain infrastrukturu</p>
</li>
<li><p>korišćenje zajedničkih OP Stack sistemskih ugovora</p>
</li>
</ul>
<p>Međutim, prenosivost ne dolazi automatski.</p>
<p>Isti bytecode može biti deployovan na više OP Stack mreža, ali se razlikuju:</p>
<ul>
<li><p>chain ID</p>
</li>
<li><p>contract adrese</p>
</li>
<li><p>stanje</p>
</li>
<li><p>tokeni</p>
</li>
<li><p>likvidnost</p>
</li>
<li><p>bridge konfiguracija</p>
</li>
<li><p>fee parametri</p>
</li>
<li><p>governance</p>
</li>
<li><p>upgrade raspored</p>
</li>
</ul>
<p>OP Stack smanjuje tehničke razlike između mreža. Ne pretvara ih u jedan chain.</p>
<h3>Realan Optimism use-case</h3>
<p>Zamislimo protokol za escrow plaćanja koji prvo radi na OP Mainnetu, ali kasnije želi da podrži druge OP Stack mreže.</p>
<p>Smart contract može ostati relativno neutralan:</p>
<pre><code class="language-solidity">// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract Escrow {
    enum Status {
        None,
        Funded,
        Released,
        Refunded
    }

    struct Payment {
        address payer;
        address recipient;
        uint256 amount;
        Status status;
    }

    mapping(bytes32 =&gt; Payment) public payments;

    function fund(
        bytes32 paymentId,
        address recipient
    ) external payable {
        require(msg.value &gt; 0, "zero value");
        require(
            payments[paymentId].status == Status.None,
            "payment exists"
        );

        payments[paymentId] = Payment({
            payer: msg.sender,
            recipient: recipient,
            amount: msg.value,
            status: Status.Funded
        });
    }
}
</code></pre>
<p>Ugovor ne zavisi direktno od OP Stack sistemskih contracta. Zbog toga se može deployovati na više EVM mreža.</p>
<p>Backend ipak mora odvojeno čuvati svaki deployment:</p>
<pre><code class="language-ts">type Deployment = {
    chainId: number;
    contractAddress: `0x${string}`;
    deploymentBlock: bigint;
};

const deployments: Deployment[] = [
    {
        chainId: 10,
        contractAddress: "0x...",
        deploymentBlock: 0n,
    },
    {
        chainId: 11155420,
        contractAddress: "0x...",
        deploymentBlock: 0n,
    },
];
</code></pre>
<p>U stvarnoj konfiguraciji <code>deploymentBlock</code> treba da bude stvarni blok deploymenta. Indeksator nema razlog da čita istoriju od genesis bloka.</p>
<p>Ako protokol kasnije uvede direktne cross-chain poruke, neutralnost nestaje. Tada mora da izabere:</p>
<ul>
<li><p>OP Stack interoperability mehanizam</p>
</li>
<li><p>canonical bridge messaging</p>
</li>
<li><p>nezavisni messaging protokol</p>
</li>
<li><p>sopstveni relayer</p>
</li>
<li><p>off-chain koordinaciju</p>
</li>
</ul>
<p>To je granica između multi-deployment i stvarne multi-chain aplikacije.</p>
<h3>Optimism trade-off</h3>
<p>OP Mainnet pruža standardno EVM iskustvo i direktan pristup OP Stack arhitekturi.</p>
<p>Najveća prednost nije samo jeftinija transakcija, već relativno jasan put od jedne L2 aplikacije ka većem OP Stack sistemu.</p>
<p>Cena je složenost koja dolazi sa modularnim rollupom:</p>
<ul>
<li><p>derivation pipeline</p>
</li>
<li><p>unsafe, safe i finalized statusi</p>
</li>
<li><p>L1 i L2 fee komponente</p>
</li>
<li><p>višefazni withdrawal</p>
</li>
<li><p>bridge token modeli</p>
</li>
<li><p>sistemski predeploy ugovori</p>
</li>
<li><p>razlika između OP Mainneta i OP Stacka kao tehnologije</p>
</li>
</ul>
<p>Ako aplikacija ostane na jednom chainu i koristi samo standardni EVM, veliki deo ove složenosti može biti sakriven. Ako želi cross-chain funkcionalnost, ona postaje centralni deo dizajna.</p>
<h2>Base: OP Stack chain sa drugačijim proizvodnim fokusom</h2>
<p>Base je zaseban Ethereum L2 koji je inkubirao Coinbase. Izgrađen je na OP Stacku, ali nije deo OP Mainnet stanja i nije privatna Coinbase baza podataka.</p>
<p>Base mainnet koristi chain ID <code>8453</code>, Base Sepolia koristi <code>84532</code>, a gas se plaća u ETH.</p>
<p>Base nema poseban nativni token potreban za slanje transakcija. ETH na Base mreži je nativni gas asset.</p>
<p>Pošto Base koristi OP Stack, veliki deo protokolske arhitekture sličan je OP Mainnetu:</p>
<ul>
<li><p>execution client izvršava EVM transakcije</p>
</li>
<li><p>rollup node prati L1 i izvodi L2 stanje</p>
</li>
<li><p>sequencer formira nove L2 blokove</p>
</li>
<li><p>batcher objavljuje podatke na Ethereum</p>
</li>
<li><p>L2 stanje može se rekonstruisati iz L1 podataka</p>
</li>
<li><p>postoje unsafe, safe i finalized pogledi na lanac</p>
</li>
</ul>
<p>To ne znači da je Base samo OP Mainnet sa drugim chain ID-em.</p>
<h3>Base ima sopstveno stanje</h3>
<p>Ako isti ugovor deployujete na OP Mainnet i Base, dobijate dve odvojene instance.</p>
<p>One imaju odvojene:</p>
<ul>
<li><p>storage vrednosti</p>
</li>
<li><p>balanse</p>
</li>
<li><p>nonce vrednosti</p>
</li>
<li><p>događaje</p>
</li>
<li><p>administrativne uloge</p>
</li>
<li><p>upgrade putanje</p>
</li>
<li><p>likvidnost</p>
</li>
<li><p>korisnike</p>
</li>
</ul>
<p>Poziv ugovora na Base mreži ne može sinhrono da čita storage ugovora na OP Mainnetu.</p>
<p>Čak i kada ugovori imaju istu adresu, to ne znači da predstavljaju isti objekat. Identitet contracta mora da sadrži mrežu:</p>
<pre><code class="language-text">chain_id + contract_address
</code></pre>
<p>Isto važi za tokene. Adresa bez chain ID-a nije potpuni identifikator asseta.</p>
<h3>Kako Base izvodi L2 lanac</h3>
<p>Kao OP Stack mreža, Base koristi derivation proces u kojem rollup node čita Ethereum podatke i iz njih rekonstruiše L2 blokove.</p>
<p>Sekvencer pruža brzu putanju do najnovijeg stanja. Validator ne mora bezuslovno da prihvati ono što sekvencer tvrdi. Može samostalno pratiti Ethereum i iz objavljenih podataka izvesti proverljivi L2 lanac.</p>
<p>To stvara dva relevantna pogleda na najnovije stanje:</p>
<ul>
<li><p>stanje koje je sekvencer upravo proizveo</p>
</li>
<li><p>stanje koje je moguće izvesti iz objavljenih L1 podataka</p>
</li>
</ul>
<p>Za frontend je prvi pogled važan zbog brzine. Za settlement backend važan je drugi.</p>
<p>Base aplikacija zato ne treba da tretira svaki receipt kao jednak signal.</p>
<h3>Flashblocks kao dodatni preconfirmation sloj</h3>
<p>Base podržava Flashblocks, mehanizam koji izlaže preconfirmation podatke češće od standardnog L2 bloka. Aktuelna dokumentacija opisuje ažuriranja približno svakih 200 milisekundi preko posebnih preconfirmation endpointa.</p>
<p>To može biti korisno za aplikacije kojima je važan brz odziv:</p>
<ul>
<li><p>trading interfejse</p>
</li>
<li><p>igre</p>
</li>
<li><p>aukcije</p>
</li>
<li><p>payment UI</p>
</li>
<li><p>aplikacije sa čestim promenama stanja</p>
</li>
<li><p>agente koji šalju više uzastopnih transakcija</p>
</li>
</ul>
<p>Međutim, preconfirmation nije finalnost.</p>
<p>Korisno je razlikovati:</p>
<pre><code class="language-text">submitted
preconfirmed
included
safe
finalized
</code></pre>
<p>Frontend može preconfirmation koristiti za optimistički prikaz rezultata. Backend koji menja finansijski ledger mora da zna kada je transakcija uključena u standardni L2 lanac i kada je stanje dobilo jaču potvrdu.</p>
<p>Postoji i praktičan problem sa nonce vrednostima.</p>
<p>Ako aplikacija brzo šalje više transakcija, standardni RPC pogled na <code>pending</code> stanje možda neće uključivati sve Flashblocks preconfirmation transakcije. Za takav workflow treba koristiti dokumentovani preconfirmation endpoint i odgovarajući <code>pending</code> nonce.</p>
<p>To nije potrebno običnoj aplikaciji koja šalje jednu transakciju i čeka receipt. Važno je za relayer, market maker ili automatizovani sistem sa većom frekvencijom.</p>
<h3>Koliko košta Base transakcija</h3>
<p>Base transakciona naknada takođe se sastoji od više delova.</p>
<p>Osnovni model uključuje:</p>
<ul>
<li><p>L2 execution trošak</p>
</li>
<li><p>L1 data trošak</p>
</li>
<li><p>mrežne fee parametre aktuelne Base konfiguracije</p>
</li>
</ul>
<p>L2 execution deo zavisi od potrošenog gasa i trenutne Base gas cene.</p>
<p>L1 data deo zavisi od podataka koji se objavljuju na Ethereumu i stanja relevantnog L1 odnosno blob fee tržišta.</p>
<p>Base sistemska konfiguracija može uključivati dodatne parametre, uključujući operator fee parametre. Zbog toga aplikacija ne treba ručno da pretpostavi da je ukupna cena jednaka samo proizvodu <code>gasUsed</code> i L2 <code>baseFeePerGas</code> vrednosti.</p>
<p>Za korisnika je najvažnija procena koju wallet prikaže neposredno pre potpisivanja.</p>
<p>Za developera koji sponzoriše gas važniji su stvarni istorijski podaci:</p>
<ul>
<li><p>medijana po tipu operacije</p>
</li>
<li><p>viši percentili troška</p>
</li>
<li><p>odnos L1 i L2 komponente</p>
</li>
<li><p>trošak neuspelih transakcija</p>
</li>
<li><p>trošak contract deploymenta</p>
</li>
<li><p>trošak u periodima povećane aktivnosti</p>
</li>
</ul>
<p>Ako proizvod plaća gas za korisnike, rečenica „Base je jeftin” nije budžetski model.</p>
<h3>Base bridge i povlačenje na Ethereum</h3>
<p>Base koristi OP Stack bridge arhitekturu za komunikaciju sa Ethereumom.</p>
<p>Deposit sa Ethereuma na Base i withdrawal sa Base mreže na Ethereum ponovo nisu isti tok.</p>
<p>Kod deposita korisnik inicira L1 transakciju, posle koje odgovarajuća poruka postaje izvršiva na Base mreži.</p>
<p>Kod standardnog withdrawala proces uključuje:</p>
<ol>
<li><p>iniciranje na Base mreži</p>
</li>
<li><p>objavljivanje relevantnog L2 stanja</p>
</li>
<li><p>dokazivanje withdrawala</p>
</li>
<li><p>challenge period</p>
</li>
<li><p>finalizaciju na Ethereumu</p>
</li>
</ol>
<p>Standardni optimistic withdrawal može trajati približno sedam dana.</p>
<p>Ako korisniku treba brži izlaz, može koristiti bridge zasnovan na likvidnosti. Tada treba jasno prikazati:</p>
<ul>
<li><p>ko obezbeđuje likvidnost</p>
</li>
<li><p>koju naknadu naplaćuje</p>
</li>
<li><p>koji token korisnik prima</p>
</li>
<li><p>na kojoj mreži ga prima</p>
</li>
<li><p>šta se dešava ako relayer ili bridge nije dostupan</p>
</li>
</ul>
<p>Bridge nije samo dugme između dva wallet balansa. To je dodatni finansijski i sigurnosni sistem.</p>
<h3>Gde Base ima praktičan smisao</h3>
<p>Base je posebno zanimljiv za consumer aplikacije i plaćanja jer kombinuje EVM okruženje sa ekosistemom usmerenim na distribuciju krajnjim korisnicima.</p>
<p>To ipak nije razlog da se aplikacija automatski deployuje na Base.</p>
<p>Pravo pitanje je da li korisnik već ima:</p>
<ul>
<li><p>wallet koji podržava Base</p>
</li>
<li><p>ETH za gas ili podršku sponzorisanog gasa</p>
</li>
<li><p>potrebne tokene na Base mreži</p>
</li>
<li><p>pristup odgovarajućem on-rampu</p>
</li>
<li><p>razlog da ostane u Base ekosistemu posle prve transakcije</p>
</li>
</ul>
<p>Ako korisnik mora da kupi asset na drugoj mreži, premosti ga na Base, nabavi ETH za gas i tek onda izvrši osnovnu funkciju proizvoda, nominalno jeftina transakcija nije rešila korisnički problem.</p>
<h3>Realan Base use-case: stablecoin checkout</h3>
<p>Zamislimo SaaS aplikaciju koja korisniku izdaje fakturu i prihvata stablecoin na Base mreži.</p>
<p>Checkout prikazuje:</p>
<pre><code class="language-text">Iznos: 50 USDC
Mreža: Base
Primalac: 0x...
Rok plaćanja: 15 minuta
</code></pre>
<p>Backend ne treba da traži bilo koji događaj čiji simbol glasi <code>USDC</code>.</p>
<p>Treba da proveri:</p>
<ul>
<li><p>chain ID je <code>8453</code></p>
</li>
<li><p>emitter je tačno dozvoljena token adresa</p>
</li>
<li><p>događaj je ERC-20 <code>Transfer</code></p>
</li>
<li><p>primalac je očekivana adresa</p>
</li>
<li><p>sirovi iznos odgovara fakturi</p>
</li>
<li><p>transakcija je uspešna</p>
</li>
<li><p>log pripada kanonskom bloku</p>
</li>
<li><p>uplata ranije nije obrađena</p>
</li>
<li><p>dostignut je potreban nivo potvrde</p>
</li>
</ul>
<p>Model događaja može izgledati ovako:</p>
<pre><code class="language-ts">type TokenPayment = {
    chainId: number;
    transactionHash: `0x${string}`;
    logIndex: number;
    blockNumber: bigint;
    blockHash: `0x${string}`;
    tokenAddress: `0x${string}`;
    sender: `0x${string}`;
    recipient: `0x${string}`;
    rawAmount: bigint;
};
</code></pre>
<p>Jedinstveni ključ događaja treba da uključi najmanje:</p>
<pre><code class="language-text">chain_id + transaction_hash + log_index
</code></pre>
<p>Transaction hash sam po sebi nije dobar globalni identifikator u sistemu koji podržava više mreža.</p>
<p>Knjiženje treba da bude idempotentno. Ako worker primi isti događaj dva puta, korisnički saldo ne sme biti kreditiran dva puta.</p>
<p>Tipičan workflow izgleda ovako:</p>
<ol>
<li><p>WebSocket brzo prijavi novi događaj.</p>
</li>
<li><p>Worker čita receipt preko RPC-a.</p>
</li>
<li><p>Proverava chain, token, primaoca i iznos.</p>
</li>
<li><p>Čuva događaj sa jedinstvenim identifikatorom.</p>
</li>
<li><p>Čeka nivo potvrde definisan poslovnom politikom.</p>
</li>
<li><p>U istoj database transakciji menja status fakture i interni ledger.</p>
</li>
<li><p>Periodični reconciliation job ponovo proverava blockchain podatke.</p>
</li>
</ol>
<p>WebSocket ubrzava sistem. Ne predstavlja izvor konačne istine za računovodstvo.</p>
<h3>Base trade-off</h3>
<p>Base pruža poznat EVM model, OP Stack sigurnosnu arhitekturu i infrastrukturu prilagođenu aplikacijama koje ciljaju veliki broj krajnjih korisnika.</p>
<p>Flashblocks mogu dodatno poboljšati osećaj odziva kod aplikacija kojima je latencija važna.</p>
<p>Sa druge strane, developer mora razlikovati:</p>
<ul>
<li><p>Flashblocks preconfirmation</p>
</li>
<li><p>standardno L2 uključenje</p>
</li>
<li><p>safe stanje izvedeno iz L1 podataka</p>
</li>
<li><p>finalizovano stanje</p>
</li>
<li><p>Base od OP Mainneta</p>
</li>
<li><p>nativni od bridged asseta</p>
</li>
<li><p>canonical od liquidity bridge toka</p>
</li>
</ul>
<p>Base nije centralizovana baza podataka samo zato što je povezan sa Coinbaseom. Istovremeno, nije ni potpuno nezavisan od operativnih i governance odluka svojih ključnih operatora.</p>
<p>Threat model mora da uzme u obzir obe strane.</p>
<h2>Poređenje Arbitrum, Optimism i Base mreže</h2>
<p>Sve tri mreže omogućavaju izvršavanje Ethereum kompatibilnih smart contracta uz niže troškove od direktnog L1 izvršavanja u mnogim tržišnim uslovima.</p>
<p>To je njihova zajednička polazna tačka, ne cela arhitektura.</p>
<table>
<thead>
<tr>
<th>Osobina</th>
<th>Arbitrum One</th>
<th>OP Mainnet</th>
<th>Base</th>
</tr>
</thead>
<tbody><tr>
<td>Mainnet chain ID</td>
<td>42161</td>
<td>10</td>
<td>8453</td>
</tr>
<tr>
<td>Testnet</td>
<td>Arbitrum Sepolia</td>
<td>OP Sepolia</td>
<td>Base Sepolia</td>
</tr>
<tr>
<td>Gas asset</td>
<td>ETH</td>
<td>ETH</td>
<td>ETH</td>
</tr>
<tr>
<td>Osnovna arhitektura</td>
<td>Arbitrum Nitro</td>
<td>OP Stack</td>
<td>OP Stack</td>
</tr>
<tr>
<td>L2 sistemski sloj</td>
<td>ArbOS i Nitro</td>
<td>OP Stack predeploy i derivation sistem</td>
<td>OP Stack sa Base konfiguracijom</td>
</tr>
<tr>
<td>Primarni programski model</td>
<td>EVM i Solidity</td>
<td>EVM i Solidity</td>
<td>EVM i Solidity</td>
</tr>
<tr>
<td>Dodatni programski model</td>
<td>Stylus, Wasm jezici</td>
<td>Nema direktan ekvivalent Stylusu</td>
<td>Nema direktan ekvivalent Stylusu</td>
</tr>
<tr>
<td>Brzi signal transakcije</td>
<td>Sekvencerska potvrda</td>
<td>Unsafe L2 blok</td>
<td>Preconfirmation ili L2 blok</td>
</tr>
<tr>
<td>Stroži signal</td>
<td>L1 potvrđeno rollup stanje</td>
<td>Safe i finalized head</td>
<td>Safe i finalized head</td>
</tr>
<tr>
<td>Standardni L2 withdrawal</td>
<td>Optimistic, približno sedam dana</td>
<td>Optimistic, približno sedam dana</td>
<td>Optimistic, približno sedam dana</td>
</tr>
<tr>
<td>Glavna fee struktura</td>
<td>L2 izvršavanje i L1 data trošak</td>
<td>L2 izvršavanje i L1 data trošak</td>
<td>L2 izvršavanje, L1 data i aktuelni mrežni parametri</td>
</tr>
<tr>
<td>Posebna developer tema</td>
<td>Nitro, ArbOS, retryable tickets i Stylus</td>
<td>OP Stack, derivation i Superchain</td>
<td>OP Stack, Base ekosistem i Flashblocks</td>
</tr>
</tbody></table>
<h3>Ako pravite DeFi aplikaciju</h3>
<p>Prvo proverite gde postoje protokoli i likvidnost od kojih zavisite.</p>
<p>Jeftiniji deployment nema veliku vrednost ako korisnik mora da premosti svaki asset ili ako na ciljnoj mreži ne postoji dovoljno duboko tržište.</p>
<p>Arbitrum može biti logičan izbor ako aplikacija koristi postojeći Arbitrum DeFi sistem. OP Mainnet može biti bolji ako su zavisnosti već tamo ili ako je važna OP Stack strategija. Base može biti bolji ako se korisnici i potrebni asseti već nalaze na Base mreži.</p>
<h3>Ako pravite consumer aplikaciju</h3>
<p>Najvažniji kriterijum možda neće biti rollup protokol.</p>
<p>Važniji mogu biti:</p>
<ul>
<li><p>wallet onboarding</p>
</li>
<li><p>sponzorisanje gasa</p>
</li>
<li><p>dostupnost stablecoina</p>
</li>
<li><p>fiat on-ramp</p>
</li>
<li><p>distribucija aplikacije</p>
</li>
<li><p>brz odziv interfejsa</p>
</li>
<li><p>jednostavan recovery naloga</p>
</li>
</ul>
<p>Base može biti zanimljiv zbog consumer fokusa i Flashblocks podrške. To ne uklanja potrebu za pravilnim modelovanjem finalnosti.</p>
<h3>Ako pravite payment backend</h3>
<p>Ne birajte mrežu samo prema prosečnoj naknadi.</p>
<p>Proverite:</p>
<ul>
<li><p>koji token korisnici zaista poseduju</p>
</li>
<li><p>da li prihvatate nativnu ili bridged varijantu</p>
</li>
<li><p>koliko košta treasury consolidation</p>
</li>
<li><p>kako sredstva izlaze na Ethereum ili berzu</p>
</li>
<li><p>koliko je pouzdan RPC</p>
</li>
<li><p>kako se obrađuju reorganizacije</p>
</li>
<li><p>koji nivo potvrde pokreće isporuku proizvoda</p>
</li>
<li><p>ko plaća gas</p>
</li>
<li><p>kako se rešava uplata na pogrešnoj mreži</p>
</li>
</ul>
<p>Najjeftiniji transfer nije nužno najjeftiniji poslovni tok.</p>
<h3>Ako planirate deployment na sve tri mreže</h3>
<p>Multi-chain deployment povećava broj korisnika koje aplikacija može da podrži, ali uvodi dodatnu operativnu površinu.</p>
<p>Za svaki chain treba održavati:</p>
<ul>
<li><p>deployment adresu</p>
</li>
<li><p>deployment blok</p>
</li>
<li><p>admin i upgrade konfiguraciju</p>
</li>
<li><p>token allowlistu</p>
</li>
<li><p>oracle adrese</p>
</li>
<li><p>RPC providere</p>
</li>
<li><p>rezervne RPC providere</p>
</li>
<li><p>block explorer</p>
</li>
<li><p>bridge konfiguraciju</p>
</li>
<li><p>indeksator</p>
</li>
<li><p>treasury balans</p>
</li>
<li><p>alerte</p>
</li>
<li><p>incident proceduru</p>
</li>
</ul>
<p>Jedan Solidity repository ne znači jednu produkcionu aplikaciju.</p>
<p>Tri deploymenta su tri skupa stanja koja mogu da se raziđu.</p>
<p>Ako postoji poslovna logika koja mora ostati konzistentna između njih, timu je potreban eksplicitan cross-chain ili off-chain koordinacioni model.</p>
<h2>Zaključak</h2>
<p>Arbitrum, Optimism i Base rešavaju sličan problem, ali nisu isti sistem.</p>
<p>Arbitrum One koristi Nitro, ArbOS, retryable tickets i sopstveni rollup model. Uz standardni Solidity pruža i Stylus kao dodatno Wasm izvršno okruženje.</p>
<p>OP Mainnet je konkretna L2 mreža zasnovana na OP Stacku. Njegov najvažniji developer koncept nije samo EVM kompatibilnost, već derivation proces kojim nezavisni node rekonstruiše L2 lanac iz Ethereum podataka.</p>
<p>Base koristi OP Stack, ali predstavlja zaseban chain sa sopstvenim stanjem, parametrima, sekvencerom i ekosistemom. Flashblocks dodaje brži preconfirmation sloj, ali ne menja potrebu da aplikacija razlikuje rani signal od finalizovanog stanja.</p>
<p>Za običan smart contract razlike mogu biti male. Promeni se chain konfiguracija, RPC URL i deployment adresa.</p>
<p>Za produkcionu aplikaciju razlike su velike.</p>
<p>Pojavljuju se u:</p>
<ul>
<li><p>obračunu naknada</p>
</li>
<li><p>statusima blokova</p>
</li>
<li><p>cross-chain porukama</p>
</li>
<li><p>bridge workflowu</p>
</li>
<li><p>withdrawal periodu</p>
</li>
<li><p>sistemskim ugovorima</p>
</li>
<li><p>indeksiranju događaja</p>
</li>
<li><p>načinu na koji backend procenjuje rizik</p>
</li>
</ul>
<p>Najrazumniji izbor zato ne počinje pitanjem koja mreža ima najniži gas.</p>
<p>Počinje pitanjima:</p>
<ul>
<li><p>gde se nalaze korisnici</p>
</li>
<li><p>gde se nalaze potrebni asseti</p>
</li>
<li><p>od kojih protokola aplikacija zavisi</p>
</li>
<li><p>koliko brzo rezultat mora postati upotrebljiv</p>
</li>
<li><p>koji nivo finalnosti poslovni model zahteva</p>
</li>
<li><p>koliko L2 specifične infrastrukture tim želi da održava</p>
</li>
</ul>
<p>Ako su ti odgovori jasni, izbor između Arbitrum, Optimism i Base mreže obično postaje mnogo jednostavniji.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati USDT i USDC. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://docs.arbitrum.io/for-devs/dev-tools-and-resources/chain-info">Arbitrum Docs: Chain information</a></p>
</li>
<li><p><a href="https://docs.arbitrum.io/how-arbitrum-works/inside-arbitrum-nitro">Arbitrum Docs: Inside Arbitrum Nitro</a></p>
</li>
<li><p><a href="https://docs.arbitrum.io/how-arbitrum-works/gas-fees">Arbitrum Docs: Gas and fees</a></p>
</li>
<li><p><a href="https://docs.arbitrum.io/">Arbitrum Docs</a></p>
</li>
<li><p><a href="https://docs.arbitrum.io/stylus/gentle-introduction">Arbitrum Docs: Stylus introduction</a></p>
</li>
<li><p><a href="https://docs.optimism.io/">Optimism Docs</a></p>
</li>
<li><p><a href="https://specs.optimism.io/protocol/derivation.html">OP Stack Specification: Derivation</a></p>
</li>
<li><p><a href="https://docs.optimism.io/op-stack/fault-proofs/explainer">Optimism Docs: Fault proofs</a></p>
</li>
<li><p><a href="https://docs.optimism.io/app-developers/guides/bridging/standard-bridge">Optimism Docs: Standard Bridge</a></p>
</li>
<li><p><a href="https://docs.base.org/base-chain/api-reference/ethereum-json-rpc-api/eth_chainId">Base Docs: Chain ID</a></p>
</li>
<li><p><a href="https://docs.base.org/base-chain/specs/protocol/consensus/derivation">Base Docs: Derivation</a></p>
</li>
<li><p><a href="https://docs.base.org/base-chain/api-reference/ethereum-json-rpc-api/eth_getTransactionCount">Base Docs: Flashblocks transaction state</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/"><strong>Volet Srbija</strong></a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/arbitrum-optimism-and-base-for-developers-three-different-approaches-to-ethereum-layer-2-3kc6">Arbitrum, Optimism, and Base for Developers: Three Different Approaches to Ethereum Layer 2 Architecture</a></p>
]]></content:encoded></item><item><title><![CDATA[USDT i USDC ispod haube: arhitektura za developere]]></title><description><![CDATA[USDT i USDC na prvi pogled rade istu stvar. Oba tokena pokušavaju da održe vrednost blizu jednog američkog dolara, oba postoje na više blockchain mreža i oba se mogu poslati bez bankarskog radnog vrem]]></description><link>https://kripto-pocetnica.hashnode.dev/usdt-i-usdc-ispod-haube-arhitektura-za-developere</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/usdt-i-usdc-ispod-haube-arhitektura-za-developere</guid><category><![CDATA[usdt]]></category><category><![CDATA[usdc]]></category><category><![CDATA[tether]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[Stablecoins ]]></category><category><![CDATA[Web3]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Sat, 19 Sep 2026 16:43:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/48e0f79a-532a-4a84-a9b1-35e786878ced.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>USDT i USDC na prvi pogled rade istu stvar. Oba tokena pokušavaju da održe vrednost blizu jednog američkog dolara, oba postoje na više blockchain mreža i oba se mogu poslati bez bankarskog radnog vremena.</p>
<p>Za developera, međutim, sličnost se uglavnom završava na simbolu i ciljanoj ceni.</p>
<p>Iza tokena stoje različiti izdavaoci, različite rezerve, različiti modeli distribucije i različita cross-chain infrastruktura. Čak ni isti token na dve mreže nije jedan globalni balans. To su odvojeni ugovori, odvojeni ledger-i i odvojeni operativni rizici.</p>
<p>Ako aplikacija prihvata samo jedan stablecoin na jednoj mreži, integracija može da izgleda kao običan ERC-20 transfer. Ako treba da prima uplate, vodi interne balanse, šalje isplate, prebacuje likvidnost između mreža i na kraju konvertuje tokene u fiat, problem brzo postaje distribuirani platni sistem.</p>
<p>Ovaj tekst posmatra USDT i USDC upravo iz tog ugla.</p>
<h2>Kratak odgovor: šta su USDT i USDC</h2>
<p>USDT je stablecoin koji izdaje Tether. Namenjen je održavanju vrednosti bliske jednom USD i pokriven je rezervama kojima upravlja izdavalac. Najjača strana mu je rasprostranjenost: prisutan je na velikim berzama, u P2P trgovini, OTC kanalima, remittance aplikacijama i na više blockchain mreža.</p>
<p>USDC je stablecoin koji izdaju regulisani Circle entiteti. Takođe cilja vrednost od jednog USD, ali je operativno više usmeren ka institucionalnim on-ramp i off-ramp tokovima, transparentnosti rezervi i nativnoj interoperabilnosti između podržanih mreža.</p>
<p>Oba su fiat-backed stablecoini. To znači da stabilnost ne pokušavaju da postignu algoritmom ili kripto-kolateralom zaključanim u DeFi protokolu. Umesto toga, oslanjaju se na centralnog izdavaoca koji:</p>
<ul>
<li><p>prima fiat od kvalifikovanih klijenata</p>
</li>
<li><p>upravlja rezervnom imovinom</p>
</li>
<li><p>izdaje nove tokene</p>
</li>
<li><p>obrađuje otkup tokena za fiat</p>
</li>
<li><p>upravlja administratorskim pravima token ugovora</p>
</li>
<li><p>sprovodi pravne i compliance odluke</p>
</li>
</ul>
<p>Blockchain rešava prenos i evidenciju vlasništva nad tokenima. Ne čuva dolare koji ih pokrivaju i ne donosi odluku ko može da izvrši direktan otkup.</p>
<p>To je najvažnija mentalna granica za razumevanje oba sistema.</p>
<h2>Stablecoin nije dolar u smart ugovoru</h2>
<p>Kada wallet prikazuje <code>1,000 USDC</code> ili <code>1,000 USDT</code>, on ne prikazuje stanje bankovnog računa. Prikazuje količinu tokena u određenom ugovoru na određenoj mreži.</p>
<p>Vrednost tog tokena zavisi od nekoliko slojeva:</p>
<ol>
<li><p>Izdavalac mora da upravlja rezervama.</p>
</li>
<li><p>Kvalifikovani korisnici moraju da mogu da izvrše mint i redemption.</p>
</li>
<li><p>Berze i market makeri moraju da održavaju dovoljno likvidna tržišta.</p>
</li>
<li><p>Blockchain mora da nastavi da obrađuje transakcije.</p>
</li>
<li><p>Smart ugovor mora da radi očekivano.</p>
</li>
<li><p>Off-ramp partner mora da prihvata baš tu verziju tokena na baš toj mreži.</p>
</li>
</ol>
<p>Zbog toga oznaka <code>USDC</code> ili <code>USDT</code> nije dovoljna za identifikaciju imovine.</p>
<p>Praktični identitet tokena je kombinacija:</p>
<pre><code class="language-text">chainId + token contract address
</code></pre>
<p>Za ne-EVM mreže to može biti kombinacija mreže i mint adrese, asset ID-ja ili drugog nativnog identifikatora.</p>
<p>Ako baza čuva samo <code>currency = "USDC"</code>, model je nedovoljan. Potrebno je čuvati najmanje:</p>
<pre><code class="language-text">asset
network
chain_id
contract_or_asset_id
decimals
amount_in_base_units
transaction_hash
block_number
confirmation_status
</code></pre>
<p>To nije samo pitanje uredne šeme. Pogrešan model podataka pre ili kasnije završava pogrešno knjiženim depozitom ili slanjem tokena na nepodržanu mrežu.</p>
<h2>Kako USDT radi</h2>
<p>USDT je centralno izdat token sa promenljivom ponudom. Nema unapred definisan maksimalni supply kao Bitcoin. Ponuda raste i smanjuje se kroz procese izdavanja i otkupa kojima upravlja Tether.</p>
<h3>Primarno tržište</h3>
<p>Na primarnom tržištu kvalifikovani i verifikovani klijent radi direktno sa Tether-om.</p>
<p>Pojednostavljen mint tok izgleda ovako:</p>
<ol>
<li><p>Klijent prolazi KYC i AML proveru.</p>
</li>
<li><p>Klijent šalje fiat Tether-u.</p>
</li>
<li><p>Tether potvrđuje sredstva i zahtev za izdavanje.</p>
</li>
<li><p>Tether izdaje odgovarajuću količinu USDT-a na podržanoj mreži.</p>
</li>
<li><p>Tokeni se šalju klijentu ili ostaju u treasury inventaru do izdavanja.</p>
</li>
</ol>
<p>Redemption ide u suprotnom smeru:</p>
<ol>
<li><p>Verifikovani klijent šalje USDT Tether-u.</p>
</li>
<li><p>Tokeni se uklanjaju iz opticaja ili vraćaju u treasury.</p>
</li>
<li><p>Tether isplaćuje fiat na verifikovani bankovni račun, u skladu sa uslovima i naknadama.</p>
</li>
</ol>
<p>Direktan otkup nije zamišljen kao retail tok. Tether u dokumentaciji navodi minimalni iznos od 100.000 USD ekvivalenta. Za većinu korisnika realan izlaz nije direktan redemption, već prodaja USDT-a na berzi ili kod lokalnog OTC partnera.</p>
<h3>Sekundarno tržište</h3>
<p>Kada korisnik kupi 500 USDT na berzi, Tether najčešće ne mintuje novih 500 tokena. Korisnik kupuje postojeće tokene od druge strane ili iz inventara berze.</p>
<p>Isto važi za većinu aktivnosti koje aplikacija vidi:</p>
<ul>
<li><p>slanje USDT-a između wallet-a</p>
</li>
<li><p>zamena USDT-a za drugi token</p>
</li>
<li><p>prebacivanje između korisničkog i treasury wallet-a</p>
</li>
<li><p>trgovanje na centralizovanoj berzi</p>
</li>
<li><p>deponovanje u DeFi protokol</p>
</li>
</ul>
<p>Ove operacije menjaju vlasništvo nad postojećim tokenima, ali same po sebi ne menjaju ukupnu ponudu.</p>
<p>Peg se održava ekonomskim odnosom između primarnog i sekundarnog tržišta. Ako USDT padne ispod jednog USD, kvalifikovani akteri mogu da ga kupe sa diskontom i pokušaju da ga otkupe kod izdavaoca. Ako je cena iznad jednog USD, mogu da nabave nove tokene kroz primarni kanal i prodaju ih na tržištu.</p>
<p>Mehanizam nije automatski smart contract arbitrage. Zavisi od bankarskih šina, likvidnosti, prava na redemption i poverenja da će izdavalac obraditi zahtev.</p>
<h3>Rezerve USDT-a</h3>
<p>Tether navodi da su tokeni u opticaju pokriveni rezervama čija ukupna vrednost premašuje obaveze prema holderima.</p>
<p>Struktura rezervi nije ograničena samo na gotovinu. Objavljeni izveštaji obuhvataju kategorije kao što su:</p>
<ul>
<li><p>američki trezorski zapisi</p>
</li>
<li><p>gotovina i bankarski depoziti</p>
</li>
<li><p>money market fondovi</p>
</li>
<li><p>reverse repo aranžmani</p>
</li>
<li><p>obezbeđeni zajmovi</p>
</li>
<li><p>plemeniti metali</p>
</li>
<li><p>bitcoin</p>
</li>
<li><p>druge investicije</p>
</li>
</ul>
<p>Ovo ne znači automatski da je rezerva nekvalitetna. Znači da developer ili treasury tim ne sme izraz „backed by reserves” da prevede u „svaki token ima jedan fizički dolar na odvojenom računu”.</p>
<p>Važna je i razlika između atestacije i revizije. Atestacija daje nezavisno uveravanje o određenim izjavama i stanju na određeni datum. Potpuna finansijska revizija ima širi obim, proverava interne kontrole i finansijske izveštaje kroz duži period. Ta dva termina ne treba koristiti kao sinonime.</p>
<h3>USDT kao multichain token</h3>
<p>USDT nije sopstveni blockchain. Tether ga izdaje na više postojećih mreža, među kojima su Ethereum, Tron, Solana, Avalanche, TON, Near, Aptos, Celo, Kaia, Tezos, Liquid i Polkadot AssetHub.</p>
<p>Svaka implementacija koristi standard te mreže:</p>
<ul>
<li><p>ERC-20 na EVM mrežama</p>
</li>
<li><p>TRC-20 na Tronu</p>
</li>
<li><p>SPL token na Solani</p>
</li>
<li><p>Jetton na TON-u</p>
</li>
<li><p>Fungible Asset na Aptosu</p>
</li>
<li><p>Asset ID na Polkadot AssetHub-u</p>
</li>
</ul>
<p>Iz perspektive izdavaoca, jedan USDT na podržanoj mreži treba da predstavlja istu ekonomsku obavezu kao jedan USDT na drugoj podržanoj mreži. Iz perspektive aplikacije, to su potpuno odvojena sredstva.</p>
<p>USDT na Ethereumu ne može direktno da se pošalje u Tron transakciji. Potrebna je berza, bridge, issuer swap ili drugi posrednički mehanizam koji uklanja ili zaključava token na jednoj strani i izdaje odgovarajući oblik na drugoj.</p>
<p>Tether je tokom vremena ukidao podršku za pojedine mreže. Omni, EOS, Algorand, Kusama i Bitcoin Cash SLP nalaze se među legacy implementacijama za koje Tether više ne izdaje nove tokene niti ima istu obavezu direktnog otkupa. Token ugovor može i dalje postojati i transferi mogu tehnički raditi, ali to nije isto što i aktivna podrška izdavaoca.</p>
<p>Za produkcioni sistem lista mreža zato nije statička konfiguracija koju jednom upišeš i zaboraviš.</p>
<h3>Posebnost Ethereum USDT ugovora</h3>
<p>USDT na Ethereumu koristi stariju ERC-20 implementaciju. Njegova <code>transfer</code> funkcija ne ponaša se potpuno kao moderni ERC-20 ugovori koji eksplicitno vraćaju <code>bool</code>.</p>
<p>Ako Solidity ugovor očekuje standardni boolean povratni rezultat, direktan poziv može da dovede do neuspeha integracije. Tether u zvaničnim smernicama preporučuje korišćenje biblioteke koja ume da obradi i stare i nove ERC-20 implementacije.</p>
<p>U praksi, to znači <code>SafeERC20</code> iz OpenZeppelin-a:</p>
<pre><code class="language-solidity">// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {IERC20} from
    "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from
    "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

contract StablecoinPayout {
    using SafeERC20 for IERC20;

    function send(
        IERC20 token,
        address recipient,
        uint256 amount
    ) external {
        token.safeTransfer(recipient, amount);
    }
}
</code></pre>
<p>Primer nije kompletan treasury ugovor. Nema autentikaciju, limite, pause kontrolu ni zaštitu administratorskih ključeva. Pokazuje samo ispravan način da ugovor komunicira sa tokenima koji ne vraćaju vrednost dosledno modernom ERC-20 standardu.</p>
<h2>Kako USDC radi</h2>
<p>USDC koristi isti osnovni mint-and-burn princip, ali sa drugačijom rezervnom politikom, institucionalnim pristupom i znatno razvijenijom zvaničnom developer infrastrukturom.</p>
<p>Circle je jedini izdavalac USDC-a preko svojih regulisanih entiteta. Direktno izdavanje i otkup obavljaju se kroz Circle Mint.</p>
<h3>Mint i redemption</h3>
<p>Kvalifikovana institucija povezuje bankovni račun sa Circle Mint nalogom. Kada uplati fiat i zatraži USDC, Circle izdaje isti nominalni iznos tokena na izabranoj podržanoj mreži.</p>
<p>Kod redemption-a:</p>
<ol>
<li><p>Institucija šalje USDC na Circle Mint.</p>
</li>
<li><p>Circle uklanja odgovarajući USDC iz opticaja.</p>
</li>
<li><p>Fiat se šalje na povezani bankovni račun.</p>
</li>
</ol>
<p>Circle Mint nije dostupan fizičkim licima i malim kompanijama. Retail korisnici i manji startupi obično koriste:</p>
<ul>
<li><p>centralizovane berze</p>
</li>
<li><p>regulisane on-ramp i off-ramp provajdere</p>
</li>
<li><p>neobanke</p>
</li>
<li><p>wallet aplikacije</p>
</li>
<li><p>lokalne platne partnere</p>
</li>
</ul>
<p>To je bitna produktna razlika. „USDC je redeemable 1:1” ne znači da svaki holder može neposredno da pozove Circle API i dobije bankovni transfer. Direktan pristup zavisi od pravnog lica, jurisdikcije, onboardinga i dostupnosti Circle Mint proizvoda.</p>
<h3>Rezerve USDC-a</h3>
<p>Circle navodi da je USDC pokriven visoko likvidnom gotovinom i gotovinskim ekvivalentima.</p>
<p>Većina rezervi nalazi se u Circle Reserve Fund-u, SEC registrovanom government money market fondu kojim upravlja BlackRock. Fond može da sadrži:</p>
<ul>
<li><p>gotovinu</p>
</li>
<li><p>kratkoročne američke trezorske zapise</p>
</li>
<li><p>overnight repo transakcije obezbeđene američkim trezorcima</p>
</li>
</ul>
<p>Preostali deo drži se u gotovini kod regulisanih finansijskih institucija. Portfolio Circle Reserve Fund-a objavljuje se svakodnevno, Circle objavljuje nedeljne podatke o rezervama, mintovanju i redemption-u, a mesečni reserve report dobija nezavisno mišljenje Deloitte-a.</p>
<p>Ovo je konzervativniji i jednostavniji rezervni model od Tether-ovog. I dalje nije bez rizika. Postoje bankarski, kastodi, operativni, regulatorni i issuer rizik. USDC je tokom bankarske krize u martu 2023. privremeno odstupio od jednog USD, što je dobar podsetnik da kvalitet izveštavanja ne uklanja zavisnost od tradicionalnog finansijskog sistema.</p>
<h3>Native USDC nije isto što i bridged USDC</h3>
<p>Circle je do septembra 2026. nativno izdavao USDC na 38 blockchain mreža. Među njima su Ethereum, Solana, Base, Arbitrum, Optimism, Polygon PoS, Avalanche, Stellar, Aptos, Sui, Near, Celo, Linea, ZKsync i druge.</p>
<p>Reč „nativno” je ključna.</p>
<p>Native USDC je token koji Circle direktno izdaje i podržava na toj mreži. Bridged USDC je reprezentacija koja obično nastaje kada bridge zaključa USDC na izvornoj mreži i mintuje drugi token na odredišnoj.</p>
<p>Na nekim mrežama bridged verzija koristi oznaku <code>USDC.e</code>. Takav token može da prati cenu USDC-a, ali:</p>
<ul>
<li><p>Circle ga nije direktno izdao</p>
</li>
<li><p>ne mora biti podržan u Circle Mint-u</p>
</li>
<li><p>možda ne može da se pošalje na Circle deposit adresu</p>
</li>
<li><p>nosi rizik bridge ugovora</p>
</li>
<li><p>može imati odvojenu likvidnost</p>
</li>
<li><p>može koristiti drugu adresu i drugačiji redemption put</p>
</li>
</ul>
<p>Ticker u wallet-u zato nije dokaz autentičnosti.</p>
<p>Za svaku mrežu treba proveriti zvaničnu Circle tabelu ugovora. Na primer:</p>
<table>
<thead>
<tr>
<th>Mreža</th>
<th>Native USDC identifikator</th>
</tr>
</thead>
<tbody><tr>
<td>Ethereum</td>
<td><code>0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48</code></td>
</tr>
<tr>
<td>Base</td>
<td><code>0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913</code></td>
</tr>
<tr>
<td>Arbitrum</td>
<td><code>0xaf88d065e77c8cC2239327C5EDb3A432268e5831</code></td>
</tr>
<tr>
<td>Solana</td>
<td><code>EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v</code></td>
</tr>
<tr>
<td>Polygon PoS</td>
<td><code>0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359</code></td>
</tr>
</tbody></table>
<p>Ove adrese ne treba kopirati iz blogova, poruka ili rezultata pretrage. Produkciona konfiguracija treba da se proverava prema zvaničnoj dokumentaciji izdavaoca i odgovarajućem block exploreru.</p>
<h2>Kako oba tokena održavaju cenu</h2>
<p>USDT i USDC ne koriste oracle koji silom podešava cenu na jedan USD. Token ugovor ne može da naredi tržištu po kojoj ceni da trguje.</p>
<p>Peg nastaje iz kombinacije:</p>
<ul>
<li><p>prava kvalifikovanih klijenata na mint i redemption</p>
</li>
<li><p>dubine likvidnosti na berzama</p>
</li>
<li><p>arbitraže</p>
</li>
<li><p>kvaliteta i likvidnosti rezervi</p>
</li>
<li><p>poverenja u izdavaoca</p>
</li>
<li><p>pristupa bankarskom sistemu</p>
</li>
</ul>
<p>Ako USDC na berzi padne na 0,995 USD, institucionalni učesnik može da kupi token sa diskontom i otkupi ga za nominalni USD, pod uslovom da ima pristup Circle Mint-u i da redemption radi bez zastoja. Kupovina smanjuje diskont.</p>
<p>Ako token trguje iznad jednog USD, kvalifikovani učesnik može da mintuje novi USDC po nominalnoj vrednosti i proda ga skuplje na sekundarnom tržištu. Dodatna ponuda pritiska cenu nazad.</p>
<p>USDT koristi isti osnovni ekonomski princip, ali sa Tether-ovim pravilima pristupa, minimalnim iznosima, bankarskim kanalima i rezervnom politikom.</p>
<p>Zbog toga je „1 stablecoin = 1 USD” cilj i ekonomski mehanizam, ne nepromenljiva osobina protokola.</p>
<h2>Centralizacija nije fusnota</h2>
<p>USDT i USDC su tokeni na javnim blockchain mrežama, ali nisu decentralizovani u smislu izdavanja i upravljanja.</p>
<p>Izdavaoci kontrolišu administratorske funkcije koje mogu obuhvatiti:</p>
<ul>
<li><p>mintovanje novih tokena</p>
</li>
<li><p>spaljivanje tokena</p>
</li>
<li><p>pauziranje transfera</p>
</li>
<li><p>blokiranje pojedinačnih adresa</p>
</li>
<li><p>nadogradnju ugovora</p>
</li>
<li><p>upravljanje privilegovanim minter adresama</p>
</li>
</ul>
<p>Na Ethereum USDT ugovoru postoje funkcije kao što su <code>addBlackList</code>, <code>removeBlackList</code> i <code>destroyBlackFunds</code>. USDC FiatToken arhitektura takođe podržava blokiranje adresa i pauziranje ugovora.</p>
<p>To ima dve posledice koje developer mora eksplicitno da prihvati.</p>
<p>Prva je compliance prednost. Izdavalac može da reaguje na krađu, sankcije, sudski nalog ili zahtev organa za sprovođenje zakona.</p>
<p>Druga je counterparty kontrola. Balans u self-custody wallet-u nije van domašaja izdavaoca samo zato što korisnik drži privatni ključ. Privatni ključ kontroliše potpisivanje transakcije, ali token ugovor odlučuje da li je transfer dozvoljen.</p>
<p>Za platnu aplikaciju zato nije dovoljno pratiti samo stanje. Potrebno je imati proceduru za sredstva koja su:</p>
<ul>
<li><p>primljena sa sumnjive adrese</p>
</li>
<li><p>zamrznuta nakon prijema</p>
</li>
<li><p>povezana sa sankcionisanim entitetom</p>
</li>
<li><p>tehnički vidljiva, ali neprenosiva</p>
</li>
<li><p>vraćena ili spaljena kroz administratorsku akciju</p>
</li>
</ul>
<h2>Cross-chain problem: isti naziv, različita imovina</h2>
<p>Najveća greška u multichain integracijama je pretpostavka da blockchain mreže dele stanje.</p>
<p>Ne dele ga.</p>
<p>Ako korisnik ima 100 USDC na Ethereumu i želi 100 USDC na Base-u, postojeći tokeni moraju biti uklonjeni, zaključani ili predati posredniku na jednoj mreži, a odgovarajući tokeni oslobođeni ili mintovani na drugoj.</p>
<p>Postoje tri uobičajena modela.</p>
<h3>Lock and mint bridge</h3>
<p>Bridge zaključava originalni token u smart ugovoru i izdaje wrapped reprezentaciju na drugoj mreži.</p>
<p>Rizici uključuju:</p>
<ul>
<li><p>ranjivost bridge ugovora</p>
</li>
<li><p>kompromitovan validator ili signer set</p>
</li>
<li><p>pogrešno računanje zaključanog kolaterala</p>
</li>
<li><p>nelikvidnost wrapped tokena</p>
</li>
<li><p>zavisnost od bridge operatora</p>
</li>
</ul>
<h3>Liquidity bridge</h3>
<p>Korisnik uplaćuje token u pool na izvornoj mreži, a liquidity provider isplaćuje ekvivalent na odredišnoj.</p>
<p>Ovaj model uvodi:</p>
<ul>
<li><p>liquidity provider rizik</p>
</li>
<li><p>slippage</p>
</li>
<li><p>route availability</p>
</li>
<li><p>dinamičke naknade</p>
</li>
<li><p>rizik relayer infrastrukture</p>
</li>
</ul>
<h3>Burn and mint</h3>
<p>Token se spaljuje na izvornoj mreži, a izdavalac autorizuje mint nativnog tokena na odredišnoj.</p>
<p>Circle CCTP koristi ovaj model za USDC. Prednost je što korisnik na odredištu dobija native USDC, bez trajnog wrapped sloja i bez poola koji mora da drži oba sredstva.</p>
<h2>CCTP: kako USDC prelazi između mreža</h2>
<p>Cross-Chain Transfer Protocol je Circle-ov permissionless protokol za prenos nativnog USDC-a između podržanih blockchain mreža.</p>
<p>Osnovni CCTP tok izgleda ovako:</p>
<ol>
<li><p>Korisnik odobrava <code>TokenMessengerV2</code> ugovoru da potroši USDC.</p>
</li>
<li><p>Aplikacija poziva burn operaciju na izvornoj mreži.</p>
</li>
<li><p>USDC se spaljuje i emituje se cross-chain poruka.</p>
</li>
<li><p>Circle Iris servis posmatra događaj i potpisuje atestaciju.</p>
</li>
<li><p>Aplikacija preuzima atestaciju.</p>
</li>
<li><p>Aplikacija prosleđuje poruku i atestaciju <code>MessageTransmitter</code> ugovoru na odredišnoj mreži.</p>
</li>
<li><p>Odredišni ugovor proverava potpis i mintuje native USDC primaocu.</p>
</li>
</ol>
<p>Pojednostavljen tok može da se prikaže ovako:</p>
<pre><code class="language-mermaid">sequenceDiagram
    participant U as Korisnik
    participant S as Source chain
    participant I as Circle Iris
    participant D as Destination chain

    U-&gt;&gt;S: Approve i depositForBurn
    S-&gt;&gt;S: Burn native USDC
    S--&gt;&gt;I: Burn event
    I--&gt;&gt;U: Potpisana atestacija
    U-&gt;&gt;D: receiveMessage
    D-&gt;&gt;D: Provera atestacije
    D--&gt;&gt;U: Mint native USDC
</code></pre>
<p>CCTP ne uklanja sva poverenja. Circle-ova atestaciona infrastruktura je i dalje deo sistema. Protokol ipak uklanja neke tipične bridge pretpostavke, pre svega trajno zaključavanje USDC likvidnosti u third-party bridge poolu.</p>
<h3>Standard i Fast Transfer</h3>
<p>CCTP nudi dva režima.</p>
<p>Standard Transfer čeka viši nivo finalnosti na izvornoj mreži. Sporiji je, ali optimizovan za niži trošak.</p>
<p>Fast Transfer koristi Circle-ov Fast Transfer allowance i izdaje atestaciju pre pune finalnosti. Brži je, ali može imati protokolsku naknadu koja zavisi od izvorne mreže.</p>
<p>Prema aktuelnoj dokumentaciji, Fast Transfer naknada kreće se od 0 do 13 baznih poena, u zavisnosti od mreže. Naknada se oduzima od iznosa koji se mintuje na odredištu. Vrednosti su promenljive i ne treba ih hardkodovati.</p>
<p>Aktuelna naknada preuzima se preko:</p>
<pre><code class="language-text">GET /v2/burn/USDC/fees
</code></pre>
<p>uz <code>sourceDomainId</code> i <code>destDomainId</code>.</p>
<p>Aplikacija zatim postavlja <code>maxFee</code> u burn pozivu. Ako je maksimalna dozvoljena naknada preniska, transakcija može biti odbijena ili prebačena na sporiji režim, zavisno od parametara transfera.</p>
<p>Fast Transfer allowance je globalni pool. Može privremeno biti iscrpljen dok prethodni transferi ne dostignu punu finalnost. Produkciona integracija zato mora imati fallback na Standard Transfer umesto da pretpostavi da je fast ruta uvek dostupna.</p>
<h3>Ko plaća gas na odredišnoj mreži</h3>
<p>Osnovni CCTP tok zahteva transakciju na izvornoj i odredišnoj mreži. To znači da neko mora imati native gas token na obe strane.</p>
<p>Za korisnika koji samo drži USDC ovo je loš UX. Može imati dovoljno USDC-a, ali ne i ETH, SOL ili drugi token potreban da završi mint.</p>
<p>Circle Forwarding Service može da preuzme destination-side mint i naplati gas i servisnu naknadu iz transfera. To pojednostavljuje UX, ali uvodi dodatnu uslugu, dinamičku naknadu i još jednu operativnu zavisnost.</p>
<p>U UI-ju zato treba prikazati najmanje:</p>
<ul>
<li><p>iznos koji se skida na izvoru</p>
</li>
<li><p>CCTP protokolsku naknadu</p>
</li>
<li><p>forwarding naknadu, ako postoji</p>
</li>
<li><p>procenjeni destination iznos</p>
</li>
<li><p>izabrani režim finalnosti</p>
</li>
<li><p>očekivano vreme završetka</p>
</li>
<li><p>fallback ponašanje</p>
</li>
</ul>
<h2>USDT i cross-chain fragmentacija</h2>
<p>USDT nema jedan jedinstven cross-chain protokol koji pokriva sve njegove implementacije.</p>
<p>Postoje:</p>
<ul>
<li><p>direktno izdati USDT ugovori</p>
</li>
<li><p>canonical bridge reprezentacije</p>
</li>
<li><p>third-party wrapped tokeni</p>
</li>
<li><p>exchange interne konverzije</p>
</li>
<li><p>USDT0 implementacije zasnovane na LayerZero OFT modelu</p>
</li>
</ul>
<p>USDT0 je cross-chain sloj koji zaključava USDT na Ethereumu i izdaje odgovarajući USDT0 na podržanim odredištima. To može da pruži konzistentniji cross-chain supply model, ali USDT0 nije isto što i Tether-ovo direktno izdavanje na svakoj mreži.</p>
<p>Za developera je najvažnije sledeće pitanje:</p>
<blockquote>
<p>Ko je odgovoran za konverziju ovog konkretnog tokena nazad u issuer-supported USDT?</p>
</blockquote>
<p>Odgovor može biti Tether, bridge, LayerZero infrastruktura, berza, kustodian ili treća strana. Rizik se menja sa odgovorom.</p>
<p>Zato token registry mora eksplicitno razlikovati:</p>
<pre><code class="language-text">USDT_NATIVE
USDT_CANONICAL_BRIDGED
USDT0
USDT_THIRD_PARTY_WRAPPED
</code></pre>
<p>Ista logika važi za <code>USDC</code>, <code>USDC.e</code> i druge bridged reprezentacije.</p>
<h2>USDT vs USDC: ključne razlike</h2>
<table>
<thead>
<tr>
<th>Oblast</th>
<th>USDT</th>
<th>USDC</th>
</tr>
</thead>
<tbody><tr>
<td>Izdavalac</td>
<td>Tether</td>
<td>Circle preko regulisanih entiteta</td>
</tr>
<tr>
<td>Osnovni model</td>
<td>Fiat-backed, centralno mintovanje i redemption</td>
<td>Fiat-backed, centralno mintovanje i redemption</td>
</tr>
<tr>
<td>Rezerve</td>
<td>Širi skup rezervne imovine</td>
<td>Gotovina i visoko likvidni gotovinski ekvivalenti</td>
</tr>
<tr>
<td>Izveštavanje</td>
<td>Periodične atestacije i dnevni podaci o opticaju</td>
<td>Nedeljni podaci, mesečni reserve report i dnevni portfolio fonda</td>
</tr>
<tr>
<td>Direktan pristup</td>
<td>Verifikovani klijenti, visok minimalni redemption</td>
<td>Circle Mint za kvalifikovane institucije</td>
</tr>
<tr>
<td>Retail izlaz</td>
<td>Najčešće berza ili OTC</td>
<td>Najčešće berza, wallet ili on/off-ramp</td>
</tr>
<tr>
<td>Glavna prednost</td>
<td>Globalna likvidnost i široka distribucija</td>
<td>Institucionalna infrastruktura i dokumentacija</td>
</tr>
<tr>
<td>Važna mreža</td>
<td>Tron, uz Ethereum i druge mreže</td>
<td>Ethereum, Solana, Base i veliki broj L2 mreža</td>
</tr>
<tr>
<td>Cross-chain model</td>
<td>Više različitih ruta, uključujući USDT0</td>
<td>CCTP native burn-and-mint</td>
</tr>
<tr>
<td>DeFi pozicija</td>
<td>Široko podržan</td>
<td>Veoma čest kolateral i settlement asset</td>
</tr>
<tr>
<td>Administratorska kontrola</td>
<td>Blacklist, pause, burn i upgrade kontrole</td>
<td>Blacklist, pause, mint i upgrade kontrole</td>
</tr>
<tr>
<td>Smart contract posebnost</td>
<td>Ethereum ugovor ima starije ERC-20 ponašanje</td>
<td>Modernija i konzistentnija developer dokumentacija</td>
</tr>
<tr>
<td>Primarni operativni rizik</td>
<td>Fragmentacija mreža i issuer politika</td>
<td>Circle i bankarska infrastruktura</td>
</tr>
<tr>
<td>Tipičan use-case</td>
<td>Trgovanje, P2P, OTC i remittance</td>
<td>Treasury, payments, DeFi i cross-chain aplikacije</td>
</tr>
</tbody></table>
<p>Ne postoji univerzalno bolji token. Postoji token sa prikladnijim skupom zavisnosti za konkretan sistem.</p>
<h2>Prednosti i mane USDT-a</h2>
<h3>Prednosti</h3>
<p>Najveća prednost USDT-a je distribucija. Korisnik u tržištu gde lokalna berza, P2P trgovac i OTC desk koriste USDT verovatno ne želi da prima USDC samo zato što je developeru urednija dokumentacija.</p>
<p>USDT ima smisla kada su najvažniji:</p>
<ul>
<li><p>duboka likvidnost na globalnim berzama</p>
</li>
<li><p>veliki broj trgovačkih parova</p>
</li>
<li><p>P2P tržišta</p>
</li>
<li><p>postojeća podrška kod lokalnih partnera</p>
</li>
<li><p>Tron kao jeftin transferni sloj</p>
</li>
<li><p>široka prihvaćenost među retail korisnicima</p>
</li>
</ul>
<p>USDT je često infrastrukturno dosadan na dobar način. Partneri ga već podržavaju, korisnici ga poznaju, a lokalni offramp ima gotovu likvidnost.</p>
<h3>Mane</h3>
<p>Operativna širina dolazi sa fragmentacijom.</p>
<p>Potrebno je razlikovati:</p>
<ul>
<li><p>mrežu</p>
</li>
<li><p>nativni ili bridged oblik</p>
</li>
<li><p>aktivno ili legacy izdavanje</p>
</li>
<li><p>podršku berze za depozit</p>
</li>
<li><p>podršku Tether-a za redemption</p>
</li>
<li><p>ponašanje konkretnog token ugovora</p>
</li>
</ul>
<p>Rezervna politika je šira od USDC modela, a direktan redemption nije praktičan za mali retail tok zbog minimalnog iznosa i onboardinga.</p>
<p>Ethereum ugovor zahteva pažljiviju smart contract integraciju, a centralne blacklist i pause funkcije znače da self-custody ne uklanja issuer rizik.</p>
<h2>Prednosti i mane USDC-a</h2>
<h3>Prednosti</h3>
<p>USDC je jednostavniji za timove kojima su važni:</p>
<ul>
<li><p>dokumentovan rezervni model</p>
</li>
<li><p>institucionalni on-ramp i off-ramp</p>
</li>
<li><p>javna lista zvaničnih ugovora</p>
</li>
<li><p>native prisustvo na velikom broju mreža</p>
</li>
<li><p>CCTP cross-chain transferi</p>
</li>
<li><p>DeFi integracije na Ethereumu i L2 mrežama</p>
</li>
<li><p>compliance i treasury dokumentacija</p>
</li>
</ul>
<p>CCTP je posebno koristan ako aplikacija mora da rebalansira likvidnost između mreža bez držanja kapitala u bridge poolovima. Aplikacija može da spaljuje USDC na mreži sa viškom i mintuje native USDC na mreži gde je potreban za isplate.</p>
<p>To ne rešava FX, fiat settlement ni korisnički onboarding, ali rešava specifičan problem multichain likvidnosti na uredan način.</p>
<h3>Mane</h3>
<p>USDC nije jednako likvidan u svakom regionu i na svakoj berzi. Na tržištima gde USDT dominira, korisnik može platiti dodatni spread da bi konvertovao USDC.</p>
<p>Circle Mint nije API koji svaki startup može odmah da uključi. Potrebni su institucionalni onboarding, KYB, podržana jurisdikcija i odgovarajući bankarski račun.</p>
<p>CCTP je dobar cross-chain primitive, ali i dalje zahteva:</p>
<ul>
<li><p>podržanu source i destination mrežu</p>
</li>
<li><p>ispravno upravljanje finalnošću</p>
</li>
<li><p>atestacioni servis</p>
</li>
<li><p>gas ili forwarding servis na odredištu</p>
</li>
<li><p>fee quoting</p>
</li>
<li><p>fallback kada fast allowance nije dostupan</p>
</li>
<li><p>idempotentno izvršavanje destination mint-a</p>
</li>
</ul>
<p>USDC takođe ima administratorske funkcije. Transparentnija rezerva ne znači decentralizovan token.</p>
<h2>Koliko integracija zaista košta</h2>
<p>Ne postoji jedna „USDT provizija” ili „USDC provizija”. Ukupan trošak ima više slojeva.</p>
<h3>Mrežni gas</h3>
<p>Svaki transfer plaća trošak mreže na kojoj se izvršava.</p>
<p>Na Ethereumu je to ETH gas. Na Base-u i Arbitrumu korisnik takođe plaća ETH, ali po drugačijem fee modelu. Na Solani plaća SOL. Na Tronu se koristi TRX i njegov energy odnosno bandwidth model.</p>
<p>Gas zavisi od:</p>
<ul>
<li><p>mreže</p>
</li>
<li><p>zagušenja</p>
</li>
<li><p>kompleksnosti poziva</p>
</li>
<li><p>calldata veličine</p>
</li>
<li><p>wallet infrastrukture</p>
</li>
<li><p>batch ili pojedinačnog izvršavanja</p>
</li>
</ul>
<p>Zato ne treba hardkodovati prosečnu cenu u proizvod. Fee estimator treba da koristi aktuelno stanje mreže.</p>
<h3>Spread i trading fee</h3>
<p>Ako aplikacija konvertuje USDT u USDC ili stablecoin u fiat, plaća:</p>
<ul>
<li><p>spread</p>
</li>
<li><p>trading fee</p>
</li>
<li><p>potencijalni market impact</p>
</li>
<li><p>withdrawal fee</p>
</li>
<li><p>bankarsku naknadu</p>
</li>
</ul>
<p>Za velike iznose spread može biti važniji od blockchain gas-a. Quote treba računati za konkretnu količinu, ne iz poslednje tržišne cene.</p>
<h3>On-ramp i off-ramp</h3>
<p>Berza ili payment provider može naplatiti:</p>
<ul>
<li><p>fiat depozit</p>
</li>
<li><p>konverziju</p>
</li>
<li><p>povlačenje tokena</p>
</li>
<li><p>povlačenje fiat valute</p>
</li>
<li><p>lokalnu isplatu</p>
</li>
<li><p>compliance obradu</p>
</li>
</ul>
<p>Naknade se razlikuju po jurisdikciji, valuti, metodi uplate i nivou naloga.</p>
<h3>Cross-chain trošak</h3>
<p>CCTP može uključiti:</p>
<ul>
<li><p>gas na izvornoj mreži</p>
</li>
<li><p>Fast Transfer fee</p>
</li>
<li><p>gas na odredišnoj mreži</p>
</li>
<li><p>Forwarding Service fee</p>
</li>
<li><p>aplikativnu naknadu, ako je platforma dodaje</p>
</li>
</ul>
<p>Kod bridge ili liquidity ruta mogu postojati:</p>
<ul>
<li><p>bridge fee</p>
</li>
<li><p>relayer fee</p>
</li>
<li><p>liquidity provider fee</p>
</li>
<li><p>slippage</p>
</li>
<li><p>destination gas drop</p>
</li>
</ul>
<h3>Trošak kapitala</h3>
<p>Najčešće zanemaren trošak je prefunding.</p>
<p>Ako aplikacija podržava USDT na Tronu, USDC na Base-u i oba tokena na Ethereumu, možda mora unapred držati likvidnost u četiri odvojena balansa. Kapital na jednoj mreži ne pomaže automatski payout-u na drugoj.</p>
<p>Cross-chain protokol može smanjiti prefunding, ali uvodi vreme rebalansa, naknade i dodatne failure mode-ove.</p>
<h2>Realan use-case: platforma za isplatu kontraktora</h2>
<p>Zamislimo SaaS platformu koja firmama iz Evrope omogućava da plaćaju kontraktore u Latinskoj Americi i jugoistočnoj Aziji.</p>
<p>Kompanija uplaćuje EUR ili USD. Kontraktor bira:</p>
<ul>
<li><p>USDC na Base-u</p>
</li>
<li><p>USDC na Solani</p>
</li>
<li><p>USDT na Tronu</p>
</li>
<li><p>bankovnu isplatu preko lokalnog partnera</p>
</li>
</ul>
<p>Ovo nije jedna stablecoin integracija. To je orkestracija više ledger-a.</p>
<h3>Korak 1: napraviti asset registry</h3>
<p>Registry je jedini izvor istine za podržana sredstva.</p>
<pre><code class="language-ts">type Stablecoin = 'USDC' | 'USDT';

type AssetConfig = {
  asset: Stablecoin;
  chainId: number;
  address: `0x${string}`;
  decimals: number;
  depositsEnabled: boolean;
  withdrawalsEnabled: boolean;
};

export const ethereumAssets: AssetConfig[] = [
  {
    asset: 'USDC',
    chainId: 1,
    address: '0xA0b86991c6218b36c1d19d4a2e9Eb0cE3606eB48',
    decimals: 6,
    depositsEnabled: true,
    withdrawalsEnabled: true,
  },
  {
    asset: 'USDT',
    chainId: 1,
    address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
    decimals: 6,
    depositsEnabled: true,
    withdrawalsEnabled: true,
  },
];
</code></pre>
<p>U produkciji registry treba da sadrži i:</p>
<ul>
<li><p>minimalni depozit</p>
</li>
<li><p>minimalni payout</p>
</li>
<li><p>broj potrebnih potvrda</p>
</li>
<li><p>explorer URL šablon</p>
</li>
<li><p>custody wallet</p>
</li>
<li><p>sweep threshold</p>
</li>
<li><p>status izdavaoca</p>
</li>
<li><p>status bridge rute</p>
</li>
<li><p>podršku offramp partnera</p>
</li>
<li><p>datum poslednje verifikacije konfiguracije</p>
</li>
</ul>
<p>Nemoj prihvatati token samo zato što mu <code>symbol()</code> vraća <code>USDC</code>. Bilo ko može da deployuje ERC-20 sa istim simbolom.</p>
<h3>Korak 2: voditi interni double-entry ledger</h3>
<p>Blockchain transakcija nije isto što i poslovno knjiženje.</p>
<p>Aplikacija treba da ima interni ledger koji razdvaja:</p>
<ul>
<li><p>pending depozit</p>
</li>
<li><p>confirmed depozit</p>
</li>
<li><p>raspoloživ balans</p>
</li>
<li><p>rezervisan iznos</p>
</li>
<li><p>poslatu isplatu</p>
</li>
<li><p>neuspelu isplatu</p>
</li>
<li><p>network fee</p>
</li>
<li><p>platform fee</p>
</li>
<li><p>konverziju</p>
</li>
<li><p>korekciju</p>
</li>
</ul>
<p>Korisnički saldo ne treba izračunavati svaki put čitanjem wallet-a. Jedan treasury wallet može sadržati sredstva hiljada korisnika, a blockchain ne zna kome pripada koji poslovni deo balansa.</p>
<h3>Korak 3: obrađivati događaje idempotentno</h3>
<p>Za EVM token depozit prati se <code>Transfer</code> događaj zvaničnog ugovora.</p>
<p>Event key može biti:</p>
<pre><code class="language-text">chain_id + transaction_hash + log_index
</code></pre>
<p>To omogućava idempotentnu obradu. Ako indexer pošalje isti događaj dva puta, sistem ne sme dva puta kreditirati korisnika.</p>
<p>Depozit najpre ulazi u <code>observed</code>, zatim u <code>confirming</code>, pa tek posle definisanog broja potvrda u <code>confirmed</code>.</p>
<p>Kod reorganizacije lanca potrebno je moći poništiti prethodno viđen događaj. Za male iznose aplikacija može prihvatiti niži prag potvrda, ali to je poslovna odluka, ne univerzalna blockchain konstanta.</p>
<h3>Korak 4: nikada ne koristiti floating point</h3>
<p>USDT i USDC na većini popularnih implementacija koriste 6 decimala, ali aplikacija ne treba da se oslanja na pretpostavku bez konfiguracije.</p>
<p>Iznosi se čuvaju kao celi brojevi u baznim jedinicama:</p>
<pre><code class="language-text">1 USDC = 1_000_000 base units
12.50 USDC = 12_500_000 base units
</code></pre>
<p>U TypeScript-u koristi <code>bigint</code>, <code>parseUnits</code> i <code>formatUnits</code>, ne JavaScript <code>number</code>.</p>
<pre><code class="language-ts">import {formatUnits, parseUnits} from 'viem';

const decimals = 6;

const payout = parseUnits('125.50', decimals);
// 125500000n

const display = formatUnits(payout, decimals);
// "125.5"
</code></pre>
<p>Baza treba da koristi integer ili dovoljno precizan decimalni tip. Nikada <code>float</code>.</p>
<h3>Korak 5: proceniti gas pre payout-a</h3>
<p>Ako korisnik prima 5 USDC, a transfer i operativna obrada koštaju uporediv iznos, payout nije ekonomski održiv.</p>
<p>Platforma može:</p>
<ul>
<li><p>uvesti minimalni payout</p>
</li>
<li><p>grupisati više isplata</p>
</li>
<li><p>koristiti jeftiniju mrežu</p>
</li>
<li><p>sponzorisati gas samo iznad određenog obima</p>
</li>
<li><p>naplatiti transparentnu network fee stavku</p>
</li>
<li><p>nuditi off-chain interni balans do povlačenja</p>
</li>
</ul>
<p>Batch payout smanjuje operativni overhead, ali smart ugovor povećava blast radius. Greška u batch ugovoru može zaustaviti sve isplate, dok pojedinačni transferi imaju jednostavniji failure model.</p>
<h3>Korak 6: upravljati treasury likvidnošću</h3>
<p>Pretpostavimo da korisnici tog dana traže:</p>
<ul>
<li><p>40.000 USDT na Tronu</p>
</li>
<li><p>25.000 USDC na Base-u</p>
</li>
<li><p>10.000 USDC na Solani</p>
</li>
</ul>
<p>Aplikacija mora imati odgovarajuću likvidnost na svakoj mreži pre nego što payout počne.</p>
<p>USDC se između podržanih mreža može rebalansirati CCTP-om. Za USDT na Tronu možda je praktičnija berza ili OTC partner koji prima USDT na jednoj mreži i isplaćuje ga na drugoj.</p>
<p>Treasury engine treba da računa:</p>
<ul>
<li><p>trenutni raspoloživi balans</p>
</li>
<li><p>rezervisane isplate</p>
</li>
<li><p>očekivane depozite</p>
</li>
<li><p>minimalni operativni bafer</p>
</li>
<li><p>cenu rebalansa</p>
</li>
<li><p>vreme rebalansa</p>
</li>
<li><p>limite partnera</p>
</li>
<li><p>maksimalnu izloženost jednom izdavaocu</p>
</li>
</ul>
<h3>Korak 7: omogućiti bezbedan izbor mreže</h3>
<p>Korisnik ne treba da vidi jedno polje „Wallet address” i jedan izbor „USDT”.</p>
<p>UI mora jasno prikazati:</p>
<ul>
<li><p>token</p>
</li>
<li><p>mrežu</p>
</li>
<li><p>adresni format</p>
</li>
<li><p>procenjenu naknadu</p>
</li>
<li><p>očekivano vreme</p>
</li>
<li><p>minimalni iznos</p>
</li>
<li><p>upozorenje za nepodržane mreže</p>
</li>
<li><p>da li primalac mora imati gas token</p>
</li>
</ul>
<p>Za velike isplate korisno je uvesti:</p>
<ul>
<li><p>address book</p>
</li>
<li><p>verifikaciju nove adrese</p>
</li>
<li><p>vremensko odlaganje prve isplate</p>
</li>
<li><p>testni transfer</p>
</li>
<li><p>allowlist</p>
</li>
<li><p>višestruko odobrenje</p>
</li>
<li><p>dnevne limite</p>
</li>
</ul>
<h2>Produkcioni rizici koje tutoriali obično preskoče</h2>
<h3>Lažni tokeni</h3>
<p>Napadač može napraviti token sa nazivom <code>Tether USD</code>, simbolom <code>USDT</code> i istim brojem decimala.</p>
<p>Aplikacija mora filtrirati događaje po zvaničnoj adresi ugovora, ne po simbolu. Wallet UI može prikazati lažni token kao da je pravi, ali backend ne sme.</p>
<h3>Pogrešna mreža</h3>
<p>EVM adresa izgleda isto na Ethereumu, Base-u, Arbitrumu i Polygonu. To ne znači da depozit sistem podržava sve te mreže.</p>
<p>Korisnik može poslati pravi USDC na ispravnu EVM adresu, ali na pogrešnoj mreži. Sredstva tehnički mogu biti dostupna istom privatnom ključu, ali recovery može zahtevati ručni proces, gas i sigurnosno odobrenje.</p>
<h3>Native i bridged zabuna</h3>
<p>Aplikacija koja podržava native USDC na Polygonu ne treba automatski da kreditira stari bridged USDC samo zato što ticker izgleda isto.</p>
<p>Svaki podržani ugovor mora biti zaseban asset u registry-ju. Ako se prihvataju oba oblika, moraju imati odvojenu likvidnost, cenu i offramp put.</p>
<h3>Chain reorganizacija</h3>
<p>Transakcija koja je viđena u mempool-u nije uplata. Transakcija u jednom bloku nije nužno konačna.</p>
<p>Prag potvrda treba prilagoditi mreži, vrednosti i poslovnom riziku. Veći depoziti mogu zahtevati više potvrda ili dodatnu proveru finalnosti.</p>
<h3>RPC i indexer nedostupnost</h3>
<p>Jedan RPC endpoint nije produkciona infrastruktura.</p>
<p>Potrebni su:</p>
<ul>
<li><p>primarni i rezervni RPC provider</p>
</li>
<li><p>health check</p>
</li>
<li><p>praćenje block height-a</p>
</li>
<li><p>upozorenje kada indexer kasni</p>
</li>
<li><p>periodični reconciliation sa on-chain stanjem</p>
</li>
<li><p>mogućnost ponovnog skeniranja blokova</p>
</li>
<li><p>deduplikacija događaja</p>
</li>
</ul>
<h3>Zamrznuta sredstva</h3>
<p>USDT i USDC mogu biti blokirani na nivou ugovora. Ako treasury primi takva sredstva, saldo može biti vidljiv, ali neprenosiv.</p>
<p>Sistem mora razlikovati:</p>
<ul>
<li><p>confirmed balance</p>
</li>
<li><p>spendable balance</p>
</li>
<li><p>frozen balance</p>
</li>
<li><p>compliance hold</p>
</li>
</ul>
<p>On-chain stanje samo po sebi ne daje kompletnu poslovnu klasifikaciju.</p>
<h3>Upravljanje ključevima</h3>
<p>Najveći rizik često nije stablecoin ugovor, već sopstveni hot wallet.</p>
<p>Minimalni produkcioni model uključuje:</p>
<ul>
<li><p>odvojene hot i cold wallet-e</p>
</li>
<li><p>dnevne limite</p>
</li>
<li><p>multisig za velike transfere</p>
</li>
<li><p>automatsko sweepovanje</p>
</li>
<li><p>izolovane signer servise</p>
</li>
<li><p>audit log svake autorizacije</p>
</li>
<li><p>rotaciju ključeva</p>
</li>
<li><p>incident plan</p>
</li>
<li><p>mogućnost globalnog zaustavljanja isplata</p>
</li>
</ul>
<p>Privatni ključ ne treba da bude obična environment promenljiva na istom serveru koji obrađuje javne API zahteve.</p>
<h2>Kada izabrati USDT</h2>
<p>USDT je često bolji operativni izbor kada:</p>
<ul>
<li><p>korisnici već drže USDT</p>
</li>
<li><p>lokalni P2P i OTC partneri koriste USDT</p>
</li>
<li><p>potreban je veliki broj berzanskih parova</p>
</li>
<li><p>ciljno tržište koristi Tron</p>
</li>
<li><p>najvažnija je izlazna likvidnost</p>
</li>
<li><p>aplikacija radi sa globalnim traderima</p>
</li>
<li><p>partneri ne podržavaju USDC na željenoj mreži</p>
</li>
</ul>
<p>Tipičan primer je remittance koridor u kome primalac dobija USDT na Tronu i prodaje ga lokalnom OTC desk-u. U tom sistemu USDC može imati lepšu infrastrukturu, ali ne rešava poslednji kilometar ako ga lokalni partner ne kupuje.</p>
<h2>Kada izabrati USDC</h2>
<p>USDC je često prirodniji izbor kada:</p>
<ul>
<li><p>firma ima institucionalni on-ramp ili off-ramp</p>
</li>
<li><p>potrebna je dokumentovana rezervna politika</p>
</li>
<li><p>aplikacija radi na Ethereumu ili L2 mrežama</p>
</li>
<li><p>potreban je native cross-chain transfer</p>
</li>
<li><p>koristi se DeFi infrastruktura</p>
</li>
<li><p>treasury mora redovno da rebalansira mreže</p>
</li>
<li><p>partneri zahtevaju regulisaniji operativni okvir</p>
</li>
<li><p>proizvod se gradi oko Circle infrastrukture</p>
</li>
</ul>
<p>Tipičan primer je marketplace koji naplaćuje u USDC na Base-u, drži treasury na Ethereumu i isplaćuje deo korisnika na Solani. CCTP može da prebaci native likvidnost tamo gde je potrebna bez uvođenja sopstvenog wrapped tokena.</p>
<h2>Kada podržati oba</h2>
<p>Za ozbiljnu međunarodnu platnu aplikaciju odgovor često nije USDT ili USDC, već oba uz strogo ograničen skup mreža.</p>
<p>Dobar početni model može biti:</p>
<ul>
<li><p>USDT na Tronu za P2P i remittance korisnike</p>
</li>
<li><p>USDC na Base-u za jeftine EVM isplate</p>
</li>
<li><p>USDC na Solani za brze i jeftine transfere</p>
</li>
<li><p>Ethereum samo za velike iznose i treasury operacije</p>
</li>
</ul>
<p>Nije potrebno podržati svaki token na svakoj mreži. Svaka nova kombinacija povećava:</p>
<ul>
<li><p>broj wallet-a</p>
</li>
<li><p>broj RPC integracija</p>
</li>
<li><p>količinu prefundinga</p>
</li>
<li><p>monitoring površinu</p>
</li>
<li><p>recovery procedure</p>
</li>
<li><p>compliance posao</p>
</li>
<li><p>rizik pogrešnog depozita</p>
</li>
<li><p>broj offramp ruta</p>
</li>
</ul>
<p>Dve dobro podržane mreže vrednije su od deset delimično podržanih.</p>
<h2>Konačni trade-off</h2>
<p>USDT optimizuje za distribuciju, tržišnu likvidnost i globalnu dostupnost. Njegova snaga nije najlepši smart contract niti najjednostavniji rezervni model, već činjenica da veliki broj berzi, trgovaca, wallet-a i lokalnih partnera već govori njegovim jezikom.</p>
<p>USDC optimizuje za institucionalnu infrastrukturu, transparentniju rezervnu politiku i programabilnu multichain upotrebu. Njegova najveća tehnička prednost je CCTP, koji pruža standardizovan burn-and-mint put između podržanih mreža.</p>
<p>Oba tokena su centralno izdata. Oba zavise od rezervi koje nisu na blockchainu. Oba mogu da zamrznu adrese. Oba mogu privremeno odstupiti od jednog USD. I kod oba najveće produkcione greške obično nastaju oko njih, a ne unutar njih: pogrešna mreža, pogrešan ugovor, loš custody, floating-point računanje, neobrađena reorganizacija ili nepodržan offramp.</p>
<p>Zato pravi izbor nije „koji stablecoin je sigurniji” u apstraktnom smislu. Pravo pitanje je:</p>
<blockquote>
<p>Koji skup izdavaoca, mreže, ugovora, likvidnosti, partnera i pravnih zavisnosti odgovara konkretnom toku novca?</p>
</blockquote>
<p>Kada se problem tako postavi, USDT i USDC prestaju da budu dva gotovo ista tickera. Postaju dve različite komponente platne arhitekture, svaka korisna kada se koristi tamo gde joj operativni model odgovara.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati USDT i USDC. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://www.circle.com/usdc">Circle: USDC pregled, izdavanje, redemption i podržane mreže</a></p>
</li>
<li><p><a href="https://www.circle.com/transparency">Circle: transparentnost i struktura USDC rezervi</a></p>
</li>
<li><p><a href="https://developers.circle.com/stablecoins/usdc-contract-addresses">Circle Docs: zvanične USDC contract adrese</a></p>
</li>
<li><p><a href="https://developers.circle.com/cctp">Circle Docs: Cross-Chain Transfer Protocol</a></p>
</li>
<li><p><a href="https://developers.circle.com/cctp/concepts/fees">Circle Docs: CCTP naknade</a></p>
</li>
<li><p><a href="https://developers.circle.com/cctp/references/technical-guide">Circle Docs: CCTP tehnički vodič</a></p>
</li>
<li><p><a href="https://developers.circle.com/cctp/concepts/forwarding-service">Circle Docs: CCTP Forwarding Service</a></p>
</li>
<li><p><a href="https://developers.circle.com/cctp/concepts/fast-transfer-allowance">Circle Docs: Fast Transfer allowance</a></p>
</li>
<li><p><a href="https://tether.to/en/supported-protocols/">Tether: podržani protokoli i smernice za integraciju</a></p>
</li>
<li><p><a href="https://tether.to/en/transparency/">Tether: transparentnost i rezerve</a></p>
</li>
<li><p><a href="https://tether.to/en/redeem-tethers-to-fiat-currency/">Tether: direktan redemption u fiat valutu</a></p>
</li>
<li><p><a href="https://docs.openzeppelin.com/contracts/5.x/api/token/erc20#SafeERC20">OpenZeppelin Docs: SafeERC20</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/"><strong>Volet Srbija</strong></a></p>
</li>
</ol>
<p>English version:_ Read on Dev.to: <a href="https://dev.to/kriptomuza/usdt-and-usdc-in-practice-choosing-a-stablecoin-for-developers-584">USDT and USDC in Practice: Choosing a Stablecoin for Developers</a></p>
]]></content:encoded></item><item><title><![CDATA[Polygon POL u praksi: EVM, finality, CDK i Agglayer]]></title><description><![CDATA[Polygon je dugo bilo moguće opisati jednom rečenicom: EVM mreža sa jeftinijim transakcijama od Ethereuma. Taj opis više nije dovoljan.
Naziv Polygon danas pokriva nekoliko povezanih, ali tehnički razl]]></description><link>https://kripto-pocetnica.hashnode.dev/polygon-pol-u-praksi-evm-finality-cdk-i-agglayer</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/polygon-pol-u-praksi-evm-finality-cdk-i-agglayer</guid><category><![CDATA[Polygon]]></category><category><![CDATA[POL]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[blockchain security]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[crypto]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Sat, 19 Sep 2026 00:27:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/08107aaf-4245-4a07-b844-8cd6961245d0.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Polygon je dugo bilo moguće opisati jednom rečenicom: EVM mreža sa jeftinijim transakcijama od Ethereuma. Taj opis više nije dovoljan.</p>
<p>Naziv Polygon danas pokriva nekoliko povezanih, ali tehnički različitih stvari:</p>
<ul>
<li><p>Polygon Chain, ranije najčešće nazivan Polygon PoS</p>
</li>
<li><p>POL, izvorni token koji je zamenio MATIC</p>
</li>
<li><p>Agglayer, sloj za interoperabilnost između različitih lanaca</p>
</li>
<li><p>Polygon CDK, toolkit za pokretanje sopstvenih EVM lanaca</p>
</li>
<li><p>prateću infrastrukturu za bridge, wallet, stablecoin i payment integracije</p>
</li>
</ul>
<p>Za developera je najvažnije da ove komponente ne posmatra kao jedan proizvod. Deploy Solidity ugovora na Polygon Chain, pokretanje CDK lanca i povezivanje lanca na Agglayer tri su različite odluke, sa različitim troškovima, rizicima i operativnim zahtevima.</p>
<p>Ovaj tekst se zato ne bavi pitanjem da li je Polygon "dobar projekat", već konkretnijim pitanjem: <strong>kada Polygon ima smisla kao tehnička platforma i šta je potrebno da aplikacija na njemu radi pouzdano u produkciji?</strong></p>
<h2>Šta je Polygon POL danas?</h2>
<p>POL nije naziv blockchain mreže. To je izvorni token Polygon Chain-a i staking token koji učestvuje u obezbeđivanju mreže.</p>
<p>Polygon Chain je EVM kompatibilan Proof-of-Stake lanac povezan sa Ethereumom. Njegov execution layer zove se Bor, dok Heimdall-v2 koordinira validatore, milestone finality, checkpoint-e i komunikaciju sa Ethereum ugovorima.</p>
<p>Aplikacija koja već radi na Ethereum EVM-u obično može da se prebaci na Polygon bez promene programskog modela:</p>
<ul>
<li><p>ugovori se pišu u Solidity-ju</p>
</li>
<li><p>adrese su standardne EVM adrese</p>
</li>
<li><p>transakcije koriste Ethereum JSON-RPC</p>
</li>
<li><p>podržani su alati kao što su Foundry, Hardhat, viem, ethers i web3.js</p>
</li>
<li><p>tokeni koriste ERC-20, ERC-721 i ERC-1155 interfejse</p>
</li>
<li><p>događaji se čitaju kroz standardne EVM logove</p>
</li>
<li><p>naknade koriste EIP-1559 model</p>
</li>
</ul>
<p>To, međutim, ne znači da je Polygon samo "Ethereum sa drugim RPC URL-om". Razlike postaju važne kod finality-ja, bridge operacija, indeksiranja, upravljanja gasom i sigurnosnog modela.</p>
<p>Najkorisnija mentalna slika izgleda ovako:</p>
<pre><code class="language-mermaid">flowchart TB
    App[Web ili backend aplikacija]
    RPC[Polygon JSON-RPC]
    Bor[Bor execution layer]
    Heimdall[Heimdall-v2 consensus layer]
    Ethereum[Ethereum ugovori]
    Agglayer[Agglayer]
    CDK[CDK lanci]

    App --&gt; RPC
    RPC --&gt; Bor
    Bor --&gt; Heimdall
    Heimdall --&gt; Ethereum
    CDK --&gt; Agglayer
    Agglayer --&gt; Ethereum
</code></pre>
<p>Za običan dApp nije potrebno direktno komunicirati sa Heimdall-om. Aplikacija šalje standardne EVM transakcije Bor sloju preko RPC provajdera.</p>
<p>Heimdall je važan zato što određuje kada aplikacija može da smatra blok deterministički finalizovanim i kako se stanje periodično sidri na Ethereum.</p>
<h2>Od MATIC-a do POL-a</h2>
<p>MATIC je 4. septembra 2024. zamenjen POL tokenom kao izvorni gas i staking token Polygon PoS mreže.</p>
<p>Na samom Polygon Chain-u migracija je obavljena na nivou mreže. MATIC saldo koji je postojao na Polygon PoS-u postao je POL saldo u odnosu 1:1, bez potrebe da korisnik poziva migration ugovor. Aplikacije i pametni ugovori nisu morali da menjaju način čitanja native balansa.</p>
<p>Situacija na Ethereumu je drugačija. MATIC i POL tamo postoje kao ERC-20 ugovori, pa se migracija obavlja preko odgovarajućeg migration mehanizma.</p>
<p>To je važno za aplikacije koje:</p>
<ul>
<li><p>drže MATIC u Ethereum pametnim ugovorima</p>
</li>
<li><p>koriste MATIC kao kolateral</p>
</li>
<li><p>imaju hardkodirane token adrese</p>
</li>
<li><p>koriste oracle feed vezan za MATIC</p>
</li>
<li><p>prikazuju MATIC ili WMATIC u korisničkom interfejsu</p>
</li>
<li><p>održavaju bridge ili exchange infrastrukturu</p>
</li>
</ul>
<p>Za novu aplikaciju terminologija bi trebalo da bude jasna:</p>
<ul>
<li><p><code>POL</code> je native token Polygon Chain-a</p>
</li>
<li><p>native POL nema ERC-20 adresu</p>
</li>
<li><p><code>WPOL</code> je wrapped ERC-20 reprezentacija native POL-a</p>
</li>
<li><p>stari interfejsi, indekseri i ugovori još mogu koristiti naziv <code>MATIC</code> ili <code>WMATIC</code></p>
</li>
<li><p>naziv promenljive ne garantuje koji se token nalazi iza neke adrese</p>
</li>
</ul>
<p>Poslednja stavka je posebno važna. Ako postojeći ugovor ima promenljivu <code>WMATIC</code>, ne treba pretpostaviti da je ugovor zastareo ili neispravan. Nazivi Solidity promenljivih i ABI-ja ne menjaju se automatski migracijom mreže.</p>
<p>Pre migracije aplikacije često su sadržale nešto slično:</p>
<pre><code class="language-ts">const nativeToken = {
    name: "MATIC",
    symbol: "MATIC",
    decimals: 18,
};
</code></pre>
<p>Za Polygon Chain konfiguraciju to sada treba da bude:</p>
<pre><code class="language-ts">const nativeToken = {
    name: "POL",
    symbol: "POL",
    decimals: 18,
};
</code></pre>
<p>Ovo je promena na nivou interfejsa i konfiguracije. Način dobijanja native balansa, slanja transakcije i obračuna gasa ostaje EVM kompatibilan.</p>
<h2>Zašto bi developer izabrao Polygon Chain?</h2>
<p>Najbolji razlog nije to što je transakcija "jeftina". Jeftin gas nema veliku vrednost ako aplikacija nema jasan razlog da nešto izvršava onchain.</p>
<p>Polygon ima smisla kada aplikacija kombinuje nekoliko sledećih zahteva:</p>
<ul>
<li><p>veliki broj relativno malih transakcija</p>
</li>
<li><p>EVM kompatibilnost</p>
</li>
<li><p>kratko vreme do determinističkog finality-ja</p>
</li>
<li><p>stablecoin plaćanja</p>
</li>
<li><p>česte ERC-20 transfere</p>
</li>
<li><p>tokenizovane loyalty ili reward sisteme</p>
</li>
<li><p>marketplace poravnanje</p>
</li>
<li><p>embedded wallet iskustvo</p>
</li>
<li><p>account abstraction i gas sponsorship</p>
</li>
<li><p>integraciju sa postojećim Ethereum alatima</p>
</li>
</ul>
<p>Tipični primeri nisu samo DeFi protokoli. Polygon je praktičan i za proizvode kod kojih blockchain nije centralni deo korisničkog interfejsa:</p>
<ul>
<li><p>isplate freelancerima u stablecoin-u</p>
</li>
<li><p>marketplace raspodela prihoda</p>
</li>
<li><p>loyalty poeni predstavljeni tokenima</p>
</li>
<li><p>mikrotransakcije između servisa</p>
</li>
<li><p>escrow za digitalnu robu</p>
</li>
<li><p>ticketing i membership sistemi</p>
</li>
<li><p>registri vlasništva i dozvola</p>
</li>
<li><p>periodično poravnanje između kompanija</p>
</li>
<li><p>backend automatizacija treasury operacija</p>
</li>
</ul>
<p>Kod takvih sistema najveća prednost nije samo cena transakcije. Važna je mogućnost da se poznati EVM alatni lanac kombinuje sa finality-jem koji se meri sekundama.</p>
<h2>Kako Polygon Chain obrađuje transakciju?</h2>
<p>Polygon Chain koristi podelu između Bor execution layer-a i Heimdall-v2 consensus layer-a.</p>
<h3>Bor</h3>
<p>Bor je odgovoran za:</p>
<ul>
<li><p>izvršavanje EVM transakcija</p>
</li>
<li><p>održavanje account i contract stanja</p>
</li>
<li><p>produkciju blokova</p>
</li>
<li><p>obračun gasa</p>
</li>
<li><p>emitovanje logova</p>
</li>
<li><p>standardni Ethereum JSON-RPC interfejs</p>
</li>
</ul>
<p>Iz ugla Solidity ili TypeScript developera, Bor je deo sa kojim se najčešće komunicira.</p>
<h3>Heimdall-v2</h3>
<p>Heimdall-v2 je zasnovan na Cosmos SDK-u i CometBFT-u. On prati staking ugovore na Ethereumu, koordinira validator set, validira Bor podatke, finalizuje milestone-ove i učestvuje u kreiranju checkpoint-a.</p>
<h3>Ethereum sloj</h3>
<p>Na Ethereumu se nalaze ugovori povezani sa:</p>
<ul>
<li><p>stakingom</p>
</li>
<li><p>upravljanjem validatorima</p>
</li>
<li><p>čuvanjem checkpoint-a</p>
</li>
<li><p>bridge operacijama</p>
</li>
</ul>
<p>Ova arhitektura znači da Polygon Chain nije Ethereum rollup u klasičnom smislu. Njegova bezbednost zavisi od Polygon validatora, staking mehanizma, bridge ugovora i checkpoint procesa.</p>
<p>Ethereum služi kao važan settlement i anchoring sloj, ali ne izvršava svaku Polygon transakciju niti proverava validity proof za svaki Polygon blok.</p>
<p>To je bitan trade-off, a ne terminološka sitnica.</p>
<h2>Finality više nije broj konfirmacija koji pogađamo</h2>
<p>Stariji Polygon backend sistemi često imaju hardkodirano pravilo poput:</p>
<pre><code class="language-ts">const REQUIRED_CONFIRMATIONS = 128;
</code></pre>
<p>Takav pristup je nastao u vreme kada su se aplikacije uglavnom oslanjale na broj blokova i čekale dovoljno dugo da smanje rizik od reorganizacije.</p>
<p>Heimdall-v2 koristi milestone mehanizam za deterministički finality. Prema aktuelnoj dokumentaciji, milestone finality se tipično postiže za dve do pet sekundi.</p>
<p>Za developera je važniji drugi detalj: Polygon podržava standardni JSON-RPC block tag <code>finalized</code>.</p>
<p>Najnoviji finalizovani blok može da se dobije standardnim pozivom:</p>
<pre><code class="language-json">{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_getBlockByNumber",
  "params": ["finalized", false]
}
</code></pre>
<p>Aplikacija zato ne mora da izmišlja sopstvenu procenu na osnovu broja konfirmacija. Umesto toga:</p>
<ol>
<li><p>sačeka da transakcija dobije receipt</p>
</li>
<li><p>pročita blok u kojem je transakcija uključena</p>
</li>
<li><p>periodično pročita <code>finalized</code> blok</p>
</li>
<li><p>transakciju označi finalnom kada je njen blok obuhvaćen finalizovanim stanjem</p>
</li>
</ol>
<p>To je posebno korisno za payment i settlement sisteme, gde razlika između <code>included</code> i <code>finalized</code> nije samo tehnička.</p>
<p>Dobar interni model statusa mogao bi da izgleda ovako:</p>
<table>
<thead>
<tr>
<th>Status</th>
<th>Značenje</th>
</tr>
</thead>
<tbody><tr>
<td><code>created</code></td>
<td>Operacija postoji u lokalnoj bazi</td>
</tr>
<tr>
<td><code>signed</code></td>
<td>Transakcija je potpisana</td>
</tr>
<tr>
<td><code>broadcast</code></td>
<td>RPC je prihvatio transakciju</td>
</tr>
<tr>
<td><code>included</code></td>
<td>Transakcija ima receipt i block number</td>
</tr>
<tr>
<td><code>finalized</code></td>
<td>Njen blok je obuhvaćen <code>finalized</code> blokom</td>
</tr>
<tr>
<td><code>failed</code></td>
<td>Receipt ima neuspešan status ili je operacija odbijena</td>
</tr>
<tr>
<td><code>unknown</code></td>
<td>Slanje je prekinuto pre nego što je poznat konačan ishod</td>
</tr>
</tbody></table>
<p>Status <code>unknown</code> je važan. Ako backend izgubi mrežnu vezu neposredno nakon broadcast-a, ne sme automatski da pošalje novu isplatu.</p>
<p>Prvo mora da proveri nonce, transaction hash ili poslovni idempotency ključ.</p>
<h2>Realan use-case: stablecoin isplate iz marketplace-a</h2>
<p>Pretpostavimo da gradimo marketplace koji prodavcima isplaćuje sredstva u native USDC-u na Polygon Chain-u.</p>
<p>Korisnik vidi iznos u standardnoj fiat denominaciji, dok backend:</p>
<ul>
<li><p>obračunava raspoloživi saldo prodavca</p>
</li>
<li><p>kreira payout nalog</p>
</li>
<li><p>proverava adresu primaoca</p>
</li>
<li><p>potpisuje ERC-20 transfer</p>
</li>
<li><p>plaća gas u POL-u</p>
</li>
<li><p>prati receipt i finality</p>
</li>
<li><p>knjiži transfer u internom ledger-u</p>
</li>
</ul>
<p>Native USDC na Polygon Chain-u je standardni ERC-20 token. Njegova mainnet adresa je:</p>
<pre><code class="language-text">0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359
</code></pre>
<p>Važno je razlikovati native USDC od istorijskog bridged tokena <code>USDC.e</code>. Oni imaju različite contract adrese i nisu isti asset iz ugla pametnog ugovora.</p>
<p>Arhitektura payout sistema mogla bi da izgleda ovako:</p>
<pre><code class="language-mermaid">sequenceDiagram
    participant API as Marketplace API
    participant DB as Payout baza
    participant Signer as KMS ili wallet signer
    participant RPC as Polygon RPC
    participant Chain as Polygon Chain
    participant Indexer as Reconciliation worker

    API-&gt;&gt;DB: Kreiraj payout sa idempotency ključem
    API-&gt;&gt;RPC: Simuliraj USDC transfer
    API-&gt;&gt;Signer: Potpiši transakciju
    Signer-&gt;&gt;RPC: Pošalji transakciju
    RPC--&gt;&gt;API: Transaction hash
    API-&gt;&gt;DB: Status broadcast
    Chain--&gt;&gt;Indexer: Transfer event i receipt
    Indexer-&gt;&gt;RPC: Proveri finalized blok
    Indexer-&gt;&gt;DB: Status finalized
</code></pre>
<p>Blockchain ovde nije zamena za poslovnu bazu. On je settlement sloj.</p>
<p>Interna baza i dalje mora da zna:</p>
<ul>
<li><p>zašto je isplata kreirana</p>
</li>
<li><p>ko ju je odobrio</p>
</li>
<li><p>koji order-i su uključeni</p>
</li>
<li><p>da li je prošla risk proveru</p>
</li>
<li><p>koji idempotency ključ joj pripada</p>
</li>
<li><p>koja transakcija ju je poravnala</p>
</li>
</ul>
<h2>Minimalna, ali realistična USDC integracija</h2>
<p>Sledeći primer koristi <code>viem</code>, simulira transfer pre slanja i čeka da blok postane finalizovan.</p>
<p>Privatni ključ iz environment promenljive je prihvatljiv za lokalni eksperiment, ali ne i kao konačna produkcijska arhitektura. U produkciji signer treba izdvojiti iza KMS-a, HSM-a ili odgovarajućeg wallet servisa.</p>
<pre><code class="language-ts">import { setTimeout as sleep } from "node:timers/promises";
import {
    createPublicClient,
    createWalletClient,
    erc20Abi,
    http,
    isAddress,
    parseUnits,
    type Address,
    type Hex,
} from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { polygon } from "viem/chains";

const USDC: Address =
    "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359";

const rpcUrl = process.env.POLYGON_RPC_URL;
const privateKey = process.env.PRIVATE_KEY as Hex | undefined;
const recipient = process.argv[2];
const amount = process.argv[3];

if (!rpcUrl || !privateKey) {
    throw new Error("Missing POLYGON_RPC_URL or PRIVATE_KEY");
}

if (!recipient || !isAddress(recipient)) {
    throw new Error("Invalid recipient address");
}

if (!amount) {
    throw new Error("Missing USDC amount");
}

const account = privateKeyToAccount(privateKey);
const transport = http(rpcUrl);

const publicClient = createPublicClient({
    chain: polygon,
    transport,
});

const walletClient = createWalletClient({
    account,
    chain: polygon,
    transport,
});

async function waitUntilFinalized(blockNumber: bigint): Promise&lt;void&gt; {
    while (true) {
        const finalized = await publicClient.getBlock({
            blockTag: "finalized",
        });

        if (finalized.number &gt;= blockNumber) {
            return;
        }

        await sleep(1_000);
    }
}

async function main(): Promise&lt;void&gt; {
    const value = parseUnits(amount, 6);

    const { request } = await publicClient.simulateContract({
        account,
        address: USDC,
        abi: erc20Abi,
        functionName: "transfer",
        args: [recipient, value],
    });

    const hash = await walletClient.writeContract(request);

    console.log("Broadcast:", hash);

    const receipt = await publicClient.waitForTransactionReceipt({
        hash,
    });

    if (receipt.status !== "success") {
        throw new Error(`Transaction reverted: ${hash}`);
    }

    console.log("Included in block:", receipt.blockNumber.toString());

    await waitUntilFinalized(receipt.blockNumber);

    console.log("Finalized:", hash);
}

main().catch((error) =&gt; {
    console.error(error);
    process.exitCode = 1;
});
</code></pre>
<p>Primer namerno ne sadrži automatski retry slanja. Generički retry oko <code>writeContract</code> poziva može da napravi duplu poslovnu operaciju.</p>
<p>Produkcijska implementacija treba da uradi sledeće:</p>
<ol>
<li><p>Pre slanja upiše payout u bazu.</p>
</li>
<li><p>Dodeli mu jedinstven poslovni idempotency ključ.</p>
</li>
<li><p>Rezerviše nonce za konkretnog signer-a.</p>
</li>
<li><p>Sačuva transaction hash čim postane dostupan.</p>
</li>
<li><p>U slučaju timeout-a prvo proveri stanje nonce-a i mreže.</p>
</li>
<li><p>Tek nakon reconciliation procesa odluči da li je bezbedno ponoviti operaciju.</p>
</li>
</ol>
<p>Za veći obim nije dobro da deset paralelnih worker-a deli jedan hot wallet bez nonce koordinatora. Tada dve transakcije mogu pokušati da koriste isti nonce, dok nepažljiv replacement može zameniti pogrešnu isplatu.</p>
<p>Opcije su:</p>
<ul>
<li><p>centralizovani nonce allocator</p>
</li>
<li><p>red transakcija po signer adresi</p>
</li>
<li><p>više signer wallet-a sa odvojenim nonce prostorima</p>
</li>
<li><p>smart account sa batch i policy kontrolama</p>
</li>
<li><p>treasury ugovor koji interno vodi autorizacije i payout identifikatore</p>
</li>
</ul>
<h2>Kako se aplikacija povezuje na mrežu?</h2>
<p>Osnovni mrežni parametri su:</p>
<table>
<thead>
<tr>
<th>Mreža</th>
<th>Chain ID</th>
<th>Gas token</th>
<th>Parent chain</th>
</tr>
</thead>
<tbody><tr>
<td>Polygon mainnet</td>
<td>137</td>
<td>POL</td>
<td>Ethereum</td>
</tr>
<tr>
<td>Amoy testnet</td>
<td>80002</td>
<td>Test POL</td>
<td>Sepolia</td>
</tr>
</tbody></table>
<p>Za razvoj je preporučljivo da RPC URL dolazi iz environment konfiguracije:</p>
<pre><code class="language-env">POLYGON_RPC_URL=https://your-mainnet-rpc.example
POLYGON_AMOY_RPC_URL=https://polygon-amoy.drpc.org
</code></pre>
<p>Javni RPC je dobar za ručno testiranje, ali nije produkcijska strategija.</p>
<p>Besplatni endpoint može imati:</p>
<ul>
<li><p>rate limit</p>
</li>
<li><p>ograničen maksimalni block range za <code>eth_getLogs</code></p>
</li>
<li><p>različitu politiku čuvanja istorijskog stanja</p>
</li>
<li><p>sporiji odgovor pod opterećenjem</p>
</li>
<li><p>ograničen WebSocket broj konekcija</p>
</li>
<li><p>nedostupne trace metode</p>
</li>
<li><p>različito ponašanje za velike batch zahteve</p>
</li>
</ul>
<p>Produkcijski sistem treba da podržava najmanje dva RPC provajdera. Failover ipak ne treba implementirati kao nasumično prebacivanje svakog zahteva između endpoint-a.</p>
<p>Različiti RPC čvorovi mogu u istom trenutku videti različit chain head ili mempool.</p>
<p>Praktičan obrazac je:</p>
<ul>
<li><p>jedan primarni RPC za slanje transakcija</p>
</li>
<li><p>sekundarni RPC za read failover</p>
</li>
<li><p>poseban archive endpoint ako je potreban</p>
</li>
<li><p>health check koji poredi block height i finalized height</p>
</li>
<li><p>eksplicitno logovanje provajdera koji je vratio rezultat</p>
</li>
</ul>
<h2>Koliko košta Polygon transakcija?</h2>
<p>Ne postoji fiksna cena transfera, contract poziva ili deploy-a.</p>
<p>Naknada zavisi od:</p>
<ul>
<li><p>količine potrošenog gasa</p>
</li>
<li><p>trenutnog base fee-ja</p>
</li>
<li><p>priority fee-ja</p>
</li>
<li><p>kompleksnosti ugovora</p>
</li>
<li><p>stanja koje ugovor menja</p>
</li>
<li><p>količine calldata podataka</p>
</li>
<li><p>trenutnog opterećenja mreže</p>
</li>
</ul>
<p>Stvarni trošak receipt-a može se izračunati ovako:</p>
<pre><code class="language-ts">const feeWei = receipt.gasUsed * receipt.effectiveGasPrice;
</code></pre>
<p>Rezultat je denominovan u najmanjoj jedinici native POL-a.</p>
<p>Polygon Chain koristi EIP-1559 Type 2 transakcije. <code>maxFeePerGas</code> predstavlja maksimalnu cenu koju je pošiljalac spreman da plati, dok <code>maxPriorityFeePerGas</code> predstavlja maksimalni validator tip.</p>
<p>Za većinu aplikacija nema potrebe ručno hardkodirati fee parametre. Wallet ili biblioteka mogu ih proceniti preko RPC-ja.</p>
<p>Ako je potrebna kontrolisana backend politika, Polygon Gas Station vraća <code>safeLow</code>, <code>standard</code> i <code>fast</code> preporuke izračunate na osnovu <code>eth_feeHistory</code> podataka.</p>
<p>Mainnet endpoint je:</p>
<pre><code class="language-text">https://gasstation.polygon.technology/v2
</code></pre>
<p>Amoy endpoint je:</p>
<pre><code class="language-text">https://gasstation.polygon.technology/amoy
</code></pre>
<p>Primer odgovora ima sledeću strukturu:</p>
<pre><code class="language-json">{
  "safeLow": {
    "maxPriorityFee": 0,
    "maxFee": 0
  },
  "standard": {
    "maxPriorityFee": 0,
    "maxFee": 0
  },
  "fast": {
    "maxPriorityFee": 0,
    "maxFee": 0
  },
  "estimatedBaseFee": 0,
  "blockNumber": 0,
  "blockTime": 0
}
</code></pre>
<p>Nule su ovde namerno placeholder vrednosti. Aktuelne vrednosti treba pročitati u trenutku slanja, a ne kopirati iz dokumentacije ili članka.</p>
<p>Dokumentacija navodi i minimalni mainnet priority fee. Ako aplikacija sama formira Type 2 transakcije, treba proveriti aktuelni mrežni minimum pre slanja umesto oslanjanja na trajno hardkodiranu vrednost.</p>
<h3>Procena troška pre slanja</h3>
<p>Za finansijski proizvod nije dovoljno pokazati korisniku generičku poruku "network fee may apply".</p>
<p>Backend može pre slanja da uradi:</p>
<ol>
<li><p>simulaciju contract poziva</p>
</li>
<li><p>gas estimation</p>
</li>
<li><p>učitavanje trenutnih fee parametara</p>
</li>
<li><p>obračun maksimalnog troška</p>
</li>
<li><p>konverziju POL troška u prikaznu valutu</p>
</li>
</ol>
<p>Treba razlikovati:</p>
<ul>
<li><p>procenjeni trošak</p>
</li>
<li><p>maksimalno dozvoljeni trošak</p>
</li>
<li><p>stvarni trošak iz receipt-a</p>
</li>
</ul>
<p>Ako se korisniku naplaćuje mrežna naknada, ledger treba da knjiži stvarni receipt trošak, a ne prethodnu procenu.</p>
<h2>POL kao gas menja UX aplikacije</h2>
<p>Ako korisnik prima USDC, to ne znači da ima POL kojim može da plati narednu transakciju.</p>
<p>To je klasičan problem token UX-a:</p>
<ol>
<li><p>korisnik dobije stablecoin</p>
</li>
<li><p>pokuša da ga pošalje</p>
</li>
<li><p>wallet traži POL</p>
</li>
<li><p>korisnik ne zna gde da nabavi gas token</p>
</li>
<li><p>proizvod gubi korisnika na infrastrukturnom detalju</p>
</li>
</ol>
<p>Postoji nekoliko pristupa.</p>
<h3>Korisnik sam drži POL</h3>
<p>Najjednostavnije za developera, ali često najlošije za consumer UX. Pogodno je za DeFi aplikacije i korisnike koji već razumeju EVM mreže.</p>
<h3>Aplikacija distribuira malu količinu POL-a</h3>
<p>Faucet model može raditi za kontrolisane sisteme, ali otvara probleme zloupotrebe, Sybil napada, treasury upravljanja i dodatnog računovodstva.</p>
<h3>Meta-transakcije</h3>
<p>Korisnik potpisuje nameru, a relayer šalje transakciju i plaća gas. Aplikacija mora da održava relayer, pravila autorizacije i zaštitu od replay napada.</p>
<h3>ERC-4337 smart accounts</h3>
<p>Polygon podržava ERC-4337 model sa <code>UserOperation</code>, bundler, <code>EntryPoint</code>, smart account i opcionim paymaster komponentama.</p>
<p>Paymaster može sponzorisati gas, ali to nije besplatan gas. Trošak se samo premešta sa korisnika na operatora paymaster-a.</p>
<p>U produkciji paymaster politika obično proverava:</p>
<ul>
<li><p>koji account šalje operaciju</p>
</li>
<li><p>koji contract se poziva</p>
</li>
<li><p>koji function selector je dozvoljen</p>
</li>
<li><p>maksimalnu gas vrednost</p>
</li>
<li><p>dnevni limit</p>
</li>
<li><p>potpis ili voucher backend servisa</p>
</li>
<li><p>rok važenja sponzorstva</p>
</li>
</ul>
<p>Loše podešen paymaster je javni endpoint za trošenje vašeg POL treasury-ja.</p>
<h2>Eventi nisu poslovni ledger</h2>
<p>EVM događaji su veoma korisni za indeksiranje, ali nisu zamena za poslovno stanje.</p>
<p>Za prethodni payout primer USDC ugovor emituje <code>Transfer</code> događaj. Indexer može da ga koristi za potvrdu da je transfer izvršen.</p>
<p>Ipak, sam događaj ne zna:</p>
<ul>
<li><p>kojem payout nalogu pripada</p>
</li>
<li><p>koji order-i su poravnati</p>
</li>
<li><p>da li je transfer bio refund</p>
</li>
<li><p>ko je odobrio operaciju</p>
</li>
<li><p>kako treba knjižiti naknadu</p>
</li>
</ul>
<p>Zato je dobro da sopstveni payout ugovor, ako postoji, emituje poslovni identifikator:</p>
<pre><code class="language-solidity">event PayoutSettled(
    bytes32 indexed payoutId,
    address indexed recipient,
    address indexed token,
    uint256 amount
);
</code></pre>
<p><code>payoutId</code> treba da bude deterministički ili vezan za zapis u poslovnom sistemu. Tako reconciliation worker može da poveže onchain događaj sa internim nalogom bez heuristike zasnovane samo na iznosu i adresi.</p>
<p>Indexer takođe mora da podrži:</p>
<ul>
<li><p>ponovno čitanje određenog block range-a</p>
</li>
<li><p>deduplikaciju po <code>chainId</code>, <code>transactionHash</code> i <code>logIndex</code></p>
</li>
<li><p>proveru <code>removed</code> logova ako ih provajder šalje</p>
</li>
<li><p>napredovanje checkpoint kursora tek nakon uspešnog upisa</p>
</li>
<li><p>nezavisnu proveru finalized visine</p>
</li>
<li><p>rekonstrukciju stanja iz događaja</p>
</li>
</ul>
<p>Čak i kada mreža ima brz deterministički finality, vaš RPC, WebSocket ili indeksacioni servis i dalje može izgubiti događaj.</p>
<h2>Bridge nije samo još jedan ERC-20 transfer</h2>
<p>Kretanje tokena između Ethereuma i Polygon Chain-a uključuje drugačiji lifecycle od transakcije unutar jednog lanca.</p>
<p>Kod Polygon bridge modela potrebno je razlikovati:</p>
<ul>
<li><p>transakciju na izvornom lancu</p>
</li>
<li><p>state sync ili bridge zapis</p>
</li>
<li><p>potvrdu izvornog stanja</p>
</li>
<li><p>eventualni claim na odredišnom lancu</p>
</li>
<li><p>mapping između root i child tokena</p>
</li>
</ul>
<p>Posebno je važno razlikovati milestone finality od checkpoint-a.</p>
<p>Milestone omogućava brz deterministički finality na Polygon Chain-u. Checkpoint služi za sidrenje Polygon stanja na Ethereum i koristi se u procesima kao što je dokazivanje burn operacije pri povlačenju sredstava.</p>
<p>Zbog toga tvrdnja "Polygon transakcija je finalna za nekoliko sekundi" ne znači da će svaka Polygon-to-Ethereum bridge operacija biti završena u istom roku.</p>
<p>Aplikacija koja skriva bridge iza jednog dugmeta mora korisniku prikazati precizan status:</p>
<ul>
<li><p>čeka source-chain potvrdu</p>
</li>
<li><p>čeka checkpoint ili bridge proof</p>
</li>
<li><p>spremno za claim</p>
</li>
<li><p>claim poslat</p>
</li>
<li><p>claim finalizovan</p>
</li>
<li><p>operacija zahteva ručnu intervenciju</p>
</li>
</ul>
<p>Bridge workflow treba da ima sopstvenu state machine logiku. Jedan boolean <code>completed</code> gotovo nikada nije dovoljan.</p>
<h2>Gde se uklapa Agglayer?</h2>
<p>Agglayer nije novi RPC endpoint za Polygon dApp. To je interoperabilni sloj namenjen povezivanju različitih lanaca i koordinaciji cross-chain stanja.</p>
<p>Njegov Unified Bridge kombinuje:</p>
<ul>
<li><p>bridge ugovore na Ethereumu</p>
</li>
<li><p>bridge ugovore na povezanim lancima</p>
</li>
<li><p>Local Exit Tree za svaki lanac</p>
</li>
<li><p>Rollup Exit Tree</p>
</li>
<li><p>Mainnet Exit Tree</p>
</li>
<li><p>Global Exit Root</p>
</li>
<li><p>indexer i proof servise</p>
</li>
<li><p>Merkle dokaze za asset i message claim operacije</p>
</li>
</ul>
<p>Kada korisnik inicira izlaz sa jednog povezanog lanca, bridge operacija se beleži u njegovom Local Exit Tree-u.</p>
<p>Više lokalnih root vrednosti agregira se u strukturu koja na kraju proizvodi Global Exit Root. Odredišni lanac koristi Merkle dokaze da proveri da li je konkretan izlaz validno zabeležen i spreman za claim.</p>
<pre><code class="language-mermaid">flowchart LR
    ChainA[Lanac A]
    ChainB[Lanac B]
    ChainC[Lanac C]

    LET1[Local Exit Tree A]
    LET2[Local Exit Tree B]
    LET3[Local Exit Tree C]

    RET[Rollup Exit Tree]
    GER[Global Exit Root]
    L1[Ethereum]

    ChainA --&gt; LET1
    ChainB --&gt; LET2
    ChainC --&gt; LET3

    LET1 --&gt; RET
    LET2 --&gt; RET
    LET3 --&gt; RET

    RET --&gt; GER
    GER --&gt; L1
</code></pre>
<p>Agglayer je relevantan developeru kada aplikacija:</p>
<ul>
<li><p>mora da radi na više lanaca</p>
</li>
<li><p>šalje poruke između sopstvenih i javnih mreža</p>
</li>
<li><p>pokreće namenski CDK lanac</p>
</li>
<li><p>želi zajednički bridge model za više povezanih lanaca</p>
</li>
<li><p>mora da indeksira cross-chain claim stanje</p>
</li>
<li><p>pokušava da smanji fragmentaciju asset reprezentacija</p>
</li>
</ul>
<p>Nije potrebno uvoditi Agglayer samo zato što je aplikacija deploy-ovana na Polygon Chain.</p>
<p>Takođe, "unified liquidity" ne znači da svaka aplikacija automatski dobija likvidnost svih drugih lanaca. Token ugovori, canonical asset modeli, bridge podrška, routing i application-level integracije i dalje moraju biti pravilno dizajnirani.</p>
<h2>Pessimistic proof i izolacija lanaca</h2>
<p>Agglayer podržava različite sigurnosne modele povezanih lanaca. Pessimistic proof proverava ograničenja cross-chain accounting-a i sprečava da jedan povezani lanac povuče više sredstava nego što može da opravda svojim stanjem.</p>
<p>To ne dokazuje nužno svaku internu state tranziciju svakog lanca. U zavisnosti od konfiguracije, consensus dokaz može koristiti potpis pouzdanog sequencer-a ili generički validity proof.</p>
<p>Ovo razdvajanje je važno:</p>
<ul>
<li><p>sigurnost internog izvršavanja određuje sam lanac</p>
</li>
<li><p>sigurnost bridge accounting-a određuju bridge pravila i dokazi</p>
</li>
<li><p>dostupnost podataka zavisi od izabranog deployment moda</p>
</li>
<li><p>konačni settlement zavisi od L1 ugovora i proof lifecycle-a</p>
</li>
</ul>
<p>Povezivanje na Agglayer ne pretvara automatski privatni ili centralizovano sekvencirani lanac u trustless Ethereum rollup.</p>
<h2>Polygon CDK: kada javni chain više nije dovoljan?</h2>
<p>Polygon CDK je toolkit za pokretanje sopstvenog Ethereum L2 lanca sa podrškom za Agglayer integraciju.</p>
<p>To nije isto što i deploy ugovora. Kada koristite CDK, više ne upravljate samo aplikacijom. Upravljate delom blockchain infrastrukture:</p>
<ul>
<li><p>execution client-om</p>
</li>
<li><p>sequencer-om</p>
</li>
<li><p>RPC servisima</p>
</li>
<li><p>batcher ili proposer komponentama</p>
</li>
<li><p>data availability konfiguracijom</p>
</li>
<li><p>bridge servisima</p>
</li>
<li><p>indexer-ima</p>
</li>
<li><p>monitoringom</p>
</li>
<li><p>upgrade procesom</p>
</li>
<li><p>incident response procedurama</p>
</li>
<li><p>ključevima infrastrukturnih komponenti</p>
</li>
</ul>
<p>Aktuelni CDK podržava <code>op-geth</code> i <code>op-reth</code> execution klijente. Deployment modeli nisu samo stari izbor "rollup ili validium".</p>
<table>
<thead>
<tr>
<th>CDK mod</th>
<th>Status u dokumentaciji</th>
<th>Osnovni model</th>
</tr>
</thead>
<tbody><tr>
<td>Sovereign</td>
<td>Live</td>
<td>Agglayer povezivanje preko pessimistic proof-a, bez validity prover-a</td>
</tr>
<tr>
<td>Validium</td>
<td>Live</td>
<td>ZK izvršavanje uz alternativnu ili offchain dostupnost podataka</td>
</tr>
<tr>
<td>zkRollup</td>
<td>U razvoju</td>
<td>Validity proof uz onchain dostupnost podataka na Ethereumu</td>
</tr>
</tbody></table>
<p>Ovo je važna korekcija u odnosu na starije Polygon CDK tekstove. Ne treba planirati novi sistem pod pretpostavkom da su sve CDK konfiguracije podjednako dostupne i produkcijski zrele.</p>
<h3>Sovereign mod</h3>
<p>Sovereign konfiguracija daje operatoru veću kontrolu i jednostavniji početni deployment, ali korisnici prihvataju veći skup pretpostavki o sequencer-u i operatoru.</p>
<p>Primeri upotrebe:</p>
<ul>
<li><p>interni settlement lanac</p>
</li>
<li><p>permissioned mreža između kompanija</p>
</li>
<li><p>aplikacija sa kontrolisanim validatorima</p>
</li>
<li><p>lanac za specifičnu industriju</p>
</li>
<li><p>proizvod kome je interoperabilnost važnija od punog validity proving-a</p>
</li>
</ul>
<h3>Validium mod</h3>
<p>Validium čuva transakcione podatke van Ethereuma ili na alternativnom DA sloju, dok validity proof potvrđuje ispravnost izvršavanja.</p>
<p>Prednost je niži L1 data trošak. Kompromis je data availability: čak i ako niko ne može proizvesti matematički nevalidno stanje, korisnicima i dalje moraju biti dostupni podaci potrebni za rekonstrukciju i izlaz iz sistema.</p>
<h3>zkRollup mod</h3>
<p>Kod zkRollup-a podaci potrebni za rekonstrukciju stanja objavljuju se na Ethereumu. To nudi jači trust model, ali povećava L1 troškove i operativnu složenost.</p>
<p>Prema trenutnoj CDK dokumentaciji, ovaj mod je i dalje označen kao sistem u razvoju.</p>
<h2>Koliko košta CDK lanac?</h2>
<p>Za CDK ne postoji univerzalna cena po transakciji koju je moguće korektno navesti bez konkretne konfiguracije.</p>
<p>Operativni trošak zavisi od:</p>
<ul>
<li><p>broja i veličine RPC čvorova</p>
</li>
<li><p>sequencer infrastrukture</p>
</li>
<li><p>execution client-a</p>
</li>
<li><p>block gas limita i block time-a</p>
</li>
<li><p>količine istorijskih podataka</p>
</li>
<li><p>data availability modela</p>
</li>
<li><p>učestalosti L1 objavljivanja</p>
</li>
<li><p>cene Ethereum gasa</p>
</li>
<li><p>prover infrastrukture</p>
</li>
<li><p>bridge i proof servisa</p>
</li>
<li><p>observability sistema</p>
</li>
<li><p>broja okruženja</p>
</li>
<li><p>disaster recovery zahteva</p>
</li>
<li><p>nivoa podrške implementacionog partnera</p>
</li>
</ul>
<p>CDK lanac može imati veoma nizak marginalni trošak za pojedinačnu transakciju, a da istovremeno ima značajan fiksni mesečni infrastrukturni trošak.</p>
<p>Zato pitanje "koliko košta transakcija na mom chain-u" treba razložiti na:</p>
<ul>
<li><p>fiksni infrastrukturni trošak</p>
</li>
<li><p>L1 settlement trošak</p>
</li>
<li><p>DA trošak</p>
</li>
<li><p>proof trošak</p>
</li>
<li><p>bridge trošak</p>
</li>
<li><p>prosečnu iskorišćenost kapaciteta</p>
</li>
</ul>
<p>Ako lanac obrađuje mali broj transakcija, niski marginalni gas ne znači da je ukupan sistem ekonomičan.</p>
<h2>Polygon zkEVM više nije podrazumevani izbor</h2>
<p>Polygon zkEVM je ranije bio čest deo poređenja između Polygon PoS-a i ZK rollup-a.</p>
<p>Aktuelna Polygon dokumentacija ne preporučuje ga kao podrazumevanu platformu za nove integracije. Za nove aplikacije fokus je na Polygon Chain-u i Polygon CDK-u.</p>
<p>Za developera to znači:</p>
<ul>
<li><p>ne započinjati novi projekat na zkEVM-u samo zato što stari članak tako preporučuje</p>
</li>
<li><p>proveriti maintenance i migration plan postojećih integracija</p>
</li>
<li><p>ne koristiti stare benchmarke kao osnovu arhitektonske odluke</p>
</li>
<li><p>razlikovati Polygon ZK istraživanje od statusa konkretnog zkEVM mainnet proizvoda</p>
</li>
</ul>
<p>Tehnologija može biti tehnički zanimljiva, a da više nije preporučena produkcijska platforma. Dokumentacija i lifecycle status imaju prednost nad starim tutorijalima.</p>
<h2>Kada koristiti običan ugovor, a kada CDK?</h2>
<p>U velikom broju slučajeva dovoljan je ugovor na Polygon Chain-u.</p>
<p>CDK ima smisla tek kada postoji konkretan zahtev koji javni chain ne može dobro da ispuni.</p>
<table>
<thead>
<tr>
<th>Zahtev</th>
<th>Polygon Chain</th>
<th>CDK lanac</th>
</tr>
</thead>
<tbody><tr>
<td>Brz početak projekta</td>
<td>Bolji izbor</td>
<td>Veća početna složenost</td>
</tr>
<tr>
<td>Standardni EVM dApp</td>
<td>Dovoljan</td>
<td>Najčešće nepotreban</td>
</tr>
<tr>
<td>Sopstveni gas token</td>
<td>Ne</td>
<td>Moguće, zavisno od konfiguracije</td>
</tr>
<tr>
<td>Kontrola block space-a</td>
<td>Ne</td>
<td>Da</td>
</tr>
<tr>
<td>Permissioned pristup</td>
<td>Samo na nivou aplikacije</td>
<td>Može biti deo lanca</td>
</tr>
<tr>
<td>Privatnost podataka</td>
<td>Ograničena</td>
<td>Moguća kroz posebnu konfiguraciju</td>
</tr>
<tr>
<td>Bez node operacija</td>
<td>Da</td>
<td>Ne</td>
</tr>
<tr>
<td>Predvidiv kapacitet</td>
<td>Zavisi od javne mreže</td>
<td>Operator ga kontroliše</td>
</tr>
<tr>
<td>Najniži fiksni trošak</td>
<td>Da</td>
<td>Ne</td>
</tr>
<tr>
<td>Custom chain pravila</td>
<td>Ograničeno</td>
<td>Da</td>
</tr>
</tbody></table>
<p>Ako je glavni argument za CDK samo "možda ćemo jednog dana imati mnogo korisnika", verovatno je prerano za sopstveni lanac.</p>
<p>Ugovori, upgradeable proxy obrasci, batch izvršavanje i account abstraction često mogu da produže život aplikacije na javnom Polygon Chain-u mnogo duže nego što tim inicijalno očekuje.</p>
<h2>Sigurnosni kompromisi</h2>
<p>Polygon Chain daje brzinu i jeftinije izvršavanje, ali njegov trust model nije identičan Ethereumu.</p>
<p>Aplikacija zavisi od:</p>
<ul>
<li><p>Polygon validator seta</p>
</li>
<li><p>staking ugovora</p>
</li>
<li><p>Bor i Heimdall implementacije</p>
</li>
<li><p>bridge ugovora</p>
</li>
<li><p>governance i upgrade procesa</p>
</li>
<li><p>RPC infrastrukture</p>
</li>
<li><p>sopstvenih smart contract ugovora</p>
</li>
<li><p>signer i treasury sistema</p>
</li>
</ul>
<p>Ako aplikacija čuva značajnu vrednost, threat model treba da odgovori na sledeća pitanja:</p>
<ul>
<li><p>Šta se dešava ako primarni RPC laže ili kasni?</p>
</li>
<li><p>Da li se finality proverava preko više izvora?</p>
</li>
<li><p>Može li kompromitovan backend signer isprazniti treasury?</p>
</li>
<li><p>Postoje li dnevni payout limiti?</p>
</li>
<li><p>Da li ugovor podržava pause mehanizam?</p>
</li>
<li><p>Ko može da izvrši upgrade?</p>
</li>
<li><p>Da li su admin ključevi iza multisig-a?</p>
</li>
<li><p>Može li bridge incident blokirati povlačenje sredstava?</p>
</li>
<li><p>Kako se radi reconciliation posle prekida rada?</p>
</li>
<li><p>Da li aplikacija razlikuje native USDC i USDC.e?</p>
</li>
<li><p>Da li korisnik može biti prevaren pogrešnim chain ID-jem?</p>
</li>
</ul>
<p>Nizak gas nije bezbednosna osobina. On samo čini i legitimne i zlonamerne transakcije jeftinijim.</p>
<h2>Operativni problemi koji se ne vide u lokalnom testu</h2>
<p>Lokalni Hardhat ili Anvil test neće otkriti nekoliko problema karakterističnih za produkciju.</p>
<h3>RPC limit za logove</h3>
<p>Poziv <code>eth_getLogs</code> preko velikog block range-a može biti odbijen. Indexer treba adaptivno da deli opseg na manje segmente.</p>
<h3>Nonce konkurentnost</h3>
<p>Više worker-a koji koriste istu adresu moraju koordinisati nonce. RPC <code>pending</code> nonce sam po sebi nije dovoljan distributed lock.</p>
<h3>Stuck i replacement transakcije</h3>
<p>Ako transakcija ostane pending, replacement mora koristiti isti nonce i viši fee. Ne sme se kreirati nova poslovna operacija sa novim nonce-om pre nego što se utvrdi status stare.</p>
<h3>Token decimale</h3>
<p>USDC koristi šest decimala. POL koristi 18. Poslovna logika ne sme računati iznose preko JavaScript <code>number</code> tipa.</p>
<p>Koristite:</p>
<ul>
<li><p><code>bigint</code></p>
</li>
<li><p>decimal string vrednosti</p>
</li>
<li><p><code>parseUnits</code></p>
</li>
<li><p><code>formatUnits</code></p>
</li>
</ul>
<h3>Pogrešan token contract</h3>
<p>Simbol <code>USDC</code> nije jedinstven identifikator. Contract adresa i chain ID zajedno identifikuju asset.</p>
<p>Dobar interni ključ izgleda ovako:</p>
<pre><code class="language-text">eip155:137/erc20:0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359
</code></pre>
<h3>Finality nije isto što i uspešan poslovni proces</h3>
<p>Onchain transfer može biti finalan, dok interni ledger još nije ažuriran. Reconciliation worker mora moći da pronađe i popravi takvo stanje.</p>
<h2>Testiranje na Amoy mreži</h2>
<p>Amoy je Polygon testnet sa chain ID-jem <code>80002</code> i test POL tokenom za gas.</p>
<p>Minimalan test plan ne treba da proverava samo uspešan deploy.</p>
<p>Treba testirati:</p>
<ol>
<li><p>Uspešnu transakciju.</p>
</li>
<li><p>Namerni contract revert.</p>
</li>
<li><p>Nedovoljan POL za gas.</p>
</li>
<li><p>Nedovoljan ERC-20 saldo.</p>
</li>
<li><p>Pogrešan chain ID.</p>
</li>
<li><p>RPC timeout pre broadcast-a.</p>
</li>
<li><p>RPC timeout posle broadcast-a.</p>
</li>
<li><p>Dupli API zahtev sa istim idempotency ključem.</p>
</li>
<li><p>Paralelne transakcije sa iste adrese.</p>
</li>
<li><p>Replacement transakciju.</p>
</li>
<li><p>Ponovno pokretanje indexer-a.</p>
</li>
<li><p>Čitanje istorijskih događaja.</p>
</li>
<li><p>Prelazak iz <code>included</code> u <code>finalized</code>.</p>
</li>
<li><p>Privremenu nedostupnost primarnog RPC-ja.</p>
</li>
<li><p>Token sa šest i token sa 18 decimala.</p>
</li>
</ol>
<p>Amoy je koristan za proveru mrežne integracije, ali nije dovoljan za finansijsku logiku.</p>
<p>Većinu edge case scenarija lakše je deterministički testirati lokalno uz Anvil ili Hardhat, a zatim na Amoy-u proveriti RPC, wallet, explorer i finality ponašanje.</p>
<h2>Migraciona kontrolna lista za stare MATIC aplikacije</h2>
<p>Ako postojeća aplikacija još koristi MATIC terminologiju, migracija nije samo search-and-replace.</p>
<h3>Frontend</h3>
<ul>
<li><p>Prikazati <code>POL</code> kao native token.</p>
</li>
<li><p>Ukloniti zastarele tekstove o MATIC gasu.</p>
</li>
<li><p>Proveriti network konfiguraciju wallet biblioteke.</p>
</li>
<li><p>Razlikovati POL i WPOL.</p>
</li>
<li><p>Proveriti prikaz istorijskih transakcija.</p>
</li>
</ul>
<h3>Smart contracts</h3>
<ul>
<li><p>Proveriti hardkodirane ERC-20 adrese.</p>
</li>
<li><p>Ne menjati ugovor samo zbog naziva promenljive.</p>
</li>
<li><p>Proveriti oracle i DEX zavisnosti.</p>
</li>
<li><p>Proveriti allowance prema wrapped tokenu.</p>
</li>
<li><p>Pregledati bridge integracije.</p>
</li>
</ul>
<h3>Backend</h3>
<ul>
<li><p>Promeniti asset oznake u ledger-u.</p>
</li>
<li><p>Ne menjati istorijske zapise bez audit traga.</p>
</li>
<li><p>Proveriti POL cenu ako se gas prikazuje u fiat valuti.</p>
</li>
<li><p>Ažurirati alerting i treasury limite.</p>
</li>
<li><p>Proveriti da li RPC metadata još vraća stari simbol.</p>
</li>
</ul>
<h3>Data pipeline</h3>
<ul>
<li><p>Ne spajati MATIC sa Ethereuma i native POL sa Polygon Chain-a samo na osnovu simbola.</p>
</li>
<li><p>Koristiti chain ID i contract adresu kao identitet asset-a.</p>
</li>
<li><p>Sačuvati originalni naziv iz istorijskog izvora podataka.</p>
</li>
<li><p>U reporting sloju eksplicitno definisati pravila konverzije.</p>
</li>
</ul>
<h2>Kako doneti arhitektonsku odluku?</h2>
<p>Polygon Chain je dobar kandidat kada timu treba javni EVM settlement sloj sa brzim finality-jem, stablecoin likvidnošću i niskim marginalnim troškom transakcije.</p>
<p>Nije automatski dobar izbor kada:</p>
<ul>
<li><p>aplikacija zahteva Ethereum rollup trust model</p>
</li>
<li><p>sva aktivnost može ostati u običnoj bazi</p>
</li>
<li><p>ne postoji razlog da korisnik samostalno verifikuje stanje</p>
</li>
<li><p>tim nema plan za upravljanje ključevima</p>
</li>
<li><p>bridge rizik nije prihvatljiv</p>
</li>
<li><p>pravni ili privacy zahtevi zabranjuju javne transakcione podatke</p>
</li>
</ul>
<p>CDK je razuman tek kada je potreba za sopstvenim block space-om, pristupnim pravilima ili privatnošću dovoljno velika da opravda vođenje blockchain infrastrukture.</p>
<p>Agglayer je relevantan kada proizvod zaista postane cross-chain ili kada sopstveni lanac mora da komunicira sa drugim mrežama. Ne treba ga uvoditi kao apstrakciju unapred ako aplikacija danas koristi samo Polygon Chain.</p>
<p>Najzdraviji razvojni put često izgleda ovako:</p>
<ol>
<li><p>Lokalni EVM prototip.</p>
</li>
<li><p>Deploy na Amoy.</p>
</li>
<li><p>Mali mainnet ugovor na Polygon Chain-u.</p>
</li>
<li><p>Stabilan indexer i reconciliation.</p>
</li>
<li><p>Gas sponsorship ako UX to zahteva.</p>
</li>
<li><p>Cross-chain integracija kada se pojave stvarni korisnici na drugim mrežama.</p>
</li>
<li><p>CDK tek kada javni chain postane stvarno ograničenje.</p>
</li>
</ol>
<h2>Zaključak</h2>
<p>Najzanimljivija stvar kod savremenog Polygon ekosistema nije sam POL token. Za developere je važnija kombinacija tri nivoa.</p>
<p>Polygon Chain pruža poznat EVM runtime, native POL gas, standardni JSON-RPC i brz deterministički finality. Agglayer pokušava da standardizuje bridge i message passing između različitih lanaca. CDK omogućava da aplikacija, kada za to postoji opravdan razlog, preraste iz skupa ugovora u namenski lanac.</p>
<p>Ti nivoi nisu podjednako potrebni svakom projektu.</p>
<p>Za marketplace, stablecoin payout servis, loyalty platformu ili aplikaciju sa velikim brojem malih transakcija, Polygon Chain može biti dovoljno jednostavan da se integriše bez menjanja postojećeg Ethereum stack-a.</p>
<p>Najveći posao neće biti deploy ugovora, već pouzdano upravljanje finality-jem, nonce-ovima, signer ključevima, događajima, gasom i poslovnom idempotencijom.</p>
<p>Upravo tu se vidi razlika između demo aplikacije i sistema koji zaista može da pomera vrednost.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati POL. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://docs.polygon.technology/pos/architecture/overview">Polygon Developer Docs: Polygon Chain Architecture Overview</a></p>
</li>
<li><p><a href="https://polygon.technology/blog/matic-to-pol-migration-is-now-live-everything-you-need-to-know">Polygon: MATIC to POL Migration Is Now Live</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/pos/concepts/finality/finality">Polygon Developer Docs: Finality</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/payment-services/stablecoins/usdc-native-integration">Polygon Developer Docs: USDC Native Integration</a></p>
</li>
<li><p><a href="https://viem.sh/docs/contract/simulateContract">Viem Documentation: simulateContract</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/pos/reference/rpc-endpoints">Polygon Developer Docs: RPC Endpoints</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/pos/concepts/transactions/eip-1559">Polygon Developer Docs: EIP-1559</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/tools/gas/polygon-gas-station">Polygon Developer Docs: Polygon Gas Station</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/pos/concepts/transactions/eip-4337">Polygon Developer Docs: EIP-4337</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/interoperability/agglayer/core-concepts/unified-bridge/architecture">Polygon Developer Docs: Unified Bridge Architecture</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/interoperability/agglayer/core-concepts/state-transition-proof/aggchain-proof">Polygon Developer Docs: Aggchain Proof</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/chain-development/cdk/get-started/overview">Polygon Developer Docs: What Is CDK?</a></p>
</li>
<li><p><a href="https://docs.polygon.technology/chain-development/cdk/cdk-opgeth/architecture">Polygon Developer Docs: CDK Architecture</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/"><strong>Volet Srbija</strong></a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/polygon-pol-from-a-developers-perspective-evm-gas-and-finality-4800">Polygon POL from a Developer’s Perspective: EVM, Gas, and Finality</a></p>
]]></content:encoded></item><item><title><![CDATA[Avalanche za developere: C-Chain, L1 i ICM u praksi]]></title><description><![CDATA[Avalanche se često opisuje kao brz EVM lanac sa AVAX tokenom. Taj opis nije pogrešan, ali je suviše uzak da bi developeru objasnio zbog čega platforma uopšte postoji.
C-Chain jeste EVM mreža na kojoj ]]></description><link>https://kripto-pocetnica.hashnode.dev/avalanche-za-developere-c-chain-l1-i-icm-u-praksi</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/avalanche-za-developere-c-chain-l1-i-icm-u-praksi</guid><category><![CDATA[#avax]]></category><category><![CDATA[Avalanche]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[crypto]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Sat, 19 Sep 2026 00:02:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/da362305-f401-4984-bdb6-5b6a1b0ed196.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Avalanche se često opisuje kao brz EVM lanac sa AVAX tokenom. Taj opis nije pogrešan, ali je suviše uzak da bi developeru objasnio zbog čega platforma uopšte postoji.</p>
<p>C-Chain jeste EVM mreža na kojoj se Solidity ugovori mogu razvijati alatima kao što su Foundry, Hardhat i viem. Međutim, važniji deo Avalanche arhitekture jeste mogućnost pokretanja sopstvenih Layer 1 mreža sa zasebnim validatorima, pravilima pristupa, gas tokenom, ekonomijom naknada i izvršnim okruženjem.</p>
<p>Zato Avalanche nije samo još jedno mesto za deploy pametnog ugovora. To je mreža heterogenih blokčejnova koju koordinira P-Chain, dok Avalanche Interchain Messaging omogućava asinhronu komunikaciju između tih lanaca.</p>
<p>Ovaj model donosi više kontrole nego klasičan shared-chain deployment, ali i obaveze koje aplikacioni timovi često potcene. Ako pokrenete sopstveni Avalanche L1, ne održavate samo ugovore. Održavate validator set, RPC infrastrukturu, nadzor, nadogradnje, relayer procese i ekonomiju mreže.</p>
<p>Upravo je taj kompromis centralna tema ovog teksta.</p>
<h2>Šta je Avalanche iz perspektive developera</h2>
<p>Najkorisniji mentalni model jeste sledeći:</p>
<blockquote>
<p>Avalanche je platforma na kojoj više nezavisnih lanaca koristi isti mrežni protokol, zajednički registar validatora i standardizovan mehanizam za među-lančanu komunikaciju.</p>
</blockquote>
<p>Avalanche Mainnet čine Primary Network i svi Avalanche L1 lanci registrovani uz njega. Primary Network je poseban Avalanche L1 koji sadrži tri ugrađena lanca:</p>
<ul>
<li><p>C-Chain za EVM pametne ugovore</p>
</li>
<li><p>P-Chain za validatore, staking i administraciju L1 mreža</p>
</li>
<li><p>X-Chain za Avalanche Native Tokens i UTXO operacije</p>
</li>
</ul>
<p>Jedan Avalanche L1 može sadržati jedan ili više blokčejnova. Veza „jedan L1 jednako jedan blockchain” zato nije deo protokola, iako će veliki broj praktičnih implementacija imati samo jedan EVM lanac.</p>
<p>Za aplikacionog developera postoje dva osnovna načina rada:</p>
<ol>
<li><p>Deploy ugovora na C-Chain.</p>
</li>
<li><p>Pokretanje sopstvenog Avalanche L1 lanca.</p>
</li>
</ol>
<p>Izbor između njih ne bi trebalo donositi na osnovu toga šta zvuči tehnički naprednije. Treba ga doneti na osnovu toga ko treba da kontroliše izvršavanje, ko validira stanje, koji token plaća gas i koliko operativne kompleksnosti tim može da preuzme.</p>
<h2>Primary Network nije jedan lanac sa tri endpointa</h2>
<p>Podela na C, P i X lance nije samo API organizacija. Svaki lanac ima drugačiju odgovornost i drugačiji model stanja.</p>
<h3>C-Chain</h3>
<p>C-Chain koristi Coreth, Avalanche implementaciju Ethereum Virtual Machine okruženja. Podržava standardne Ethereum JSON-RPC metode, Solidity ugovore i veliki deo postojećeg Ethereum tooling ekosistema.</p>
<p>Glavne mrežne vrednosti su:</p>
<table>
<thead>
<tr>
<th>Parametar</th>
<th>Mainnet</th>
<th>Fuji testnet</th>
</tr>
</thead>
<tbody><tr>
<td>EVM chain ID</td>
<td><code>43114</code></td>
<td><code>43113</code></td>
</tr>
<tr>
<td>Gas token</td>
<td>AVAX</td>
<td>AVAX</td>
</tr>
<tr>
<td>JSON-RPC</td>
<td><code>/ext/bc/C/rpc</code></td>
<td><code>/ext/bc/C/rpc</code></td>
</tr>
<tr>
<td>WebSocket</td>
<td><code>/ext/bc/C/ws</code></td>
<td><code>/ext/bc/C/ws</code></td>
</tr>
</tbody></table>
<p>C-Chain je najjednostavniji izbor kada aplikaciji odgovara:</p>
<ul>
<li><p>javni validator set</p>
</li>
<li><p>AVAX kao gas token</p>
</li>
<li><p>postojeća likvidnost i infrastruktura</p>
</li>
<li><p>standardni EVM način rada</p>
</li>
<li><p>deljeno izvršno okruženje</p>
</li>
<li><p>minimalna DevOps odgovornost</p>
</li>
</ul>
<p>Za većinu prototipova i prve produkcione verzije aplikacije, C-Chain je racionalniji početak od sopstvenog L1 lanca.</p>
<h3>P-Chain</h3>
<p>P-Chain je kontrolna ravan Avalanche mreže. Ne izvršava Solidity ugovore i nije EVM lanac.</p>
<p>Na njemu se čuvaju informacije o:</p>
<ul>
<li><p>Primary Network validatorima</p>
</li>
<li><p>Avalanche L1 mrežama</p>
</li>
<li><p>validatorima pojedinačnih L1 mreža</p>
</li>
<li><p>validator težinama</p>
</li>
<li><p>BLS javnim ključevima</p>
</li>
<li><p>preostalim validator balansima</p>
</li>
<li><p>kreiranim blockchain instancama</p>
</li>
</ul>
<p>Operacije kao što su <code>CreateSubnetTx</code>, <code>CreateChainTx</code>, <code>ConvertSubnetToL1Tx</code>, <code>RegisterL1ValidatorTx</code> i <code>IncreaseL1ValidatorBalanceTx</code> pripadaju PlatformVM okruženju P-Chain-a.</p>
<p>Termin <code>subnetID</code> i dalje se pojavljuje u API-jima i izvornom kodu. Razlog je istorijski i protokolski: novi L1 najpre dobija Subnet zapis preko <code>CreateSubnetTx</code>, a zatim se konvertuje u L1. Identifikator transakcije ostaje njegov <code>subnetID</code>.</p>
<h3>X-Chain</h3>
<p>X-Chain koristi UTXO model i Avalanche Virtual Machine. Namenjen je Avalanche Native Tokens sredstvima i transferima.</p>
<p>Važna ispravka u odnosu na veliki broj starih članaka jeste da X-Chain na današnjoj mreži više ne koristi DAG konsenzus. Linearizovan je tokom Cortina nadogradnje u aprilu 2023. i sada koristi Snowman konsenzus.</p>
<p>Ova promena ne znači da je X-Chain postao EVM lanac. Njegov model sredstava i API ostaju drugačiji od C-Chain-a.</p>
<h2>Avalanche konsenzus bez marketinške magle</h2>
<p>Avalanche koristi porodicu Snow protokola zasnovanih na ponovljenom nasumičnom uzorkovanju validatora.</p>
<p>Kod klasičnih BFT protokola često postoji faza u kojoj veliki broj učesnika razmenjuje glasove sa velikim delom validator seta. Kako broj validatora raste, komunikacioni trošak može postati ograničavajući faktor.</p>
<p>Snow protokoli koriste drugačiji pristup. Validator više puta pita mali, nasumično odabran uzorak drugih validatora koju opciju preferiraju. Ako dovoljno veliki deo uzorka podržava istu opciju, validator povećava poverenje u nju. Proces se ponavlja dok poverenje ne pređe konfigurisan prag.</p>
<p>Pojednostavljena iteracija izgleda ovako:</p>
<ol>
<li><p>Čvor dobija validan predlog bloka.</p>
</li>
<li><p>Nasumično bira uzorak validatora.</p>
</li>
<li><p>Od njih traži trenutnu preferenciju.</p>
</li>
<li><p>Ako odgovor pređe prag <code>alpha</code>, prihvata tu preferenciju za tekuću rundu.</p>
</li>
<li><p>Broji uzastopne uspešne runde.</p>
</li>
<li><p>Kada broj uspešnih rundi dostigne <code>beta</code>, odluka postaje finalna.</p>
</li>
</ol>
<p>U aktuelnoj dokumentaciji navedene su podrazumevane vrednosti kao što su uzorak od 20 validatora, prag od 15 glasova i 20 uzastopnih uspešnih rundi. Ove vrednosti treba posmatrati kao implementacione parametre, a ne kao nepromenljiva svojstva protokola.</p>
<pre><code class="language-mermaid">flowchart TD
    A[Validan predlog bloka] --&gt; B[Nasumično uzorkovanje validatora]
    B --&gt; C[Prikupljanje preferencija]
    C --&gt; D{Dostignut alpha prag?}
    D -- Ne --&gt; E[Promeni ili zadrži preferenciju]
    E --&gt; B
    D -- Da --&gt; F[Povećaj confidence]
    F --&gt; G{Dostignut beta prag?}
    G -- Ne --&gt; B
    G -- Da --&gt; H[Prihvati blok]
</code></pre>
<p>Za linearni blokčejn koristi se Snowman, odnosno optimizovana Snowman++ implementacija.</p>
<h3>Finalnost je brza, ali nije Nakamoto finalnost</h3>
<p>Dokumentacija opisuje Snowman kao protokol sa probabilističkom, podesivom finalnošću koja se tipično postiže za manje od jedne sekunde.</p>
<p>To je drugačije od lanaca kod kojih se sigurnost transakcije procenjuje brojem blokova izgrađenih nakon nje. Kod Avalanche aplikacije obično nema smisla čekati proizvoljnih 12 ili 30 potvrda nakon što je blok prihvaćen.</p>
<p>To ipak ne znači da svaka aplikaciona operacija traje manje od jedne sekunde. Korisnička latencija uključuje i:</p>
<ul>
<li><p>propagaciju transakcije do RPC čvora</p>
</li>
<li><p>čekanje na uključivanje u blok</p>
</li>
<li><p>vreme izvršavanja backend servisa</p>
</li>
<li><p>indeksiranje događaja</p>
</li>
<li><p>reakciju wallet interfejsa</p>
</li>
<li><p>relayer obradu kod ICM poruka</p>
</li>
<li><p>opterećenje konkretnog RPC provajdera</p>
</li>
</ul>
<p>Konsenzusna finalnost i end-to-end latencija aplikacije nisu ista metrika.</p>
<h2>C-Chain ili sopstveni Avalanche L1</h2>
<p>Ovo je najvažnija arhitektonska odluka.</p>
<table>
<thead>
<tr>
<th>Pitanje</th>
<th>C-Chain</th>
<th>Sopstveni Avalanche L1</th>
</tr>
</thead>
<tbody><tr>
<td>Ko validira stanje?</td>
<td>Primary Network validator set</td>
<td>Validator set vašeg L1 lanca</td>
</tr>
<tr>
<td>Koji token plaća gas?</td>
<td>AVAX</td>
<td>Token definisan konfiguracijom lanca</td>
</tr>
<tr>
<td>Možete li ograničiti korisnike?</td>
<td>Uglavnom kroz ugovore</td>
<td>Da, i na nivou izvršnog okruženja</td>
</tr>
<tr>
<td>Možete li menjati fee parametre?</td>
<td>Ne kao aplikacioni tim</td>
<td>Da</td>
</tr>
<tr>
<td>Da li održavate validatore?</td>
<td>Ne</td>
<td>Da</td>
</tr>
<tr>
<td>Da li održavate RPC infrastrukturu?</td>
<td>Opciono</td>
<td>Praktično obavezno</td>
</tr>
<tr>
<td>Da li imate sopstveni blockspace?</td>
<td>Ne</td>
<td>Da</td>
</tr>
<tr>
<td>Da li delite stanje sa drugim dAppovima?</td>
<td>Da</td>
<td>Ne</td>
</tr>
<tr>
<td>Da li imate direktan pristup postojećoj likvidnosti?</td>
<td>Da</td>
<td>Ne nužno</td>
</tr>
<tr>
<td>Operativna složenost</td>
<td>Niža</td>
<td>Znatno viša</td>
</tr>
</tbody></table>
<p>Sopstveni L1 ima smisla kada je jedan ili više sledećih zahteva suštinski važan:</p>
<ul>
<li><p>aplikaciji je potreban izolovan blockspace</p>
</li>
<li><p>gas mora da se plaća sopstvenim tokenom</p>
</li>
<li><p>transakcije smeju da šalju samo odobrene adrese</p>
</li>
<li><p>samo određene adrese smeju da deployuju ugovore</p>
</li>
<li><p>validator membership mora biti kontrolisan</p>
</li>
<li><p>naknade treba usmeravati validatorima ili treasury adresi</p>
</li>
<li><p>potreban je poseban EVM precompile</p>
</li>
<li><p>aplikacija proizvodi dovoljno prometa da opravda zasebnu infrastrukturu</p>
</li>
</ul>
<p>Ako se zahtev može rešiti običnim Solidity ugovorom, pokretanje L1 mreže je verovatno preuranjeno.</p>
<h2>Realan use-case: B2B mreža za poravnanje obaveza</h2>
<p>Zamislimo platformu koja povezuje distributere i dobavljače. Učesnici tokom dana registruju fakture, odobrenja, netiranje i naloge za poravnanje. Finansijska sredstva postoje na javnom lancu, ali poslovna pravila zahtevaju:</p>
<ul>
<li><p>poznate učesnike</p>
</li>
<li><p>ograničen pristup slanju transakcija</p>
</li>
<li><p>kontrolisano deployovanje ugovora</p>
</li>
<li><p>predvidljiv kapacitet</p>
</li>
<li><p>zaseban audit trail</p>
</li>
<li><p>periodično poravnanje prema C-Chain-u</p>
</li>
<li><p>mogućnost zamene validatora bez zaustavljanja aplikacije</p>
</li>
</ul>
<p>Prva verzija može raditi na C-Chain-u. Ugovor čuva obaveze, dok backend proverava identitete učesnika.</p>
<p>Kada sistem poraste, pojavljuju se problemi:</p>
<ul>
<li><p>svaka poslovna operacija konkuriše za javni blockspace</p>
</li>
<li><p>svi učesnici moraju posedovati AVAX za gas</p>
</li>
<li><p>aplikacioni backend i dalje mora da sprovodi pristupna pravila</p>
</li>
<li><p>nije moguće prilagoditi fee tržište poslovnom prometu</p>
</li>
<li><p>svi podaci se nalaze u javnom stanju C-Chain-a</p>
</li>
</ul>
<p>Dedicated Avalanche L1 može preuzeti operativno stanje, dok C-Chain ostaje mesto na kom se drži kolateral ili završava javno poravnanje.</p>
<pre><code class="language-mermaid">flowchart LR
    U[Odobreni poslovni korisnici] --&gt; API[API i wallet sloj]
    API --&gt; L1[Settlement Avalanche L1]
    L1 --&gt; IDX[Indexer i audit baza]
    L1 --&gt; ICM[ICM poruke]
    ICM --&gt; C[C-Chain ugovori]
    C --&gt; TOK[Kolateral i javno poravnanje]
    REL[ICM relayer] --&gt; ICM
    VAL[Validator set] --&gt; L1
</code></pre>
<p>Ova arhitektura nije automatski bolja. Ona je bolja samo ako kontrola, izolacija i obim opravdavaju sopstvenu mrežu.</p>
<h2>Prva faza: validiranje aplikacije na C-Chain-u</h2>
<p>Pre nego što tim pokrene L1, korisno je potvrditi da aplikacioni model funkcioniše na Fuji C-Chain-u.</p>
<p>C-Chain podržava standardne Ethereum JSON-RPC metode kao što su:</p>
<ul>
<li><p><code>eth_chainId</code></p>
</li>
<li><p><code>eth_getBalance</code></p>
</li>
<li><p><code>eth_call</code></p>
</li>
<li><p><code>eth_estimateGas</code></p>
</li>
<li><p><code>eth_feeHistory</code></p>
</li>
<li><p><code>eth_sendRawTransaction</code></p>
</li>
<li><p><code>eth_getTransactionReceipt</code></p>
</li>
<li><p><code>eth_getLogs</code></p>
</li>
</ul>
<p>Fuji RPC koristi EVM chain ID <code>43113</code>, dok Mainnet C-Chain koristi <code>43114</code>.</p>
<p>Važan detalj za Solidity projekte jeste EVM verzija. Aktuelna Avalanche dokumentacija navodi da C-Chain i Subnet-EVM podržavaju Cancun, ali ne i novije hard forkove kao što je Pectra. Pošto Solidity <code>0.8.30</code> podrazumevano cilja Pectra, potrebno je eksplicitno postaviti <code>cancun</code>.</p>
<p>Minimalni Foundry <code>foundry.toml</code> može izgledati ovako:</p>
<pre><code class="language-toml">[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc_version = "0.8.30"
evm_version = "cancun"

[rpc_endpoints]
fuji = "https://api.avax-test.network/ext/bc/C/rpc"
avalanche = "https://api.avax.network/ext/bc/C/rpc"
</code></pre>
<p>Ovaj detalj je važniji nego što izgleda. Ugovor može uspešno da se kompajlira za Pectra EVM, ali zatim da pri deployu koristi opkod ili ponašanje koje ciljni lanac još ne podržava.</p>
<p>Za proveru fee tržišta ne treba hardkodovati gas cenu. C-Chain podržava <code>eth_feeHistory</code>, pa klijent može analizirati prethodne blokove i formirati <code>maxFeePerGas</code> i <code>maxPriorityFeePerGas</code> vrednosti.</p>
<pre><code class="language-bash">curl -s \
  -X POST \
  -H "content-type: application/json" \
  --data '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_feeHistory",
    "params": [10, "latest", [25, 50, 90]]
  }' \
  https://api.avax-test.network/ext/bc/C/rpc
</code></pre>
<p>U produkcionom klijentu bi uz to trebalo koristiti <code>eth_estimateGas</code>, ograničiti maksimalni prihvatljivi fee i razlikovati:</p>
<ul>
<li><p>procenu gasa koju transakcija može potrošiti</p>
</li>
<li><p>base fee bloka</p>
</li>
<li><p>priority fee</p>
</li>
<li><p>maksimalni fee koji korisnik dozvoljava</p>
</li>
</ul>
<h2>Druga faza: lokalni Avalanche L1</h2>
<p>Za EVM kompatibilan L1 koristi se Subnet-EVM. To je pojednostavljena varijanta EVM okruženja izgrađena za Avalanche L1 lance.</p>
<p>Tipičan životni ciklus L1 mreže obuhvata:</p>
<ol>
<li><p>Kreiranje Subnet zapisa na P-Chain-u.</p>
</li>
<li><p>Kreiranje jednog ili više blockchain zapisa.</p>
</li>
<li><p>Definisanje genesis konfiguracije.</p>
</li>
<li><p>Postavljanje početnih validatora.</p>
</li>
<li><p>Konverziju Subnet zapisa u L1.</p>
</li>
<li><p>Inicijalizaciju Validator Manager ugovora.</p>
</li>
<li><p>Pokretanje validator i RPC čvorova.</p>
</li>
</ol>
<p>Avalanche CLI može automatizovati veliki deo lokalnog procesa:</p>
<pre><code class="language-bash">avalanche blockchain create SettlementL1
avalanche blockchain deploy SettlementL1 --local
</code></pre>
<p>CLI zatim prikazuje RPC endpoint, EVM chain ID, blockchain ID, funded test adresu i druge parametre lokalne mreže.</p>
<p>Ipak, postoji važna napomena za izbor alata. Avalanche CLI repozitorijum je od decembra 2025. u maintenance režimu. Bezbednosne i kritične ispravke se i dalje prihvataju, ali Ava Labs više ne planira razvoj novih funkcionalnosti u tom projektu.</p>
<p>Zbog toga tim koji danas postavlja dugoročni workflow treba da razdvoji alate po odgovornosti:</p>
<ul>
<li><p>Avalanche CLI za postojeće lokalne i dokumentovane tokove</p>
</li>
<li><p>Platform CLI za direktnije P-Chain operacije</p>
</li>
<li><p>Interchain Kit za lokalni ICM i ICTT razvoj</p>
</li>
<li><p>Avalanche Deploy za cloud infrastrukturu</p>
</li>
<li><p>Builder Console za generisanje i proveru pojedinih konfiguracija</p>
</li>
</ul>
<p>To nije razlog da se Avalanche CLI izbegava u eksperimentima. Jeste razlog da se čitav produkcioni deployment pipeline ne veže za njega bez procene održavanja.</p>
<h2>Tri identifikatora koja ne treba pomešati</h2>
<p>Kod sopstvenog L1 lanca postoje najmanje tri vrednosti koje se često nazivaju „chain ID”.</p>
<h3>EVM chain ID</h3>
<p>To je broj koji vraća <code>eth_chainId</code>. Wallet ga koristi za EIP-155 zaštitu i identifikaciju EVM mreže.</p>
<p>Primer:</p>
<pre><code class="language-text">20261001
</code></pre>
<h3>Blockchain ID</h3>
<p>To je Avalanche identifikator konkretne blockchain instance. Koristi se u RPC putanji:</p>
<pre><code class="language-text">/ext/bc/&lt;blockchainID&gt;/rpc
</code></pre>
<h3>Subnet ID</h3>
<p>To je identifikator validator grupe, odnosno istorijski identifikator Subnet zapisa iz kog je L1 nastao.</p>
<p>ICM i validator operacije često zahtevaju blockchain ID ili subnet ID, dok wallet konfiguracija zahteva EVM chain ID. Mešanje ovih vrednosti proizvodi greške koje izgledaju kao problemi sa RPC-jem, potpisom ili nedostupnim lancem.</p>
<h2>Šta se zapravo konfiguriše u Subnet-EVM genesisu</h2>
<p>Genesis nije samo lista početnih računa. On definiše ekonomska i izvršna pravila mreže.</p>
<p>Među najvažnijim parametrima su:</p>
<ul>
<li><p>EVM chain ID</p>
</li>
<li><p>početni balansi</p>
</li>
<li><p>block gas limit</p>
</li>
<li><p>minimalni base fee</p>
</li>
<li><p>ciljani block rate</p>
</li>
<li><p>način promene base fee-a</p>
</li>
<li><p>native gas token ekonomija</p>
</li>
<li><p>aktivirani precompile moduli</p>
</li>
<li><p>početni administratori precompile modula</p>
</li>
</ul>
<p>Subnet-EVM ima stateful precompile ugovore za funkcije koje bi na standardnom EVM lancu zahtevale dodatne ugovore ili promene klijenta.</p>
<p>Aktuelni ugrađeni moduli uključuju:</p>
<table>
<thead>
<tr>
<th>Precompile</th>
<th>Adresa</th>
<th>Namena</th>
</tr>
</thead>
<tbody><tr>
<td>Contract Deployer Allowlist</td>
<td><code>0x0200000000000000000000000000000000000000</code></td>
<td>Kontroliše ko sme da deployuje ugovore</td>
</tr>
<tr>
<td>Native Minter</td>
<td><code>0x0200000000000000000000000000000000000001</code></td>
<td>Kontroliše mintovanje native tokena</td>
</tr>
<tr>
<td>Transaction Allowlist</td>
<td><code>0x0200000000000000000000000000000000000002</code></td>
<td>Kontroliše ko sme da šalje transakcije</td>
</tr>
<tr>
<td>Fee Manager</td>
<td><code>0x0200000000000000000000000000000000000003</code></td>
<td>Menja fee parametre</td>
</tr>
<tr>
<td>Reward Manager</td>
<td><code>0x0200000000000000000000000000000000000004</code></td>
<td>Definiše odredište transakcionih naknada</td>
</tr>
</tbody></table>
<p>Za prethodni B2B use-case, deo genesis konfiguracije mogao bi da aktivira transaction i deployer allowliste:</p>
<pre><code class="language-json">{
  "config": {
    "chainId": 20261001,
    "txAllowListConfig": {
      "blockTimestamp": 0,
      "adminAddresses": [
        "0x1111111111111111111111111111111111111111"
      ]
    },
    "contractDeployerAllowListConfig": {
      "blockTimestamp": 0,
      "adminAddresses": [
        "0x2222222222222222222222222222222222222222"
      ]
    },
    "feeManagerConfig": {
      "blockTimestamp": 0,
      "adminAddresses": [
        "0x3333333333333333333333333333333333333333"
      ]
    },
    "rewardManagerConfig": {
      "blockTimestamp": 0,
      "adminAddresses": [
        "0x4444444444444444444444444444444444444444"
      ],
      "initialRewardConfig": {
        "rewardAddress":
          "0x5555555555555555555555555555555555555555"
      }
    }
  }
}
</code></pre>
<p>Ovo je fragment, ne kompletan genesis fajl. Nedostaju fee konfiguracija, <code>alloc</code>, EVM fork parametri i ostala obavezna polja.</p>
<p><code>blockTimestamp: 0</code> znači da je precompile aktivan od genesis bloka.</p>
<h3>Allowlista nije isto što i autorizacija aplikacije</h3>
<p>Transaction Allowlist odlučuje da li adresa uopšte sme da pošalje transakciju na mrežu. Ona ne odlučuje da li ta adresa sme da izvrši određenu poslovnu operaciju.</p>
<p>Na primer, adresa može biti ovlašćena da plaća gas i šalje transakcije, ali ne mora imati dozvolu da potvrdi fakturu. Poslovne dozvole i dalje treba implementirati u ugovorima.</p>
<p>Praktična podela odgovornosti je:</p>
<ul>
<li><p>Transaction Allowlist za članstvo u mreži</p>
</li>
<li><p>Contract Deployer Allowlist za kontrolu koda</p>
</li>
<li><p>Solidity role model za poslovne dozvole</p>
</li>
<li><p>Validator Manager za članstvo u validator setu</p>
</li>
</ul>
<p>Mešanje ovih slojeva vodi do previše moćnih administratorskih ključeva.</p>
<h3>Rizik administratorskog zaključavanja</h3>
<p>Ako se uklone svi administratori i manageri iz allowliste, lista više ne može da se menja običnom transakcijom. Oporavak tada zahteva koordinisanu mrežnu nadogradnju.</p>
<p>Zato produkcioni genesis ne bi trebalo da koristi jedan EOA nalog kao jedinog administratora. Razumniji izbor je:</p>
<ul>
<li><p>multisig</p>
</li>
<li><p>odvojeni administratori za različite precompile module</p>
</li>
<li><p>dokumentovana procedura rotacije ključeva</p>
</li>
<li><p>vremenski odložene kritične promene</p>
</li>
<li><p>nadzor <code>RoleSet</code> događaja</p>
</li>
<li><p>testirana procedura mrežne nadogradnje</p>
</li>
</ul>
<h2>Gas ekonomija sopstvenog L1 lanca</h2>
<p>Na C-Chain-u gas se plaća u AVAX-u. Na sopstvenom Avalanche L1 lancu native token može biti token koji definiše operator mreže.</p>
<p>To otvara nekoliko modela:</p>
<ul>
<li><p>korisnici direktno poseduju gas token</p>
</li>
<li><p>backend sponzoriše korisničke transakcije</p>
</li>
<li><p>isti token služi za gas i staking</p>
</li>
<li><p>poseban utility token služi za gas</p>
</li>
<li><p>naknade se spaljuju</p>
</li>
<li><p>naknade se prosleđuju validatorima</p>
</li>
<li><p>naknade se šalju treasury adresi</p>
</li>
</ul>
<p>Fee parametri Subnet-EVM lanca uključuju:</p>
<ul>
<li><p><code>gasLimit</code></p>
</li>
<li><p><code>targetBlockRate</code></p>
</li>
<li><p><code>minBaseFee</code></p>
</li>
<li><p><code>targetGas</code></p>
</li>
<li><p><code>baseFeeChangeDenominator</code></p>
</li>
<li><p><code>minBlockGasCost</code></p>
</li>
<li><p><code>maxBlockGasCost</code></p>
</li>
<li><p><code>blockGasCostStep</code></p>
</li>
</ul>
<p><code>FeeManager</code> omogućava promenu ovih parametara nakon pokretanja lanca, ako je precompile aktiviran i pozivalac ima odgovarajuću ulogu.</p>
<p>Ovo je moćna funkcija, ali i governance rizik. Promena <code>minBaseFee</code> ili <code>gasLimit</code> nije obična administrativna operacija. Ona može promeniti:</p>
<ul>
<li><p>hardverske zahteve validatora</p>
</li>
<li><p>trošak DoS napada</p>
</li>
<li><p>korisnički trošak</p>
</li>
<li><p>prihod validatora</p>
</li>
<li><p>stopu sagorevanja tokena</p>
</li>
<li><p>maksimalnu veličinu stanja</p>
</li>
<li><p>ponašanje RPC infrastrukture</p>
</li>
</ul>
<p>Fee podešavanja zato treba tretirati kao deo protokola aplikacije, a ne kao runtime konfiguraciju koju jedan administrator menja po potrebi.</p>
<h2>Validator set je bezbednosni perimetar L1 mreže</h2>
<p>Sopstveni Avalanche L1 ne nasleđuje automatski isti validator set kao C-Chain.</p>
<p>P-Chain vodi evidenciju o L1 validatorima i omogućava proveru njihovih BLS ključeva i težina. Međutim, stanje konkretnog L1 lanca finalizuje validator set tog lanca.</p>
<p>To znači da bezbednost L1 mreže zavisi od:</p>
<ul>
<li><p>broja validatora</p>
</li>
<li><p>raspodele njihove težine</p>
</li>
<li><p>nezavisnosti operatora</p>
</li>
<li><p>fizičke i mrežne distribucije</p>
</li>
<li><p>bezbednosti signing ključeva</p>
</li>
<li><p>procedure dodavanja i uklanjanja validatora</p>
</li>
<li><p>sposobnosti reagovanja na kvarove</p>
</li>
<li><p>governance modela Validator Manager ugovora</p>
</li>
</ul>
<p>Avalanche dokumentacija navodi da L1 normalno napreduje kada su povezani validatori sa najmanje 80 procenata ukupne težine.</p>
<p>Ovo ima praktičnu posledicu. Ako tri validatora imaju jednake težine, gubitak jednog validatora ostavlja oko 66,7 procenata aktivne težine, što nije dovoljno za normalan napredak lanca.</p>
<p>Pet validatora jednake težine dozvoljava gubitak jednog i ostavlja tačno 80 procenata. Međutim, to nije razlog da se pet čvorova automatski proglasi bezbednom produkcionom konfiguracijom. Ako svih pet radi u istom cloud nalogu, regionu ili Kubernetes klasteru, validator count daje lažan osećaj otpornosti.</p>
<h2>PoA i PoS nisu konsenzus protokoli</h2>
<p>Avalanche L1 može koristiti Proof of Authority ili Proof of Stake logiku za upravljanje validator setom.</p>
<p>Ovi termini opisuju Sybil protection i pravila članstva, ne način na koji validatori postižu konsenzus. I PoA i PoS L1 mogu koristiti Snowman za dogovor o blokovima.</p>
<p>Aktuelni Validator Manager sistem obuhvata:</p>
<ul>
<li><p><code>ValidatorManager</code></p>
</li>
<li><p><code>PoAManager</code></p>
</li>
<li><p><code>NativeTokenStakingManager</code></p>
</li>
<li><p><code>ERC20TokenStakingManager</code></p>
</li>
</ul>
<p>Kod PoA modela vlasnik ili administratorski ugovor odlučuje ko može da postane validator.</p>
<p>Kod PoS modela kandidat zaključava native ili ERC-20 staking token, dok ugovor upravlja težinom, delegacijama i nagradama.</p>
<p>Za zatvorenu B2B mrežu, PoA može biti odgovarajući početak jer su validatori poznate organizacije. Za javnu mrežu, PoA uvodi očigledan centralizacioni rizik.</p>
<p>Dobar migracioni put može biti:</p>
<ol>
<li><p>PoA tokom privatnog testiranja.</p>
</li>
<li><p>Više nezavisnih PoA operatora u ranoj produkciji.</p>
</li>
<li><p>Formalizovana pravila rotacije i težina.</p>
</li>
<li><p>Migracija na PoS ako otvoreno članstvo ima poslovni smisao.</p>
</li>
</ol>
<p>PoS ne treba uvoditi samo zato što deluje decentralizovanije. Loše dizajniran staking token, koncentrisana distribucija i neproveren reward model mogu biti slabiji od transparentnog PoA sistema sa poznatim operatorima.</p>
<h2>Kako registracija L1 validatora zapravo funkcioniše</h2>
<p>Registracija validatora nije običan poziv jednom ugovoru.</p>
<p>Pojednostavljen tok izgleda ovako:</p>
<ol>
<li><p>Operator inicira registraciju u <code>ValidatorManager</code> ugovoru na L1 lancu.</p>
</li>
<li><p>Validator set potpisuje odgovarajuću Warp poruku.</p>
</li>
<li><p>Potpisi se agregiraju prema težini validatora.</p>
</li>
<li><p>Na P-Chain se šalje <code>RegisterL1ValidatorTx</code>.</p>
</li>
<li><p>P-Chain kreira <code>validationID</code>.</p>
</li>
<li><p>Potvrda se vraća L1 lancu preko među-lančane poruke.</p>
</li>
<li><p>Registracija se kompletira u Validator Manager sistemu.</p>
</li>
</ol>
<p>Aktuelna dokumentacija za registracioni tok navodi prag od 67 procenata ukupne validatorske težine za agregaciju odgovarajuće poruke.</p>
<p>P-Chain za validatora čuva najmanje:</p>
<ul>
<li><p><code>nodeID</code></p>
</li>
<li><p>BLS public key</p>
</li>
<li><p>validator weight</p>
</li>
<li><p>L1 odnosno subnet ID</p>
</li>
<li><p>preostali AVAX balans</p>
</li>
<li><p>vlasnika preostalog balansa</p>
</li>
<li><p>adresu ovlašćenu za deaktivaciju</p>
</li>
</ul>
<p>Ovaj tok pokazuje zbog čega su BLS ključevi i P-Chain stanje centralni za ICM i upravljanje validatorima.</p>
<h2>Kontinuirana naknada za L1 validatore</h2>
<p>Pre Etna i ACP-77 modela, Subnet validator je morao istovremeno biti Primary Network validator, što je podrazumevalo Primary Network staking zahteve.</p>
<p>Kod novog L1 modela validator ne mora da zaključava 2.000 AVAX da bi validirao samo L1. Umesto toga, svaki aktivan L1 validator ima unapred uplaćen AVAX balans na P-Chain-u iz kog se kontinuirano naplaćuje validator fee.</p>
<p>Kada balans padne na nulu:</p>
<ul>
<li><p>validator postaje neaktivan</p>
</li>
<li><p>prestaje da učestvuje u L1 validaciji</p>
</li>
<li><p>njegove poruke više se ne tretiraju kao poruke aktivnog validatora</p>
</li>
<li><p>validator može ponovo postati aktivan dopunom balansa</p>
</li>
</ul>
<p>Balans može dopuniti bilo ko preko <code>IncreaseL1ValidatorBalanceTx</code>, ali samo definisani vlasnik može dobiti preostali balans nakon deaktivacije validatora.</p>
<p>U trenutku Etna aktivacije, minimalna stopa bila je <code>512 nAVAX</code> po sekundi. Dokumentacija to približno prevodi u <code>1,33 AVAX</code> mesečno po validatoru, sve dok ukupan broj aktivnih L1 validatora ostaje ispod ciljanog praga od 10.000.</p>
<p>Ovo nije fiksna cena koju treba uneti u finansijski model. Fee je dinamičan, a parametri mogu biti promenjeni budućim mrežnim nadogradnjama.</p>
<p>Aktuelno stanje treba čitati preko P-Chain API metoda:</p>
<ul>
<li><p><code>platform.getValidatorFeeState</code></p>
</li>
<li><p><code>platform.getValidatorFeeConfig</code></p>
</li>
<li><p><code>platform.getL1Validator</code></p>
</li>
<li><p><code>platform.getCurrentValidators</code></p>
</li>
</ul>
<p><code>platform.getL1Validator</code> vraća i preostali <code>balance</code> konkretnog validatora.</p>
<p>Produkcioni monitoring zato ne treba da proverava samo da li je proces živ. Treba da računa preostali runway:</p>
<pre><code class="language-text">preostalo vreme = validator balance / trenutni fee rate
</code></pre>
<p>Alarm zasnovan samo na fiksnom AVAX iznosu nije dovoljan, jer se fee stopa može promeniti.</p>
<h2>RPC topologija za produkcioni L1</h2>
<p>Validator čvor ne bi trebalo automatski da bude javni RPC endpoint.</p>
<p>Razumnija infrastruktura razdvaja uloge:</p>
<ul>
<li><p>validator čvorovi za konsenzus</p>
</li>
<li><p>pruned RPC čvorovi za wallet i aplikacioni saobraćaj</p>
</li>
<li><p>archive RPC čvorovi za istorijske upite</p>
</li>
<li><p>indeksiranje događaja</p>
</li>
<li><p>load balancer</p>
</li>
<li><p>monitoring</p>
</li>
<li><p>ICM relayer</p>
</li>
<li><p>signature aggregator kada je potreban</p>
</li>
</ul>
<pre><code class="language-mermaid">flowchart TD
    APP[Web i backend aplikacije] --&gt; LB[RPC load balancer]
    LB --&gt; R1[Pruned RPC 1]
    LB --&gt; R2[Pruned RPC 2]
    INDEX[Indexing servis] --&gt; ARCH[Archive RPC]
    V1[Validator 1] --&gt; NET[L1 P2P mreža]
    V2[Validator 2] --&gt; NET
    V3[Validator 3] --&gt; NET
    V4[Validator 4] --&gt; NET
    V5[Validator 5] --&gt; NET
    REL[ICM relayer] --&gt; R1
    REL --&gt; P[P-Chain RPC]
    MON[Prometheus i Grafana] --&gt; V1
    MON --&gt; V2
    MON --&gt; V3
    MON --&gt; R1
    MON --&gt; R2
</code></pre>
<p>Avalanche L1 čvor mora da prati svoj L1 i P-Chain zbog podataka o validator setovima i interoperabilnosti. Ne mora istovremeno da sinhronizuje C-Chain i X-Chain.</p>
<p>Za RPC čvor treba odlučiti:</p>
<ul>
<li><p>da li je potreban archive mode</p>
</li>
<li><p>koji API namespace-i su uključeni</p>
</li>
<li><p>da li su <code>debug</code> i <code>trace</code> metode javno dostupne</p>
</li>
<li><p>koji su rate limit-i</p>
</li>
<li><p>kako se radi state sync</p>
</li>
<li><p>kako se čuvaju snapshot-i</p>
</li>
<li><p>kako aplikacija prelazi na rezervni RPC</p>
</li>
<li><p>koliko istorije zahteva indexer</p>
</li>
<li><p>kako se štite WebSocket konekcije</p>
</li>
</ul>
<p>Javno izlaganje svih RPC metoda validator čvora nepotrebno povećava napadnu površinu.</p>
<h2>ICM: komunikacija između Avalanche lanaca</h2>
<p>Avalanche Interchain Messaging koristi Avalanche Warp Messaging kao niži protokolski sloj, a Teleporter ugovore kao aplikacioni sloj za EVM lance.</p>
<p>ICM nije sinhroni poziv funkcije na drugom lancu. To je asinhroni protokol prenosa poruka.</p>
<p>Pojednostavljen životni ciklus poruke je:</p>
<ol>
<li><p>Ugovor na izvornom lancu šalje poruku preko <code>TeleporterMessenger</code>.</p>
</li>
<li><p>Poruka se emituje kao Warp log.</p>
</li>
<li><p>Relayer detektuje poruku.</p>
</li>
<li><p>Relayer traži BLS potpise validatora izvornog lanca.</p>
</li>
<li><p>Potpisi se agregiraju prema validatorskoj težini.</p>
</li>
<li><p>Relayer formira transakciju za odredišni lanac.</p>
</li>
<li><p>Odredišni lanac proverava agregirani potpis prema P-Chain stanju.</p>
</li>
<li><p><code>TeleporterMessenger</code> poziva odredišni ugovor.</p>
</li>
</ol>
<pre><code class="language-mermaid">sequenceDiagram
    participant A as Source ugovor
    participant TM1 as Source Teleporter
    participant V as Source validatori
    participant R as ICM relayer
    participant TM2 as Destination Teleporter
    participant B as Destination ugovor

    A-&gt;&gt;TM1: Pošalji poruku
    TM1--&gt;&gt;R: Warp log
    R-&gt;&gt;V: Zatraži BLS potpise
    V--&gt;&gt;R: Potpisi prema težini
    R-&gt;&gt;R: Agregiraj potpise
    R-&gt;&gt;TM2: Destination transakcija
    TM2-&gt;&gt;TM2: Provera poruke i validator seta
    TM2-&gt;&gt;B: Izvrši destination poziv
</code></pre>
<p>Reference ICM relayer zahteva pristup:</p>
<ul>
<li><p>RPC i WebSocket API-jima povezanih EVM lanaca</p>
</li>
<li><p>P-Chain API-jima</p>
</li>
<li><p>Info API-jima čvorova</p>
</li>
<li><p>P2P konekcijama prema validatorima radi prikupljanja potpisa</p>
</li>
<li><p>privatnom ključu sa sredstvima za destination gas</p>
</li>
</ul>
<h3>Relayer nije most validator</h3>
<p>Relayer ne odlučuje da li je poruka validna. Ne može samostalno da kreira validan agregirani BLS potpis.</p>
<p>To smanjuje trust površinu u odnosu na bridge modele u kojima mala grupa eksternih potpisnika kontroliše mintovanje sredstava.</p>
<p>Ipak, relayer ostaje važan za dostupnost. Neispravan ili cenzorski relayer može:</p>
<ul>
<li><p>odložiti dostavu poruke</p>
</li>
<li><p>potrošiti svoj gas balans</p>
</li>
<li><p>zaglaviti zbog nonce konflikta</p>
</li>
<li><p>prestati da prati jedan smer komunikacije</p>
</li>
<li><p>propustiti događaje tokom restartovanja</p>
</li>
<li><p>koristiti zastarelu konfiguraciju</p>
</li>
</ul>
<p>Zbog toga ICM sistem i dalje zahteva operativnu strategiju:</p>
<ul>
<li><p>više relayer instanci gde je opravdano</p>
</li>
<li><p>odvojeni destination signing ključevi</p>
</li>
<li><p>alert na gas balans</p>
</li>
<li><p>alert na zaostale poruke</p>
</li>
<li><p>proveru kompatibilnosti relayer i AvalancheGo verzija</p>
</li>
<li><p>praćenje <code>/health</code> endpointa</p>
</li>
<li><p>idempotentnu obradu na odredištu</p>
</li>
</ul>
<h2>Dizajn asinhronih među-lančanih workflow-a</h2>
<p>Najčešća greška je tretirati ICM kao RPC između dva ugovora.</p>
<p>Pretpostavimo da L1 šalje nalog C-Chain ugovoru da zaključa kolateral. Slanje poruke ne znači da je kolateral zaključan. Između ta dva događaja postoji stanje u kom je operacija pokrenuta, ali nije završena.</p>
<p>Aplikacioni model zato treba da sadrži eksplicitna stanja:</p>
<pre><code class="language-text">Created
PendingDelivery
Delivered
Executed
Failed
Compensating
Completed
</code></pre>
<p>Svaka poruka treba da ima stabilan identifikator, a destination ugovor mora da spreči dvostruku obradu.</p>
<p>Minimalni obrazac izgleda ovako:</p>
<pre><code class="language-solidity">// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

abstract contract IdempotentMessageHandler {
    mapping(bytes32 =&gt; bool) public processedMessages;

    error MessageAlreadyProcessed(bytes32 messageId);

    function _markProcessed(bytes32 messageId) internal {
        if (processedMessages[messageId]) {
            revert MessageAlreadyProcessed(messageId);
        }

        processedMessages[messageId] = true;
    }
}
</code></pre>
<p>Ovo nije kompletan Teleporter receiver. Nedostaju provera pozivaoca, izvornog blockchain ID-a, izvorne adrese i sadržaja poruke. Primer prikazuje samo aplikacioni problem idempotentnosti.</p>
<p>Produkcioni receiver treba najmanje da proveri:</p>
<ul>
<li><p>da poziv dolazi od očekivanog Messenger ugovora</p>
</li>
<li><p>da je <code>originBlockchainID</code> dozvoljen</p>
</li>
<li><p>da je izvorna ugovorna adresa dozvoljena</p>
</li>
<li><p>da poruka nije ranije obrađena</p>
</li>
<li><p>da payload odgovara verziji protokola</p>
</li>
<li><p>da poslovna operacija još može da bude izvršena</p>
</li>
</ul>
<p>Treba definisati i ponašanje u slučaju da destination poziv ne uspe. Moguće strategije su:</p>
<ul>
<li><p>ponovno slanje poruke</p>
</li>
<li><p>ručni retry</p>
</li>
<li><p>povratna poruka izvornom lancu</p>
</li>
<li><p>kompenzujuća transakcija</p>
</li>
<li><p>timeout nakon kog se operacija poništava</p>
</li>
<li><p>parkiranje poruke u dead-letter stanje</p>
</li>
</ul>
<p>Brza finalnost ne rešava distribuirane transakcije između dva nezavisna stanja.</p>
<h2>ICTT: transfer tokena između L1 lanaca</h2>
<p>Za transfer tokena postoji Avalanche Interchain Token Transfer, odnosno ICTT. To je skup ugovora izgrađen na ICM-u.</p>
<p>Osnovni model ima:</p>
<ul>
<li><p>jedan <code>TokenHome</code> ugovor na lancu porekla</p>
</li>
<li><p>jedan ili više <code>TokenRemote</code> ugovora na drugim lancima</p>
</li>
</ul>
<p>Kada se token šalje sa home lanca:</p>
<ol>
<li><p>Originalni token se zaključava u <code>TokenHome</code> ugovoru.</p>
</li>
<li><p>ICM poruka odlazi prema remote lancu.</p>
</li>
<li><p><code>TokenRemote</code> mintuje reprezentaciju tokena.</p>
</li>
</ol>
<p>Kod povratka:</p>
<ol>
<li><p>Remote reprezentacija se spaljuje.</p>
</li>
<li><p>Poruka se šalje <code>TokenHome</code> ugovoru.</p>
</li>
<li><p>Originalni token se otključava primaocu.</p>
</li>
</ol>
<p>ICTT podržava kombinacije:</p>
<ul>
<li><p>ERC-20 prema ERC-20</p>
</li>
<li><p>ERC-20 prema native tokenu</p>
</li>
<li><p>native token prema ERC-20 tokenu</p>
</li>
<li><p>native token prema native tokenu</p>
</li>
</ul>
<p>Podržani su i multi-hop transferi između dva remote lanca povezana sa istim home ugovorom, kao i <code>sendAndCall</code> obrazac u kom destination ugovor koristi primljene tokene u istoj workflow operaciji.</p>
<h3>Home i remote ugovori nisu automatski bezbedni</h3>
<p>ICTT registracija može biti permissionless. Bilo ko može deployovati kompatibilan remote ugovor i pokušati da ga registruje.</p>
<p>To ne znači da korisnički interfejs treba automatski da tretira svaki remote kao legitimnu reprezentaciju sredstva. Wallet, frontend i backend moraju imati sopstvenu listu odobrenih:</p>
<ul>
<li><p>blockchain ID vrednosti</p>
</li>
<li><p>home ugovora</p>
</li>
<li><p>remote ugovora</p>
</li>
<li><p>token adresa</p>
</li>
<li><p>decimalnih skaliranja</p>
</li>
<li><p>minimalnih podržanih Teleporter verzija</p>
</li>
</ul>
<p>Posebnu pažnju zahteva decimalno skaliranje. Token sa šest decimala na home lancu može imati reprezentaciju sa 18 decimala na remote lancu. Zaokruživanje, dust i maksimalna količina moraju biti eksplicitno testirani.</p>
<h2>Koliko Avalanche stvarno košta</h2>
<p>Ne postoji jedna cena „korišćenja Avalanche-a”. Trošak zavisi od toga da li aplikacija koristi C-Chain ili održava L1.</p>
<h3>Trošak C-Chain transakcije</h3>
<p>C-Chain koristi dinamički fee model sličan EIP-1559.</p>
<p>Približan trošak je:</p>
<pre><code class="language-text">gas used × effective gas price
</code></pre>
<p>Base fee se menja prema potražnji. Zato ne treba navoditi statičnu cenu transfera ili deploya ugovora.</p>
<p>Tačan trošak konkretne operacije treba proceniti neposredno pre slanja korišćenjem:</p>
<ul>
<li><p><code>eth_estimateGas</code></p>
</li>
<li><p><code>eth_feeHistory</code></p>
</li>
<li><p>trenutnog base fee-a</p>
</li>
<li><p>politike priority fee-a aplikacije</p>
</li>
</ul>
<p>Gas se plaća u AVAX-u, pa fiat vrednost zavisi i od tržišne cene AVAX-a.</p>
<h3>Trošak Avalanche L1 mreže</h3>
<p>L1 uvodi najmanje četiri kategorije troška.</p>
<h4>1. Kontinuirani P-Chain validator fee</h4>
<p>Na minimalnoj Etna stopi dokumentovana procena je približno <code>1,33 AVAX</code> mesečno po validatoru, ali stvarnu stopu treba čitati sa P-Chain-a.</p>
<p>Pet validatora na toj minimalnoj stopi bi značilo približno <code>6,65 AVAX</code> mesečno, bez infrastrukture i bez P-Chain transakcionih naknada.</p>
<h4>2. Compute i storage infrastruktura</h4>
<p>Potrebni su validator čvorovi, RPC čvorovi, diskovi, bandwidth, monitoring i backup.</p>
<p>Aktuelni Avalanche Deploy vodič daje referentnu AWS <code>us-east-1</code> topologiju sa:</p>
<ul>
<li><p>pet validatora</p>
</li>
<li><p>jednim archive RPC čvorom</p>
</li>
<li><p>jednim pruned RPC čvorom</p>
</li>
<li><p>monitoring instancom</p>
</li>
<li><p>S3 i KMS resursima</p>
</li>
</ul>
<p>Dokumentovana procena za tu konkretnu konfiguraciju iznosi približno <code>651 USD</code> mesečno.</p>
<p>To nije univerzalna cena L1 mreže. Ne uključuje nužno:</p>
<ul>
<li><p>veći bandwidth</p>
</li>
<li><p>dodatne regione</p>
</li>
<li><p>rezervne čvorove</p>
</li>
<li><p>managed baze</p>
</li>
<li><p>explorer infrastrukturu</p>
</li>
<li><p>log agregaciju</p>
</li>
<li><p>on-call podršku</p>
</li>
<li><p>bezbednosne alate</p>
</li>
<li><p>relayer redundancy</p>
</li>
<li><p>indeksiranje velikog obima</p>
</li>
<li><p>promene cloud cena</p>
</li>
</ul>
<h4>3. Relayer i interoperability trošak</h4>
<p>Relayer plaća gas na destination lancu i zahteva sopstvenu infrastrukturu. Ako postoji više povezanih lanaca, broj smerova i ključeva raste.</p>
<h4>4. Operativni rad</h4>
<p>Najskuplji deo privatnog lanca često nije VM instanca nego odgovornost tima:</p>
<ul>
<li><p>nadogradnje AvalancheGo i Subnet-EVM verzija</p>
</li>
<li><p>koordinacija validatora</p>
</li>
<li><p>rotacija ključeva</p>
</li>
<li><p>incident response</p>
</li>
<li><p>kapacitet planiranje</p>
</li>
<li><p>monitoring validator balansa</p>
</li>
<li><p>održavanje arhivskih podataka</p>
</li>
<li><p>kompatibilnost ICM komponenti</p>
</li>
</ul>
<p>Ako tim nema ljude koji mogu da održavaju distribuirani sistem van radnog vremena, niski transakcioni fee nije dovoljan razlog za sopstveni L1.</p>
<h2>Observability koji treba postaviti pre produkcije</h2>
<p>Minimalna kontrolna tabla treba da prati četiri sloja.</p>
<h3>L1 konsenzus</h3>
<ul>
<li><p>visinu poslednjeg prihvaćenog bloka</p>
</li>
<li><p>vreme poslednjeg bloka</p>
</li>
<li><p>povezanu validatorsku težinu</p>
</li>
<li><p>broj aktivnih validatora</p>
</li>
<li><p>bootstrap status</p>
</li>
<li><p>consensus error metrike</p>
</li>
<li><p>disk i memoriju validatora</p>
</li>
</ul>
<h3>P-Chain stanje</h3>
<ul>
<li><p>balans svakog L1 validatora</p>
</li>
<li><p>trenutni validator fee rate</p>
</li>
<li><p>procenjeni runway</p>
</li>
<li><p>promene validator težina</p>
</li>
<li><p>aktivne i neaktivne validatore</p>
</li>
<li><p>uspeh registracionih i top-up transakcija</p>
</li>
</ul>
<h3>RPC sloj</h3>
<ul>
<li><p>latency po JSON-RPC metodi</p>
</li>
<li><p>error rate</p>
</li>
<li><p>WebSocket konekcije</p>
</li>
<li><p>broj zahteva</p>
</li>
<li><p>rate-limit odbijanja</p>
</li>
<li><p>disk IOPS</p>
</li>
<li><p>state sync status</p>
</li>
<li><p>archive query latency</p>
</li>
</ul>
<h3>ICM</h3>
<ul>
<li><p>broj nedostavljenih poruka</p>
</li>
<li><p>starost najstarije poruke</p>
</li>
<li><p>source i destination block height</p>
</li>
<li><p>relayer health</p>
</li>
<li><p>gas balans relayer naloga</p>
</li>
<li><p>nonce konflikte</p>
</li>
<li><p>broj neuspešnih destination izvršavanja</p>
</li>
<li><p>podržanu Teleporter verziju</p>
</li>
</ul>
<p>Posebno koristan alarm je „validator balance runway kraći od vremena potrebnog za dopunu”. Ako operativna procedura zahteva šest sati da multisig potpiše top-up, alarm na preostalih 30 minuta nije operativno koristan.</p>
<h2>Nadogradnje su distribuirana operacija</h2>
<p>Kod običnog dAppa upgrade se često svodi na proxy ugovor ili deploy nove verzije.</p>
<p>Kod sopstvenog L1 lanca postoje najmanje tri različite nadogradnje:</p>
<ul>
<li><p>aplikacioni ugovori</p>
</li>
<li><p>Subnet-EVM konfiguracija ili precompile aktivacija</p>
</li>
<li><p>AvalancheGo i VM binarne verzije na validatorima</p>
</li>
</ul>
<p>Mrežna nadogradnja mora biti koordinisana. Ako dovoljan deo validatora ne pređe na kompatibilnu verziju pre aktivacije novih pravila, lanac može prestati da napreduje.</p>
<p>Produkcioni proces treba da sadrži:</p>
<ol>
<li><p>Reprodukciju produkcione topologije na test mreži.</p>
</li>
<li><p>Fiksiranje tačnih verzija binarnih fajlova.</p>
</li>
<li><p>Proveru checksum vrednosti.</p>
</li>
<li><p>Rolling instalaciju bez aktivacije novih pravila.</p>
</li>
<li><p>Proveru da su svi validatori spremni.</p>
</li>
<li><p>Aktivaciju preko budućeg timestamp-a.</p>
</li>
<li><p>Monitoring pre i posle aktivacije.</p>
</li>
<li><p>Dokumentovan rollback, ako je protokolski moguć.</p>
</li>
<li><p>Proceduru za oporavak ako se mreža zaustavi.</p>
</li>
</ol>
<p>Aktiviranje više precompile promena u isto vreme otežava dijagnostiku. Konzervativni pristup je jedna velika protokolska promena po upgrade prozoru.</p>
<h2>Najčešće greške u Avalanche projektima</h2>
<h3>Pokretanje L1 mreže pre validacije proizvoda</h3>
<p>Dedicated chain ne rešava product-market fit. Ako aplikacija još nema realan promet, C-Chain ili lokalni L1 daju dovoljno prostora za proveru modela.</p>
<h3>Pretpostavka da L1 nasleđuje svu bezbednost Primary Network-a</h3>
<p>P-Chain registruje L1 validatore i podržava interoperabilnost, ali stanje L1 lanca štiti njegov validator set.</p>
<h3>Korišćenje broja validatora kao jedine mere decentralizacije</h3>
<p>Pet validatora u istom cloud nalogu nisu pet nezavisnih bezbednosnih domena.</p>
<h3>Izlaganje validator RPC-ja internetu</h3>
<p>Validator treba da bude zaštićen od javnog aplikacionog saobraćaja. RPC i validator uloge treba razdvojiti.</p>
<h3>Hardkodovanje gas cene</h3>
<p>Fee tržište je dinamičko i na C-Chain-u i u konfigurisanim L1 okruženjima.</p>
<h3>Ignorisanje Cancun EVM cilja</h3>
<p>Noviji Solidity kompajler može podrazumevano generisati bytecode za nepodržanu EVM verziju.</p>
<h3>Mešanje EVM chain ID-a, blockchain ID-a i subnet ID-a</h3>
<p>Ove vrednosti imaju različite funkcije i različite formate.</p>
<h3>Tretiranje ICM poruke kao sinhronog poziva</h3>
<p>Cross-chain operacija mora imati stanje, retry, idempotentnost i kompenzaciju.</p>
<h3>Jedan administratorski EOA</h3>
<p>Gubitak ili kompromitovanje tog ključa može zaključati ili preuzeti mrežnu administraciju.</p>
<h3>Nedostatak alarma za validator balance</h3>
<p>Validator proces može biti zdrav, dok mu P-Chain balans ističe.</p>
<h3>Oslanjanje na jednu relayer instancu</h3>
<p>Relayer nije trust root, ali može postati availability bottleneck.</p>
<h3>Promena fee parametara bez kapacitet testa</h3>
<p>Povećanje gas limita može preopteretiti slabije validatore i RPC čvorove.</p>
<h2>Kada Avalanche ima smisla</h2>
<p>Avalanche je posebno zanimljiv kada aplikaciji nije dovoljno samo izvršavanje ugovora, već joj je potreban kontrolisan blockchain runtime.</p>
<p>Dobri kandidati uključuju:</p>
<ul>
<li><p>igre sa velikim brojem promena stanja i sopstvenom ekonomijom</p>
</li>
<li><p>finansijske mreže sa poznatim učesnicima</p>
</li>
<li><p>loyalty i rewards sisteme sa native gas tokenom</p>
</li>
<li><p>tržišta kojima je potreban izolovan blockspace</p>
</li>
<li><p>infrastrukturu za tokenizovanu imovinu</p>
</li>
<li><p>aplikacije koje zahtevaju kontrolu validator membership-a</p>
</li>
<li><p>sisteme koji povezuju više specijalizovanih EVM lanaca</p>
</li>
<li><p>projekte kojima su potrebni custom precompile moduli</p>
</li>
</ul>
<p>C-Chain ima smisla kada su važniji:</p>
<ul>
<li><p>postojeća likvidnost</p>
</li>
<li><p>javna kompozabilnost</p>
</li>
<li><p>jednostavan deploy</p>
</li>
<li><p>standardni EVM alati</p>
</li>
<li><p>odsustvo validator i RPC operacija</p>
</li>
<li><p>AVAX kao prihvatljiv gas token</p>
</li>
</ul>
<h2>Kada Avalanche L1 verovatno nije dobar izbor</h2>
<p>Dedicated L1 je verovatno pogrešan ako:</p>
<ul>
<li><p>aplikacija ima mali ili povremen promet</p>
</li>
<li><p>svi zahtevi mogu da se implementiraju ugovorima</p>
</li>
<li><p>tim nema blockchain DevOps iskustvo</p>
</li>
<li><p>nije jasno ko će operisati validatore</p>
</li>
<li><p>ne postoji plan za RPC, indexer i explorer</p>
</li>
<li><p>aplikaciji je neophodna trenutna kompozabilnost sa C-Chain protokolima</p>
</li>
<li><p>sopstveni gas token nema održiv distribucioni model</p>
</li>
<li><p>relayer i među-lančana stanja nisu deo threat modela</p>
</li>
<li><p>jedini argument glasi „transakcije će biti jeftinije”</p>
</li>
</ul>
<p>Cena transakcije je samo jedan deo ukupnog troška sistema.</p>
<h2>Praktičan razvojni put</h2>
<p>Razuman put od ideje do produkcionog Avalanche sistema izgleda ovako.</p>
<h3>Faza 1: C-Chain prototip</h3>
<ul>
<li><p>Deploy ugovora na lokalnu EVM mrežu.</p>
</li>
<li><p>Testiranje na Fuji C-Chain-u.</p>
</li>
<li><p>Merenje realnog gas usage-a.</p>
</li>
<li><p>Implementacija event indexera.</p>
</li>
<li><p>Validacija wallet i backend toka.</p>
</li>
</ul>
<h3>Faza 2: Lokalni L1</h3>
<ul>
<li><p>Kreiranje Subnet-EVM konfiguracije.</p>
</li>
<li><p>Izbor EVM chain ID-a i gas tokena.</p>
</li>
<li><p>Aktiviranje samo neophodnih precompile modula.</p>
</li>
<li><p>Testiranje sa više lokalnih validatora.</p>
</li>
<li><p>Simulacija gašenja jednog ili više validatora.</p>
</li>
<li><p>Testiranje upgrade procedure.</p>
</li>
</ul>
<h3>Faza 3: Interoperabilnost</h3>
<ul>
<li><p>Pokretanje lokalnog ICM relayera.</p>
</li>
<li><p>Slanje običnih poruka između lanaca.</p>
</li>
<li><p>Uvođenje idempotentnosti i retry mehanizma.</p>
</li>
<li><p>Testiranje ICTT modela ako se prenose tokeni.</p>
</li>
<li><p>Simulacija nedostupnog relayera i destination lanca.</p>
</li>
</ul>
<h3>Faza 4: Fuji infrastruktura</h3>
<ul>
<li><p>Deploy L1 mreže na Fuji.</p>
</li>
<li><p>Odvojeni validator i RPC čvorovi.</p>
</li>
<li><p>Monitoring P-Chain balansa.</p>
</li>
<li><p>Testiranje validator rotacije.</p>
</li>
<li><p>Testiranje multisig administracije.</p>
</li>
<li><p>Testiranje coordinated upgrade-a.</p>
</li>
</ul>
<h3>Faza 5: Produkcija</h3>
<ul>
<li><p>Nezavisni validator operatori.</p>
</li>
<li><p>Višeregionska RPC topologija.</p>
</li>
<li><p>Archive i pruned čvorovi.</p>
</li>
<li><p>Relayer redundancy.</p>
</li>
<li><p>Alerting sa jasnim runbook procedurama.</p>
</li>
<li><p>Dokumentovan governance i fee model.</p>
</li>
<li><p>Formalna bezbednosna revizija ugovora i infrastrukture.</p>
</li>
</ul>
<h2>Zaključak</h2>
<p>Najzanimljiviji deo Avalanche-a nije to što Solidity ugovor može da bude deployovan uz nekoliko izmena RPC konfiguracije. To mogu mnoge mreže.</p>
<p>Razlika je u tome što isti razvojni model može postepeno da preraste iz običnog C-Chain dAppa u sopstveni EVM L1 sa zasebnim validatorima, gas ekonomijom, pravilima pristupa i među-lančanom komunikacijom.</p>
<p>Cena te fleksibilnosti je jasna: što više kontrole aplikacija preuzme od javne mreže, više bezbednosnih i operativnih obaveza prelazi na njen tim.</p>
<p>Zato Avalanche L1 ne treba posmatrati kao optimizovani deployment target. Treba ga posmatrati kao distribuirani sistem koji tim poseduje.</p>
<p>Za developera je dobar prvi eksperiment relativno mali: pokrenuti lokalni Subnet-EVM, povezati ga standardnim EVM alatom, aktivirati jednu allowlistu i poslati jednu ICM poruku. Taj eksperiment brzo pokazuje gde se završava poznati Solidity svet, a gde počinje stvarno projektovanje sopstvene mreže.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati AVAX. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2><strong>Izvori</strong></h2>
<ol>
<li><p><a href="https://build.avax.network/docs/avalanche-l1s">Avalanche L1s, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/primary-network/platformvm-architecture">PlatformVM Architecture, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/nodes/architecture/consensus">Consensus Protocols, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/primary-network">Primary Network, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/avalanche-l1s/add-utility/deploy-smart-contract">Deploy a Smart Contract, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/tooling/avalanche-cli/create-deploy-avalanche-l1s/deploy-locally">Deploy an L1 on a Local Network, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://github.com/ava-labs/avalanche-cli">Avalanche CLI Repository</a></p>
</li>
<li><p><a href="https://build.avax.network/academy/avalanche-l1/access-restriction/02-genesis-activation/01-permissioning-precompiles">Permissioning Precompiles, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/avalanche-l1s/evm-configuration/customize-avalanche-l1">Customize an Avalanche L1, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/avalanche-l1s/upgrade/considerations">Avalanche L1 Upgrade Considerations, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/avalanche-l1s/validator-manager/contract">Validator Manager Contracts, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/avalanche-l1s/validator-manager/registration-flow">Validator Registration Flow, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/acps/77-reinventing-subnets">ACP-77: Reinventing Subnets, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/tooling/avalanche-sdk/client/methods/public-methods/p-chain">P-Chain Methods, Avalanche SDK</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/nodes/run-a-node">Node Setup Overview, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/cross-chain/avalanche-warp-messaging/run-relayer">Run an ICM Relayer, Avalanche Builder Hub</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/cross-chain/interchain-token-transfer/overview">Avalanche Interchain Token Transfer Overview</a></p>
</li>
<li><p><a href="https://build.avax.network/docs/tooling/avalanche-deploy/deploy-l1">Deploy an L1 with Terraform and Ansible</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/"><strong>Volet Srbija</strong></a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/avalanche-for-developers-from-a-c-chain-dapp-to-an-l1-network-42i6">Avalanche for Developers: From a C-Chain dApp to an L1 Network</a></p>
]]></content:encoded></item><item><title><![CDATA[BNB Smart Chain iz ugla developera: EVM bez prečica]]></title><description><![CDATA[BNB Smart Chain se često opisuje jednom rečenicom: EVM kompatibilan Layer 1 sa kraćim blokovima i nižim transakcionim troškovima od Ethereum Mainneta.
Opis je tačan, ali developeru ne govori dovoljno.]]></description><link>https://kripto-pocetnica.hashnode.dev/bnb-smart-chain-iz-ugla-developera-evm-bez-pre-ica</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/bnb-smart-chain-iz-ugla-developera-evm-bez-pre-ica</guid><category><![CDATA[bnb]]></category><category><![CDATA[binance]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[crypto]]></category><category><![CDATA[Cryptocurrency]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Fri, 18 Sep 2026 23:40:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/05456e43-de0b-4c02-9006-1e7040f36cc0.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>BNB Smart Chain se često opisuje jednom rečenicom: EVM kompatibilan Layer 1 sa kraćim blokovima i nižim transakcionim troškovima od Ethereum Mainneta.</p>
<p>Opis je tačan, ali developeru ne govori dovoljno.</p>
<p>Ne govori šta EVM kompatibilnost zaista garantuje, kako Parlia konsenzus menja način na koji aplikacija tretira potvrđene transakcije, zašto <code>latest</code> nije isto što i <code>finalized</code>, niti zašto RPC sloj često postane veći operativni problem od samog pametnog ugovora.</p>
<p>BNB Smart Chain, ranije nazvan Binance Smart Chain, danas je samostalna EVM mreža unutar šireg BNB Chain ekosistema. BNB je njen native asset, koristi se za gas i staking, dok pametni ugovori koriste iste osnovne koncepte kao Ethereum: adrese, ABI, bytecode, logove, storage slotove, gas i JSON-RPC.</p>
<p>To znači da Solidity, Foundry, Hardhat, OpenZeppelin Contracts, Viem, Ethers i veliki deo Ethereum infrastrukture rade i na BSC-u.</p>
<p>Ne znači da je BSC samo Ethereum sa drugim RPC URL-om.</p>
<h2>Šta je BNB Smart Chain</h2>
<p>BNB Smart Chain je EVM kompatibilan Layer 1 blokčejn sa sopstvenim validatorima, konsenzusom, fork-choice pravilima, fee tržištem i finalnošću.</p>
<p>Osnovni mrežni parametri su:</p>
<table>
<thead>
<tr>
<th>Mreža</th>
<th>Chain ID</th>
<th>Hex Chain ID</th>
<th>Native asset</th>
</tr>
</thead>
<tbody><tr>
<td>BSC Mainnet</td>
<td>56</td>
<td><code>0x38</code></td>
<td>BNB</td>
</tr>
<tr>
<td>BSC Testnet</td>
<td>97</td>
<td><code>0x61</code></td>
<td>tBNB</td>
</tr>
</tbody></table>
<p>Mainnet i testnet izlažu Geth-kompatibilan JSON-RPC. Tipični Ethereum pozivi poput <code>eth_call</code>, <code>eth_estimateGas</code>, <code>eth_getBlockByNumber</code>, <code>eth_getTransactionReceipt</code>, <code>eth_sendRawTransaction</code> i <code>eth_getLogs</code> postoje i na BSC-u.</p>
<p>BSC ipak ima i funkcije koje proizlaze iz njegove sopstvene arhitekture, pre svega drugačiji model finalnosti, validatora, blob podataka i pojedine dodatne RPC metode.</p>
<p>Praktična posledica je da aplikaciju treba posmatrati kroz tri odvojena sloja:</p>
<ol>
<li><p>EVM izvršavanje pametnih ugovora</p>
</li>
<li><p>Parlia konsenzus i finalnost blokova</p>
</li>
<li><p>RPC i indekserska infrastruktura</p>
</li>
</ol>
<p>Većina jednostavnih integracija vidi samo prvi sloj. Produkcioni problemi se uglavnom pojavljuju u druga dva.</p>
<h2>EVM kompatibilnost bez pogrešnih pretpostavki</h2>
<p>EVM kompatibilnost omogućava da ugovor kompajliran iz Solidityja bude izvršen na BSC-u, pod uslovom da koristi instrukcije podržane aktivnim hard forkom mreže.</p>
<p>To donosi nekoliko praktičnih prednosti:</p>
<ul>
<li><p>ABI enkodiranje je isto kao na Ethereumu.</p>
</li>
<li><p>Adrese imaju standardni format od 20 bajtova.</p>
</li>
<li><p>Ugovori koriste isti model storagea.</p>
</li>
<li><p><code>msg.sender</code>, <code>msg.value</code>, <code>block.number</code> i <code>block.timestamp</code> imaju poznatu semantiku.</p>
</li>
<li><p>Event logovi koriste topics i data polja.</p>
</li>
<li><p>ERC-20 interfejsi rade kao osnova za BEP-20 tokene.</p>
</li>
<li><p>Ethereum alati mogu da koriste BSC preko odgovarajućeg RPC-ja i chain ID-ja.</p>
</li>
</ul>
<p>BSC je tokom razvoja uključio više Ethereum EIP-ova, među kojima su typed transactions, EIP-1559 interfejs sa nultom base fee komponentom, <code>PUSH0</code>, transient storage, <code>MCOPY</code>, blob transakcije i EIP-7702.</p>
<p>Ipak, kompatibilnost nije isto što i identičnost.</p>
<h3>Razlike koje se vide tek u produkciji</h3>
<p>Ugovor može biti bytecode kompatibilan, a da aplikacija ipak ima drugačije ponašanje zbog:</p>
<ul>
<li><p>kraćeg vremena između blokova</p>
</li>
<li><p>drugačije finalnosti</p>
</li>
<li><p>drugačijeg fee tržišta</p>
</li>
<li><p>drugačijeg validator seta</p>
</li>
<li><p>različitog MEV okruženja</p>
</li>
<li><p>ograničenja RPC provajdera</p>
</li>
<li><p>drugačije učestalosti hard forkova</p>
</li>
<li><p>različite likvidnosti i dostupnosti tokena</p>
</li>
</ul>
<p>Migracija ugovora sa Ethereuma zato nije kompletna dok nisu provereni backend, indexer, wallet konfiguracija, token adrese, oracle izvori, bridge pretpostavke i monitoring.</p>
<p>Ako ugovor očekuje određeni Chainlink feed, DEX router ili stablecoin na jednoj mreži, ista adresa na BSC-u najčešće ne predstavlja isti ugovor. Ponekad na toj adresi neće biti nikakvog koda, a u najgorem slučaju može postojati potpuno nepovezan ugovor.</p>
<p>Chain-specific adrese moraju biti konfiguracija, ne konstante kopirane iz deploymenta za drugu mrežu.</p>
<h2>Kako Parlia i PoSA proizvode blokove</h2>
<p>BSC koristi Parlia consensus engine zasnovan na Proof of Staked Authority modelu.</p>
<p>PoSA kombinuje dva pristupa:</p>
<ul>
<li><p>staking određuje koji validator kandidati mogu učestvovati</p>
</li>
<li><p>ograničen skup validatora proizvodi blokove po rasporedu sličnom Proof of Authority sistemima</p>
</li>
</ul>
<p>Prema aktuelnoj dokumentaciji, BSC ima 45 aktivnih validatora. Dvadeset jedan validator sa najviše stakea pripada grupi Cabinet, dok su preostala 24 Candidate validatori.</p>
<p>Za pojedinačnu epohu bira se consensus set od 21 validatora:</p>
<ul>
<li><p>18 iz Cabinet grupe</p>
</li>
<li><p>3 iz Candidate grupe</p>
</li>
</ul>
<p>Aktivni validatori se biraju kroz periodični izbor zasnovan na staking rangiranju.</p>
<p>Ovo je važna razlika u odnosu na Ethereum PoS. BSC namerno koristi manji skup proizvođača blokova da bi skratio vreme propagacije i postigao veću učestalost blokova. Cena takvog dizajna je veća koncentracija konsenzusne odgovornosti.</p>
<pre><code class="language-mermaid">flowchart LR
    U[Wallet ili backend] --&gt;|potpisana transakcija| R[RPC node]
    R --&gt; M[Transaction pool]
    M --&gt; P[Validator ili block builder]
    P --&gt; E[EVM izvršavanje]
    E --&gt; B[Novi blok]
    B --&gt; V[Glasovi validatora]
    V --&gt; F[Finalizovan blok]
</code></pre>
<h3>Blok više nije na tri sekunde</h3>
<p>Stariji tekstovi i veliki broj postojećih integracija i dalje navode približno tri sekunde po BSC bloku. To više nije aktuelan parametar.</p>
<p>Kroz Lorentz, Maxwell i Fermi nadogradnje, block interval je postepeno smanjen sa tri sekunde na približno 0,45 sekundi.</p>
<p>Ova promena utiče na backend mnogo više nego na Solidity kod.</p>
<p>Ako je servis ranije proveravao novi blok svake tri sekunde, sada u istom periodu može propustiti nekoliko blokova. Ako indexer obrađuje logove sekvencijalno i sporo, zaostajanje se brže akumulira. Ako UI osvežava stanje na svakom bloku, nepotrebno može proizvesti veliki broj RPC poziva.</p>
<p>Kraći block interval ne znači da svaki korisnički zahtev treba da izazove novi blockchain read.</p>
<p>Frontend i backend i dalje treba da koriste:</p>
<ul>
<li><p>keširanje</p>
</li>
<li><p>request deduplikaciju</p>
</li>
<li><p>batch RPC pozive</p>
</li>
<li><p>multicall gde odgovara</p>
</li>
<li><p>indeksirano stanje za liste i agregate</p>
</li>
<li><p>direktan RPC za kritične i sveže podatke</p>
</li>
</ul>
<h2>Inclusion nije isto što i finality</h2>
<p>Kada <code>eth_getTransactionReceipt</code> vrati uspešan receipt, transakcija je uključena u blok. To još nije ista tvrdnja kao da je blok finalizovan.</p>
<p>Korisno je razlikovati tri stanja:</p>
<table>
<thead>
<tr>
<th>Stanje</th>
<th>Značenje</th>
</tr>
</thead>
<tbody><tr>
<td>Submitted</td>
<td>RPC je prihvatio transakciju i vratio hash</td>
</tr>
<tr>
<td>Included</td>
<td>Transakcija je pronađena u bloku i ima receipt</td>
</tr>
<tr>
<td>Finalized</td>
<td>Blok više ne bi trebalo da bude uklonjen reorganizacijom lanca</td>
</tr>
</tbody></table>
<p>BSC koristi Fast Finality uveden kroz BEP-126. Validatori šalju BLS glasove za blokove, a blok može biti finalizovan kada se prikupi dovoljan prag glasova.</p>
<p>Aktuelna dokumentacija navodi da se pri normalnom radu blok finalizuje u približno dva bloka. Uz block interval od oko 0,45 sekundi, očekivana finalnost je približno jednu sekundu.</p>
<p>Ako nema dovoljno finality glasova, mreža može da nastavi rad uz probabilističku finalnost. To znači da aplikacija ne treba da zaključi kako je svaki blok garantovano finalizovan nakon fiksnog broja milisekundi.</p>
<p>Za kritične odluke treba čitati <code>finalized</code> block tag.</p>
<p>Primer direktnog JSON-RPC poziva:</p>
<pre><code class="language-json">{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_getBlockByNumber",
  "params": ["finalized", false]
}
</code></pre>
<p>To je bolji signal od hardkodovanog pravila poput „sačekaj tri bloka”.</p>
<h3>Kako modelovati status u aplikaciji</h3>
<p>Za escrow, depozit ili isplatu, backend može koristiti sledeću logiku:</p>
<ol>
<li><p>Transakcija je poslata.</p>
</li>
<li><p>Receipt još nije dostupan, status je <code>pending</code>.</p>
</li>
<li><p>Receipt postoji, ali je receipt blok iznad finalizovanog bloka, status je <code>included</code>.</p>
</li>
<li><p>Finalizovani blok je dostigao ili prešao receipt blok, status je <code>finalized</code>.</p>
</li>
<li><p>Receipt ima <code>status = 0</code>, status je <code>reverted</code>.</p>
</li>
<li><p>Transakcija nije pronađena duže od očekivanog perioda, proveravaju se replacement i nonce scenariji.</p>
</li>
</ol>
<p>U Viem biblioteci finalizovani blok može se čitati eksplicitno:</p>
<pre><code class="language-ts">import { createPublicClient, http } from 'viem';
import { bsc } from 'viem/chains';

const publicClient = createPublicClient({
  chain: bsc,
  transport: http(process.env.BSC_RPC_URL),
});

export async function isTransactionFinalized(hash: `0x${string}`) {
  const [receipt, finalizedBlock] = await Promise.all([
    publicClient.getTransactionReceipt({ hash }),
    publicClient.getBlock({ blockTag: 'finalized' }),
  ]);

  return {
    receipt,
    finalized: finalizedBlock.number &gt;= receipt.blockNumber,
  };
}
</code></pre>
<p><code>getTransactionReceipt</code> ovde može da baci grešku ako receipt još ne postoji. Produkcijska implementacija treba da razlikuje „još nije uključen” od stvarne RPC greške.</p>
<p>Viem <code>getBlock</code> podržava <code>latest</code>, <code>pending</code>, <code>safe</code> i <code>finalized</code> block tagove, ali krajnja podrška zavisi i od RPC servera koji se koristi.</p>
<h2>Gas model i realan trošak transakcije</h2>
<p>BSC koristi isti osnovni princip kao druge EVM mreže:</p>
<pre><code class="language-text">transaction cost = gas used × effective gas price
</code></pre>
<p>Gas used zavisi od izvršenih EVM operacija. Gas price se izražava u weima po jedinici gasa, a konačna naknada plaća se u BNB.</p>
<p>Jedan gwei je milijarda weia:</p>
<pre><code class="language-text">1 gwei = 1,000,000,000 wei
1 BNB = 1,000,000,000,000,000,000 wei
</code></pre>
<p>BSC podržava EIP-1559 strukturu transakcija, ali je BEP-226 uveo base fee od nule. Aktuelna BNB Chain dokumentacija navodi standardni minimum priority price od 0,05 gwei za BSC Mainnet i 0,1 gwei za testnet.</p>
<p>Ovo nije obećanje da će svaka transakcija po toj ceni odmah ući u blok. To je mrežna konfiguracija, dok stvarna preporučena cena zavisi od trenutnog stanja fee tržišta, validatora i RPC procene.</p>
<p>Nemojte hardkodovati gas price u produkciji. Koristite RPC procenu kao što su <code>eth_gasPrice</code>, <code>eth_maxPriorityFeePerGas</code> ili bibliotečku funkciju za procenu fee parametara.</p>
<h3>Primeri na minimumu od 0,05 gwei</h3>
<p>Ako bi efektivna gas cena bila tačno 0,05 gwei:</p>
<table>
<thead>
<tr>
<th>Operacija</th>
<th>Gas used</th>
<th>Trošak u BNB</th>
</tr>
</thead>
<tbody><tr>
<td>Native BNB transfer</td>
<td>21.000</td>
<td>0,00000105 BNB</td>
</tr>
<tr>
<td>Jednostavan contract call</td>
<td>100.000</td>
<td>0,000005 BNB</td>
</tr>
<tr>
<td>Složenija transakcija</td>
<td>250.000</td>
<td>0,0000125 BNB</td>
</tr>
<tr>
<td>Deployment od 1.000.000 gasa</td>
<td>1.000.000</td>
<td>0,00005 BNB</td>
</tr>
</tbody></table>
<p>Trošak u fiat valuti računa se množenjem sa aktuelnom cenom BNB-a. Pošto se cena BNB-a i gas tržište menjaju, članak ili korisnički interfejs ne bi trebalo da predstavlja fiksan USD iznos kao trajnu osobinu mreže.</p>
<h3><code>gas</code> i <code>gasPrice</code> nisu isto</h3>
<p>Česta greška je mešanje limita i cene.</p>
<ul>
<li><p><code>gas</code> ili <code>gasLimit</code> je maksimalna količina gasa koju transakcija sme da potroši.</p>
</li>
<li><p><code>gasPrice</code> je cena svake potrošene jedinice kod legacy transakcije.</p>
</li>
<li><p><code>maxFeePerGas</code> je maksimalna ukupna cena po gasu kod dynamic-fee transakcije.</p>
</li>
<li><p><code>maxPriorityFeePerGas</code> je maksimalna priority komponenta.</p>
</li>
</ul>
<p>Ako transakcija potroši manje gasa od limita, neiskorišćeni deo se ne naplaćuje. Ako nema dovoljno limita, izvršavanje se prekida sa out-of-gas greškom, a do tada potrošen gas se ne vraća.</p>
<p>Zato je <code>eth_estimateGas</code> deo pripreme transakcije, a ne optimizacija koju treba preskočiti.</p>
<h2>Realan use case: escrow za digitalno tržište</h2>
<p>Razmotrimo sistem u kojem kupac plaća digitalnu uslugu, a sredstva se oslobađaju prodavcu nakon isporuke.</p>
<p>Primer može biti:</p>
<ul>
<li><p>kupovina licence</p>
</li>
<li><p>plaćanje API kredita</p>
</li>
<li><p>naručivanje digitalnog sadržaja</p>
</li>
<li><p>freelance zadatak</p>
</li>
<li><p>obračun između dve aplikacije</p>
</li>
<li><p>prodaja tokenizovanog digitalnog dobra</p>
</li>
</ul>
<p>BSC ima smisla kada je iznos pojedinačne transakcije relativno mali, korisnicima je važna kratka potvrda, a aplikacija želi standardni EVM development stack.</p>
<h3>Šta treba da bude on-chain</h3>
<p>Pametni ugovor može da čuva:</p>
<ul>
<li><p>identifikator porudžbine</p>
</li>
<li><p>kupca</p>
</li>
<li><p>prodavca</p>
</li>
<li><p>adresu payment tokena</p>
</li>
<li><p>zaključani iznos</p>
</li>
<li><p>rok</p>
</li>
<li><p>status porudžbine</p>
</li>
<li><p>ko ima pravo da oslobodi ili refundira sredstva</p>
</li>
</ul>
<p>Na lanac ne treba stavljati:</p>
<ul>
<li><p>privatne podatke kupca</p>
</li>
<li><p>ceo sadržaj porudžbine</p>
</li>
<li><p>velike fajlove</p>
</li>
<li><p>API rezultate</p>
</li>
<li><p>interne komentare</p>
</li>
<li><p>podatke koje zakon ili poslovna logika zahtevaju da budu obrisivi</p>
</li>
</ul>
<p>Umesto kompletnog sadržaja, ugovor može čuvati <code>bytes32</code> hash kanonski serijalizovanog dokumenta.</p>
<p>Hash potvrđuje da se određeni dokument nije promenio. Ne dokazuje da je dokument istinit, kompletan ili legalan.</p>
<h3>Predlog arhitekture</h3>
<pre><code class="language-mermaid">flowchart TD
    W[Web aplikacija] --&gt; WAL[Wallet]
    W --&gt; API[Backend API]
    WAL --&gt; RPC[RPC provajder]
    RPC --&gt; ESC[Escrow ugovor]
    ESC --&gt; EVT[Contract events]
    EVT --&gt; IDX[Indexer]
    IDX --&gt; DB[(Aplikaciona baza)]
    API --&gt; DB
    API --&gt; WRK[Delivery worker]
    WRK --&gt; STORE[Off-chain storage]
</code></pre>
<p>Ugovor je autoritet za vlasništvo nad sredstvima. Baza je projekcija on-chain događaja i off-chain poslovnih podataka.</p>
<p>To razdvajanje je važno. Ako baza kaže da je porudžbina plaćena, a ugovor kaže da nije, ugovor je finansijski autoritet. Ako ugovor sadrži samo hash, baza ili storage servis ostaju autoritet za sam sadržaj.</p>
<h2>Minimalni contract interfejs</h2>
<p>Escrow ne mora da bude veliki ugovor. Bitnije je da ima jasan state machine i događaje koji omogućavaju pouzdano indeksiranje.</p>
<pre><code class="language-solidity">interface IOrderEscrow {
    event OrderCreated(
        bytes32 indexed orderId,
        address indexed buyer,
        address indexed seller,
        address token,
        uint256 amount,
        uint64 deadline
    );

    event OrderReleased(bytes32 indexed orderId);
    event OrderRefunded(bytes32 indexed orderId);

    function createOrder(
        bytes32 orderId,
        address seller,
        address token,
        uint256 amount,
        uint64 deadline
    ) external;

    function release(bytes32 orderId) external;
    function refund(bytes32 orderId) external;
}
</code></pre>
<p>Implementacija treba najmanje da proveri:</p>
<ul>
<li><p><code>orderId</code> još ne postoji</p>
</li>
<li><p>prodavac nije zero address</p>
</li>
<li><p>token je dozvoljen</p>
</li>
<li><p>iznos nije nula</p>
</li>
<li><p>rok nije u prošlosti</p>
</li>
<li><p>samo dozvoljena strana može da pozove <code>release</code></p>
</li>
<li><p>refund je moguć samo u definisanim stanjima</p>
</li>
<li><p>stanje se ažurira pre spoljnog token transfera</p>
</li>
<li><p>ugovor je zaštićen od reentrancy napada</p>
</li>
<li><p>događaji se emituju nakon uspešne promene stanja</p>
</li>
</ul>
<p>Za BEP-20 transfere treba koristiti bezbedan wrapper poput OpenZeppelin <code>SafeERC20</code>, a ne pretpostaviti da svaki token savršeno implementira <code>IERC20</code> povratnu vrednost.</p>
<pre><code class="language-solidity">using SafeERC20 for IERC20;

IERC20(order.token).safeTransfer(order.seller, order.amount);
</code></pre>
<p>BEP-20 je izveden iz ERC-20 standarda i koristi poznate funkcije poput <code>transfer</code>, <code>approve</code>, <code>transferFrom</code>, <code>balanceOf</code> i <code>allowance</code>.</p>
<p>Naziv „BEP-20” ipak nije garancija da svaki postojeći token ima identično ponašanje.</p>
<h2>Problematični tokeni nisu teorijski slučaj</h2>
<p>Escrow koji prihvata proizvoljne tokene mora da razmotri nekoliko klasa tokena.</p>
<h3>Token vraća <code>false</code></h3>
<p>Neki tokeni vraćaju <code>false</code> umesto da revertuju. Ako ugovor ignoriše povratnu vrednost, može upisati da je uplata primljena iako transfer nije izvršen.</p>
<p><code>SafeERC20.safeTransferFrom</code> rešava ovu klasu problema.</p>
<h3>Token ne vraća vrednost</h3>
<p>Postoje tokeni čiji <code>transfer</code> i <code>transferFrom</code> ne vraćaju standardni boolean. Direktan ABI poziv može imati neočekivano ponašanje, dok <code>SafeERC20</code> podržava i takve implementacije.</p>
<h3>Fee-on-transfer token</h3>
<p>Ako korisnik pošalje 100 jedinica tokena, ugovor možda primi 98.</p>
<p>Kod koji samo čuva argument <code>amount</code> napraviće računovodstvenu razliku. Ako aplikacija želi da podrži ovakve tokene, treba meriti stvarnu promenu balansa:</p>
<pre><code class="language-solidity">uint256 beforeBalance = token.balanceOf(address(this));
token.safeTransferFrom(msg.sender, address(this), amount);
uint256 received = token.balanceOf(address(this)) - beforeBalance;
</code></pre>
<p>Čak ni ovo ne rešava svaki rebasing ili nestandardni token. Za escrow je često bolja eksplicitna allowlista podržanih payment tokena.</p>
<h3>Pogrešan broj decimala</h3>
<p>Nikada nemojte pretpostaviti da svaki token koristi 18 decimala.</p>
<p>Frontend može čitati <code>decimals()</code>, ali backend treba da tretira iznose kao celobrojne minimalne jedinice. Decimalni string iz korisničkog interfejsa mora se pretvoriti pre potpisivanja transakcije.</p>
<h3>Lažni token sa istim simbolom</h3>
<p><code>symbol()</code> i <code>name()</code> nisu identitet tokena. Bilo ko može napraviti token sa simbolom <code>USDT</code>, <code>USDC</code> ili drugim poznatim nazivom.</p>
<p>Identitet tokena je najmanje kombinacija:</p>
<pre><code class="language-text">chain ID + contract address
</code></pre>
<p>Produkcijska aplikacija treba da održava proverenu listu token adresa po mreži.</p>
<h2>Workflow od korisničkog klika do finalizovane porudžbine</h2>
<p>Pouzdana integracija nije samo poziv <code>writeContract</code>.</p>
<h3>1. Aplikacija gradi deterministički <code>orderId</code></h3>
<p><code>orderId</code> može biti hash internih podataka:</p>
<pre><code class="language-text">orderId = keccak256(
    appDomain,
    internalOrderId,
    buyer,
    seller,
    token,
    amount
)
</code></pre>
<p>Domen ili namespace sprečava kolizije između različitih aplikacija koje koriste isti format.</p>
<p>Backend ne bi trebalo da prihvati nasumični <code>orderId</code> bez provere da pripada konkretnoj porudžbini i korisniku.</p>
<h3>2. Backend priprema nepotpisane parametre</h3>
<p>Backend može vratiti:</p>
<ul>
<li><p>escrow adresu</p>
</li>
<li><p>token adresu</p>
</li>
<li><p>iznos u minimalnim jedinicama</p>
</li>
<li><p><code>orderId</code></p>
</li>
<li><p>seller adresu</p>
</li>
<li><p>rok</p>
</li>
<li><p>očekivani chain ID</p>
</li>
</ul>
<p>Privatni ključ korisnika ostaje u walletu.</p>
<h3>3. Frontend proverava mrežu</h3>
<p>Pre simulacije proverava se:</p>
<pre><code class="language-ts">const chainId = await publicClient.getChainId();

if (chainId !== 56) {
  throw new Error(`Pogrešna mreža: očekivan chain ID 56, dobijen ${chainId}`);
}
</code></pre>
<p>Na testnetu očekivani chain ID je 97.</p>
<p>Provera chain ID-ja mora postojati čak i kada wallet UI prikazuje naziv mreže. Naziv je prezentacioni podatak, chain ID ulazi u potpis transakcije i zaštitu od replay scenarija.</p>
<h3>4. Proverava se allowance</h3>
<p>Ako escrow koristi <code>transferFrom</code>, korisnik prvo mora odobriti potrošnju tokena.</p>
<p>Klasični workflow zahteva dve transakcije:</p>
<ol>
<li><p><code>approve(escrow, amount)</code></p>
</li>
<li><p><code>createOrder(...)</code></p>
</li>
</ol>
<p>To ima UX i bezbednosne posledice. Infinite approval smanjuje broj budućih transakcija, ali povećava potencijalnu štetu ako escrow ugovor ili njegov upgrade mehanizam bude kompromitovan.</p>
<p>Konzervativniji pristup je odobravanje tačnog iznosa ili potrebnog limita.</p>
<p>Permit može smanjiti broj on-chain koraka ako konkretni token podržava odgovarajući standard. Ne treba pretpostaviti da svaki BEP-20 token ima <code>permit</code>.</p>
<h3>5. Contract call se simulira</h3>
<p>Viem odvaja simulaciju od slanja transakcije:</p>
<pre><code class="language-ts">const { request } = await publicClient.simulateContract({
  account,
  address: escrowAddress,
  abi: escrowAbi,
  functionName: 'createOrder',
  args: [
    orderId,
    sellerAddress,
    tokenAddress,
    amount,
    deadline,
  ],
});
</code></pre>
<p>Simulacija otkriva veliki broj problema pre nego što korisnik potpiše transakciju:</p>
<ul>
<li><p>nedovoljan allowance</p>
</li>
<li><p>nevažeći token</p>
</li>
<li><p>dupliran <code>orderId</code></p>
</li>
<li><p>istekao deadline</p>
</li>
<li><p>pogrešna rola</p>
</li>
<li><p>očekivani revert u ugovoru</p>
</li>
</ul>
<p>Simulacija nije garancija uspeha. Stanje se može promeniti između <code>eth_call</code> simulacije i stvarnog izvršavanja transakcije.</p>
<h3>6. Wallet šalje simulirani request</h3>
<pre><code class="language-ts">const hash = await walletClient.writeContract(request);
</code></pre>
<p>Dobijeni hash znači da je transakcija poslata kroz izabrani transport. Ne znači da je izvršena.</p>
<p>UI treba da prikaže najmanje:</p>
<ul>
<li><p>hash transakcije</p>
</li>
<li><p>mrežu</p>
</li>
<li><p>pending status</p>
</li>
<li><p>mogućnost da korisnik zatvori ekran bez gubitka praćenja</p>
</li>
</ul>
<p>Hash treba odmah sačuvati u lokalnom stanju ili poslati backendu.</p>
<h3>7. Čeka se receipt</h3>
<pre><code class="language-ts">const receipt = await publicClient.waitForTransactionReceipt({
  hash,
});
</code></pre>
<p>Nakon receipt-a proveravaju se:</p>
<pre><code class="language-ts">if (receipt.status !== 'success') {
  throw new Error('Escrow transakcija je revertovana');
}
</code></pre>
<p>Receipt ne treba prihvatiti samo zato što postoji. Revertovana transakcija takođe ima receipt i potrošen gas.</p>
<h3>8. Backend potvrđuje event</h3>
<p>Backend ne treba da veruje samo hash-u koji mu je poslao frontend.</p>
<p>Treba proveriti:</p>
<ul>
<li><p>chain ID</p>
</li>
<li><p>adresu ugovora</p>
</li>
<li><p><code>receipt.status</code></p>
</li>
<li><p>emitovani event</p>
</li>
<li><p><code>orderId</code></p>
</li>
<li><p>buyer adresu</p>
</li>
<li><p>seller adresu</p>
</li>
<li><p>token</p>
</li>
<li><p>iznos</p>
</li>
<li><p>broj bloka</p>
</li>
</ul>
<p>Tek tada interna porudžbina može preći iz <code>awaiting_payment</code> u <code>included</code>.</p>
<h3>9. Čeka se finalnost</h3>
<p>Kada finalized block dostigne blok u kojem je emitovan <code>OrderCreated</code>, status može preći u <code>funded</code>.</p>
<p>Ova razlika omogućava da aplikacija brzo prikaže napredak, ali da nepovratne off-chain operacije ne pokrene prerano.</p>
<p>Ako digitalni resurs može biti opozvan, aplikacija možda može reagovati već na inclusion. Ako isporuka izaziva nepovratan trošak, bolje je čekati finalnost.</p>
<h2>Event indexing na BSC-u</h2>
<p>Jedna od najvažnijih operativnih činjenica u aktuelnoj BSC dokumentaciji jeste da je <code>eth_getLogs</code> isključen na navedenim javnim mainnet endpointima. Dokumentacija za česta čitanja logova preporučuje druge RPC provajdere ili WebSocket pristup.</p>
<p>To znači da javni endpoint koji radi za <code>eth_call</code> nije automatski dovoljan za indexer.</p>
<h3>Pouzdan indexer koristi cursor</h3>
<p>Minimalni cursor treba da sadrži:</p>
<pre><code class="language-text">blockNumber
transactionIndex
logIndex
blockHash
</code></pre>
<p><code>blockNumber</code> sam nije dovoljan jer jedan blok može imati više relevantnih transakcija i više logova iz iste transakcije.</p>
<p>Tipičan workflow je:</p>
<ol>
<li><p>Učitaj poslednji procesirani finalizovani blok.</p>
</li>
<li><p>Učitaj novi finalized head.</p>
</li>
<li><p>Podeli opseg na razumne blok rangeove.</p>
</li>
<li><p>Pozovi <code>eth_getLogs</code> za poznate ugovore i topics.</p>
</li>
<li><p>Sortiraj po <code>blockNumber</code>, <code>transactionIndex</code> i <code>logIndex</code>.</p>
</li>
<li><p>Upisuj događaje idempotentno.</p>
</li>
<li><p>Pomeri cursor tek nakon uspešnog database commita.</p>
</li>
</ol>
<p>Jedinstveni ključ događaja može biti:</p>
<pre><code class="language-text">chainId + transactionHash + logIndex
</code></pre>
<p>To sprečava dupliranje kada worker ponovi isti range nakon restarta.</p>
<h3>WebSocket nije zamena za backfill</h3>
<p>WebSocket subscription je korisna za nisku latenciju, ali nije kompletan indexer.</p>
<p>Veza može pući, proces može biti restartovan, a provider može propustiti notifikaciju. Nakon svakog reconnecta treba uraditi HTTP backfill od poslednjeg pouzdano obrađenog bloka.</p>
<p>Dobar obrazac je:</p>
<ul>
<li><p>WebSocket za obaveštenje da postoji novi blok</p>
</li>
<li><p>HTTP JSON-RPC za determinističko čitanje logova</p>
</li>
<li><p>baza sa cursorom za oporavak</p>
</li>
</ul>
<h3><code>latest</code> ili <code>finalized</code></h3>
<p>Indexer može birati između dva modela.</p>
<h4>Finalized-only model</h4>
<p>Čita samo finalizovane blokove.</p>
<p>Prednosti:</p>
<ul>
<li><p>jednostavnija baza</p>
</li>
<li><p>nema rollback logike u normalnom radu</p>
</li>
<li><p>događaji se ne prikazuju pa nestaju</p>
</li>
</ul>
<p>Nedostatak:</p>
<ul>
<li>aplikacija ima malu dodatnu latenciju</li>
</ul>
<h4>Optimistic model</h4>
<p>Čita <code>latest</code> blokove i odmah ažurira UI.</p>
<p>Prednosti:</p>
<ul>
<li>najbrže korisničko iskustvo</li>
</ul>
<p>Nedostaci:</p>
<ul>
<li><p>mora čuvati block hash</p>
</li>
<li><p>mora prepoznati reorg</p>
</li>
<li><p>mora poništiti prethodno projektovane događaje</p>
</li>
<li><p>mora odvojiti <code>included</code> i <code>finalized</code> status</p>
</li>
</ul>
<p>Na mreži sa približno jednom sekundom normalne finalnosti, finalized-only model je često sasvim razuman za poslovne aplikacije.</p>
<h2>Backend wallet i nonce management</h2>
<p>Ako backend sam šalje transakcije, na primer release, refund ili batch settlement, privatni ključ postaje deo produkcijske infrastrukture.</p>
<p>Najčešća greška nije kriptografija, već konkurentno upravljanje nonce vrednostima.</p>
<p>Dva workera mogu istovremeno pročitati isti transaction count i poslati transakcije sa istim nonceom. Jedna tada zamenjuje drugu ili ostaje zaglavljena iza nje.</p>
<p>Za svaki sender nalog treba imati serijalizovan red:</p>
<pre><code class="language-mermaid">flowchart LR
    A[API zahtevi] --&gt; Q[Durable queue]
    Q --&gt; N[Nonce manager]
    N --&gt; S[Signer]
    S --&gt; R[RPC]
    R --&gt; T[Receipt monitor]
</code></pre>
<p>Praktična pravila:</p>
<ul>
<li><p>Jedan logički writer upravlja jednim sender nalogom.</p>
</li>
<li><p>Nonce se rezerviše u transakciji baze ili durable queue sistemu.</p>
</li>
<li><p>Pri pokretanju se porede lokalni nonce i RPC <code>pending</code> transaction count.</p>
</li>
<li><p>Svaka poslovna operacija ima idempotency key.</p>
</li>
<li><p>Replacement transakcije koriste isti nonce.</p>
</li>
<li><p>Status <code>submitted</code> se ne tretira kao uspeh.</p>
</li>
<li><p>Signer nije dostupan običnom web procesu ako to nije neophodno.</p>
</li>
</ul>
<p>Za vrednije treasury naloge treba razmotriti multisig ili hardversko upravljanje ključevima umesto jednog hot private key-a.</p>
<h2>RPC sloj je deo bezbednosnog modela</h2>
<p>RPC provider vidi šta aplikacija čita i šalje. Može biti nedostupan, spor, pogrešno konfigurisan ili nekoliko blokova iza mreže.</p>
<p>Za jednostavan prototip dovoljan je jedan endpoint. Za produkciju vredi odvojiti:</p>
<ul>
<li><p>read RPC</p>
</li>
<li><p>write RPC</p>
</li>
<li><p>WebSocket RPC</p>
</li>
<li><p>archive RPC</p>
</li>
<li><p>fallback provider</p>
</li>
</ul>
<p>Read i write endpoint ne moraju biti isti. Poseban write endpoint olakšava kontrolu rate limita i ponašanje pri ponovnom slanju.</p>
<h3>Šta treba meriti</h3>
<p>RPC monitoring treba da prati:</p>
<ul>
<li><p>latency po metodi</p>
</li>
<li><p>procenat grešaka</p>
</li>
<li><p>timeout rate</p>
</li>
<li><p>aktuelni block number</p>
</li>
<li><p>finalized block number</p>
</li>
<li><p>razliku između latest i finalized head-a</p>
</li>
<li><p>razliku u visini između provajdera</p>
</li>
<li><p>uspešnost <code>eth_estimateGas</code></p>
</li>
<li><p>vreme do receipt-a</p>
</li>
<li><p>vreme od receipt-a do finalnosti</p>
</li>
</ul>
<p>HTTP 200 nije dovoljan health check. RPC može vratiti uspešan HTTP odgovor sa JSON-RPC greškom ili zastarelim podacima.</p>
<h3>Public endpoint nije produkcioni SLA</h3>
<p>Aktuelna dokumentacija za navedene javne BSC endpointe navodi ograničenje od 10.000 zahteva u pet minuta, uz već pomenuto ograničenje za <code>eth_getLogs</code>.</p>
<p>Čak i kada je to dovoljno po prosečnom prometu, burst saobraćaj može napraviti problem. Frontend polling koji se izvršava za svakog korisnika posebno lako pretvara mali broj korisnika u veliki broj RPC zahteva.</p>
<h2>Kada ima smisla pokrenuti sopstveni node</h2>
<p>Sopstveni node daje veću kontrolu nad:</p>
<ul>
<li><p>retention politikom</p>
</li>
<li><p>RPC metodama</p>
</li>
<li><p>log rangeovima</p>
</li>
<li><p>tracingom</p>
</li>
<li><p>rate limitima</p>
</li>
<li><p>privatnošću</p>
</li>
<li><p>zavisnošću od spoljnog provajdera</p>
</li>
</ul>
<p>Ali BSC node nije mali servis koji se povremeno pokrene na jeftinoj virtuelnoj mašini.</p>
<p>Aktuelne preporuke razlikuju fast, full i archive konfiguracije.</p>
<table>
<thead>
<tr>
<th>Tip noda</th>
<th>CPU</th>
<th>RAM</th>
<th>Storage</th>
</tr>
</thead>
<tbody><tr>
<td>Fast node</td>
<td>najmanje 16 jezgara</td>
<td>najmanje 32 GB</td>
<td>najmanje 2 TB SSD</td>
</tr>
<tr>
<td>Full node</td>
<td>najmanje 16 jezgara</td>
<td>najmanje 64 GB</td>
<td>najmanje 3 TB SSD</td>
</tr>
<tr>
<td>Archive node</td>
<td>najmanje 16 jezgara</td>
<td>do 128 GB po preporuci</td>
<td>10 TB SSD po opštoj preporuci</td>
</tr>
</tbody></table>
<p>Zahtevi za archive node zavise od klijenta, retention politike i stanja snapshotova. Posebna dokumentacija za BSC Erigon navodi drugačiji minimum, uključujući najmanje 64 GB RAM-a i 5 TB za archive režim.</p>
<p>To nije nužno kontradikcija. Radi se o različitim klijentima, bazama, načinima pruning-a i operativnim marginama.</p>
<p>Zvanična node maintenance dokumentacija posebno naglašava performanse diska: SSD ili NVMe, hiljade IOPS-a, visoku propusnost i nisku read latenciju. Full node storage treba redovno održavati pruning procedurama.</p>
<p>Za mnoge timove je racionalna hibridna postavka:</p>
<ul>
<li><p>komercijalni RPC kao primarni endpoint</p>
</li>
<li><p>drugi provider kao fallback</p>
</li>
<li><p>sopstveni pruned node za kritične read operacije</p>
</li>
<li><p>archive provider samo za istorijske upite i tracing</p>
</li>
</ul>
<h2>Deployment workflow koji ne zavisi od sreće</h2>
<p>Deployment na BSC-u tehnički liči na deployment na drugim EVM mrežama, ali dobar proces obuhvata više od <code>forge script --broadcast</code>.</p>
<h3>1. Pinujte compiler i zavisnosti</h3>
<p>Nemojte dozvoliti da CI automatski pređe na novu Solidity ili OpenZeppelin verziju bez pregleda promena.</p>
<p>Treba pinovati:</p>
<ul>
<li><p>Solidity verziju</p>
</li>
<li><p><code>evmVersion</code></p>
</li>
<li><p>OpenZeppelin Contracts verziju</p>
</li>
<li><p>Foundry ili Hardhat verziju</p>
</li>
<li><p>npm lockfile</p>
</li>
<li><p>deployment skripte</p>
</li>
</ul>
<p>BSC prati veliki broj Ethereum EIP-ova, ali novi Solidity default može početi da emituje instrukcije koje nisu aktivne na svakoj ciljnoj mreži, privatnom lancu ili lokalnom fork okruženju.</p>
<h3>2. Testirajte state machine, ne samo funkcije</h3>
<p>Za escrow nije dovoljno testirati happy path.</p>
<p>Treba obuhvatiti:</p>
<ul>
<li><p>dupli <code>orderId</code></p>
</li>
<li><p>zero amount</p>
</li>
<li><p>zero address</p>
</li>
<li><p>istekao deadline</p>
</li>
<li><p>release od neovlašćene adrese</p>
</li>
<li><p>refund pre isteka</p>
</li>
<li><p>refund posle releasea</p>
</li>
<li><p>token transfer koji vraća <code>false</code></p>
</li>
<li><p>token transfer koji revertuje</p>
</li>
<li><p>fee-on-transfer token</p>
</li>
<li><p>reentrancy pokušaj</p>
</li>
<li><p>pausiran ugovor, ako postoji pause mehanizam</p>
</li>
<li><p>granične timestamp vrednosti</p>
</li>
</ul>
<h3>3. Fork testirajte sa realnim tokenima</h3>
<p>Lokalni mock ERC-20 obično se ponaša previše uredno.</p>
<p>Fork test može proveriti interakciju sa stvarnim deploymentima i njihovim decimals, allowance i return-value ponašanjem.</p>
<p>I dalje treba izbegavati testove koji zavise od promenljivog stanja bez pinovanog broja bloka. U suprotnom test može danas proći, a sutra pasti bez promene koda.</p>
<h3>4. Deploy na BSC Testnet</h3>
<p>Testnet koristi chain ID 97 i tBNB za gas.</p>
<p>Na testnetu treba proveriti:</p>
<ul>
<li><p>wallet network switching</p>
</li>
<li><p>deployment skriptu</p>
</li>
<li><p>contract verification</p>
</li>
<li><p>approval workflow</p>
</li>
<li><p>event indexing</p>
</li>
<li><p>finalized block čitanje</p>
</li>
<li><p>restart indexera</p>
</li>
<li><p>RPC failover</p>
</li>
<li><p>backend nonce red</p>
</li>
<li><p>alerting</p>
</li>
</ul>
<h3>5. Proverite deployment bytecode</h3>
<p>Nakon deploymenta treba uporediti očekivani runtime bytecode sa kodom na adresi.</p>
<p>Samo postojanje transaction hash-a nije dovoljno. Deployment može završiti na pogrešnoj mreži, sa pogrešnim constructor argumentima ili drugačijim artifactom.</p>
<h3>6. Odvojite adrese po okruženju</h3>
<p>Konfiguracija može izgledati ovako:</p>
<pre><code class="language-ts">type ChainConfig = {
  chainId: number;
  escrow: `0x${string}`;
  paymentTokens: Record&lt;string, `0x${string}`&gt;;
};

export const chains: Record&lt;'bscTestnet' | 'bscMainnet', ChainConfig&gt; = {
  bscTestnet: {
    chainId: 97,
    escrow: process.env.BSC_TESTNET_ESCROW as `0x${string}`,
    paymentTokens: {},
  },
  bscMainnet: {
    chainId: 56,
    escrow: process.env.BSC_MAINNET_ESCROW as `0x${string}`,
    paymentTokens: {},
  },
};
</code></pre>
<p>Prazna allowlista je bezbednija od automatskog popunjavanja neproverenim adresama iz blog posta ili slučajnog repozitorijuma.</p>
<h2>Smart contract optimizacija nije samo smanjenje gasa</h2>
<p>Nizak gas price često dovodi do pogrešnog zaključka da optimizacija nije važna.</p>
<p>Gas ima još dve uloge:</p>
<ul>
<li><p>ograničava količinu posla u transakciji</p>
</li>
<li><p>utiče na skalabilnost čitave aplikacije i mreže</p>
</li>
</ul>
<h3>Storage writes su i dalje skupe operacije</h3>
<p>Čak i kada je BNB trošak nizak, svako trajno storage polje povećava state.</p>
<p>Umesto čuvanja kompletnog istorijata u ugovoru, često je dovoljno čuvati trenutno stanje i emitovati event za istoriju.</p>
<p>Loš obrazac:</p>
<pre><code class="language-solidity">mapping(address =&gt; Order[]) public allOrdersByUser;
</code></pre>
<p>Ovakva struktura može postati skupa za upis, komplikovana za paginaciju i nepraktična za pozivanje iz drugih ugovora.</p>
<p>Često je bolji obrazac:</p>
<pre><code class="language-solidity">mapping(bytes32 =&gt; Order) public orders;
</code></pre>
<p>Uz događaje:</p>
<pre><code class="language-solidity">event OrderCreated(bytes32 indexed orderId, address indexed buyer);
</code></pre>
<p>Liste i pretraga pripadaju indexeru.</p>
<h3>Ne iterirajte kroz neograničene skupove</h3>
<p>Funkcija koja pokušava da obradi sve korisnike ili sve porudžbine može postati neizvršiva.</p>
<p>Umesto toga koristite:</p>
<ul>
<li><p>korisnički inicirane claim funkcije</p>
</li>
<li><p>ograničene batcheve</p>
</li>
<li><p>Merkle claim mehanizme</p>
</li>
<li><p>cursor-based obradu</p>
</li>
<li><p>off-chain računanje sa on-chain proverom</p>
</li>
</ul>
<p>Nizak gas price ne uklanja block gas limit.</p>
<h3>Event nije zamena za stanje</h3>
<p>Eventovi su dobri za indeksiranje, ali ugovori ne mogu direktno čitati istorijske logove. Sve što buduća contract logika mora da proveri treba da postoji u stateu ili da bude dokazivo preko eksplicitnog mehanizma.</p>
<h2>MEV i transakcioni redosled</h2>
<p>Brži blokovi ne uklanjaju front-running i sandwich napade.</p>
<p>Ako aplikacija šalje DEX swap u javni mempool, drugi učesnici mogu pokušati da reaguju pre uključenja transakcije. BSC dokumentacija opisuje Proposer-Builder Separation i privatne RPC opcije koje smanjuju javno izlaganje transakcije pre uključivanja.</p>
<p>Privatni RPC ipak ne popravlja loše parametre.</p>
<p>Swap i dalje mora imati:</p>
<ul>
<li><p>razuman <code>amountOutMin</code></p>
</li>
<li><p>deadline</p>
</li>
<li><p>proverenu router adresu</p>
</li>
<li><p>ograničen allowance</p>
</li>
<li><p>zaštitu od pogrešnog token path-a</p>
</li>
</ul>
<p>Za escrow <code>createOrder</code> redosled uglavnom nije problem ako je <code>orderId</code> vezan za kupca i parametre. Ako bilo ko može prvi da registruje proizvoljan <code>orderId</code>, napadač može front-runovati korisnika i zauzeti identifikator.</p>
<p>Rešenje nije „brža transakcija”, već domain separation i validacija identiteta pošiljaoca.</p>
<h2>Upgradeable ili immutable ugovor</h2>
<p>BSC ne menja osnovni trade-off proxy arhitekture.</p>
<p>Upgradeable ugovor omogućava:</p>
<ul>
<li><p>ispravke</p>
</li>
<li><p>nove funkcije</p>
</li>
<li><p>promenu poslovnih pravila</p>
</li>
<li><p>reakciju na promene integrisanih protokola</p>
</li>
</ul>
<p>Istovremeno uvodi:</p>
<ul>
<li><p>admin key rizik</p>
</li>
<li><p>storage layout rizik</p>
</li>
<li><p>dodatnu složenost</p>
</li>
<li><p>mogućnost promene pravila nakon što korisnik uplati sredstva</p>
</li>
<li><p>potrebu za transparentnom governance procedurom</p>
</li>
</ul>
<p>Za escrow sa kratkim životnim ciklusom može biti jednostavnije deployovati immutable verziju i kasnije preusmeriti frontend na novi deployment. Stare porudžbine ostaju na starom ugovoru dok se ne zatvore.</p>
<p>Ako se koristi proxy, korisnik mora moći da sazna:</p>
<ul>
<li><p>ko kontroliše upgrade</p>
</li>
<li><p>da li postoji timelock</p>
</li>
<li><p>da li postoji pause</p>
</li>
<li><p>ko može menjati allowlistu tokena</p>
</li>
<li><p>da li admin može preusmeriti sredstva</p>
</li>
</ul>
<p>Niži gas nije razlog da se preskoči threat model.</p>
<h2>BSC ili opBNB</h2>
<p>BNB ekosistem sadrži i opBNB, Layer 2 mrežu koja koristi BSC kao deo svoje L1 infrastrukture.</p>
<p>Izbor nije samo pitanje „koja mreža je jeftinija”.</p>
<p>BSC ima smisla kada su važni:</p>
<ul>
<li><p>direktna BSC likvidnost</p>
</li>
<li><p>postojeći BSC korisnici i tokeni</p>
</li>
<li><p>jednostavniji L1 settlement model</p>
</li>
<li><p>kratka finalnost</p>
</li>
<li><p>standardni EVM stack</p>
</li>
<li><p>troškovi koje BSC već čini prihvatljivim</p>
</li>
</ul>
<p>opBNB može biti bolji kada aplikacija zahteva:</p>
<ul>
<li><p>još jeftinije mikrotransakcije</p>
</li>
<li><p>veći broj čestih korisničkih akcija</p>
</li>
<li><p>gaming ili social workload</p>
</li>
<li><p>L2 arhitekturu kao prihvatljiv trade-off</p>
</li>
</ul>
<p>Pri prelasku na L2 pojavljuju se nova pitanja:</p>
<ul>
<li><p>sequencer model</p>
</li>
<li><p>L1 data trošak</p>
</li>
<li><p>bridge depoziti i povlačenja</p>
</li>
<li><p>L2 finalnost naspram L1 settlementa</p>
</li>
<li><p>dostupnost tokena na L2</p>
</li>
<li><p>drugačiji chain ID i RPC</p>
</li>
</ul>
<p>BSC Mainnet ima chain ID 56, dok opBNB Mainnet koristi chain ID 204. To su dve različite mreže, iako obe koriste BNB kao native asset.</p>
<h2>Glavni trade-off: performanse za uži konsenzus</h2>
<p>Najvažniji arhitektonski trade-off BSC-a nije Solidity, gas niti izbor biblioteke. To je konsenzus.</p>
<p>Ograničen validator set omogućava:</p>
<ul>
<li><p>bržu propagaciju</p>
</li>
<li><p>kratak block interval</p>
</li>
<li><p>kratku finalnost</p>
</li>
<li><p>jednostavniju koordinaciju validatora</p>
</li>
<li><p>niže fee zahteve</p>
</li>
</ul>
<p>Istovremeno znači:</p>
<ul>
<li><p>manji broj direktnih konsenzusnih učesnika</p>
</li>
<li><p>veći značaj validator infrastrukture</p>
</li>
<li><p>drugačiji censorship-resistance profil</p>
</li>
<li><p>veće oslanjanje na staking i governance model mreže</p>
</li>
</ul>
<p>Za sistem nagrađivanja, marketplace, gaming ekonomiju, loyalty program ili settlement manjih iznosa, ovaj kompromis može biti sasvim prihvatljiv.</p>
<p>Za sistem čiji je jedini cilj maksimalna neutralnost i otpornost na koordinisanu cenzuru, developer treba eksplicitno da uporedi BSC sa drugim L1 i L2 opcijama.</p>
<p>„EVM kompatibilno” nije bezbednosni model.</p>
<h2>Šta BSC ne rešava umesto aplikacije</h2>
<p>Mreža može brzo i jeftino izvršiti bytecode. Ne može utvrditi da li je poslovna logika ispravna.</p>
<p>BSC ne rešava automatski:</p>
<ul>
<li><p>bugove u pametnom ugovoru</p>
</li>
<li><p>kompromitovan admin ključ</p>
</li>
<li><p>pogrešnu token adresu</p>
</li>
<li><p>lažan oracle podatak</p>
</li>
<li><p>nestabilan bridge</p>
</li>
<li><p>unlimited approval rizik</p>
</li>
<li><p>izgubljen private key</p>
</li>
<li><p>duplu obradu eventa</p>
</li>
<li><p>pogrešno nonce upravljanje</p>
</li>
<li><p>RPC koji zaostaje</p>
</li>
<li><p>neusklađenost baze i on-chain stanja</p>
</li>
<li><p>pravne obaveze aplikacije</p>
</li>
</ul>
<p>Niži gas može čak povećati površinu za spam i automatizovane napade jer je eksperimentisanje napadaču jeftinije.</p>
<p>Rate limit, signature nonce, idempotency key i access control ostaju neophodni.</p>
<h2>Minimalna produkcijska kontrolna lista</h2>
<p>Pre mainnet deploymenta vredi proveriti sledeće.</p>
<h3>Ugovor</h3>
<ul>
<li><p>State machine je eksplicitno dokumentovan.</p>
</li>
<li><p>Postoje testovi za svaku nevalidnu tranziciju.</p>
</li>
<li><p>BEP-20 transferi koriste <code>SafeERC20</code>.</p>
</li>
<li><p>Podržani tokeni su na allowlisti.</p>
</li>
<li><p>Ne postoji neograničena petlja.</p>
</li>
<li><p>Eksterni pozivi dolaze nakon promene internog stanja.</p>
</li>
<li><p>Admin prava su minimalna.</p>
</li>
<li><p>Upgrade model je dokumentovan.</p>
</li>
<li><p>Emituju se dovoljni događaji za rekonstrukciju stanja.</p>
</li>
</ul>
<h3>Deployment</h3>
<ul>
<li><p>Chain ID se proverava pre broadcasta.</p>
</li>
<li><p>Compiler i dependency verzije su pinovane.</p>
</li>
<li><p>Constructor i initializer parametri se proveravaju.</p>
</li>
<li><p>Runtime bytecode se validira.</p>
</li>
<li><p>Izvorni kod je verifikovan na exploreru.</p>
</li>
<li><p>Deployment artifacti i adrese čuvaju se u version controlu.</p>
</li>
</ul>
<h3>Frontend</h3>
<ul>
<li><p>Prikazuje se tačna mreža.</p>
</li>
<li><p>Tokeni se identifikuju adresom, ne simbolom.</p>
</li>
<li><p>Iznosi se računaju prema <code>decimals()</code>.</p>
</li>
<li><p>Transakcija se simulira pre slanja.</p>
</li>
<li><p>Razlikuju se pending, included, finalized i reverted.</p>
</li>
<li><p>Approval iznos je vidljiv korisniku.</p>
</li>
</ul>
<h3>Backend</h3>
<ul>
<li><p>Ne veruje podacima koje je poslao frontend bez on-chain provere.</p>
</li>
<li><p>Event obrada je idempotentna.</p>
</li>
<li><p>Cursor se čuva trajno.</p>
</li>
<li><p>WebSocket reconnect pokreće backfill.</p>
</li>
<li><p>Finansijske odluke koriste finalized blokove.</p>
</li>
<li><p>Backend sender ima serijalizovan nonce red.</p>
</li>
<li><p>Privatni ključevi nisu u source codeu ili logovima.</p>
</li>
</ul>
<h3>Infrastruktura</h3>
<ul>
<li><p>Postoji najmanje jedan fallback RPC.</p>
</li>
<li><p>Mere se latest i finalized head.</p>
</li>
<li><p>Alert postoji za RPC lag i indexer lag.</p>
</li>
<li><p>Poznato je da li provider podržava <code>eth_getLogs</code>, tracing i archive state.</p>
</li>
<li><p>Rate limit je testiran pod burst opterećenjem.</p>
</li>
<li><p>Incident procedura obuhvata pause ili migraciju ako ih arhitektura podržava.</p>
</li>
</ul>
<h2>Kada je BNB Smart Chain razuman izbor</h2>
<p>BNB Smart Chain je posebno zanimljiv developeru koji želi EVM okruženje, ali mu Ethereum L1 troškovi ili latencija nisu prihvatljivi.</p>
<p>Dobar je kandidat kada aplikacija ima:</p>
<ul>
<li><p>mnogo contract interakcija srednje složenosti</p>
</li>
<li><p>tokene ili likvidnost koji već postoje na BSC-u</p>
</li>
<li><p>korisnike koji već koriste BNB i BSC wallete</p>
</li>
<li><p>potrebu za kratkim vremenom do finalnosti</p>
</li>
<li><p>backend koji može pravilno indeksirati događaje</p>
</li>
<li><p>bezbednosni model koji prihvata PoSA validator trade-off</p>
</li>
</ul>
<p>Manje je ubedljiv izbor kada:</p>
<ul>
<li><p>aplikacija nema stvaran razlog da koristi blockchain</p>
</li>
<li><p>svi podaci i prava zavise od jednog centralnog backend servera</p>
</li>
<li><p>aplikacija zahteva neograničeno jeftine mikrotransakcije</p>
</li>
<li><p>tim ne može da održava key management i RPC monitoring</p>
</li>
<li><p>najvažniji zahtev je maksimalno širok validator set</p>
</li>
<li><p>poslovna logika zahteva podatke koje ugovor ne može pouzdano dobiti</p>
</li>
</ul>
<p>Najbolji prvi eksperiment nije deployment novog tokena. Korisnije je napraviti mali ugovor sa jasnim state machineom, nekoliko događaja i kompletnim backend tokom od simulacije do finalnosti.</p>
<p>Tada postaje vidljivo gde BSC zaista pomaže: ne u tome što menja način pisanja Solidityja, već u tome što standardni EVM workflow čini praktičnim za veći broj transakcija.</p>
<p>Istovremeno postaje vidljivo gde nema prečice. Pouzdan indexer, ispravan nonce management, proverene token adrese, finality-aware backend i eksplicitan bezbednosni model ostaju odgovornost aplikacije.</p>
<h3><em><strong>Ovaj članak je sponzorisan od strane</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a><em><strong>. Na</strong></em> <a href="http://Volet.com"><em><strong>Volet.com</strong></em></a> <em><strong>možete kupiti i prodati BNB. Više informacija nalazi se na stranici</strong></em> <a href="https://volet.srbija.workers.dev/"><em><strong>Volet za korisnike iz Srbije</strong></em></a><em><strong>. Za otvaranje naloga koristi</strong></em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em><strong>Volet referral link</strong></em></a><em><strong>. Link je referral link autora članka.</strong></em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://docs.bnbchain.org/bnb-smart-chain/introduction/">BNB Smart Chain: Introduction</a></p>
</li>
<li><p><a href="https://docs.bnbchain.org/bnb-smart-chain/developers/json_rpc/json-rpc-endpoint/">BNB Smart Chain: JSON-RPC endpoints</a></p>
</li>
<li><p><a href="https://github.com/bnb-chain/BEPs">BNB Evolution Proposals</a></p>
</li>
<li><p><a href="https://docs.bnbchain.org/bnb-smart-chain/validator/overview/">BSC Validator Overview</a></p>
</li>
<li><p><a href="https://viem.sh/docs/actions/public/getBlock">Viem: getBlock</a></p>
</li>
<li><p><a href="https://docs.bnbchain.org/bnb-opbnb/core-concepts/gas-and-fees/">BNB Chain: Gas and Fees</a></p>
</li>
<li><p><a href="https://docs.openzeppelin.com/contracts/5.x/api/token/erc20">OpenZeppelin Contracts: SafeERC20</a></p>
</li>
<li><p><a href="https://github.com/bnb-chain/BEPs/blob/master/BEPs/BEP20.md">BEP-20: Tokens on BNB Smart Chain</a></p>
</li>
<li><p><a href="https://docs.bnbchain.org/bnb-smart-chain/developers/node_operators/node_best_practices/">BSC Node Configuration: Best Practices</a></p>
</li>
<li><p><a href="https://docs.bnbchain.org/bnb-smart-chain/developers/node_operators/archive_node/">Running a BSC Erigon Archive Node</a></p>
</li>
<li><p><a href="https://docs.bnbchain.org/bnb-smart-chain/developers/node_operators/node_maintenance/">BSC Node Maintenance</a></p>
</li>
<li><p><a href="https://docs.bnbchain.org/bnb-smart-chain/validator/mev/user-guide/">BSC MEV User Guide</a></p>
</li>
<li><p><a href="https://docs.bnbchain.org/bnb-opbnb/get-started/network-info/">opBNB Network Information</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/bnb-smart-chain-is-more-than-just-a-cheaper-ethereum-512g">BNB Smart Chain Is More Than Just a Cheaper Ethereum</a></p>
]]></content:encoded></item><item><title><![CDATA[Tron za developere: TVM, resursi i produkcioni sistemi]]></title><description><![CDATA[Tron se često svodi na jednu rečenicu: mreža preko koje korisnici šalju USDT. Za developera je zanimljiviji tehnički razlog zbog kojeg je do toga došlo.
To je samostalan Layer 1 blockchain sa približn]]></description><link>https://kripto-pocetnica.hashnode.dev/tron-za-developere-tvm-resursi-i-produkcioni-sistemi</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/tron-za-developere-tvm-resursi-i-produkcioni-sistemi</guid><category><![CDATA[TRX]]></category><category><![CDATA[tron]]></category><category><![CDATA[Tron blockchain node]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Blockchain technology]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[crypto]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Fri, 18 Sep 2026 23:17:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/9123a24b-b757-40a2-af11-e72c174db492.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Tron se često svodi na jednu rečenicu: mreža preko koje korisnici šalju USDT. Za developera je zanimljiviji tehnički razlog zbog kojeg je do toga došlo.</p>
<p>To je samostalan Layer 1 blockchain sa približno trominutnim, ne, trosekundnim intervalom između blokova, Delegated Proof of Stake konsenzusom, Solidity pametnim ugovorima i modelom troškova zasnovanim na resursima Energy i Bandwidth. Izgleda dovoljno slično Ethereumu da se postojeće znanje može preneti, ali se ponaša dovoljno drugačije da naivna EVM integracija lako napravi produkcione probleme.</p>
<p>Najčešće greške nisu u Solidity kodu. Nastaju u backendu koji broadcast odgovor smatra konačnom potvrdom, u pogrešnom tretiranju Base58 i hex adresa, u lošem <code>feeLimit</code> proračunu, u ignorisanju Energy modela i u oslanjanju na indeksirani API kao da predstavlja konsenzusno stanje mreže.</p>
<p>Ovaj članak posmatra Tron iz perspektive developera koji želi da napravi wallet, sistem za depozite i isplate, payment gateway ili servis koji radi sa TRC-20 tokenima.</p>
<h2>Šta su Tron i TRX</h2>
<p>Tron je javni blockchain koji održava sopstveno stanje, proizvodi blokove, izvršava pametne ugovore i ima sopstveni konsenzus. Nije Ethereum Layer 2 i ne nasleđuje bezbednost drugog lanca.</p>
<p>Njegov nativni token je TRX. Koristi se za:</p>
<ul>
<li><p>prenos vrednosti</p>
</li>
<li><p>plaćanje mrežnih troškova kada nalog nema dovoljno resursa</p>
</li>
<li><p>staking za Energy ili Bandwidth</p>
</li>
<li><p>dobijanje glasačke moći</p>
</li>
<li><p>glasanje za Super Representatives</p>
</li>
<li><p>delegiranje resursa drugim adresama</p>
</li>
</ul>
<p>Najmanja jedinica TRX-a zove se <code>sun</code>:</p>
<pre><code class="language-text">1 TRX = 1.000.000 sun
</code></pre>
<p>Naziv se u dokumentaciji piše malim slovom. To je bitno jer <code>SUN</code> može označavati drugi token iz Tron ekosistema.</p>
<p>Gotovo svi iznosi u node API-jima, sirovim transakcijama i parametrima kao što je <code>feeLimit</code> izraženi su u <code>sun</code>, ne u TRX. Ako API-ju proslediš <code>1000000</code>, on to ne tumači kao milion TRX već kao 1 TRX.</p>
<p>Isto pravilo ne važi automatski za TRC-20 tokene. Svaki ugovor definiše sopstveni broj decimala. USDT na Tronu koristi šest decimala, ali generička integracija treba da pročita <code>decimals()</code> iz ugovora ili pouzdane konfiguracije tokena.</p>
<h2>Zašto bi developer koristio Tron</h2>
<p>Tron ima smisla kada proizvod ima veliki broj relativno jednostavnih transfera i kada su važni:</p>
<ul>
<li><p>brzo uključivanje transakcije u blok</p>
</li>
<li><p>široka podrška za TRC-20 tokene</p>
</li>
<li><p>mogućnost subvencionisanja korisničkih transakcija</p>
</li>
<li><p>predvidljiviji troškovni model od aukcijskog gas tržišta</p>
</li>
<li><p>ponovna upotreba Solidity znanja</p>
</li>
<li><p>delegacija mrežnih resursa između naloga</p>
</li>
<li><p>dobra podrška među walletima, berzama i payment servisima</p>
</li>
</ul>
<p>Tipični projekti su:</p>
<ul>
<li><p>custodial i non-custodial walleti</p>
</li>
<li><p>payment gateway sistemi</p>
</li>
<li><p>merchant checkout</p>
</li>
<li><p>payout i payroll servisi</p>
</li>
<li><p>sistemi za doznake</p>
</li>
<li><p>berze i brokerske platforme</p>
</li>
<li><p>treasury automatizacija</p>
</li>
<li><p>aplikacije sa čestim stablecoin transferima</p>
</li>
<li><p>servisi koji žele da korisniku pokriju mrežni trošak</p>
</li>
</ul>
<p>Tron je manje očigledan izbor kada proizvod zavisi od široke EVM composability mreže, specifične Ethereum infrastrukture, rollup bezbednosnog modela ili velikog broja biblioteka koje očekuju standardni Ethereum JSON-RPC.</p>
<p>TVM kompatibilnost smanjuje cenu prelaska, ali ne pretvara Tron u još jednu Ethereum mrežu.</p>
<h2>Konsenzus i šta znači potvrđena transakcija</h2>
<p>Tron koristi Delegated Proof of Stake. Aktivni skup čini 27 Super Representatives, skraćeno SR, koji proizvode blokove po unapred određenom rasporedu. Jedan slot traje približno tri sekunde .</p>
<p>Brzo pojavljivanje transakcije u bloku nije isto što i finalnost.</p>
<p>Blok se smatra solidifikovanim kada najmanje 19 od 27 aktivnih SR-ova proizvede blok na toj ili većoj visini. U zdravim mrežnim uslovima solidifikacija obično traje oko jednog minuta .</p>
<p>To uvodi najmanje četiri stanja koja aplikacija mora razlikovati:</p>
<ol>
<li><p>Transakcija je prihvaćena za broadcast.</p>
</li>
<li><p>Transakcija je pronađena na FullNode čvoru.</p>
</li>
<li><p>Transakcija je izvršena i postoji receipt.</p>
</li>
<li><p>Transakcija je deo solidifikovanog bloka.</p>
</li>
</ol>
<p>Ova razlika je posebno važna za payment sisteme.</p>
<p>Odgovor:</p>
<pre><code class="language-json">{
  "result": true,
  "txid": "..."
}
</code></pre>
<p>ne znači da je uplata uspela. Znači samo da je čvor prihvatio potpisanu transakciju i pokušao da je prosledi u mempool.</p>
<p>Pametni ugovor posle toga može da uradi <code>revert</code>, može da ostane bez Energyja ili transakcija može da ne bude uključena pre isteka. Za konačan rezultat potrebno je pročitati execution receipt, a za finansijsko poravnanje i velike iznose proveriti solidifikovano stanje .</p>
<p>Praktičan model statusa izgleda ovako:</p>
<pre><code class="language-text">CREATED
  -&gt; SIGNED
  -&gt; BROADCAST
  -&gt; INCLUDED
  -&gt; EXECUTED_SUCCESS | EXECUTED_FAILED
  -&gt; SOLIDIFIED
</code></pre>
<p>Treba sačuvati i neodređeno stanje:</p>
<pre><code class="language-text">UNKNOWN
</code></pre>
<p>Timeout RPC poziva nije dokaz neuspeha. Ako backend posle broadcasta izgubi vezu sa čvorom, ista transakcija je možda već ušla u mrežu. Pre rekonstrukcije i ponovnog potpisivanja prvo treba proveriti originalni <code>txID</code>.</p>
<h2>Kako transakcija prolazi kroz mrežu</h2>
<p>Svaka operacija koja menja stanje prolazi kroz isti osnovni tok:</p>
<ol>
<li><p>Klijent konstruiše nepotpisanu transakciju.</p>
</li>
<li><p>Transakcija dobija TAPOS referencu na nedavni blok.</p>
</li>
<li><p>Vlasnik naloga potpisuje <code>raw_data</code>.</p>
</li>
<li><p>Potpisana transakcija se šalje FullNode čvoru.</p>
</li>
<li><p>Čvor proverava potpis, format, resurse i TAPOS referencu.</p>
</li>
<li><p>Trenutni SR uključuje transakciju u blok.</p>
</li>
<li><p>TVM izvršava pametni ugovor, ako je u pitanju ugovorni poziv.</p>
</li>
<li><p>Nastaju receipt, događaji i promene stanja.</p>
</li>
<li><p>Blok se kasnije solidifikuje.</p>
</li>
</ol>
<p>TAPOS, odnosno Transaction as Proof of Stake, vezuje transakciju za nedavni blok. Polja <code>ref_block_bytes</code> i <code>ref_block_hash</code> sprečavaju da stara transakcija bude beskonačno validna ili da se jednostavno reprodukuje na nekom drugom forku .</p>
<p>Transakcija ima i vreme isteka. Ako istekne, nije dovoljno ponovo broadcastovati staro telo. Potrebno je izgraditi novu transakciju sa novom referencom i expiration vremenom, a zatim je ponovo potpisati. Nova konstrukcija proizvodi novi <code>txID</code>.</p>
<p>Ponovni broadcast identične, još važeće i već potpisane transakcije je bezbedniji od nasumične rekonstrukcije, jer Tron deduplikuje transakcije prema <code>txID</code>.</p>
<h2>TVM nije samo preimenovani EVM</h2>
<p>Tron Virtual Machine je stack-based virtuelna mašina kompatibilna sa EVM bytecodeom. Solidity kod prolazi kroz kompajler i postaje niz instrukcija koje TVM deterministički izvršava na svakom čvoru .</p>
<p>TVM koristi operand stack dubine 1024, sa 256-bitnim vrednostima, što odgovara EVM modelu. Dubina ugneždenih contract-to-contract poziva ograničena je na 64 .</p>
<p>Za većinu standardnih ugovora mentalni model je poznat:</p>
<ul>
<li><p><code>msg.sender</code> je pozivalac</p>
</li>
<li><p><code>msg.value</code> predstavlja poslati TRX</p>
</li>
<li><p>storage je trajan</p>
</li>
<li><p>events se zapisuju u logove</p>
</li>
<li><p><code>view</code> i <code>pure</code> funkcije mogu da se simuliraju bez transakcije</p>
</li>
<li><p>state-changing funkcije zahtevaju transakciju i potpis</p>
</li>
<li><p>ABI kodiranje uglavnom odgovara EVM pravilima</p>
</li>
</ul>
<p>Ipak, kompatibilnost nije identitet.</p>
<p>Razlike koje zahtevaju proveru uključuju:</p>
<ul>
<li><p>format adresa van lanca</p>
</li>
<li><p>prefiks adrese u node API-jima</p>
</li>
<li><p><code>CREATE2</code> proračun adresa</p>
</li>
<li><p>pojedina opcode ponašanja</p>
</li>
<li><p>hardfork funkcije koje se aktiviraju parametrima mreže</p>
</li>
<li><p>TRX i <code>sun</code> umesto ETH i <code>wei</code></p>
</li>
<li><p>Energy i Bandwidth umesto jednog gas resursa</p>
</li>
<li><p>TRC-10 podršku na nivou protokola</p>
</li>
<li><p>različite API površine i confirmation semantiku</p>
</li>
<li><p>drugačiji razvojni i deployment alatni lanac</p>
</li>
</ul>
<p>TRON može postepeno uključivati opcode podršku povezanu sa Ethereum hardforkovima. Konkretne funkcije mogu biti uključene chain parametrima kao što su podrška za Constantinople, Istanbul, London, Shanghai ili Cancun funkcionalnosti. Pre upotrebe novijih Solidity funkcija treba proveriti podršku mreže na koju se ugovor postavlja .</p>
<p>Ugovor koji se kompajlira nije nužno ugovor koji se isto ponaša.</p>
<p>Ako portuješ običan token, escrow ili multisig logiku, migracija može biti mala. Ako koristiš inline assembly, factory ugovore, determinističke adrese, napredne proxy obrasce ili pretpostavke o tačnim opcode troškovima, migraciju treba tretirati kao novi deployment target i ponoviti kompletan audit.</p>
<h2>Adrese: tri oblika iste vrednosti</h2>
<p>Tron adrese će biti prvi detalj koji prekida generički EVM kod.</p>
<p>Korisnička adresa obično izgleda ovako:</p>
<pre><code class="language-text">T...
</code></pre>
<p>To je Base58Check reprezentacija pogodna za prikaz, kopiranje i validaciju.</p>
<p>Node API može koristiti hex reprezentaciju sa bajtom mrežnog prefiksa <code>41</code>:</p>
<pre><code class="language-text">41 + 20 bajtova adrese
</code></pre>
<p>Unutar Solidity ugovora adresa je i dalje standardna 20-bajtna vrednost. Prefiks <code>41</code> nije deo Solidity <code>address</code> vrednosti.</p>
<p>Problem postaje vidljiv kada se adresa pakuje u <code>bytes</code>, ručno ABI kodira ili šalje ka bridge ugovoru. U takvim slučajevima treba koristiti 20-bajtni oblik koji očekuje ABI, a ne Base58 string ili 21-bajtni oblik sa <code>41</code> prefiksom .</p>
<p>TronWeb pruža pomoćne funkcije:</p>
<pre><code class="language-js">const hex = TronWeb.address.toHex(base58Address);
const base58 = TronWeb.address.fromHex(hexAddress);
</code></pre>
<p>Validaciju treba raditi pre konstrukcije transakcije:</p>
<pre><code class="language-js">if (!TronWeb.isAddress(recipient)) {
  throw new Error('Neispravna TRON adresa');
}
</code></pre>
<p>Nemoj adresu validirati samo proverom da počinje slovom T. Base58Check uključuje checksum, a SDK već zna kako da ga proveri.</p>
<h2>Energy i Bandwidth: stvarni model troškova</h2>
<p>Na Ethereumu developer najčešće razmišlja o gas jedinicama i gas ceni. Na Tronu postoje dva odvojena mrežna resursa.</p>
<h3>Bandwidth</h3>
<p>Bandwidth predstavlja veličinu transakcije u bajtovima. Troši ga svaka transakcija, uključujući:</p>
<ul>
<li><p>TRX transfer</p>
</li>
<li><p>TRC-10 transfer</p>
</li>
<li><p>TRC-20 transfer</p>
</li>
<li><p>contract call</p>
</li>
<li><p>staking</p>
</li>
<li><p>delegiranje resursa</p>
</li>
<li><p>glasanje</p>
</li>
</ul>
<p>Nalog dobija ograničenu besplatnu dnevnu alokaciju Bandwidtha. Dodatni Bandwidth dobija se stakeovanjem TRX-a. Ako nema dovoljno raspoloživog Bandwidtha, mreža može sagoreti TRX za nepokriveni deo .</p>
<h3>Energy</h3>
<p>Energy predstavlja računarski rad potreban za izvršavanje TVM instrukcija.</p>
<p>Energy troše:</p>
<ul>
<li><p>TRC-20 transferi</p>
</li>
<li><p>pozivi DeFi ugovora</p>
</li>
<li><p>token approvals</p>
</li>
<li><p>mint i burn operacije</p>
</li>
<li><p>NFT transferi</p>
</li>
<li><p>deployment pametnih ugovora</p>
</li>
<li><p>bilo koja druga state-changing contract funkcija</p>
</li>
</ul>
<p>Energy se dobija stakeovanjem TRX-a, delegacijom resursa ili sagorevanjem TRX-a kao fallback mehanizmom.</p>
<p>Važna posledica je da contract call može da ne sagori nijedan TRX ako nalog ima dovoljno Energyja i Bandwidtha. To ne znači da je izvršenje besplatno. Trošak postoji u obliku zaključanog kapitala, delegiranih resursa ili troška treće strane koja je obezbedila Energy.</p>
<h2>Stake 2.0 kao infrastrukturni mehanizam</h2>
<p>Stake 2.0 omogućava zaključavanje TRX-a za jedan od dva resursa:</p>
<ul>
<li><p><code>ENERGY</code></p>
</li>
<li><p><code>BANDWIDTH</code></p>
</li>
</ul>
<p>Staking daje i TRON Power koji se koristi za glasanje.</p>
<p>Staked resursi nisu trajno potrošeni kada se izvrši transakcija. Raspoloživi Energy i Bandwidth smanjuju se korišćenjem, a zatim se obnavljaju tokom vremena. To je razlog zbog kojeg staking ima smisla za wallet ili payout servis sa kontinuiranim saobraćajem.</p>
<p>Životni ciklus nije samo <code>stake</code> i <code>unstake</code>. Postoji eksplicitni tok:</p>
<pre><code class="language-text">Stake -&gt; korišćenje resursa -&gt; Unstake -&gt; period čekanja -&gt; Withdraw
</code></pre>
<p>Aktuelni model uključuje odloženo povlačenje nakon unstake operacije. Dokumentacija navodi četrnaestodnevni period, ali pošto je to chain parametar, produkcioni sistem treba da čita trenutnu vrednost umesto da je zauvek hardkoduje .</p>
<p>Resursi se mogu delegirati drugom nalogu bez prenosa vlasništva nad stakeovanim TRX-om. To otvara nekoliko korisnih arhitektura:</p>
<ul>
<li><p>centralni treasury stakeuje TRX i delegira Energy hot walletima</p>
</li>
<li><p>DApp operator pokriva prvu korisničku transakciju</p>
</li>
<li><p>različiti payout walleti dobijaju dnevne Energy budžete</p>
</li>
<li><p>resursi se povlače sa neaktivnih naloga i preusmeravaju aktivnim</p>
</li>
<li><p>korisnik potpisuje transakciju, dok operator obezbeđuje resurse</p>
</li>
</ul>
<p>Delegacija Energyja ne daje primaocu pravo da troši TRX koji je stakeovan. Ona prenosi samo pravo korišćenja mrežnog resursa.</p>
<h2>Dynamic Energy model</h2>
<p>Potrošnja Energyja nije uvek samo statičan zbir troškova TVM instrukcija.</p>
<p>Tron koristi Dynamic Energy Model koji može povećati Energy potrošnju veoma aktivnih pametnih ugovora. Cilj je da mali broj popularnih ugovora ne zauzme nesrazmeran deo izvršnog kapaciteta mreže.</p>
<p>Za contract call zato treba razlikovati:</p>
<ul>
<li><p>osnovnu Energy potrošnju</p>
</li>
<li><p>dinamički faktor konkretnog ugovora</p>
</li>
<li><p>ukupnu očekivanu potrošnju</p>
</li>
<li><p>raspoloživi Energy pozivaoca</p>
</li>
<li><p>deo koji može pokriti deployer ugovora</p>
</li>
<li><p>deo koji će biti pokriven burnom TRX-a</p>
</li>
</ul>
<p>Ovo je posebno relevantno za popularne stablecoin i DeFi ugovore. Broj koji je bio tačan u testu prošle nedelje nije ugovorna garancija za sledeću nedelju.</p>
<p>Pre slanja treba proceniti poziv na istom contract addressu, sa istim parametrima i što sličnijim stanjem.</p>
<h2>Koliko korišćenje Trona košta</h2>
<p>Najprecizniji odgovor je: od nula sagorelih TRX-a do iznosa koji odgovara nepokrivenoj Energy i Bandwidth potrošnji.</p>
<p>Ako su resursi potpuno pokriveni stakingom ili delegacijom, transakcija može izvršiti ugovor bez sagorevanja TRX-a.</p>
<p>Ako resursi nisu pokriveni, pojednostavljen proračun Energy dela izgleda ovako:</p>
<pre><code class="language-text">burnedTRX =
  missingEnergy * energyFeeSun / 1.000.000
</code></pre>
<p>Ako simulacija, na primer, proceni 65.000 Energy, nalog nema nijednu raspoloživu jedinicu Energyja, a trenutni chain parametar iznosi 100 sun po jedinici, račun bi bio:</p>
<pre><code class="language-text">65.000 * 100 / 1.000.000 = 6,5 TRX
</code></pre>
<p>Ovo je primer proračuna, a ne garantovana cena TRC-20 transfera. Stvarna Energy potrošnja zavisi od ugovora, trenutnog stanja, primaoca, dynamic Energy faktora i putanje izvršenja.</p>
<p>Promena predložena 2025. godine smanjila je cenu jedne Energy jedinice sa 210 na 100 sun, sa planiranim stupanjem na snagu 29. avgusta 2025. godine. Kasnije analize predloga koriste 100 sun kao novu osnovu . Ipak, Energy cena je upravljivi chain parametar i treba je proveriti neposredno pre finansijskog planiranja.</p>
<p>Chain parametri mogu se dobiti preko:</p>
<pre><code class="language-text">POST /wallet/getchainparameters
</code></pre>
<p>U odgovoru parametar treba pronaći po <code>key</code>, ne po poziciji u nizu.</p>
<p>Cena izražena u fiat valuti nije stabilna jer zavisi i od tržišne cene TRX-a. Backend zato treba da vodi najmanje tri odvojene metrike:</p>
<ul>
<li><p>Energy potrošen po tipu operacije</p>
</li>
<li><p>TRX stvarno sagorevan po transakciji</p>
</li>
<li><p>fiat protivvrednost u trenutku izvršenja</p>
</li>
</ul>
<p>To omogućava da razlikuješ povećanu složenost ugovora od promene cene TRX-a.</p>
<h2>FeeLimit nije procena naknade</h2>
<p><code>feeLimit</code> je jedna od najčešće pogrešno shvaćenih Tron vrednosti.</p>
<p>To nije obećanje da će transakcija potrošiti navedeni iznos. To je gornja granica Energy troška koji je pozivalac spreman da pokrije za taj contract call ili deployment.</p>
<p>Vrednost se izražava u <code>sun</code>:</p>
<pre><code class="language-js">const feeLimit = 100_000_000; // 100 TRX
</code></pre>
<p>Transakcija koja realno potroši manje neće automatski potrošiti svih 100 TRX. Limit samo ograničava maksimalnu izloženost i učestvuje u određivanju ukupnog Energy limita izvršenja.</p>
<p>Ako je prenizak, izvršenje može završiti greškom <code>OUT_OF_ENERGY</code>.</p>
<p>Ako je nepotrebno visok, povećavaš maksimalnu izloženost u slučaju neočekivane ili zlonamerne putanje izvršenja.</p>
<p>Mreža trenutno dozvoljava maksimalni <code>feeLimit</code> od 15.000 TRX, odnosno:</p>
<pre><code class="language-text">15.000.000.000 sun
</code></pre>
<p>To je protokolski maksimum, ne preporučena vrednost .</p>
<p>Razumna procedura je:</p>
<ol>
<li><p>Simuliraj poziv.</p>
</li>
<li><p>Pročitaj procenjenu Energy potrošnju.</p>
</li>
<li><p>Proveri dynamic faktor ugovora.</p>
</li>
<li><p>Dodaj kontrolisanu rezervu.</p>
</li>
<li><p>Izračunaj <code>feeLimit</code> prema trenutnom <code>energy_fee</code>.</p>
</li>
<li><p>Primeni dodatni poslovni maksimum za tip operacije.</p>
</li>
<li><p>Odbij slanje ako procena prelazi dozvoljeni budžet.</p>
</li>
</ol>
<p>Nemoj koristiti jedan globalni <code>feeLimit</code> za sve funkcije. <code>approve</code>, <code>transfer</code>, swap i kompleksna contract operacija nemaju isti profil.</p>
<h2>Realan use-case: custodial USDT sistem</h2>
<p>Zamisli payment platformu koja korisniku dodeljuje Tron deposit adresu i kasnije šalje USDT isplate.</p>
<p>Na prvi pogled tok izgleda jednostavno:</p>
<pre><code class="language-text">korisnik uplati -&gt; backend vidi transfer -&gt; pripiše saldo
</code></pre>
<p>Produkcioni tok je znatno složeniji.</p>
<pre><code class="language-mermaid">flowchart TD
    A[Korisnik šalje TRC-20 token] --&gt; B[Transakcija ulazi u blok]
    B --&gt; C[Indexer otkriva Transfer event]
    C --&gt; D[Backend validira ugovor i event]
    D --&gt; E[Provera execution receipta]
    E --&gt; F[Čekanje solidifikacije]
    F --&gt; G[Idempotentno knjiženje depozita]
    G --&gt; H[Sweep ili zadržavanje sredstava]
</code></pre>
<p>Platforma mora da zna:</p>
<ul>
<li><p>da li je token contract očekivan</p>
</li>
<li><p>da li je događaj standardni <code>Transfer</code></p>
</li>
<li><p>da li je contract call uspešno izvršen</p>
</li>
<li><p>koji je stvarni primalac</p>
</li>
<li><p>koji je iznos u base units</p>
</li>
<li><p>koliko token ima decimala</p>
</li>
<li><p>da li je blok solidifikovan</p>
</li>
<li><p>da li je događaj već obrađen</p>
</li>
<li><p>da li je transfer top-level ili internal rezultat</p>
</li>
<li><p>da li indeksirani API kasni ili je preskočio stranicu</p>
</li>
</ul>
<h3>Identitet depozita</h3>
<p>Samo <code>txID</code> nije uvek dovoljan poslovni ključ. Jedna transakcija može proizvesti više događaja, uključujući više <code>Transfer</code> događaja.</p>
<p>Pouzdan identifikator TRC-20 depozita je kombinacija:</p>
<pre><code class="language-text">network
tokenContract
txID
logIndex
</code></pre>
<p>Ako koristiš TronGrid event API, poslednja komponenta može biti <code>event_index</code>. Ako čitaš receipt direktno sa čvora, koristi poziciju u <code>log[]</code> nizu.</p>
<p>U bazi postavi unique constraint nad tim poljima. Tako retry indexera, ponovno skeniranje bloka ili duplikat sa API-ja ne može dvaput knjižiti isti depozit.</p>
<h3>Validacija Transfer eventa</h3>
<p>Standardni TRC-20 događaj je:</p>
<pre><code class="language-solidity">event Transfer(
    address indexed from,
    address indexed to,
    uint256 value
);
</code></pre>
<p>Backend ne treba da traži samo događaj sa nazivom <code>Transfer</code>. Treba da proveri:</p>
<ul>
<li><p>adresu ugovora koji je emitovao log</p>
</li>
<li><p>signature topic događaja</p>
</li>
<li><p>ispravno dekodirane <code>from</code> i <code>to</code> adrese</p>
</li>
<li><p>količinu iz <code>data</code></p>
</li>
<li><p>uspešan execution receipt</p>
</li>
<li><p>solidifikovano stanje za konačno knjiženje</p>
</li>
</ul>
<p>Napadač može postaviti lažni token koji emituje identičan događaj. Ako backend validira simbol <code>USDT</code> umesto contract addressa, može knjižiti bezvredan token kao stvarni depozit.</p>
<p>Simbol i naziv tokena su metadata. Contract address je identitet sredstva.</p>
<h2>FullNode, SolidityNode i TronGrid nisu ista stvar</h2>
<p>Tron izlaže nekoliko različitih površina za čitanje podataka.</p>
<h3>FullNode</h3>
<p>FullNode radi sa aktuelnim chain headom.</p>
<p>Koristi se za:</p>
<ul>
<li><p>konstrukciju transakcija</p>
</li>
<li><p>broadcast</p>
</li>
<li><p>čitanje najnovijeg stanja</p>
</li>
<li><p>debugging</p>
</li>
<li><p>brzi prikaz nepotvrđenih podataka</p>
</li>
</ul>
<p>Podaci sa FullNode čvora imaju malu latenciju, ali nisu nužno solidifikovani.</p>
<h3>SolidityNode</h3>
<p>SolidityNode izlaže stanje solidifikovanih blokova.</p>
<p>Koristi se za:</p>
<ul>
<li><p>finalnu potvrdu transakcije</p>
</li>
<li><p>finansijsko poravnanje</p>
</li>
<li><p>konačan receipt</p>
</li>
<li><p>potvrđeni balans</p>
</li>
<li><p>proveru solidifikovanih blokova</p>
</li>
</ul>
<p>Naziv može zbuniti. SolidityNode nije čvor koji samo izvršava Solidity. Njegova ključna uloga za integratora je pristup potvrđenom stanju.</p>
<h3>TronGrid V1 API</h3>
<p>TronGrid pruža indeksirane podatke pogodne za:</p>
<ul>
<li><p>istoriju naloga</p>
</li>
<li><p>TRC-20 transfer istoriju</p>
</li>
<li><p>events</p>
</li>
<li><p>interne transakcije</p>
</li>
<li><p>paginaciju</p>
</li>
<li><p>pretragu</p>
</li>
</ul>
<p>Indexer je praktičan, ali može kasniti za čvorom, imati pagination ograničenja ili privremeno vratiti nepotpun skup rezultata.</p>
<p>Dobra produkciona arhitektura kombinuje izvore:</p>
<ol>
<li><p>Indexer otkriva kandidata.</p>
</li>
<li><p>FullNode daje brzu informaciju za UX.</p>
</li>
<li><p>SolidityNode potvrđuje konačno stanje.</p>
</li>
<li><p>Lokalna baza održava cursor i idempotentnost.</p>
</li>
</ol>
<p>Za finansijsko knjigovodstvo nije preporučljivo tretirati event API kao jedini izvor istine .</p>
<h2>TronWeb integracija</h2>
<p>TronWeb je glavni JavaScript SDK za rad sa Tronom. Može da:</p>
<ul>
<li><p>upravlja adresama</p>
</li>
<li><p>čita balans</p>
</li>
<li><p>gradi transakcije</p>
</li>
<li><p>potpisuje</p>
</li>
<li><p>broadcastuje</p>
</li>
<li><p>učitava contract ABI</p>
</li>
<li><p>poziva <code>view</code> funkcije</p>
</li>
<li><p>šalje state-changing contract pozive</p>
</li>
<li><p>radi sa stakingom i delegacijom</p>
</li>
<li><p>komunicira sa node API-jima</p>
</li>
</ul>
<p>Instalacija:</p>
<pre><code class="language-bash">npm install tronweb
</code></pre>
<p>Osnovna inicijalizacija za Shasta testnet:</p>
<pre><code class="language-js">const { TronWeb } = require('tronweb');

const privateKey = process.env.TRON_PRIVATE_KEY;

if (!privateKey) {
  throw new Error('Nedostaje TRON_PRIVATE_KEY');
}

const tronWeb = new TronWeb({
  fullHost: 'https://api.shasta.trongrid.io',
  privateKey
});

console.log('Adresa:', tronWeb.defaultAddress.base58);
</code></pre>
<p>Aktuelni uobičajeni endpointi su:</p>
<table>
<thead>
<tr>
<th>Mreža</th>
<th>FullNode HTTP endpoint</th>
</tr>
</thead>
<tbody><tr>
<td>Mainnet</td>
<td><code>https://api.trongrid.io</code></td>
</tr>
<tr>
<td>Shasta</td>
<td><code>https://api.shasta.trongrid.io</code></td>
</tr>
<tr>
<td>Nile</td>
<td><code>https://nile.trongrid.io</code></td>
</tr>
<tr>
<td>Lokalni čvor</td>
<td><code>http://127.0.0.1:8090</code></td>
</tr>
</tbody></table>
<p>Mainnet TronGrid zahtevi uglavnom koriste <code>TRON-PRO-API-KEY</code> header:</p>
<pre><code class="language-js">const tronWeb = new TronWeb({
  fullHost: 'https://api.trongrid.io',
  headers: {
    'TRON-PRO-API-KEY': process.env.TRONGRID_API_KEY
  }
});
</code></pre>
<p>Read-only klijent ne treba privatni ključ.</p>
<p>U browser aplikaciji privatni ključ nikada ne treba ubaciti u TronWeb konfiguraciju. Potpisivanje treba prepustiti TronLinku ili kompatibilnom wallet provideru.</p>
<h2>Čitanje TRC-20 stanja</h2>
<p>Contract instanca može se učitati prema adresi:</p>
<pre><code class="language-js">const token = await tronWeb.contract().at(tokenAddress);
</code></pre>
<p>Pozivi funkcija koje ne menjaju stanje koriste <code>.call()</code>:</p>
<pre><code class="language-js">const [name, symbol, decimals, rawBalance] = await Promise.all([
  token.name().call(),
  token.symbol().call(),
  token.decimals().call(),
  token.balanceOf(accountAddress).call()
]);

console.log({
  name,
  symbol,
  decimals: decimals.toString(),
  rawBalance: rawBalance.toString()
});
</code></pre>
<p>Kod produkcionog sistema treba razlikovati:</p>
<ul>
<li><p>prikazani iznos, na primer <code>1.25</code></p>
</li>
<li><p>base-unit iznos, na primer <code>1250000</code></p>
</li>
<li><p>decimal precision tokena, na primer <code>6</code></p>
</li>
</ul>
<p>Za slanje koristi isključivo integer base units. Floating point tip nije pogodan za token iznose.</p>
<p>Umesto:</p>
<pre><code class="language-js">const amount = 1.25 * 10 ** 6;
</code></pre>
<p>koristi decimal parser ili biblioteku koja radi sa celim brojevima. Za jednostavan poznat iznos možeš proslediti string:</p>
<pre><code class="language-js">const amountBaseUnits = '1250000';
</code></pre>
<h2>Slanje TRC-20 tokena</h2>
<p>State-changing contract funkcija koristi <code>.send()</code>:</p>
<pre><code class="language-js">const { TronWeb } = require('tronweb');

async function transferToken({
  tronWeb,
  tokenAddress,
  recipient,
  amountBaseUnits
}) {
  if (!TronWeb.isAddress(tokenAddress)) {
    throw new Error('Neispravna token adresa');
  }

  if (!TronWeb.isAddress(recipient)) {
    throw new Error('Neispravna adresa primaoca');
  }

  if (!/^\d+$/.test(amountBaseUnits)) {
    throw new Error('Iznos mora biti integer u base units');
  }

  const token = await tronWeb.contract().at(tokenAddress);

  const result = await token
    .transfer(recipient, amountBaseUnits)
    .send({
      feeLimit: 150_000_000,
      callValue: 0,
      shouldPollResponse: true,
      keepTxID: true
    });

  const [txID, contractResult] = result;

  return {
    txID,
    contractResult
  };
}
</code></pre>
<p>Vrednost <code>150_000_000</code> predstavlja limit od 150 TRX. To nije univerzalna preporuka. U pravom sistemu treba je izračunati na osnovu simulacije, trenutnog Energy parametra i internog limita rizika.</p>
<p>Opcije imaju različitu semantiku:</p>
<ul>
<li><p><code>feeLimit</code> ograničava caller-side Energy trošak</p>
</li>
<li><p><code>callValue</code> šalje TRX ugovoru ako je funkcija payable</p>
</li>
<li><p><code>shouldPollResponse</code> čeka rezultat umesto da vrati samo <code>txID</code></p>
</li>
<li><p><code>keepTxID</code> zadržava <code>txID</code> uz dekodirani contract rezultat</p>
</li>
</ul>
<p>Čak i kada SDK čeka odgovor, backend treba da ima sopstveni confirmation worker. HTTP konekcija može pući, proces se može restartovati ili provider može vratiti timeout posle uspešnog broadcasta.</p>
<p>Pouzdan API endpoint za isplatu zato ne treba da drži korisnički HTTP zahtev otvoren dok čeka solidifikaciju.</p>
<p>Bolji tok je:</p>
<pre><code class="language-text">POST /withdrawals
  -&gt; validacija
  -&gt; upis withdrawal zapisa
  -&gt; asinhroni signing job
  -&gt; broadcast
  -&gt; confirmation worker
  -&gt; SOLIDIFIED ili FAILED
</code></pre>
<h2>Idempotentne isplate</h2>
<p>Payout sistem mora sprečiti duplo slanje kada job queue ponovi zadatak.</p>
<p>Minimalna tabela može imati:</p>
<pre><code class="language-text">withdrawal_id
idempotency_key
network
token_contract
recipient
amount_base_units
status
unsigned_tx_hash
tx_id
created_at
broadcast_at
solidified_at
</code></pre>
<p>Pre konstrukcije transakcije treba rezervisati poslovni zahtev preko <code>idempotency_key</code>.</p>
<p>Nakon konstrukcije sačuvaj <code>txID</code> pre broadcasta ako workflow to dozvoljava. Ako broadcast poziv vrati timeout, worker prvo proverava postojeći <code>txID</code>. Ne konstruiše automatski novu transakciju.</p>
<p>Nova transakcija je opravdana tek kada je potvrđeno da:</p>
<ul>
<li><p>originalna nije ušla u lanac</p>
</li>
<li><p>istekla je</p>
</li>
<li><p>ne postoji validan receipt</p>
</li>
<li><p>poslovna operacija i dalje treba da bude izvršena</p>
</li>
</ul>
<p>Svaka rekonstrukcija menja TAPOS reference, expiration i <code>txID</code>, pa mora ostati povezana sa istim withdrawal zapisom.</p>
<h2>Upravljanje privatnim ključevima</h2>
<p>Primer sa <code>process.env.TRON_PRIVATE_KEY</code> prihvatljiv je za testnet skriptu, ali nije dovoljna bezbednosna arhitektura za custodial sistem.</p>
<p>Produkcioni signer treba odvojiti od aplikacionog backenda.</p>
<pre><code class="language-mermaid">flowchart LR
    A[Payment backend] --&gt; B[Transaction builder]
    B --&gt; C[Policy engine]
    C --&gt; D[Izolovani signer ili HSM]
    D --&gt; E[Signed transaction]
    E --&gt; F[Broadcast worker]
    F --&gt; G[TRON FullNode]
</code></pre>
<p>Signer treba da dobije kompletno pripremljeno telo transakcije i proveri:</p>
<ul>
<li><p>dozvoljenu mrežu</p>
</li>
<li><p>tip transakcije</p>
</li>
<li><p>contract address</p>
</li>
<li><p>funkcijski selector</p>
</li>
<li><p>primaoca</p>
</li>
<li><p>iznos</p>
</li>
<li><p><code>feeLimit</code></p>
</li>
<li><p><code>callValue</code></p>
</li>
<li><p>expiration</p>
</li>
<li><p>dozvoljene dnevne limite</p>
</li>
</ul>
<p>Ne treba dozvoliti backendu da signer koristi kao opštu funkciju <code>sign(bytes)</code> bez poslovne validacije.</p>
<p>Tron podržava account permission model i višestruke ključeve sa pragovima. Owner permission može ostati u hladnijem okruženju, dok active permission potpisuje ograničen skup svakodnevnih operacija. Za treasury i berzanske sisteme to je sigurniji model od jednog privatnog ključa koji može menjati sve dozvole i slati sva sredstva.</p>
<h2>Razvojna okruženja: Nile, Shasta i privatna mreža</h2>
<p>Tron održava dve javne test mreže.</p>
<h3>Nile</h3>
<p>Nile je forward-looking testnet. Nove protokolske funkcije i governance promene obično se prvo pojavljuju na njemu.</p>
<p>Koristan je za:</p>
<ul>
<li><p>testiranje novih mogućnosti</p>
</li>
<li><p>rad sa budućim parametrima</p>
</li>
<li><p>integracije koje žele rano da vide promene</p>
</li>
<li><p>pokretanje sopstvenog testnet čvora</p>
</li>
</ul>
<h3>Shasta</h3>
<p>Shasta bliže prati mainnet funkcije i parametre.</p>
<p>Koristan je za:</p>
<ul>
<li><p>prvi razvojni tok</p>
</li>
<li><p>završne integration testove</p>
</li>
<li><p>proveru ponašanja pred mainnet</p>
</li>
<li><p>TronGrid zasnovane testove</p>
</li>
</ul>
<p>Shasta ne prihvata spoljne peer čvorove na isti način kao Nile, pa se programatski pristup tipično radi preko TronGrida .</p>
<h3>Privatna mreža</h3>
<p>Privatna Tron mreža ima smisla za:</p>
<ul>
<li><p>CI testove</p>
</li>
<li><p>determinističke test fixture podatke</p>
</li>
<li><p>brzo resetovanje stanja</p>
</li>
<li><p>testove bez zavisnosti od fauceta</p>
</li>
<li><p>kontrolu chain parametara</p>
</li>
<li><p>simulaciju failure scenarija</p>
</li>
</ul>
<p>Cena te kontrole je što privatna mreža nije verna slika realne distribucije validatora, javne infrastrukture, indexer kašnjenja i opterećenja popularnih ugovora.</p>
<p>Dobra test strategija koristi sva tri nivoa:</p>
<pre><code class="language-text">lokalna ili privatna mreža
  -&gt; Nile
  -&gt; Shasta
  -&gt; Mainnet sa ograničenim iznosima
</code></pre>
<h2>Pametni ugovori i razvojni alati</h2>
<p>Glavni alati su:</p>
<ul>
<li><p>TronWeb za JavaScript integraciju</p>
</li>
<li><p>TronBox za compile, migration i test workflow</p>
</li>
<li><p>TronIDE za browser razvoj i ručni deployment</p>
</li>
<li><p>Trident za Java integracije</p>
</li>
<li><p>java-tron za pokretanje sopstvenog čvora</p>
</li>
<li><p>TronScan za explorer, verifikaciju i debugging</p>
</li>
</ul>
<p>TronBox je konceptualno blizak Truffle workflowu. Projekat obično sadrži:</p>
<pre><code class="language-text">contracts/
migrations/
test/
tronbox-config.js
</code></pre>
<p>Mrežna konfiguracija definiše endpoint, privatni ključ, <code>feeLimit</code> i deployment Energy parametre.</p>
<p>Važno je razlikovati caller i deployer troškove.</p>
<p>Kod deploymenta ugovor može definisati:</p>
<ul>
<li><p><code>consume_user_resource_percent</code></p>
</li>
<li><p><code>origin_energy_limit</code></p>
</li>
</ul>
<p>Prvi parametar utiče na raspodelu Energy troška između korisnika i deployera. Drugi ograničava Energy koji deployer može da pokrije.</p>
<p>Ovo omogućava ugovoru da subvencioniše deo poziva, ali zahteva monitoring deployer resursa. Ako operator obeća subvencionisani UX, a deployer ostane bez Energyja, korisnik može neočekivano početi da sagoreva TRX ili da dobija neuspešne transakcije.</p>
<h2>Migracija sa Ethereuma</h2>
<p>Migracija nije samo promena RPC URL-a.</p>
<p>Najčešće zamene su:</p>
<table>
<thead>
<tr>
<th>Ethereum stack</th>
<th>Tron ekvivalent</th>
</tr>
</thead>
<tbody><tr>
<td>EVM</td>
<td>TVM</td>
</tr>
<tr>
<td>ETH</td>
<td>TRX</td>
</tr>
<tr>
<td>wei</td>
<td>sun</td>
</tr>
<tr>
<td>ERC-20</td>
<td>TRC-20</td>
</tr>
<tr>
<td>web3.js</td>
<td>TronWeb</td>
</tr>
<tr>
<td>Truffle</td>
<td>TronBox</td>
</tr>
<tr>
<td>Remix</td>
<td>TronIDE</td>
</tr>
<tr>
<td><code>gasLimit</code></td>
<td><code>feeLimit</code> i Energy model</td>
</tr>
<tr>
<td><code>0x...</code> adresa u UI-ju</td>
<td>Base58Check <code>T...</code></td>
</tr>
<tr>
<td>Ethereum JSON-RPC</td>
<td>Tron HTTP, gRPC ili kompatibilni JSON-RPC</td>
</tr>
</tbody></table>
<p>U testovima će se često menjati:</p>
<pre><code class="language-text">web3.eth.getBalance(address)
</code></pre>
<p>u:</p>
<pre><code class="language-text">tronWeb.trx.getBalance(address)
</code></pre>
<p>i:</p>
<pre><code class="language-text">web3.utils.toWei(value, 'ether')
</code></pre>
<p>u:</p>
<pre><code class="language-text">tronWeb.toSun(value)
</code></pre>
<p>Contract poziv menja oblik iz web3 metode u:</p>
<pre><code class="language-js">contract.methodName().call();
</code></pre>
<p>ili:</p>
<pre><code class="language-js">contract.methodName(arg).send({
  feeLimit: 100_000_000
});
</code></pre>
<p>Najopasniji deo migracije nije sintaksa nego skrivena pretpostavka da će tačno Ethereum ponašanje ostati isto. Posebno treba testirati:</p>
<ul>
<li><p>address encoding</p>
</li>
<li><p>signature domain</p>
</li>
<li><p>message signing</p>
</li>
<li><p>proxy upgrade</p>
</li>
<li><p>deployment adrese</p>
</li>
<li><p>factory ugovore</p>
</li>
<li><p>fallback i receive logiku</p>
</li>
<li><p>event decoding</p>
</li>
<li><p>custom errors</p>
</li>
<li><p><code>CREATE2</code></p>
</li>
<li><p>inline assembly</p>
</li>
<li><p>low-level <code>call</code></p>
</li>
<li><p>Energy raspodelu</p>
</li>
</ul>
<p>Za standardne tokene postoje Tron prilagođene OpenZeppelin biblioteke i dokumentacija koja eksplicitno opisuje TVM razlike .</p>
<h2>Deposit scanner bez oslanjanja na jedan API</h2>
<p>Pouzdan scanner održava lokalni solidified block cursor.</p>
<p>Pojednostavljen algoritam:</p>
<pre><code class="language-text">1. Pročitaj poslednji obrađeni solidifikovani blok.
2. Pitaj SolidityNode za trenutni solidifikovani head.
3. Obradi blokove redom, bez preskakanja.
4. Za svaku transakciju pročitaj receipt.
5. Iz receipt logova izdvoji događaje poznatih ugovora.
6. Dekodiraj Transfer događaje.
7. Upiši ih idempotentno.
8. Tek nakon uspešnog commita pomeri cursor.
</code></pre>
<p>Cursor se ne pomera pre nego što su svi događaji iz bloka trajno upisani.</p>
<p>Ako koristiš samo account history API, teže je dokazati da nijedna stranica nije preskočena tokom pagination promene. Block scanner je složeniji, ali ima jasnu progresiju i lakše se ponavlja.</p>
<p>Praktičan kompromis je:</p>
<ul>
<li><p>TronGrid za brzo otkrivanje</p>
</li>
<li><p>lokalni queue za obradu</p>
</li>
<li><p>SolidityNode za potvrdu</p>
</li>
<li><p>periodični block reconciliation za proveru kompletnosti</p>
</li>
</ul>
<p>Reconciliation treba da uporedi najmanje:</p>
<ul>
<li><p>broj događaja po bloku</p>
</li>
<li><p>zbir transfera po tokenu</p>
</li>
<li><p>lokalne i on-chain balanse</p>
</li>
<li><p>poslednji solidifikovani cursor</p>
</li>
<li><p>transakcije zaglavljene u <code>UNKNOWN</code> stanju</p>
</li>
</ul>
<h2>Sweep arhitektura i problem Energyja</h2>
<p>Custodial platforme često daju svakom korisniku posebnu deposit adresu. Nakon depozita token se prebacuje na centralni treasury. Taj transfer se zove sweep.</p>
<p>Na Tronu sweep TRC-20 tokena zahteva Energy na deposit adresi koja šalje token.</p>
<p>To stvara operativni problem: deposit adresa može imati USDT, ali nema TRX niti stakeovani Energy.</p>
<p>Moguća rešenja su:</p>
<h3>Slanje TRX-a svakoj deposit adresi</h3>
<p>Jednostavno je za implementaciju, ali:</p>
<ul>
<li><p>rasipa TRX po velikom broju adresa</p>
</li>
<li><p>uvodi dodatne transakcije</p>
</li>
<li><p>komplikuje konsolidaciju</p>
</li>
<li><p>povećava površinu za greške</p>
</li>
</ul>
<h3>Delegiranje Energyja deposit adresi</h3>
<p>Treasury stakeuje TRX i privremeno delegira Energy adresi koja treba da izvrši sweep.</p>
<p>Prednosti:</p>
<ul>
<li><p>deposit adresa ne mora da dobije vlasništvo nad TRX-om</p>
</li>
<li><p>isti Energy pool može se preraspodeljivati</p>
</li>
<li><p>lakše se uvodi centralna kontrola budžeta</p>
</li>
</ul>
<p>Nedostaci:</p>
<ul>
<li><p>delegacija i opoziv su zasebne operacije</p>
</li>
<li><p>potrebno je upravljati raspoloživim kapacitetom</p>
</li>
<li><p>paralelni sweepovi mogu iscrpeti pool</p>
</li>
<li><p>sistem mora pratiti vremensko obnavljanje resursa</p>
</li>
</ul>
<h3>Direktan burn sa deposit adrese</h3>
<p>Za to adresa i dalje mora imati dovoljno TRX-a. Operativno je najjednostavnije za mali obim, ali postaje skupo i teško za hiljade adresa.</p>
<h3>Shared deposit adresa sa memo modelom</h3>
<p>TRC-20 transfer nema obavezni destination tag kao neke druge mreže. Merchant može koristiti jednu adresu i van lanca generisane invoice iznose, ali to uvodi probleme sa identifikacijom, privatnošću i kolizijama iznosa.</p>
<p>Za ozbiljan custodial sistem, delegacija resursa i planirani sweep scheduler obično daju bolju kontrolu od nasumičnog dopunjavanja svake adrese TRX-om.</p>
<h2>Monitoring koji zaista vredi imati</h2>
<p>Standardni RPC uptime nije dovoljan.</p>
<p>Tron integracija treba da prati:</p>
<h3>Stanje mreže</h3>
<ul>
<li><p>latest FullNode block</p>
</li>
<li><p>latest solidified block</p>
</li>
<li><p>razliku između njih</p>
</li>
<li><p>vreme poslednjeg bloka</p>
</li>
<li><p>RPC latency</p>
</li>
<li><p>procenat neuspešnih zahteva</p>
</li>
</ul>
<h3>Transakcije</h3>
<ul>
<li><p>broj broadcastovanih transakcija</p>
</li>
<li><p>vreme do uključivanja u blok</p>
</li>
<li><p>vreme do solidifikacije</p>
</li>
<li><p>broj revertovanih poziva</p>
</li>
<li><p>broj <code>OUT_OF_ENERGY</code> grešaka</p>
</li>
<li><p>broj expired i TAPOS grešaka</p>
</li>
<li><p>broj transakcija u <code>UNKNOWN</code> stanju</p>
</li>
</ul>
<h3>Resurse</h3>
<ul>
<li><p>raspoloživi Energy po hot walletu</p>
</li>
<li><p>raspoloživi Bandwidth</p>
</li>
<li><p>delegirani Energy</p>
</li>
<li><p>Energy potrošnju po funkciji</p>
</li>
<li><p>TRX burn po funkciji</p>
</li>
<li><p>odstupanje procene od stvarne potrošnje</p>
</li>
<li><p>dynamic Energy faktor važnih ugovora</p>
</li>
</ul>
<h3>Poslovne podatke</h3>
<ul>
<li><p>nepoknjiženi solidifikovani depoziti</p>
</li>
<li><p>duplikate događaja</p>
</li>
<li><p>stanje payout reda</p>
</li>
<li><p>on-chain i ledger razliku</p>
</li>
<li><p>sweep backlog</p>
</li>
<li><p>deposit adrese sa tokenom, ali bez dovoljno resursa</p>
</li>
</ul>
<p>Posebno je korisna metrika:</p>
<pre><code class="language-text">actualEnergy / estimatedEnergy
</code></pre>
<p>Ako odnos raste, moguće je da se promenio contract state, dynamic faktor ili putanja izvršenja. To je bolji signal od generičkog upozorenja da su naknade porasle.</p>
<h2>Greške koje su specifično skupe</h2>
<h3>Broadcast uspeh se tretira kao poslovni uspeh</h3>
<p>Posledica je da korisnik dobije kredit ili potvrdu isplate pre uspešnog izvršenja.</p>
<p>Rešenje je receipt plus solidifikacija za finalna stanja.</p>
<h3>Simbol tokena koristi se kao identitet</h3>
<p>Napadač može postaviti ugovor sa istim simbolom i emitovati iste događaje.</p>
<p>Rešenje je allowlist contract adresa po mreži.</p>
<h3>Decimalni broj se obrađuje preko JavaScript <code>number</code></h3>
<p>Za veće iznose nastaju rounding i precision greške.</p>
<p>Rešenje su integer stringovi, <code>BigInt</code> gde ga SDK prihvata ili biblioteka za proizvoljnu preciznost.</p>
<h3>Jedan <code>feeLimit</code> koristi se svuda</h3>
<p>Kompleksne operacije padaju, dok jednostavne imaju nepotrebno visok limit.</p>
<p>Rešenje je procena i policy po funkcijskom selectoru.</p>
<h3>Indexer se smatra konačnim stanjem</h3>
<p>Kašnjenje ili pagination greška može proizvesti pogrešan ledger.</p>
<p>Rešenje je SolidityNode potvrda i periodični block reconciliation.</p>
<h3>Privatni ključ se nalazi u frontend bundleu</h3>
<p>To je direktan gubitak kontrole nad nalogom.</p>
<p>Rešenje je wallet provider za korisničko potpisivanje ili izolovani signer za custodial backend.</p>
<h3>Retry konstruiše novu transakciju bez provere stare</h3>
<p>Prva transakcija može već biti izvršena, pa druga proizvodi duplu isplatu.</p>
<p>Rešenje je trajno čuvanje <code>txID</code>, lookup pre ponovnog slanja i poslovna idempotentnost.</p>
<h2>Trade-off bez marketinga</h2>
<p>Tron nije univerzalno bolji ili jeftiniji blockchain. Ima vrlo specifičan profil.</p>
<h3>Prednosti</h3>
<ul>
<li><p>kratak interval između blokova</p>
</li>
<li><p>Solidity i TVM kompatibilnost</p>
</li>
<li><p>mature TRC-20 payment tokovi</p>
</li>
<li><p>delegacija Energyja i Bandwidtha</p>
</li>
<li><p>mogućnost operatora da pokrije korisničke resurse</p>
</li>
<li><p>predvidljiv proračun kada su resursi dobro organizovani</p>
</li>
<li><p>više pristupnih slojeva, uključujući HTTP, gRPC i JSON-RPC</p>
</li>
<li><p>jednostavna integracija za JavaScript backend</p>
</li>
<li><p>jasan model solidifikacije</p>
</li>
</ul>
<h3>Nedostaci</h3>
<ul>
<li><p>samo 27 aktivnih proizvođača blokova</p>
</li>
<li><p>protokolski parametri se mogu menjati governance odlukama</p>
</li>
<li><p>TVM nije potpuno identičan EVM-u</p>
</li>
<li><p>resursni model zahteva dodatnu operativnu logiku</p>
</li>
<li><p>Energy popularnog ugovora može zavisiti od dynamic modela</p>
</li>
<li><p>napredni Ethereum tooling nije uvek direktno prenosiv</p>
</li>
<li><p>TronGrid indeksirani podaci nisu zamena za finalno node stanje</p>
</li>
<li><p>hot wallet i sweep arhitektura postaju složeniji zbog delegacije resursa</p>
</li>
</ul>
<p>Tronov model ima najviše smisla kada sistem može planski upravljati resursima. Za pojedinačnog korisnika koji povremeno šalje token, burn je jednostavan. Za platformu sa hiljadama transfera, Energy postaje infrastrukturni kapacitet koji treba budžetirati, raspoređivati i nadgledati.</p>
<h2>Kada je racionalan izbor</h2>
<p>Tron je vredan ozbiljne tehničke procene ako projekat:</p>
<ul>
<li><p>dominantno radi sa stablecoin transferima</p>
</li>
<li><p>ima česte isplate</p>
</li>
<li><p>želi da subvencioniše mrežni trošak korisnicima</p>
</li>
<li><p>već koristi Solidity</p>
</li>
<li><p>može da upravlja stakeovanim kapitalom</p>
</li>
<li><p>prihvata DPoS bezbednosni model</p>
</li>
<li><p>ne zavisi od Ethereum-specifične composability mreže</p>
</li>
</ul>
<p>Verovatno nije najbolji izbor ako projekat:</p>
<ul>
<li><p>zahteva potpuno identičnu EVM semantiku</p>
</li>
<li><p>koristi veliki broj Ethereum-only protokola</p>
</li>
<li><p>ima stroge zahteve za širu validator decentralizaciju</p>
</li>
<li><p>ne želi da upravlja Energy i Bandwidth resursima</p>
</li>
<li><p>zavisi od najnovijih EVM opcode funkcija bez provere TVM podrške</p>
</li>
<li><p>nema operativni kapacitet za confirmation i reconciliation pipeline</p>
</li>
</ul>
<h2>Minimalan, ali realan eksperiment</h2>
<p>Dobar prvi eksperiment nije deployment sopstvenog tokena. Mnogo je korisnije napraviti mali end-to-end payment tok:</p>
<ol>
<li><p>Kreirati poseban Shasta nalog.</p>
</li>
<li><p>Dobiti test TRX i test TRC-20 token.</p>
</li>
<li><p>Pročitati balans i resurse naloga.</p>
</li>
<li><p>Pozvati <code>decimals()</code> i <code>balanceOf()</code>.</p>
</li>
<li><p>Proceniti Energy za transfer.</p>
</li>
<li><p>Poslati mali token iznos.</p>
</li>
<li><p>Sačuvati <code>txID</code>.</p>
</li>
<li><p>Razlikovati broadcast, receipt i solidifikaciju.</p>
</li>
<li><p>Dekodirati <code>Transfer</code> event.</p>
</li>
<li><p>Upisati događaj idempotentno u lokalnu bazu.</p>
</li>
<li><p>Ponoviti obradu istog bloka i proveriti da nema duplikata.</p>
</li>
<li><p>Namerno postaviti prenizak <code>feeLimit</code> i analizirati neuspešan receipt.</p>
</li>
<li><p>Ponoviti test sa stakeovanim ili delegiranim Energyjem.</p>
</li>
<li><p>Uporediti procenjenu i stvarnu potrošnju.</p>
</li>
</ol>
<p>Takav eksperiment pokazuje gotovo sve što je bitno za produkciju: SDK, adrese, resurse, izvršenje, događaje, greške i finalnost.</p>
<p>Sam Solidity deployment demonstrira TVM. Payment tok demonstrira Tron.</p>
<h2>Zaključak</h2>
<p>Tron je tehnički najzanimljiviji kada se posmatra kao settlement infrastruktura, a ne samo kao još jedan blockchain sa pametnim ugovorima.</p>
<p>Solidity i TVM olakšavaju ulazak, ali pouzdana integracija zahteva razumevanje delova koji nisu EVM standard: Base58Check adresa, <code>sun</code> jedinica, TAPOS referenci, Energy i Bandwidth resursa, <code>feeLimit</code> semantike, dynamic Energy modela i razlike između FullNode, SolidityNode i indeksiranih API-ja.</p>
<p>Za wallet ili payment backend najvažnija lekcija je da broadcast nije izvršenje, izvršenje nije solidifikacija, a indeksirani događaj nije sam po sebi konačan finansijski dokaz.</p>
<p>Kada se ti slojevi jasno razdvoje, Tron postaje relativno predvidiva platforma za TRC-20 transfere. Kada se preskoče, brza i naizgled jednostavna integracija proizvodi baš onu vrstu grešaka koja se u produkciji otkriva tek kada počne da nedostaje novac.</p>
<h3><em>Ovaj članak je sponzorisan od strane</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet.com</em></a><em>. Na Volet.com možete kupiti i prodati TRX. Više informacija nalazi se na stranici</em> <a href="https://volet.srbija.workers.dev/"><em>Volet za korisnike iz Srbije</em></a><em>. Za otvaranje naloga koristi</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet referral link</em></a><em>. Link je referral link autora članka.</em></h3>
<h3>Izvori</h3>
<ol>
<li><p><a href="https://developers.tron.network/docs/concensus">Consensus and DPoS</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/confirmation-semantics">Confirmation semantics</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/tron-protocol-transaction">Transactions and TAPOS</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/tvm">TRON Virtual Machine</a></p>
</li>
<li><p><a href="https://docs.openzeppelin.com/tron-contracts/tvm-differences">TVM differences</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/resource-model">Resource model</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/glossary">TRON glossary and Stake 2.0</a></p>
</li>
<li><p><a href="https://github.com/tronprotocol/tips/issues/789">Proposal to decrease the Energy unit price</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/set-feelimit">FeeLimit and Energy cost</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/api">TRON API reference and data-source selection</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/networks">TRON networks: Mainnet, Shasta and Nile</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/tronweb-1">TronWeb documentation</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/smart-contract-interaction">Interacting with smart contracts</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/trc20-contract-interaction">TRC-20 contract interaction</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/api-signature-and-broadcast-flow">Sign and broadcast workflow</a></p>
</li>
<li><p><a href="https://developers.tron.network/docs/smart-contract-development">Smart contract development on TRON</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/"><strong>Volet Srbija</strong></a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/tron-for-backend-developers-trc-20-payments-in-practice-3cfk">TRON for Backend Developers: TRC-20 Payments in Practice</a></p>
]]></content:encoded></item><item><title><![CDATA[XRP Ledger za developere: konsenzus, plaćanja i DEX]]></title><description><![CDATA[XRP se u javnosti uglavnom posmatra kroz cenu tokena i aktivnosti kompanije Ripple. Za developera je zanimljiviji sloj ispod toga: XRP Ledger, javni distribuirani sistem za poravnanje plaćanja, razmen]]></description><link>https://kripto-pocetnica.hashnode.dev/xrp-ledger-za-developere-konsenzus-pla-anja-i-dex</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/xrp-ledger-za-developere-konsenzus-pla-anja-i-dex</guid><category><![CDATA[XRP]]></category><category><![CDATA[Ripple]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[crypto]]></category><category><![CDATA[Web3]]></category><category><![CDATA[fintech]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Fri, 18 Sep 2026 22:51:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/f934b7bf-c124-422a-8335-c44529f5c7f0.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>XRP se u javnosti uglavnom posmatra kroz cenu tokena i aktivnosti kompanije Ripple. Za developera je zanimljiviji sloj ispod toga: XRP Ledger, javni distribuirani sistem za poravnanje plaćanja, razmenu tokenizovane vrednosti i vođenje zajedničkog finansijskog stanja.</p>
<p>XRPL nije EVM mreža sa jeftinijim gasom. Nema rudarenje, staking, mempool aukcije ni proizvoljne smart contracte na osnovnom sloju. Umesto toga nudi skup finansijskih primitiva ugrađenih direktno u protokol: plaćanja, izdavanje tokena, trust line odnose, central limit order book, automatizovane market mejkere, escrow, čekove, payment channels, NFT-ove, multisignature naloge i vremenski ograničene transakcije.</p>
<p>To ograničava šta se na mreži može programirati, ali istovremeno smanjuje količinu aplikativne logike koju developer mora sam da razvije, testira i obezbedi.</p>
<p>Ovaj tekst objašnjava šta su XRP i XRP Ledger, kako mreža postiže konsenzus, kako izgleda životni ciklus transakcije, kako rade računi i tokeni, koliko korišćenje mreže košta i kako izgleda realna produkciona integracija.</p>
<h2>Ripple, XRP i XRP Ledger nisu ista stvar</h2>
<p>Prvo treba razdvojiti tri termina koji se često koriste kao sinonimi:</p>
<ul>
<li><p><strong>XRP Ledger ili XRPL</strong> je javni blockchain i skup protokolarnih pravila.</p>
</li>
<li><p><strong>XRP</strong> je nativna digitalna valuta tog ledgera.</p>
</li>
<li><p><strong>Ripple</strong> je privatna kompanija koja razvija proizvode za plaćanja i učestvuje u XRPL ekosistemu.</p>
</li>
</ul>
<p>Aplikacija koja direktno koristi XRPL ne poziva Ripple API i ne zavisi nužno od Ripple proizvoda. Ona razgovara sa <code>xrpld</code> ili Clio serverom preko HTTP JSON-RPC ili WebSocket API-ja, potpisuje transakcije privatnim ključevima i proverava rezultate u validiranim verzijama ledgera.</p>
<p>Originalni XRP Ledger napravili su Jed McCaleb, Arthur Britto i David Schwartz tokom 2011. i početkom 2012. godine. Prilikom njegovog nastanka kreirano je ukupno 100 milijardi XRP. Protokol nema mehanizam za stvaranje novih XRP jedinica, dok se deo postojećih jedinica trajno uništava kroz transaction cost.</p>
<p>Naziv „Ripple“ istorijski se koristio i za tehnologiju, kompaniju i mrežu. Danas je tehnički preciznije govoriti o XRPL mreži, XRP valuti i Ripple kompaniji.</p>
<h2>Šta je XRP Ledger</h2>
<p>XRP Ledger je javna, permissionless i account-based blockchain mreža namenjena pre svega prenosu i razmeni vrednosti.</p>
<p>„Account-based“ znači da se globalno stanje izražava preko naloga i objekata koje ti nalozi poseduju. To je konceptualno bliže Ethereum account modelu nego Bitcoin UTXO modelu, ali se format stanja, potpisivanje i semantika transakcija bitno razlikuju.</p>
<p>Svaka verzija ledgera sadrži tri glavna dela:</p>
<ol>
<li><p>Trenutno stanje svih naloga i ledger objekata.</p>
</li>
<li><p>Uređen skup transakcija primenjenih na prethodno stanje.</p>
</li>
<li><p>Header sa indeksima, hash vrednostima, vremenom zatvaranja i drugim metapodacima.</p>
</li>
</ol>
<p>Ledger verzije su numerisane pomoću <code>ledger_index</code> vrednosti. Svaka validirana verzija nadovezuje se na prethodnu i kriptografski je povezana sa njom. Hash ledgera predstavlja sadržaj konkretne verzije, dok indeks označava njenu poziciju u istoriji. Dve konkurentne, još nevalidirane verzije mogu imati isti indeks, ali različite hash vrednosti. Samo jedna od njih može postati validirana.</p>
<p>Za razliku od sistema u kojima čvor mora da reprodukuje kompletnu istoriju kako bi izračunao trenutno stanje, XRPL ledger verzija sadrži snimak aktuelnog stanja. Istorijski podaci su i dalje važni za audit, analitiku i proveru starih transakcija, ali nisu neophodni za samo razumevanje trenutnog stanja mreže.</p>
<h3>Ledger objekti</h3>
<p>Globalno stanje nije samo mapa adresa i balansa. Ono sadrži različite tipove objekata:</p>
<ul>
<li><p><code>AccountRoot</code> za osnovno stanje naloga</p>
</li>
<li><p><code>RippleState</code> za trust line odnos</p>
</li>
<li><p><code>Offer</code> za otvoreni nalog na DEX-u</p>
</li>
<li><p><code>Escrow</code> za zaključana sredstva</p>
</li>
<li><p><code>PayChannel</code> za payment channel</p>
</li>
<li><p><code>Check</code> za odloženo povlačenje sredstava</p>
</li>
<li><p><code>SignerList</code> za multisignature konfiguraciju</p>
</li>
<li><p><code>NFTokenPage</code> za grupu NFT-ova</p>
</li>
<li><p><code>NFTokenOffer</code> za NFT ponudu</p>
</li>
<li><p><code>AMM</code> za automatizovani market mejker</p>
</li>
<li><p><code>MPToken</code> i <code>MPTokenIssuance</code> za Multi-Purpose Tokene</p>
</li>
</ul>
<p>Objekti se kreiraju, menjaju i uklanjaju isključivo kroz transakcije definisane protokolom.</p>
<p>Ne postoji opšta funkcija tipa <code>execute(bytecode)</code>. Ako želiš da promeniš stanje, biraš odgovarajući transakcioni tip, popunjavaš njegova polja, potpisuješ kanonsku binarnu reprezentaciju i šalješ je mreži.</p>
<h2>Zašto bi developer koristio XRPL</h2>
<p>XRPL ima smisla kada je glavni problem aplikacije pomeranje i poravnanje vrednosti, a ne proizvoljno izvršavanje koda.</p>
<p>Tipični scenariji uključuju:</p>
<ul>
<li><p>međunarodne isplate</p>
</li>
<li><p>marketplace i creator payouts</p>
</li>
<li><p>treasury transfere</p>
</li>
<li><p>prihvatanje XRP ili tokenizovanih plaćanja</p>
</li>
<li><p>mikroplaćanja</p>
</li>
<li><p>razmenu tokenizovanih valuta</p>
</li>
<li><p>izdavanje stablecoina ili zatvorenog utility tokena</p>
</li>
<li><p>escrow između dve strane</p>
</li>
<li><p>on-chain limit naloge</p>
</li>
<li><p>payment channels za veliki broj malih plaćanja</p>
</li>
<li><p>NFT izdavanje bez posebnog smart contracta</p>
</li>
<li><p>auditabilno poravnanje između poslovnih sistema</p>
</li>
</ul>
<p>Glavne tehničke osobine zbog kojih se XRPL razmatra za ove slučajeve jesu:</p>
<ul>
<li><p>validacija transakcija za nekoliko sekundi</p>
</li>
<li><p>eksplicitna i brza finalnost validiranog ledgera</p>
</li>
<li><p>nizak osnovni transaction cost</p>
</li>
<li><p>ugrađeni DEX i AMM</p>
</li>
<li><p>izdavanje tokena bez deployovanja ugovora</p>
</li>
<li><p>podrška za direktna i cross-currency plaćanja</p>
</li>
<li><p>lokalno potpisivanje transakcija</p>
</li>
<li><p>WebSocket pretplate na događaje</p>
</li>
<li><p>odsustvo rudarenja i stakinga</p>
</li>
<li><p>relativno mali broj pokretnih delova za jednostavan payment flow</p>
</li>
</ul>
<p>XRPL je manje prirodan izbor ako aplikaciji trebaju:</p>
<ul>
<li><p>proizvoljni smart contracti</p>
</li>
<li><p>kompleksna on-chain poslovna logika</p>
</li>
<li><p>permissionless kompozabilnost ugovora</p>
</li>
<li><p>velike količine proizvoljnih podataka na lancu</p>
</li>
<li><p>isti alati i ABI model kao na EVM mrežama</p>
</li>
<li><p>skriveni transakcioni podaci ili privatni balansi</p>
</li>
</ul>
<p>XRPL transakcije i ledger stanje su javni. Pseudonimna adresa nije isto što i privatnost.</p>
<h2>Kako XRPL postiže konsenzus</h2>
<p>XRPL ne koristi proof-of-work niti proof-of-stake. Koristi XRP Ledger Consensus Protocol, u kojem nezavisni serveri razmenjuju predloge i pokušavaju da se slože oko skupa transakcija za narednu verziju ledgera.</p>
<p>Važno je razlikovati server i validator.</p>
<p><code>xrpld</code> server može:</p>
<ul>
<li><p>primati zahteve klijenata</p>
</li>
<li><p>prosleđivati transakcije mreži</p>
</li>
<li><p>održavati lokalno ledger stanje</p>
</li>
<li><p>odgovarati na API upite</p>
</li>
<li><p>razmenjivati podatke sa drugim serverima</p>
</li>
</ul>
<p>Validator radi sve navedeno, ali dodatno potpisuje validation poruke i aktivno učestvuje u utvrđivanju validirane istorije.</p>
<p>Pokretanje servera zato ne znači automatski i učestvovanje u konsenzusu kao validator.</p>
<h3>Unique Node List</h3>
<p>Svaki server bira skup validatora čije predloge uzima u obzir. Taj skup naziva se Unique Node List ili UNL.</p>
<p>„Trusted validator“ ovde ne znači da server bezuslovno veruje svakom pojedinačnom validatoru. Pretpostavka je da dovoljno veliki deo odabranog skupa neće istovremeno sarađivati u pokušaju falsifikovanja stanja.</p>
<p>Operator može da koristi preporučenu UNL listu ili da konfiguriše sopstvenu. Bezbednost mreže zavisi od dovoljnog preklapanja lista koje koriste različiti serveri.</p>
<p>Ovo je važan trade-off. U proof-of-work sistemu uticaj proizlazi iz hash rate-a, a u proof-of-stake sistemu iz kapitala pod stake-om. U XRPL-u server eksplicitno bira validatorski skup koji smatra pouzdanim.</p>
<h3>Jedan krug konsenzusa</h3>
<p>Pojednostavljen tok izgleda ovako:</p>
<ol>
<li><p>Klijenti šalju potpisane transakcije <code>xrpld</code> serverima.</p>
</li>
<li><p>Serveri proveravaju osnovnu ispravnost i prosleđuju kandidat transakcije peerovima.</p>
</li>
<li><p>Validatori formiraju početni predlog skupa transakcija.</p>
</li>
<li><p>Predlozi se razmenjuju između validatora.</p>
</li>
<li><p>Validatori u narednim rundama prilagođavaju svoje predloge na osnovu predloga sa svojih UNL lista.</p>
</li>
<li><p>Kada se dostigne potrebna supervećina, transakcije se primenjuju definisanim redosledom.</p>
</li>
<li><p>Serveri proveravaju da li su iz istog skupa transakcija dobili isti rezultat.</p>
</li>
<li><p>Validator objavljuje potpisanu validation poruku za dobijenu ledger verziju.</p>
</li>
<li><p>Kada server vidi dovoljan broj pouzdanih validacija, ledger označava kao validiran.</p>
</li>
</ol>
<p>Transakcije koje nisu izabrane ne moraju biti neispravne. Mogle su jednostavno stići prekasno da budu uključene u konkretan krug. Takve transakcije mogu ostati kandidati za naredni ledger.</p>
<p>Prema dokumentovanom bezbednosnom modelu, konsenzus može normalno napredovati dok je manje od 20 procenata pouzdanih validatora neispravno. Ako je neispravno više od 20, ali manje od 80 procenata, očekivani bezbedni ishod je prekid napredovanja umesto potvrđivanja konfliktne istorije. Za potvrđivanje neispravnog stanja bilo bi potrebno da više od 80 procenata relevantnog pouzdanog skupa sarađuje u napadu.</p>
<p>U praksi, performanse i sigurnost zavise od mrežne povezanosti, kvaliteta validatora, preklapanja UNL lista i pravilne konfiguracije servera.</p>
<h3>Finalnost nije isto što i odgovor <code>submit</code></h3>
<p>XRPL API može vratiti privremeni rezultat čim server lokalno proceni transakciju. Taj rezultat nije konačan.</p>
<p>Na primer, <code>tesSUCCESS</code> iz prvog odgovora znači da je transakcija prošla lokalnu preliminarnu procenu. Ne znači automatski da se već nalazi u validiranom ledgeru.</p>
<p>Rezultat je autoritativan tek kada su ispunjena oba uslova:</p>
<ul>
<li><p>transakcija se nalazi u validiranom ledgeru</p>
</li>
<li><p>njen konačni <code>TransactionResult</code> je <code>tesSUCCESS</code></p>
</li>
</ul>
<p>Validirani ledger može sadržati i neuspešne transakcije sa <code>tec</code> kodovima. One nisu izvršile željenu operaciju, ali su uključene u ledger, potrošile su <code>Sequence</code> i uništile transaction cost.</p>
<h2>Kanonski redosled transakcija</h2>
<p>Čvorovi ne moraju primiti kandidat transakcije istim redosledom. Kada je konačni skup za naredni ledger poznat, protokol ih uređuje kanonskim algoritmom pre izvršavanja.</p>
<p>To znači da redosled preliminarnog izvršavanja na jednom serveru ne mora biti isti kao konačni redosled u validiranom ledgeru.</p>
<p>Posledica je bitna kod:</p>
<ul>
<li><p>DEX trgovanja</p>
</li>
<li><p>cross-currency plaćanja</p>
</li>
<li><p>konkurentnog korišćenja iste likvidnosti</p>
</li>
<li><p>više transakcija sa istog naloga</p>
</li>
<li><p>promene balansa ili trust line stanja u istom ledgeru</p>
</li>
</ul>
<p>Zbog toga preliminarno uspešna razmena može dobiti drugačiji konačni kurs ili konačno propasti kada se primeni u kanonskom redosledu. Produkcioni sistem nikada ne bi trebalo da knjiži rezultat na osnovu nevalidiranog odgovora.</p>
<h2>Anatomija XRPL naloga</h2>
<p>XRPL nalog se u osnovi predstavlja <code>AccountRoot</code> objektom. On, između ostalog, sadrži:</p>
<ul>
<li><p>adresu naloga</p>
</li>
<li><p>XRP balans u drops jedinicama</p>
</li>
<li><p>trenutni <code>Sequence</code></p>
</li>
<li><p>broj objekata koji utiču na rezervu</p>
</li>
<li><p>aktivne account flags</p>
</li>
<li><p>regular key, ako postoji</p>
</li>
<li><p>prethodni transaction ID i ledger indeks</p>
</li>
</ul>
<p>Generisanje key paira i adrese samo po sebi ne kreira nalog u ledgeru. Adresa može matematički postojati, ali dobija <code>AccountRoot</code> objekat tek kada primi dovoljno XRP-a da zadovolji base reserve.</p>
<h3>Classic address i X-address</h3>
<p>Classic adresa je Base58 reprezentacija Account ID-ja sa checksumom i najčešće počinje slovom <code>r</code>.</p>
<p>X-address kombinuje classic adresu, opcioni destination tag i identifikator mreže. Korisna je za UX jer smanjuje mogućnost da korisnik kopira adresu, a zaboravi destination tag.</p>
<p>Na nivou protokola transakcije i dalje koriste odvojena polja <code>Destination</code> i <code>DestinationTag</code>. SDK može konvertovati X-address u taj oblik.</p>
<h3><code>Sequence</code></h3>
<p>Svaki nalog ima <code>Sequence</code> broj. Transakcija iz tog naloga obično mora da koristi tačno očekivanu sledeću vrednost.</p>
<p>Kada transakcija bude uključena u validirani ledger, <code>Sequence</code> se troši čak i ako je konačni rezultat <code>tec</code> greška. Na taj način dve transakcije istog naloga sa istom sequence vrednošću ne mogu obe biti izvršene.</p>
<p>To obezbeđuje zaštitu od replay napada i dozvoljava bezbedno ponovno slanje istog potpisanog transaction bloba. Ista transakcija neće drugi put proizvesti isti transfer.</p>
<p>Za paralelno slanje većeg broja transakcija aplikacija mora da upravlja sequence brojevima ili da koristi <code>Ticket</code> objekte, koji unapred rezervišu redne brojeve za buduće transakcije.</p>
<h2>Ključevi i autorizacija</h2>
<p>XRPL podržava <code>secp256k1</code> i <code>Ed25519</code> ključeve. Aktuelni <code>xrpl.js</code> podrazumevano koristi Ed25519 za generisanje novčanika, dok pojedini <code>xrpld</code> administrativni alati mogu imati drugačiji podrazumevani algoritam.</p>
<p>Jedan nalog može imati tri modela autorizacije:</p>
<ul>
<li><p>master key</p>
</li>
<li><p>regular key</p>
</li>
<li><p>signer list za multisigning</p>
</li>
</ul>
<p>Master key je intrinzično povezan sa adresom naloga i ne može se zameniti. Može se deaktivirati, ali to ne treba raditi pre nego što je konfigurisan drugi način autorizacije.</p>
<p>Regular key je sekundarni key pair koji se može promeniti transakcijom <code>SetRegularKey</code>. U produkciji je razumno držati master key offline, a svakodnevne transakcije potpisivati regular keyem.</p>
<p>Multisigning omogućava definisanje signer liste, težine svakog signera i potrebnog kvoruma. To je korisno za:</p>
<ul>
<li><p>kompanijski treasury</p>
</li>
<li><p>razdvajanje development i operations pristupa</p>
</li>
<li><p>potpisivanje sa više uređaja</p>
</li>
<li><p>recovery proceduru</p>
</li>
<li><p>smanjenje rizika jednog kompromitovanog ključa</p>
</li>
</ul>
<p>Multisigned transakcije imaju veći transaction cost jer fee zavisi od broja potpisa.</p>
<p>Privatni ključ ili seed ne treba slati <code>xrpld</code> serveru. Potpisivanje treba raditi lokalno, u izolovanom signer servisu, hardverskom uređaju ili odgovarajućem key management sistemu.</p>
<h2>Kako izgleda XRPL transakcija</h2>
<p>Sve transakcije dele skup zajedničkih polja:</p>
<ul>
<li><p><code>TransactionType</code></p>
</li>
<li><p><code>Account</code></p>
</li>
<li><p><code>Fee</code></p>
</li>
<li><p><code>Sequence</code></p>
</li>
<li><p><code>Flags</code></p>
</li>
<li><p><code>LastLedgerSequence</code></p>
</li>
<li><p><code>SourceTag</code></p>
</li>
<li><p><code>SigningPubKey</code></p>
</li>
<li><p><code>TxnSignature</code></p>
</li>
</ul>
<p>Dodatna polja zavise od transakcionog tipa. <code>Payment</code>, na primer, zahteva destinaciju i iznos. <code>OfferCreate</code> koristi <code>TakerGets</code> i <code>TakerPays</code>. <code>TrustSet</code> koristi <code>LimitAmount</code>.</p>
<p>Minimalna direktna XRP uplata pre autofilla može izgledati ovako:</p>
<pre><code class="language-json">{
    "TransactionType": "Payment",
    "Account": "rSenderAddress",
    "Destination": "rReceiverAddress",
    "Amount": "2500000"
}
</code></pre>
<p><code>Amount</code> je string jer predstavlja celobrojnu količinu drops jedinica. Jedan XRP ima 1.000.000 drops, pa je <code>2500000</code> jednako 2,5 XRP.</p>
<p>Polja kao što su <code>Fee</code>, <code>Sequence</code> i <code>LastLedgerSequence</code> SDK može automatski popuniti na osnovu trenutnog stanja mreže.</p>
<h3>Potpis menja prirodu objekta</h3>
<p>Pre potpisivanja transakcija je samo instrukcija u JSON obliku.</p>
<p>SDK je zatim:</p>
<ol>
<li><p>serijalizuje u kanonski binarni format</p>
</li>
<li><p>izračunava sadržaj za potpisivanje</p>
</li>
<li><p>pravi digitalni potpis</p>
</li>
<li><p>dodaje potpis i javni ključ</p>
</li>
<li><p>vraća <code>tx_blob</code> i hash transakcije</p>
</li>
</ol>
<p>Posle potpisivanja nijedno polje ne može da se promeni bez poništavanja potpisa. To uključuje <code>Fee</code>, <code>Sequence</code>, <code>Destination</code>, <code>Amount</code> i <code>LastLedgerSequence</code>.</p>
<p>Backend zato ne treba da dozvoli da se neproveren transaction blob potpisuje generičkim hot wallet servisom. Signer bi pre potpisivanja trebalo da proveri dozvoljeni tip transakcije, destinaciju, maksimalni iznos, fee i mrežni identifikator.</p>
<h2>Pouzdano slanje transakcija</h2>
<p>Naivni workflow izgleda ovako:</p>
<ol>
<li><p>Pošalji transakciju.</p>
</li>
<li><p>Ako stigne timeout, pošalji novu.</p>
</li>
</ol>
<p>To je opasno. Timeout ne znači da prva transakcija nije stigla do mreže. Moguće je da je uspešno validirana, a da je samo odgovor izgubljen. Slanje nove, semantički iste transakcije sa novim <code>Sequence</code> brojem može napraviti duplu uplatu.</p>
<p>Pouzdan workflow je:</p>
<ol>
<li><p>Učitaj poslednje validirano stanje naloga.</p>
</li>
<li><p>Napravi transakciju sa <code>Sequence</code> i <code>LastLedgerSequence</code>.</p>
</li>
<li><p>Potpiši je lokalno.</p>
</li>
<li><p>Pre slanja trajno sačuvaj hash, blob, sequence i expiration.</p>
</li>
<li><p>Pošalji isti potpisani blob.</p>
</li>
<li><p>Traži transakciju po hashu.</p>
</li>
<li><p>Knjiži rezultat samo ako je <code>validated: true</code>.</p>
</li>
<li><p>Ako transakcija nije pronađena, čekaj dok mreža ne validira <code>LastLedgerSequence</code>.</p>
</li>
<li><p>Tek kada je taj ledger prošao i server ima kontinuiranu istoriju, tretiraj transakciju kao definitivno neizvršenu.</p>
</li>
</ol>
<p><code>LastLedgerSequence</code> sprečava da zaboravljena transakcija neočekivano bude izvršena mnogo kasnije. Zvanična preporuka za automatizovane procese je da se postavi nekoliko ledger verzija posle poslednjeg validiranog ledgera. Aktuelni SDK autofill može da izračuna razumnu vrednost.</p>
<p>Produkciona baza bi za svaku odlaznu transakciju trebalo da pamti najmanje:</p>
<pre><code class="language-text">application_id
transaction_hash
signed_blob
source_account
sequence
last_ledger_sequence
first_seen_ledger
final_ledger
final_result
created_at
validated_at
</code></pre>
<p><code>application_id</code> je interni idempotency ključ. <code>transaction_hash</code> je on-chain identitet. Ne treba ih mešati.</p>
<h2>Prva integracija pomoću <code>xrpl.js</code></h2>
<p>Zvanični JavaScript i TypeScript SDK zove se <code>xrpl.js</code>, a NPM paket <code>xrpl</code>. Aktuelna dokumentacija zahteva Node.js 20 ili noviji, dok repozitorijum preporučuje Node.js 22.</p>
<p>Instalacija:</p>
<pre><code class="language-bash">npm install xrpl
</code></pre>
<p>Sledeći primer koristi Testnet faucet, kreira dva test naloga, šalje 2,5 test XRP-a i čeka validirani rezultat:</p>
<pre><code class="language-js">import xrpl from "xrpl"

const client = new xrpl.Client(
    "wss://s.altnet.rippletest.net:51233"
)

async function main() {
    await client.connect()

    const { wallet: sender } = await client.fundWallet()
    const { wallet: receiver } = await client.fundWallet()

    const payment = {
        TransactionType: "Payment",
        Account: sender.address,
        Destination: receiver.address,
        DestinationTag: 104857,
        Amount: xrpl.xrpToDrops("2.5")
    }

    const response = await client.submitAndWait(payment, {
        autofill: true,
        wallet: sender
    })

    const meta = response.result.meta

    if (
        typeof meta !== "object" ||
        meta.TransactionResult !== "tesSUCCESS"
    ) {
        throw new Error("Payment nije uspešno validiran")
    }

    console.log({
        hash: response.result.hash,
        ledgerIndex: response.result.ledger_index,
        result: meta.TransactionResult,
        balanceChanges: xrpl.getBalanceChanges(meta)
    })

    await client.disconnect()
}

main().catch(async error =&gt; {
    console.error(error)

    if (client.isConnected()) {
        await client.disconnect()
    }

    process.exitCode = 1
})
</code></pre>
<p><code>submitAndWait</code> u ovom obliku radi autofill, potpisivanje, slanje i čekanje rezultata. To je praktično za Testnet i jednostavne integracije.</p>
<p>Produkcioni sistem bi obično razdvojio ove korake:</p>
<pre><code class="language-js">const prepared = await client.autofill(payment)
const signed = signer.sign(prepared)

await transactionStore.save({
    hash: signed.hash,
    blob: signed.tx_blob,
    sequence: prepared.Sequence,
    lastLedgerSequence: prepared.LastLedgerSequence
})

const response = await client.submitAndWait(signed.tx_blob)
</code></pre>
<p>Poenta nije u većem broju linija koda, nego u tome da potpisani blob bude trajno sačuvan pre mrežnog poziva. Ako proces padne posle slanja, isti blob može ponovo da se pošalje i proveri bez rizika da ista transakcija bude izvršena dvaput.</p>
<h2>Destination tag nije memo</h2>
<p>Berze, procesori plaćanja i custodial sistemi često koriste jednu XRPL adresu za veliki broj korisnika. <code>DestinationTag</code> je 32-bitni nenegativni broj kojim primalac mapira uplatu na internog korisnika, invoice ili drugi poslovni objekat.</p>
<p>Tag nema ugrađenu ekonomsku semantiku. Ledger ne zna da broj <code>104857</code> predstavlja korisnika ili porudžbinu. To zna samo sistem primaoca.</p>
<p>Ako shared adresa primi uplatu bez taga, sredstva jesu stigla, ali aplikacija možda ne zna kome pripadaju.</p>
<p>Nalog može da uključi <code>RequireDest</code> opciju. Tada mreža odbija uplate bez destination taga, što je obično razumnije od ručnog rešavanja neidentifikovanih depozita.</p>
<p>Za payment procesor dobar model je:</p>
<ul>
<li><p>generisati nepredvidiv tag za svaki invoice ili korisnika</p>
</li>
<li><p>proveriti kolizije pre dodele</p>
</li>
<li><p>ne dodeljivati tagove strogo sekvencijalno</p>
</li>
<li><p>čuvati istoriju korišćenih tagova</p>
</li>
<li><p>nikada ne reciklirati aktivni tag</p>
</li>
<li><p>koristiti <code>RequireDest</code> na shared deposit nalogu</p>
</li>
<li><p>prikazati X-address tamo gde wallet podržava taj format</p>
</li>
</ul>
<p>Tag je javan. Sekvencijalni tagovi mogu olakšati posmatraču da procenjuje broj korisnika ili povezuje transakcije.</p>
<h2>Partial payment napad</h2>
<p>Jedna od najvažnijih produkcionih zamki jeste pogrešno čitanje <code>Payment</code> transakcije sa <code>tfPartialPayment</code> flagom.</p>
<p>Kod obične uplate <code>Amount</code>, odnosno <code>DeliverMax</code> u API v2 terminologiji, predstavlja očekivani iznos isporuke. Kod partial paymenta to je maksimalna vrednost koju transakcija pokušava da isporuči, a ne nužno stvarno primljeni iznos.</p>
<p>Napadač može napraviti transakciju koja u <code>DeliverMax</code> polju navodi veoma veliki broj, ali stvarno isporuči minimalan iznos. Ako payment procesor pročita samo transaction JSON i vidi <code>tesSUCCESS</code>, može pogrešno knjižiti veliki depozit.</p>
<p>Stvarno isporučenu vrednost treba čitati iz <code>delivered_amount</code> polja validirane transaction metadata strukture.</p>
<p>Pravilo za payment backend je jednostavno:</p>
<ul>
<li><p>ne knjiži nevalidiranu transakciju</p>
</li>
<li><p>ne veruj samo <code>DeliverMax</code> ili starijem <code>Amount</code> polju</p>
</li>
<li><p>čitaj <code>delivered_amount</code> iz metadata</p>
</li>
<li><p>proveri valutu i issuer</p>
</li>
<li><p>proveri destinaciju i destination tag</p>
</li>
<li><p>proveri da transakcija nije već obrađena</p>
</li>
<li><p>proveri konačni <code>TransactionResult</code></p>
</li>
</ul>
<p>Ovo je jedan od razloga zašto se u produkciji čuva kompletna transaction metadata, a ne samo hash i iznos iz zahteva.</p>
<h2>XRP plaćanja i cross-currency plaćanja</h2>
<p>Direktan XRP transfer je najjednostavniji payment oblik. Pošiljalac navodi destinaciju i iznos u drops jedinicama.</p>
<p>XRPL <code>Payment</code> može, međutim, da radi i konverziju.</p>
<p>Pošiljalac može trošiti jedan asset, a primalac dobiti drugi. Mreža koristi payment paths, otvorene DEX ponude i dostupnu likvidnost da pronađe put između početnog i krajnjeg asseta.</p>
<p>Relevantna polja uključuju:</p>
<ul>
<li><p><code>DeliverMax</code> za maksimalan iznos koji se isporučuje</p>
</li>
<li><p><code>SendMax</code> za maksimalan iznos koji pošiljalac želi da potroši</p>
</li>
<li><p><code>DeliverMin</code> za minimalnu prihvatljivu isporuku kod partial paymenta</p>
</li>
<li><p><code>Paths</code> za eksplicitne payment putanje</p>
</li>
<li><p><code>Flags</code> za ponašanje plaćanja</p>
</li>
</ul>
<p>Cross-currency payment može atomski potrošiti više DEX ponuda. Ili se kompletno izvrši prema dozvoljenim ograničenjima, ili ne daje aplikaciji parcijalno stanje više nezavisnih trgovina koje mora naknadno da usklađuje.</p>
<p>To je korisno za scenario u kojem korisnik plaća u jednom assetu, a trgovac želi drugi. Ipak, integracija mora postaviti granice prihvatljivog kursa. Slanje bez odgovarajućeg <code>SendMax</code>, <code>DeliverMin</code> ili quality ograničenja može izložiti korisnika lošoj likvidnosti i neželjenom kursu.</p>
<h2>XRP i izdati tokeni nisu ista vrsta asseta</h2>
<p>XRP je nativan deo protokola:</p>
<ul>
<li><p>nema issuer adresu</p>
</li>
<li><p>ne zahteva trust line</p>
</li>
<li><p>koristi se za transaction cost</p>
</li>
<li><p>koristi se za reserve requirement</p>
</li>
<li><p>ne može biti zamrznut ili clawbackovan od strane izdavaoca</p>
</li>
<li><p>izražava se kao celobrojni broj drops jedinica</p>
</li>
</ul>
<p>Ostali asseti predstavljaju tokene koje izdaje određeni nalog.</p>
<p>Kod klasičnog trust line tokena identitet asseta nije samo <code>USD</code> ili <code>EUR</code>. Identitet je kombinacija:</p>
<pre><code class="language-text">currency code + issuer address
</code></pre>
<p>Dva tokena sa oznakom <code>USD</code>, ali različitim issuer adresama, jesu dva različita asseta i mogu imati potpuno drugačiji rizik, likvidnost i mogućnost otkupa.</p>
<h3>Trust lines</h3>
<p>Trust line je bilateralni ledger odnos predstavljen <code>RippleState</code> objektom. Njegova osnovna svrha je da spreči da neko drugi natera nalog da drži token koji nije prihvatio.</p>
<p>Holder obično šalje <code>TrustSet</code> transakciju i navodi:</p>
<ul>
<li><p>currency code</p>
</li>
<li><p>issuer adresu</p>
</li>
<li><p>limit</p>
</li>
<li><p>opcione trust line postavke</p>
</li>
</ul>
<p>Tek tada može da primi token tog issuera.</p>
<p>Tokeni se ne „deployuju“ kao ERC-20 ugovor. Issuer konfiguriše svoj nalog i izdaje jedinice slanjem <code>Payment</code> transakcije kroz odgovarajuću trust line strukturu. Vraćanje tokena issueru može predstavljati njihovo uništavanje.</p>
<p>Issuer može konfigurisati ponašanja kao što su:</p>
<ul>
<li><p>authorized trust lines</p>
</li>
<li><p>global freeze</p>
</li>
<li><p>pojedinačni freeze</p>
</li>
<li><p>transfer fee</p>
</li>
<li><p>clawback, ako je odgovarajuća opcija unapred omogućena</p>
</li>
<li><p>default rippling</p>
</li>
</ul>
<p>Ove mogućnosti su korisne za regulisane assete, ali predstavljaju i dodatni trust model. Holder ne zavisi samo od blockchain konsenzusa, nego i od solvencije, bezbednosti i pravila konkretnog issuera.</p>
<h3>Multi-Purpose Tokens</h3>
<p>MPT je noviji model fungibilnih tokena, projektovan na osnovu iskustava sa klasičnim trust line tokenima.</p>
<p>Umesto bilateralnog <code>RippleState</code> objekta, MPT koristi eksplicitne <code>MPTokenIssuance</code> i <code>MPToken</code> objekte. Model ima jasnije odvojenu definiciju emisije od holder stanja i podržava issuer kontrole namenjene institucionalnim i asset-backed tokenima.</p>
<p>Dostupnost konkretne MPT funkcije zavisi od amendmenta aktivnih na mreži i verzije servera. Na primer, MPTokensV1 podržava direktne transfere, dok je puna integracija MPT-a sa DEX funkcijama zasebna evolucija protokola.</p>
<p>Developer ne bi trebalo da pretpostavi da je funkcija aktivna samo zato što postoji u SDK tipovima ili dokumentaciji. Pre korišćenja nove funkcije treba proveriti:</p>
<ul>
<li><p>status amendmenta na ciljnoj mreži</p>
</li>
<li><p><code>server_info</code> verziju servera</p>
</li>
<li><p>podršku provajdera</p>
</li>
<li><p>podršku korišćenog SDK izdanja</p>
</li>
<li><p>ponašanje na Testnetu i Mainnetu</p>
</li>
</ul>
<h2>Ugrađeni DEX</h2>
<p>XRPL ima ugrađeni central limit order book DEX. Njegova logika nije implementirana smart contractom, već u samom transaction engineu.</p>
<p>Nalog za trgovanje naziva se <code>Offer</code>, a kreira se transakcijom <code>OfferCreate</code>.</p>
<p>Najvažnija polja su:</p>
<ul>
<li><p><code>TakerGets</code></p>
</li>
<li><p><code>TakerPays</code></p>
</li>
<li><p><code>Expiration</code></p>
</li>
<li><p><code>OfferSequence</code></p>
</li>
<li><p>flags koji određuju buy, sell, passive ili fill-or-kill ponašanje</p>
</li>
</ul>
<p>Nazivi <code>TakerGets</code> i <code>TakerPays</code> posmatrani su iz perspektive budućeg takera. To je čest izvor grešaka u integracijama.</p>
<p>Ako maker želi da proda 20 jedinica tokena TST i dobije 4 XRP, njegova ponuda konceptualno izgleda ovako:</p>
<pre><code class="language-json">{
    "TransactionType": "OfferCreate",
    "Account": "rMakerAddress",
    "TakerGets": {
        "currency": "TST",
        "issuer": "rIssuerAddress",
        "value": "20"
    },
    "TakerPays": "4000000"
}
</code></pre>
<p>Kada se <code>OfferCreate</code> izvršava, engine prvo pokušava da ponudu ukrsti sa postojećim ponudama. Ako nije potpuno ispunjena, ostatak postaje <code>Offer</code> objekat u ledgeru.</p>
<p>Otvoreni offer utiče na owner reserve naloga. Kada bude popunjen, otkazan ili uklonjen kao istekao ili nefundiran, odgovarajući deo rezerve se ponovo oslobađa.</p>
<h3>Nefundirane ponude</h3>
<p>XRPL ne uklanja odmah svaki offer čiji vlasnik više nema dovoljan balans.</p>
<p>Takav offer može ostati u ledgeru dok ga neka naredna transakcija ne dotakne. Zbog toga aplikacija koja prikazuje order book ne treba slepo da sabira deklarisane količine.</p>
<p><code>book_offers</code> odgovor može sadržati funded vrednosti koje pokazuju koliko je ponuda stvarno pokrivena. Trading servis bi trebalo da prati i transaction stream kako bi ažurirao ponude koje se menjaju.</p>
<h3>Auto-bridging kroz XRP</h3>
<p>Ako direktan market između dva tokena nema dovoljno likvidnosti, XRPL može kombinovati:</p>
<pre><code class="language-text">Token A -&gt; XRP -&gt; Token B
</code></pre>
<p>Ako je kombinovani kurs bolji od direktnog order booka, engine može koristiti direktne i XRP-bridged ponude u istoj transakciji.</p>
<p>To se automatski koristi kod <code>OfferCreate</code> trgovanja. Cross-currency payment može postići sličan rezultat preko pathfindinga.</p>
<p>XRP zato može imati ulogu bridge asseta, ali to nije garantovano niti obavezno. Engine bira dostupne putanje u okviru pravila i ograničenja transakcije.</p>
<h2>AMM kao deo istog DEX-a</h2>
<p>XRPL podržava i nativne automated market maker poolove. Svaki AMM sadrži dva asseta, od kojih najviše jedan može biti XRP.</p>
<p>Liquidity provider deponuje sredstva kroz <code>AMMDeposit</code> i dobija LP tokene. LP tokeni predstavljaju proporcionalni udeo u poolu i pravo na povlačenje dela sredstava i prikupljenih naknada.</p>
<p>AMM podržava:</p>
<ul>
<li><p>kreiranje poola</p>
</li>
<li><p>depozit i povlačenje likvidnosti</p>
</li>
<li><p>zamenu između dva asseta</p>
</li>
<li><p>glasanje o trading fee vrednosti</p>
</li>
<li><p>aukciju privremenog fee popusta</p>
</li>
<li><p>automatsko kombinovanje sa order book likvidnošću</p>
</li>
</ul>
<p>Kada se izvršava trgovanje, jedna transakcija može koristiti:</p>
<ul>
<li><p>samo CLOB ponude</p>
</li>
<li><p>samo AMM</p>
</li>
<li><p>kombinaciju CLOB ponuda i AMM likvidnosti</p>
</li>
</ul>
<p>Engine bira dostupnu kombinaciju prema efektivnom kursu i naknadama.</p>
<p>Za developera je značajno to što nema zasebnog router contracta koji mora da pozove. Ista ledger infrastruktura razume i offer i AMM likvidnost.</p>
<p>To ipak ne uklanja ekonomske rizike. Liquidity provider je i dalje izložen promeni relativne cene asseta, kvalitetu issuera, transfer fee pravilima, tankoj likvidnosti i gubitku u odnosu na pasivno držanje asseta.</p>
<h2>Escrow, payment channels i čekovi</h2>
<p>XRPL nudi više payment primitiva koji rešavaju različite probleme.</p>
<h3>Escrow</h3>
<p><code>EscrowCreate</code> zaključava sredstva do vremena ili kriptografskog uslova.</p>
<p>Relevantni transakcioni tipovi su:</p>
<ul>
<li><p><code>EscrowCreate</code></p>
</li>
<li><p><code>EscrowFinish</code></p>
</li>
<li><p><code>EscrowCancel</code></p>
</li>
</ul>
<p>Escrow može imati:</p>
<ul>
<li><p><code>FinishAfter</code>, vreme posle kojeg se može završiti</p>
</li>
<li><p><code>CancelAfter</code>, vreme posle kojeg se može otkazati</p>
</li>
<li><p><code>Condition</code>, kriptografski uslov</p>
</li>
<li><p>fulfillment koji dokazuje ispunjenje uslova</p>
</li>
</ul>
<p>To je korisno kada sredstva treba zaključati bez pisanog escrow smart contracta.</p>
<h3>Payment channels</h3>
<p>Payment channel zaključava XRP on-chain, ali omogućava velikom broju plaćanja da se autorizuju off-chain.</p>
<p>Pošiljalac potpisuje kumulativne claim poruke. Primalac ne mora svaki claim odmah da šalje mreži. Kasnije može da podnese najnoviji validan claim i preuzme odgovarajući iznos.</p>
<p>To je pogodno za:</p>
<ul>
<li><p>streaming naplatu</p>
</li>
<li><p>naplatu po API zahtevu</p>
</li>
<li><p>mikroplaćanja</p>
</li>
<li><p>veliki broj malih transfera između istih strana</p>
</li>
</ul>
<p>Payment channel je jednosmeran. Za dvosmerni tok potrebna su dva kanala ili drugačiji aplikativni model.</p>
<h3>Checks</h3>
<p>XRPL Check funkcioniše približno kao autorizacija primaocu da kasnije povuče sredstva, uz ograničenja definisana pri kreiranju.</p>
<p>Sredstva nisu zaključana unapred kao kod escrowa. <code>CheckCash</code> može propasti ako nalog u trenutku naplate nema dovoljan balans ili odgovarajuću token likvidnost.</p>
<p>Zato ček nije garancija plaćanja, već odložena autorizacija.</p>
<h2>Koliko košta korišćenje XRPL-a</h2>
<p>XRPL ima dva različita troškovna mehanizma:</p>
<ol>
<li><p>transaction cost</p>
</li>
<li><p>reserve requirement</p>
</li>
</ol>
<p>Njih ne treba sabirati kao da su ista vrsta troška.</p>
<h3>Transaction cost</h3>
<p>Svaka transakcija navodi <code>Fee</code> u drops jedinicama. Taj XRP se ne isplaćuje validatoru, operatoru servera ili protokolarnom treasuryju. Trajno se uništava.</p>
<p>Prema aktuelnoj dokumentaciji proverenoj u septembru 2026, minimalni trošak standardne transakcije je 10 drops, odnosno 0,00001 XRP. Vrednost može rasti kada je server ili mreža pod opterećenjem.</p>
<p>Neke transakcije imaju poseban osnovni trošak:</p>
<table>
<thead>
<tr>
<th>Transakcija</th>
<th>Osnovni trošak pre load scalinga</th>
</tr>
</thead>
<tbody><tr>
<td>Većina standardnih transakcija</td>
<td>10 drops</td>
</tr>
<tr>
<td>Multisigned transakcija</td>
<td>10 drops puta 1 plus broj potpisa</td>
</tr>
<tr>
<td><code>AccountDelete</code></td>
<td>200.000 drops</td>
</tr>
<tr>
<td><code>AMMCreate</code></td>
<td>200.000 drops</td>
</tr>
<tr>
<td><code>EscrowFinish</code> sa fulfillmentom</td>
<td>Zavisi od veličine fulfillmenta</td>
</tr>
<tr>
<td><code>Batch</code></td>
<td>Zbir spoljnog i unutrašnjih fee vrednosti</td>
</tr>
</tbody></table>
<p>Aplikacija ne treba trajno da hardkoduje minimalni fee kao jedinu dozvoljenu vrednost. Aktuelna cena može se dobiti metodom <code>fee</code>, dok <code>server_info</code> i <code>server_state</code> daju detalje o baznom fee-ju i load factoru.</p>
<p>Primer:</p>
<pre><code class="language-js">const response = await client.request({
    command: "fee"
})

console.log(response.result.drops)
</code></pre>
<p>SDK autofill obično računa odgovarajući <code>Fee</code>, ali backend treba da postavi maksimalan prihvatljiv fee. U suprotnom pogrešna konfiguracija ili kompromitovan server mogu navesti signer da potpiše nepotrebno visok iznos.</p>
<h3>Reserve requirement</h3>
<p>Reserve requirement ograničava nekontrolisan rast globalnog ledger stanja.</p>
<p>Prema aktuelnom Mainnet stanju navedenom u dokumentaciji iz septembra 2026:</p>
<ul>
<li><p>base reserve iznosi 1 XRP po nalogu</p>
</li>
<li><p>owner reserve iznosi 0,2 XRP po relevantnom objektu</p>
</li>
</ul>
<p>Rezerva se ne uništava. Ona ostaje deo XRP balansa, ali nije raspoloživa za običan transfer dok objekti koji je zahtevaju postoje.</p>
<p>Ako nalog ima:</p>
<ul>
<li><p>base reserve od 1 XRP</p>
</li>
<li><p>tri otvorena offera</p>
</li>
<li><p>dve trust line stavke koje se računaju u owner reserve</p>
</li>
</ul>
<p>potrebna rezerva je:</p>
<pre><code class="language-text">1 XRP + 5 × 0,2 XRP = 2 XRP
</code></pre>
<p>Kada nalog otkaže offer ili ukloni trust line, odgovarajući deo XRP-a ponovo postaje raspoloživ.</p>
<p>Postoje izuzeci i detalji zavisni od tipa objekta. Aktuelna pravila, na primer, omogućavaju prva dva trust linea pod posebnim uslovima bez dodatnog owner reserve zahteva. Zato wallet ne treba da procenjuje rezervu samo brojanjem objekata, već da koristi aktuelna protokolarna pravila i podatke sa servera.</p>
<p>Reserve vrednosti mogu se promeniti validatorskim glasanjem. Aplikacija ne treba da ih tretira kao večne konstante.</p>
<h3>Trošak izražen u fiat valuti</h3>
<p>Nije korektno tvrditi da transakcija uvek košta određeni broj centi, jer fiat cena zavisi od tržišne cene XRP-a i trenutnog load scalinga.</p>
<p>Tehnički preciznije je reći:</p>
<pre><code class="language-text">trošak = Fee u drops jedinicama
fiat trošak = Fee × aktuelna tržišna cena XRP-a
</code></pre>
<p>Pored mrežnog troška, proizvod može imati dodatne troškove:</p>
<ul>
<li><p>RPC ili infrastruktura provajdera</p>
</li>
<li><p>sopstveni <code>xrpld</code> server</p>
</li>
<li><p>Clio i baza za istorijske podatke</p>
</li>
<li><p>custody ili HSM</p>
</li>
<li><p>kupovina i povlačenje asseta sa berze</p>
</li>
<li><p>issuer transfer fee</p>
</li>
<li><p>AMM trading fee</p>
</li>
<li><p>spread i slippage</p>
</li>
<li><p>compliance i operativni troškovi</p>
</li>
</ul>
<p>Nizak protocol fee zato nije isto što i nulti ukupan trošak proizvoda.</p>
<h2>Realan use-case: payout servis za marketplace</h2>
<p>Zamislimo marketplace koji isplaćuje međunarodne saradnike u XRP-u ili podržanom tokenizovanom assetu.</p>
<p>Sistem ima:</p>
<ul>
<li><p>treasury nalog sa većim balansom</p>
</li>
<li><p>ograničeni operational hot wallet</p>
</li>
<li><p>signer servis odvojen od aplikacionog backend servisa</p>
</li>
<li><p>bazu payout naloga</p>
</li>
<li><p>XRPL event consumer</p>
</li>
<li><p>reconciliation worker</p>
</li>
<li><p>jedan ili više pouzdanih API servera</p>
</li>
</ul>
<h3>Korak 1: Kreiranje payout zahteva</h3>
<p>Aplikacija pravi interni zapis:</p>
<pre><code class="language-json">{
    "payoutId": "po_01JXYZ",
    "destination": "rReceiverAddress",
    "destinationTag": 78120419,
    "asset": {
        "type": "XRP"
    },
    "amount": "25.5",
    "status": "pending"
}
</code></pre>
<p>Za izdati token zapis mora sadržati i currency code i tačnu issuer adresu. Simbol tokena nije dovoljan identitet.</p>
<h3>Korak 2: Provera poslovnih ograničenja</h3>
<p>Pre kreiranja transakcije backend proverava:</p>
<ul>
<li><p>da je payout odobren</p>
</li>
<li><p>da destinacija ima ispravan format</p>
</li>
<li><p>da li destinacija zahteva tag</p>
</li>
<li><p>dnevne i pojedinačne limite</p>
</li>
<li><p>da payout nije već izvršen</p>
</li>
<li><p>da operational wallet ima dovoljan raspoloživi balans</p>
</li>
<li><p>da balance ostaje iznad potrebne rezerve</p>
</li>
<li><p>da je asset dozvoljen</p>
</li>
<li><p>da issuer odgovara očekivanom issueru</p>
</li>
</ul>
<h3>Korak 3: Konstrukcija i simulacija</h3>
<p>Backend konstruiše unsigned transaction objekat i, za novije ili složenije flowove, može koristiti <code>simulate</code> pre potpisivanja.</p>
<p>Simulacija je korisna za otkrivanje:</p>
<ul>
<li><p>neispravnog polja</p>
</li>
<li><p>nedovoljne rezerve</p>
</li>
<li><p>nepostojećeg naloga</p>
</li>
<li><p>neodgovarajuće trust line konfiguracije</p>
</li>
<li><p>neprihvatljivog fee-ja</p>
</li>
<li><p>problema sa deposit authorizationom</p>
</li>
</ul>
<p>Simulacija ne rezerviše stanje. Druga transakcija može promeniti balans ili likvidnost pre stvarnog izvršenja.</p>
<h3>Korak 4: Autofill i policy provera</h3>
<p>Backend ili signer dobija:</p>
<ul>
<li><p><code>Sequence</code></p>
</li>
<li><p><code>Fee</code></p>
</li>
<li><p><code>LastLedgerSequence</code></p>
</li>
</ul>
<p>Signer pre potpisa proverava policy:</p>
<pre><code class="language-text">TransactionType mora biti Payment
Account mora biti operational wallet
Destination mora biti dozvoljen
Amount mora biti ispod limita
Fee mora biti ispod maksimalne vrednosti
LastLedgerSequence mora biti razumno blizu
Mreža mora biti očekivani Mainnet
</code></pre>
<p>Signer ne bi trebalo da potpisuje proizvoljan JSON koji dobije od javnog API-ja.</p>
<h3>Korak 5: Trajno čuvanje potpisanog bloba</h3>
<p>Pre slanja se čuvaju:</p>
<ul>
<li><p>transaction hash</p>
</li>
<li><p>signed blob</p>
</li>
<li><p>sequence</p>
</li>
<li><p>last ledger sequence</p>
</li>
<li><p>payout ID</p>
</li>
<li><p>vreme potpisivanja</p>
</li>
</ul>
<p>Tek tada se transakcija šalje mreži.</p>
<h3>Korak 6: Praćenje validacije</h3>
<p>Event consumer može da sluša transaction stream radi brzog UX ažuriranja. Ipak, stream ne treba da bude jedini izvor istine.</p>
<p>Ako WebSocket konekcija pukne, događaj može biti propušten. Reconciliation worker zato periodično proverava sve nepotvrđene transakcije po hashu.</p>
<p>Payout prelazi u <code>completed</code> samo ako:</p>
<pre><code class="language-text">validated = true
TransactionResult = tesSUCCESS
destination = očekivana adresa
delivered amount = očekivani iznos
asset = očekivana valuta i issuer
</code></pre>
<h3>Korak 7: Reconciliation posle pada sistema</h3>
<p>Ako servis padne između slanja i čuvanja odgovora, pri restartu učitava sve zapise bez finalnog rezultata.</p>
<p>Za svaki zapis:</p>
<ol>
<li><p>traži transakciju po hashu</p>
</li>
<li><p>ako je validirana, čuva konačni rezultat</p>
</li>
<li><p>ako nije pronađena i <code>LastLedgerSequence</code> još nije prošao, čeka</p>
</li>
<li><p>ako je expiration prošao, proverava kontinuitet ledger istorije</p>
</li>
<li><p>tek nakon autoritativne provere odlučuje da li pravi novu transakciju</p>
</li>
</ol>
<p>Ovaj deo je važniji od same <code>Payment</code> metode. Finansijski bugovi se češće pojavljuju u retry i reconciliation logici nego u konstrukciji JSON objekta.</p>
<h2>Prihvatanje depozita</h2>
<p>Za custodial servis koji prima depozite postoje dva osnovna modela.</p>
<h3>Posebna adresa za svakog korisnika</h3>
<p>Prednosti:</p>
<ul>
<li><p>lakše mapiranje uplata</p>
</li>
<li><p>destination tag nije neophodan</p>
</li>
<li><p>jednostavniji korisnički UX</p>
</li>
</ul>
<p>Mane:</p>
<ul>
<li><p>base reserve za svaki nalog</p>
</li>
<li><p>upravljanje velikim brojem ključeva</p>
</li>
<li><p>sweeping sredstava</p>
</li>
<li><p>više ledger objekata i operativne složenosti</p>
</li>
</ul>
<h3>Jedna shared adresa i destination tagovi</h3>
<p>Prednosti:</p>
<ul>
<li><p>jedna rezerva i manji broj ključeva</p>
</li>
<li><p>jednostavnije upravljanje treasuryjem</p>
</li>
<li><p>lakše centralizovano povlačenje sredstava</p>
</li>
</ul>
<p>Mane:</p>
<ul>
<li><p>greške sa destination tagovima</p>
</li>
<li><p>potreba za internim mapiranjem</p>
</li>
<li><p>veća vrednost koncentrisana na jednom nalogu</p>
</li>
<li><p>složenija privatnost i analitika</p>
</li>
<li><p>ručna obrada pogrešnih depozita ako <code>RequireDest</code> nije uključen</p>
</li>
</ul>
<p>Za većinu custodial payment sistema shared adresa sa <code>RequireDest</code> i pažljivo upravljanim tagovima je praktičnija, ali odluka zavisi od custody modela i regulatornih zahteva.</p>
<h2><code>xrpld</code>, Clio i produkciona infrastruktura</h2>
<p>Za prototip je dovoljan javni Testnet ili Mainnet endpoint. Za produkciju to nije idealna jedina zavisnost.</p>
<p>Javni server može:</p>
<ul>
<li><p>uvesti rate limit</p>
</li>
<li><p>promeniti pravila pristupa</p>
</li>
<li><p>kasniti</p>
</li>
<li><p>izgubiti deo istorije</p>
</li>
<li><p>vratiti grešku</p>
</li>
<li><p>privremeno postati nedostupan</p>
</li>
</ul>
<p>Za ozbiljan payment sistem razumno je imati sopstveni <code>xrpld</code> ili najmanje više nezavisnih pouzdanih provajdera.</p>
<h3>Uloga <code>xrpld</code></h3>
<p><code>xrpld</code>:</p>
<ul>
<li><p>učestvuje u P2P mreži</p>
</li>
<li><p>prati validirane ledgere</p>
</li>
<li><p>prosleđuje transakcije</p>
</li>
<li><p>može raditi kao validator</p>
</li>
<li><p>odgovara na aktuelne i istorijske upite u okviru sačuvane istorije</p>
</li>
</ul>
<h3>Uloga Clio servera</h3>
<p>Clio je API server optimizovan za upite nad validiranim istorijskim podacima. Ne učestvuje direktno u P2P konsenzusu. Podatke dobija od povezanog <code>xrpld</code> servera i čuva ih u Cassandra ili ScyllaDB infrastrukturi.</p>
<p>Clio je koristan za:</p>
<ul>
<li><p>veliki broj read zahteva</p>
</li>
<li><p>istoriju transakcija</p>
</li>
<li><p>skaliranje analitike</p>
</li>
<li><p>rasterećenje P2P servera</p>
</li>
<li><p>horizontalno skaliranje API sloja</p>
</li>
</ul>
<p>Metode koje zahtevaju pristup aktuelnom P2P stanju ili slanje transakcije Clio prosleđuje povezanom <code>xrpld</code> serveru.</p>
<p>Tipična arhitektura može imati:</p>
<pre><code class="language-text">wallet i backend klijenti
        |
API gateway i auth
        |
read API -&gt; Clio cluster -&gt; Cassandra ili ScyllaDB
        |
write API -&gt; privatni xrpld -&gt; XRPL P2P mreža
        |
signer ili HSM
</code></pre>
<p>Signer ne mora imati direktan pristup internetu. Može dobijati pripremljenu transakciju kroz kontrolisan interni kanal, proveriti policy i vratiti potpisani blob.</p>
<h2>API metode koje se najčešće koriste</h2>
<p>Osnovni payment backend obično koristi sledeće metode:</p>
<table>
<thead>
<tr>
<th>Metoda</th>
<th>Namena</th>
</tr>
</thead>
<tbody><tr>
<td><code>account_info</code></td>
<td>Balans, sequence i postavke naloga</td>
</tr>
<tr>
<td><code>account_tx</code></td>
<td>Istorija transakcija naloga</td>
</tr>
<tr>
<td><code>account_lines</code></td>
<td>Trust lines naloga</td>
</tr>
<tr>
<td><code>account_objects</code></td>
<td>Objekti koje nalog poseduje</td>
</tr>
<tr>
<td><code>account_offers</code></td>
<td>Otvorene DEX ponude</td>
</tr>
<tr>
<td><code>tx</code></td>
<td>Rezultat transakcije po hashu</td>
</tr>
<tr>
<td><code>fee</code></td>
<td>Aktuelna fee preporuka</td>
</tr>
<tr>
<td><code>server_info</code></td>
<td>Stanje i verzija servera</td>
</tr>
<tr>
<td><code>ledger</code></td>
<td>Podaci o konkretnoj ledger verziji</td>
</tr>
<tr>
<td><code>book_offers</code></td>
<td>Ponude za currency pair</td>
</tr>
<tr>
<td><code>ripple_path_find</code></td>
<td>Procena payment putanje</td>
</tr>
<tr>
<td><code>submit</code></td>
<td>Slanje potpisanog transaction bloba</td>
</tr>
<tr>
<td><code>subscribe</code></td>
<td>WebSocket pretplate</td>
</tr>
</tbody></table>
<p><code>account_tx</code> i slični istorijski upiti mogu biti paginirani. Produkcioni indexer mora sačuvati marker i nastaviti sve dok ne obradi čitav traženi opseg.</p>
<p>Ako aplikacija prati depozite, dobra strategija je kombinacija:</p>
<ul>
<li><p>WebSocket stream za malu latenciju</p>
</li>
<li><p>periodični <code>account_tx</code> reconciliation</p>
</li>
<li><p>trajni checkpoint poslednjeg obrađenog validiranog ledgera</p>
</li>
<li><p>idempotentna obrada po transaction hashu i affected node identitetu</p>
</li>
</ul>
<p>WebSocket događaj je signal. Validirani ledger i transaction metadata su izvor istine.</p>
<h2>Amendment sistem i evolucija protokola</h2>
<p>XRPL funkcije se uvode kroz amendmente.</p>
<p>Nova funkcionalnost prvo mora biti implementirana u <code>xrpld</code> softveru. Operatori validatora zatim glasaju da li je podržavaju. Ako amendment ima više od 80 procenata podrške tokom dve nedelje, trajno se aktivira za naredne ledger verzije.</p>
<p>Ako podrška padne ispod praga pre isteka perioda, odbrojavanje se prekida i počinje ponovo kada se supervećina vrati.</p>
<p>To nije glasanje ponderisano količinom XRP-a. Posedovanje više XRP-a samo po sebi ne daje veći protokolarni glas.</p>
<p>Server koji ne podržava aktivirani amendment može postati amendment blocked. To je zaštitni mehanizam koji sprečava zastareli server da nastavi da tvrdi da razume stanje formirano po novim pravilima.</p>
<p>Za developera to znači:</p>
<ul>
<li><p>pratiti stabilna <code>xrpld</code> izdanja</p>
</li>
<li><p>pratiti amendment statuse</p>
</li>
<li><p>testirati pre-release funkcije na Devnetu</p>
</li>
<li><p>ne puštati funkciju samo zato što je SDK ima u tipovima</p>
</li>
<li><p>imati feature detection u produkcionoj konfiguraciji</p>
</li>
<li><p>planirati nadogradnju sopstvenih servera</p>
</li>
</ul>
<h2>Bezbednosni checklist</h2>
<p>Pre Mainnet integracije trebalo bi proveriti sledeće.</p>
<h3>Ključevi</h3>
<ul>
<li><p>Seed se ne nalazi u source kodu.</p>
</li>
<li><p>Seed se ne nalazi u običnoj environment promenljivoj na shared hostingu.</p>
</li>
<li><p>Potpisivanje je odvojeno od javnog API servisa.</p>
</li>
<li><p>Master key ima offline backup.</p>
</li>
<li><p>Regular key ili multisigning koriste se za svakodnevne operacije.</p>
</li>
<li><p>Postoji dokumentovana key rotation procedura.</p>
</li>
<li><p>Postoje limiti po transakciji i vremenskom periodu.</p>
</li>
</ul>
<h3>Transakcije</h3>
<ul>
<li><p>Svaka transakcija ima <code>LastLedgerSequence</code>.</p>
</li>
<li><p>Potpisani blob se čuva pre slanja.</p>
</li>
<li><p>Retry koristi isti blob dok je ista transakcija još moguća.</p>
</li>
<li><p>Rezultat se priznaje samo iz validiranog ledgera.</p>
</li>
<li><p><code>tec</code> rezultat se ne tretira kao uspeh.</p>
</li>
<li><p><code>Sequence</code> i eventualni <code>Ticket</code> brojevi se kontrolišu centralno.</p>
</li>
<li><p>Fee ima maksimalni policy limit.</p>
</li>
</ul>
<h3>Depoziti</h3>
<ul>
<li><p>Destination tag se obavezno proverava.</p>
</li>
<li><p>Shared adresa ima <code>RequireDest</code> ako poslovni model to dozvoljava.</p>
</li>
<li><p>Partial payment koristi <code>delivered_amount</code>.</p>
</li>
<li><p>Proveravaju se currency code i issuer.</p>
</li>
<li><p>Svaki hash se obrađuje idempotentno.</p>
</li>
<li><p>WebSocket stream ima reconciliation fallback.</p>
</li>
<li><p>Nevalidirane transakcije se ne prikazuju kao raspoloživi balans.</p>
</li>
</ul>
<h3>Infrastruktura</h3>
<ul>
<li><p>Postoji najmanje jedan rezervni RPC endpoint.</p>
</li>
<li><p>Produkcioni servis ne zavisi samo od besplatnog javnog servera.</p>
</li>
<li><p>Prati se razlika između poslednjeg poznatog i validiranog ledgera.</p>
</li>
<li><p>Proveravaju se <code>complete_ledgers</code> i rupe u istoriji.</p>
</li>
<li><p>Server i SDK verzije imaju kontrolisan upgrade proces.</p>
</li>
<li><p>Amendment status se prati pre uključivanja novih funkcija.</p>
</li>
</ul>
<h2>Glavni trade-offovi</h2>
<table>
<thead>
<tr>
<th>Oblast</th>
<th>Prednost</th>
<th>Cena ili ograničenje</th>
</tr>
</thead>
<tbody><tr>
<td>Konsenzus</td>
<td>Brza validacija bez rudarenja</td>
<td>Bezbednost zavisi od UNL modela i njegovog preklapanja</td>
</tr>
<tr>
<td>Programabilnost</td>
<td>Manje ugovornog koda za standardne finansijske funkcije</td>
<td>Nema proizvoljne mainnet smart contract logike</td>
</tr>
<tr>
<td>Naknade</td>
<td>Veoma mali standardni protocol fee</td>
<td>Fee raste pod opterećenjem, a fiat vrednost zavisi od XRP cene</td>
</tr>
<tr>
<td>Nalozi</td>
<td>Jednostavan account model</td>
<td>Svaki aktivni nalog zahteva rezervu</td>
</tr>
<tr>
<td>Tokeni</td>
<td>Izdavanje bez deployovanja ugovora</td>
<td>Holder zavisi od konkretnog issuera</td>
</tr>
<tr>
<td>DEX</td>
<td>CLOB i AMM su deo protokola</td>
<td>Likvidnost može biti tanka, a offer semantika zahteva pažnju</td>
</tr>
<tr>
<td>Finalnost</td>
<td>Validirani rezultat je eksplicitan i brz</td>
<td>Preliminarni API odgovor ne sme se tretirati kao finalan</td>
</tr>
<tr>
<td>Custody</td>
<td>Lokalno potpisivanje i multisigning</td>
<td>Developer je odgovoran za upravljanje ključevima</td>
</tr>
<tr>
<td>Javni podaci</td>
<td>Jednostavan audit i indeksiranje</td>
<td>Nema podrazumevane privatnosti</td>
</tr>
<tr>
<td>Upgrade model</td>
<td>Kontrolisana aktivacija amendmenta</td>
<td>Serveri moraju biti pravovremeno nadograđeni</td>
</tr>
</tbody></table>
<h2>Kada XRPL ima smisla</h2>
<p>XRPL je tehnički zanimljiv kada proizvodu treba javni settlement sloj sa unapred definisanim finansijskim primitivima.</p>
<p>Posebno je dobar kandidat kada je centralna operacija:</p>
<pre><code class="language-text">primi vrednost -&gt; proveri validaciju -&gt; konvertuj po potrebi -&gt;
upiši finalni rezultat -&gt; uskladi sa internom bazom
</code></pre>
<p>Njegova najveća vrednost za developera nije u tome što obećava univerzalnu programabilnost. Upravo suprotno. Vrednost je u tome što mnogo standardnih finansijskih operacija već ima protokolarnu semantiku.</p>
<p>Ne moraš da biraš token contract, DEX router, escrow contract i posebnu mrežu oracle ugovora samo da bi poslao ili razmenio dve podržane valute. Ali zauzvrat prihvataš granice modela, issuer rizik kod tokena, reserve mehanizam, UNL trust pretpostavke i obavezu da pravilno obradiš validaciju.</p>
<p>Najkorisniji prvi eksperiment nije pravljenje još jednog wallet interfejsa. Korisnije je implementirati mali, idempotentni payment servis:</p>
<ol>
<li><p>Napravi dva Testnet naloga.</p>
</li>
<li><p>Pošalji direktan XRP <code>Payment</code>.</p>
</li>
<li><p>Sačuvaj potpisani blob pre slanja.</p>
</li>
<li><p>Proveri <code>validated</code> i <code>TransactionResult</code>.</p>
</li>
<li><p>Dodaj destination tag.</p>
</li>
<li><p>Simuliraj prekid procesa pre dobijanja odgovora.</p>
</li>
<li><p>Pri restartu pronađi transakciju po hashu.</p>
</li>
<li><p>Zatim dodaj test token, trust line i <code>OfferCreate</code>.</p>
</li>
</ol>
<p>Posle tog workflowa postaje jasno šta XRPL jeste: ne generički distribuirani računar, već specijalizovan ledger za izdavanje, prenos, razmenu i konačno poravnanje vrednosti.</p>
<h3><em>Ovaj članak je sponzorisan od strane</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet.com</em></a><em>. Na Volet.com možete kupiti i prodati XRP. Više informacija nalazi se na stranici</em> <a href="https://volet.srbija.workers.dev/"><em>Volet za korisnike iz Srbije</em></a><em>. Za otvaranje naloga koristi</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet referral link</em></a><em>. Link je referral link autora članka.</em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://xrpl.org/docs/introduction/what-is-xrp">What is XRP and Why Is It Valuable?</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/ledgers/ledger-structure">Ledger Structure</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/networks-and-servers/ledger-history">Ledger History</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/consensus-protocol/consensus-structure">Consensus Structure</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/consensus-protocol">Consensus Protocol</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/transactions/finality-of-results">Finality of Results</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/accounts/cryptographic-keys">Cryptographic Keys</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/references/protocol/data-types/basic-data-types">Basic Data Types</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/accounts/cryptographic-keys">Cryptographic Keys and Signing Algorithms</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/accounts/multi-signing">Multi-Signing</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/references/protocol/transactions/common-fields">Transaction Common Fields</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/transactions/reliable-transaction-submission">Reliable Transaction Submission</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/tutorials/get-started/get-started-javascript">Get Started Using JavaScript</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/transactions/source-and-destination-tags">Source and Destination Tags</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/references/protocol/transactions/types/payment">Payment Transaction and Partial Payments</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/tokens/fungible-tokens/trust-line-tokens">Trust Line Tokens</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/tokens/fungible-tokens/multi-purpose-tokens">Multi-Purpose Tokens</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/tokens/decentralized-exchange/offers">Offers</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/tokens/decentralized-exchange/autobridging">Auto-Bridging</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/tokens/decentralized-exchange/automated-market-makers">Automated Market Makers</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/payment-types/escrow">Escrow</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/transactions/transaction-cost">Transaction Cost</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/accounts/reserves">Reserves</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/networks-and-servers/the-clio-server">The Clio Server</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/networks-and-servers/amendments">Amendments</a></p>
</li>
<li><p><a href="https://xrpl.org/docs/concepts/tokens/decentralized-exchange">Decentralized Exchange</a></p>
</li>
<li><p><a href="https://xrpl.org/resources/known-amendments">Known Amendments</a></p>
</li>
<li><p><a href="https://js.xrpl.org/classes/Client.html">xrpl.js Client Reference</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/ripple-xrp-and-xrpl-an-in-depth-architecture-guide-for-developers-1d0g">Ripple, XRP, and XRPL: An In-Depth Architecture Guide for Developers</a></p>
]]></content:encoded></item><item><title><![CDATA[TON iznutra: arhitektura, smart contracts i integracija]]></title><description><![CDATA[TON na prvi pogled izgleda kao još jedan Layer 1 sa sopstvenim coinom, pametnim ugovorima i wallet konekcijom. Međutim, iza sličnog korisničkog interfejsa nalazi se model koji se značajno razlikuje od]]></description><link>https://kripto-pocetnica.hashnode.dev/ton-iznutra-arhitektura-smart-contracts-i-integracija</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/ton-iznutra-arhitektura-smart-contracts-i-integracija</guid><category><![CDATA[tôn]]></category><category><![CDATA[TON Blockchain]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[crypto]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[Smart Contracts]]></category><category><![CDATA[Web3]]></category><category><![CDATA[telegram]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Fri, 18 Sep 2026 22:17:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/ee2c0023-e286-4b63-acfa-188964d33100.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>TON na prvi pogled izgleda kao još jedan Layer 1 sa sopstvenim coinom, pametnim ugovorima i wallet konekcijom. Međutim, iza sličnog korisničkog interfejsa nalazi se model koji se značajno razlikuje od EVM-a.</p>
<p>TON nije projektovan kao jedna globalna virtuelna mašina kroz koju sve transakcije prolaze redom. Njegova arhitektura je zasnovana na više lanaca, dinamičkom shardingu i asinhronoj razmeni poruka između naloga. Smart contract nije objekat koji drugi contract direktno poziva, već actor koji prima poruku, obrađuje je, menja svoje stanje i eventualno šalje nove poruke.</p>
<p>Ta razlika nije akademska. Ona utiče na način na koji se projektuju tokeni, plaćanja, greške, retry mehanizmi, testovi i korisnički interfejs.</p>
<p>Za developera je TON naročito interesantan tamo gde se ukrštaju tri zahteva:</p>
<ul>
<li><p>aplikacija treba da dođe do korisnika kroz Telegram Mini App</p>
</li>
<li><p>wallet treba povezati bez preuzimanja privatnih ključeva</p>
</li>
<li><p>veliki broj relativno malih operacija treba obraditi uz predvidljiv trošak</p>
</li>
</ul>
<p>Najčešći realni projekti nisu novi decentralizovani berzanski protokoli. Češće su to naplata digitalnog sadržaja, Telegram igre, članarine, loyalty sistemi, isplate velikom broju korisnika, trgovina digitalnim predmetima i aplikacije koje koriste USDT kao Jetton.</p>
<p>Da bi takav sistem bio pouzdan, nije dovoljno dodati <code>TonConnectButton</code>. Potrebno je razumeti kako TON adresira naloge, kako poruka postaje transakcija, zašto Jetton transfer nije jedna transakcija i zašto <code>exit_code = 0</code> još ne znači da je kompletna poslovna operacija uspela.</p>
<h2>Šta su TON, Toncoin i TON Coin</h2>
<p>TON je skraćenica za The Open Network, javnu Layer 1 blockchain mrežu. Toncoin, često neformalno nazivan TON Coin, predstavlja njenu nativnu valutu.</p>
<p>Toncoin se koristi za:</p>
<ul>
<li><p>plaćanje izvršavanja pametnih ugovora</p>
</li>
<li><p>plaćanje čuvanja podataka u stanju mreže</p>
</li>
<li><p>plaćanje prenosa poruka između naloga i shardova</p>
</li>
<li><p>staking i ekonomsko obezbeđivanje validatora</p>
</li>
<li><p>prenos vrednosti između wallet ugovora</p>
</li>
<li><p>prosleđivanje vrednosti uz poruku pametnom ugovoru</p>
</li>
</ul>
<p>Najmanja praktična obračunska jedinica je nanoton:</p>
<pre><code class="language-text">1 TON = 1,000,000,000 nanotona
</code></pre>
<p>SDK-jevi zato iznose najčešće primaju kao decimalne stringove u osnovnim jedinicama. Slanje <code>0.1 TON</code> obično znači prosleđivanje vrednosti <code>"100000000"</code>.</p>
<p>U starijem kodu, whitepaperima i pojedinim delovima dokumentacije mogu se pojaviti termini <code>gram</code> i <code>nanogram</code>. To je istorijsko nasleđe protokola. U aplikativnom kodu je važnije da se iznos tretira kao ceo broj osnovnih jedinica nego da se oslanja na naziv promenljive.</p>
<p>Nemojte koristiti JavaScript <code>number</code> za proizvoljno velike blockchain iznose. Za računanje koristite <code>bigint</code>, a prema walletu i API-ju prosleđujte decimalni string kada interfejs to zahteva.</p>
<h2>TON nije EVM sa drugačijom adresom</h2>
<p>Najveća greška pri ulasku u TON je pokušaj direktnog preslikavanja Ethereum mentalnog modela.</p>
<p>U EVM aplikaciji često razmišljamo ovako:</p>
<ol>
<li><p>Korisnik poziva contract A.</p>
</li>
<li><p>Contract A sinhrono poziva contract B.</p>
</li>
<li><p>Contract B vraća rezultat.</p>
</li>
<li><p>Ceo call stack uspeva ili se vraća na početno stanje.</p>
</li>
</ol>
<p>TON koristi drugačiji model:</p>
<ol>
<li><p>Nalog A prima poruku.</p>
</li>
<li><p>Ta poruka pokreće transakciju na nalogu A.</p>
</li>
<li><p>A može generisati izlaznu poruku za B.</p>
</li>
<li><p>B je obrađuje u zasebnoj transakciji.</p>
</li>
<li><p>B može poslati poruku ka C ili odgovor ka A.</p>
</li>
<li><p>Greška u kasnijem koraku ne mora automatski vratiti prethodno stanje.</p>
</li>
</ol>
<p>Drugim rečima, jedna korisnička namera može proizvesti čitav trag povezanih transakcija. TON dokumentacija takav povezani tok naziva trace.</p>
<p>Ovo je bliže distribuiranom actor sistemu nego klasičnom sinhronom call stacku.</p>
<table>
<thead>
<tr>
<th>Koncept</th>
<th>EVM mentalni model</th>
<th>TON mentalni model</th>
</tr>
</thead>
<tbody><tr>
<td>Contract interakcija</td>
<td>Sinhroni poziv</td>
<td>Asinhrona poruka</td>
</tr>
<tr>
<td>Složena operacija</td>
<td>Jedan call tree</td>
<td>Trace više transakcija</td>
</tr>
<tr>
<td>Povratak greške</td>
<td>Revert kroz call stack</td>
<td>Bounce ili aplikativna kompenzacija</td>
</tr>
<tr>
<td>Token balans</td>
<td>Obično u jednom token contractu</td>
<td>Poseban Jetton wallet po vlasniku</td>
</tr>
<tr>
<td>Storage</td>
<td>Slotovi</td>
<td>Stablo ćelija</td>
</tr>
<tr>
<td>Binarni format</td>
<td>ABI kodiranje</td>
<td>Ćelije, BoC i TL-B</td>
</tr>
<tr>
<td>Adresa contracta</td>
<td>Adresa deployovanog naloga</td>
<td>Izvedena iz <code>StateInit</code> podataka</td>
</tr>
<tr>
<td>Čitanje</td>
<td>RPC poziv ili view funkcija</td>
<td>Get method preko API-ja ili liteservera</td>
</tr>
</tbody></table>
<p>Ovaj model omogućava paralelnu obradu, ali prebacuje deo kompleksnosti na dizajn protokola. Contract mora da zna šta radi ako poruka stigne kasnije, stigne više puta, bude odbijena ili se izvrši samo deo poslovnog procesa.</p>
<h2>Blockchain sastavljen od blockchainova</h2>
<p>TON se sastoji od masterchaina, workchainova i shardchainova.</p>
<h3>Masterchain</h3>
<p>Masterchain je koordinacioni lanac mreže. U njemu se čuvaju globalna konfiguracija, podaci o validatorima, aktivni workchainovi, shardovi i hash reference ka njihovim poslednjim blokovima.</p>
<p>Njegov <code>workchain_id</code> je <code>-1</code>.</p>
<p>Masterchain nije mesto na kojem bi obična aplikacija trebalo da drži korisničke contracte. Operacije u njemu su skuplje kako bi se ograničio saobraćaj koji bi mogao ometati sistemske funkcije.</p>
<h3>Basechain i workchainovi</h3>
<p>Workchain predstavlja blockchain sa sopstvenim skupom pravila i prostorom naloga. Obične aplikacije koriste Basechain čiji je <code>workchain_id</code> jednak <code>0</code>.</p>
<p>Dizajn protokola dopušta više workchainova sa različitim pravilima, formatima naloga ili virtuelnim mašinama. Za većinu aplikacija ta mogućnost ostaje apstrakcija, jer se korisnički ugovori i walleti nalaze u Basechainu.</p>
<h3>Shardchainovi</h3>
<p>Workchain se može podeliti na shardchainove. Svaki shard obrađuje deo prostora adresa, a različite grupe validatora mogu paralelno obrađivati različite shardove.</p>
<p>Shard pripada određenom prefiksu adresa. Kada opterećenje poraste, shard se može podeliti na dva nova prefiksa. Kada opterećenje opadne, kompatibilni shardovi mogu se spojiti.</p>
<p>Zbog toga aplikacija ne bi trebalo da pretpostavi da će dva naloga zauvek biti u istom shardu. Routing poruka je posao protokola, ali latencija i asinhronost ostaju deo aplikativnog ponašanja.</p>
<p>Praktična posledica je da se skaliranje ne dobija ubrzavanjem jednog globalnog izvršnog reda. Dobija se razdvajanjem stanja i obrade na nezavisne shardove.</p>
<h2>Nalog, wallet i smart contract su skoro ista stvar</h2>
<p>Na TON-u je account osnovna jedinica stanja. Adresa identifikuje account, a account može imati:</p>
<ul>
<li><p>balans</p>
</li>
<li><p>contract kod</p>
</li>
<li><p>persistent podatke</p>
</li>
<li><p>status naloga</p>
</li>
<li><p>poslednju transakciju</p>
</li>
</ul>
<p>Wallet nije poseban protokolski tip. Wallet je pametni ugovor čija je osnovna funkcija da proveri potpis vlasnika i generiše interne poruke.</p>
<p>Kada korisnik u wallet aplikaciji pošalje TON, mobilna aplikacija ne menja blockchain stanje direktno. Ona konstruiše i potpisuje eksternu poruku za korisnikov wallet contract. Wallet contract proverava potpis, sequence number ili drugi replay mehanizam, a zatim šalje internu poruku primaocu.</p>
<p>To razdvaja:</p>
<ul>
<li><p>wallet aplikaciju, koja čuva ključ i prikazuje interfejs</p>
</li>
<li><p>wallet contract, koji živi na blockchainu</p>
</li>
<li><p>korisničku adresu, koja u praksi predstavlja adresu wallet contracta</p>
</li>
</ul>
<p>Postoji više verzija wallet ugovora. Kod sopstvene infrastrukture ili custody sistema nije dovoljno pretpostaviti da svaki korisnik koristi isti wallet kod. Wallet capabilities, format zahteva i broj poruka koje wallet može poslati u jednom zahtevu mogu se razlikovati.</p>
<h2>Adrese: raw, bounceable i non-bounceable format</h2>
<p>Interna TON adresa sadrži <code>workchain_id</code> i 256-bitni identifikator naloga. Raw zapis izgleda približno ovako:</p>
<pre><code class="language-text">0:2fcb1b...
</code></pre>
<p>Korisnički interfejsi obično koriste base64url format sa checksumom i flagovima. Najčešće ćete videti:</p>
<ul>
<li><p><code>EQ...</code> za bounceable adresu</p>
</li>
<li><p><code>UQ...</code> za non-bounceable adresu</p>
</li>
</ul>
<p>To nisu dva različita naloga. Payload adrese može biti isti, dok format nosi instrukciju pošiljaocu o tome da li poruka treba da bude bounceable.</p>
<p>Bounceable poruku je smisleno slati aktivnom pametnom ugovoru. Ako obrada ne uspe, protokol može generisati povratnu poruku. Non-bounceable format se često koristi za prvu uplatu na adresu koja još nije inicijalizovana ili kada povrat poruke nije poželjan.</p>
<p>Frontend ne bi trebalo ručno da sastavlja adrese. Za parsiranje, proveru checksuma i konverziju koristite funkcije iz <code>@ton/core</code> ili TON Connect paketa.</p>
<p>Posebno je važno da TON Connect može zahtevati user-friendly adresu, dok API odgovor ili wallet stanje može sadržati raw adresu. To je čest uzrok grešaka koje izgledaju kao problem sa wallet konekcijom, a zapravo predstavljaju problem formata.</p>
<h2>Determinističke adrese i <code>StateInit</code></h2>
<p>Adresa TON contracta može se izračunati pre deploya. Ona zavisi od početnog koda i početnih podataka, serijalizovanih u <code>StateInit</code>.</p>
<p>To omogućava nekoliko korisnih obrazaca:</p>
<ul>
<li><p>unapred poznate deposit adrese</p>
</li>
<li><p>deterministički Jetton wallet za kombinaciju master contracta i vlasnika</p>
</li>
<li><p>slanje prve poruke zajedno sa kodom i podacima za deploy</p>
</li>
<li><p>proveru da li određeni contract odgovara očekivanom kodu i inicijalnom stanju</p>
</li>
</ul>
<p>Ali postoji i bezbednosna posledica. Adresa sama po sebi ne dokazuje da contract pripada legitimnom tokenu ili aplikaciji. Backend mora proveriti očekivani master contract, kod, podatke ili standardne get metode, zavisno od protokola.</p>
<h2>Poruke pokreću izvršavanje</h2>
<p>Najčešći okidač transakcije na TON-u je dolazna poruka.</p>
<p>Postoje tri relevantna tipa:</p>
<ul>
<li><p>external-in poruka dolazi van blockchaina ka contractu</p>
</li>
<li><p>internal poruka ide sa jednog blockchain naloga na drugi</p>
</li>
<li><p>external-out poruka izlazi iz contracta ka spoljašnjem potrošaču</p>
</li>
</ul>
<p>Korisnički wallet obično prima potpisanu external-in poruku. Nakon provere potpisa wallet šalje jednu ili više internal poruka.</p>
<p>Internal poruka može nositi:</p>
<ul>
<li><p>adresu pošiljaoca</p>
</li>
<li><p>adresu primaoca</p>
</li>
<li><p>TON vrednost</p>
</li>
<li><p>bounce flag</p>
</li>
<li><p>telo poruke</p>
</li>
<li><p>opcioni <code>StateInit</code></p>
</li>
<li><p>parametre povezane sa prosleđivanjem i naknadama</p>
</li>
</ul>
<p>Telo poruke je ćelija. U standardnim protokolima njegov početak često sadrži 32-bitni operation code, zatim <code>query_id</code> i podatke specifične za operaciju.</p>
<p>Contract ne poziva drugu funkciju na udaljenom contractu. On konstruiše poruku sa odgovarajućim binarnim formatom i šalje je.</p>
<h2>Transakcija nije isto što i poruka</h2>
<p>Poruka je ulazni događaj. Transakcija je promena stanja jednog naloga nastala obradom tog događaja.</p>
<p>Jedna transakcija može:</p>
<ul>
<li><p>potrošiti dolaznu poruku</p>
</li>
<li><p>naplatiti storage i compute troškove</p>
</li>
<li><p>promeniti persistent stanje</p>
</li>
<li><p>promeniti contract kod</p>
</li>
<li><p>rezervisati deo balansa</p>
</li>
<li><p>generisati više izlaznih poruka</p>
</li>
</ul>
<p>Svaka od tih izlaznih poruka može kasnije pokrenuti zasebnu transakciju na drugom nalogu.</p>
<p>Zato se poslovna operacija ne prati samo jednim transaction hashom. Kod Jetton transfera, DEX swap-a ili mintovanja NFT-a potrebno je pratiti ceo trace i odrediti koji događaj predstavlja stvarni poslovni uspeh.</p>
<h2>Pet faza izvršenja</h2>
<p>Obična TON transakcija može proći kroz do pet faza.</p>
<h3>Storage faza</h3>
<p>Mreža obračunava trošak čuvanja contract koda i podataka. Storage se ne plaća samo jednom pri upisu, već u odnosu na količinu podataka i proteklo vreme.</p>
<p>To menja način projektovanja state-a. Neograničena mapa koja zauvek raste nije samo tehnički problem. Ona stvara trajan finansijski trošak za account.</p>
<h3>Credit faza</h3>
<p>Dolazna vrednost poruke knjiži se na balans naloga. Redosled credit i storage faze zavisi od vrste i bounce karakteristika poruke.</p>
<h3>Compute faza</h3>
<p>TVM izvršava contract kod. Rezultat sadrži između ostalog:</p>
<ul>
<li><p>exit code</p>
</li>
<li><p>potrošeni gas</p>
</li>
<li><p>novo stanje</p>
</li>
<li><p>listu planiranih akcija</p>
</li>
</ul>
<p>Compute faza može biti preskočena ako contract nema kod, ako <code>StateInit</code> ne odgovara adresi ili ako nema dovoljno sredstava za gas.</p>
<h3>Action faza</h3>
<p>Ako je compute izvršavanje proizvelo akcije, one se obrađuju nakon toga.</p>
<p>Akcije mogu:</p>
<ul>
<li><p>poslati poruku</p>
</li>
<li><p>promeniti contract kod</p>
</li>
<li><p>rezervisati sredstva</p>
</li>
<li><p>promeniti biblioteku</p>
</li>
</ul>
<p>Bitna zamka je da uspešna compute faza ne garantuje uspešnu action fazu. Contract može završiti sa <code>exit_code = 0</code>, a zatim ne uspeti da pošalje izlaznu poruku zbog nedostatka sredstava ili neodgovarajućeg message moda.</p>
<h3>Bounce faza</h3>
<p>Ako obrada bounceable poruke ne uspe, može nastati bounce poruka ka pošiljaocu. Ona nije automatski vraćanje kompletnog poslovnog procesa. To je nova poruka koju pošiljalac mora pravilno da obradi.</p>
<p>Contract koji šalje sredstva ili menja interno knjigovodstvo pre udaljene operacije treba da ima strategiju za bounce. U suprotnom može ostati u stanju u kojem lokalni podaci kažu da je operacija završena, iako je udaljeni contract nije prihvatio.</p>
<h2>Asinhronost kao arhitektonski problem</h2>
<p>Pretpostavimo da contract za pretplatu radi sledeće:</p>
<ol>
<li><p>Evidentira zahtev korisnika.</p>
</li>
<li><p>Šalje Jetton transfer treasury contractu.</p>
</li>
<li><p>Čeka potvrdu.</p>
</li>
<li><p>Aktivira pretplatu.</p>
</li>
</ol>
<p>Na sinhronom lancu developer bi možda sve stavio u jednu funkciju. Na TON-u to treba modelovati kao stanje procesa:</p>
<pre><code class="language-text">requested -&gt; payment_sent -&gt; confirmed
                         \-&gt; bounced
                         \-&gt; expired
</code></pre>
<p>Dobar TON protocol obično ima:</p>
<ul>
<li><p>jedinstveni <code>query_id</code></p>
</li>
<li><p>eksplicitno stanje operacije</p>
</li>
<li><p>idempotentne handlere</p>
</li>
<li><p>obradu bounce poruka</p>
</li>
<li><p>vremensko ograničenje kada je potrebno</p>
</li>
<li><p>administrativni ili korisnički recovery put</p>
</li>
<li><p>odvojenu evidenciju poslovnog uspeha i tehničkog slanja poruke</p>
</li>
</ul>
<p>Ne treba pretpostaviti da poruka nikada neće biti obrađena više puta na aplikativnom nivou. Sam blockchain sprečava određene protokolske duplikate, ali backend može ponovo pročitati isti događaj nakon restarta, reconnecta ili reorganizacije lokalnog indeksa. Idempotency je potreban i van contracta.</p>
<h2>TVM, ćelije i Bag of Cells</h2>
<p>TON Virtual Machine je stack-based virtuelna mašina. Ona ne koristi EVM storage slotove kao osnovni model podataka. Contract kod, persistent state, poruke i veliki deo protokolskih struktura predstavljeni su pomoću ćelija.</p>
<p>Jedna ćelija može sadržati:</p>
<ul>
<li><p>najviše 1023 bita</p>
</li>
<li><p>najviše četiri reference ka drugim ćelijama</p>
</li>
</ul>
<p>Ćelije formiraju usmereni aciklični graf. Ciklusi nisu dozvoljeni. Svaka ćelija ima hash koji zavisi od njenog sadržaja i referenci.</p>
<p>Kada se takav graf serijalizuje za čuvanje ili mrežni prenos, dobija se Bag of Cells, skraćeno BoC. U API odgovorima i TON Connect payloadima BoC se često prenosi kao base64 string.</p>
<p>TL-B je jezik šema koji opisuje kako se protokolske strukture pakuju u bitove i reference. Može se posmatrati kao binarna šema nalik Protocol Buffers konceptu, ali prilagođena cell grafovima i bit-level rasporedu.</p>
<p>Za TypeScript developera osnovni paket je <code>@ton/core</code>. Njime se mogu:</p>
<ul>
<li><p>parsirati i formatirati adrese</p>
</li>
<li><p>konstruisati ćelije</p>
</li>
<li><p>čitati slice strukture</p>
</li>
<li><p>serijalizovati poruke</p>
</li>
<li><p>raditi sa dictionary strukturama</p>
</li>
<li><p>generisati i parsirati BoC</p>
</li>
</ul>
<p>Minimalan primer pravljenja tela poruke:</p>
<pre><code class="language-ts">import { beginCell } from '@ton/core';

const body = beginCell()
  .storeUint(0x12345678, 32)
  .storeUint(42n, 64)
  .storeStringTail('premium-plan')
  .endCell();

const payload = body.toBoc().toString('base64');
</code></pre>
<p>Ovaj primer ne predstavlja standardni TON endpoint niti standardnu operaciju. Pokazuje samo kako se aplikativni opcode, <code>query_id</code> i tekst mogu spakovati u ćeliju.</p>
<p>U produkciji format poruke treba formalno definisati i držati stabilnim. Promena redosleda polja ili širine integera menja wire format.</p>
<h2>Dictionaries nisu besplatne baze podataka</h2>
<p>TON dictionary je tree struktura smeštena u ćelijama. Praktična je za mapiranje identifikatora na podatke, ali svako ažuriranje može kreirati više novih ćelija.</p>
<p>Neograničene petlje kroz dictionary i veliki broj izmena u jednoj transakciji mogu potrošiti gas. Ako je posao veliki, često ga treba podeliti na više poruka.</p>
<p>Umesto jednog contracta sa globalnom mapom miliona korisnika, često je bolji shard-friendly model:</p>
<ul>
<li><p>po jedan child contract po korisniku</p>
</li>
<li><p>bucket contracti po prefiksu adrese</p>
</li>
<li><p>deterministički izvedene instance</p>
</li>
<li><p>off-chain indeks sa on-chain verifikabilnim stanjem</p>
</li>
<li><p>poruke koje obrađuju ograničen broj stavki po transakciji</p>
</li>
</ul>
<p>To je isti princip koji se vidi kod Jettona: balans svakog vlasnika ne čuva se kao jedan zapis u ogromnoj globalnoj mapi master contracta.</p>
<h2>Tolk i razvoj smart contracta</h2>
<p>Tolk je preporučeni jezik za nove TON pametne ugovore. Statički je tipiziran i podržava deklarativne strukture, automatsku cell serijalizaciju i primitive za obradu poruka.</p>
<p>Tolk se kompajlira za TVM, ali ne pokušava da sakrije činjenicu da je TON message-driven sistem. I dalje morate razumeti ćelije, ulazne poruke, storage i izlazne akcije.</p>
<p>U postojećim projektima srešćete:</p>
<ul>
<li><p>FunC, stariji jezik nalik C-u</p>
</li>
<li><p>Tact, viši jezik koji je korišćen za jednostavniji razvoj</p>
</li>
<li><p>Fift, jezik blizak assembler i tooling sloju</p>
</li>
<li><p>Tolk, preporučeni jezik za novi contract kod</p>
</li>
</ul>
<p>Za novi projekat ne treba birati jezik na osnovu starog tutorijala ili popularnosti repozitorijuma. Aktuelna dokumentacija usmerava nove smart contract projekte ka Tolk jeziku i Acton toolchainu.</p>
<p>Blueprint je i dalje relevantan za postojeće projekte i TypeScript razvojni tok. Njegova struktura obično sadrži:</p>
<pre><code class="language-text">contracts/
scripts/
tests/
wrappers/
build/
</code></pre>
<p>Wrapper je važan deo TON razvoja. On povezuje TypeScript aplikaciju sa binarnim formatom contract poruka i get metoda. Dobar wrapper skriva ručno pakovanje ćelija, ali ne bi trebalo da sakrije semantiku asinhronog toka.</p>
<h2>Lokalno testiranje mora obuhvatiti trace, ne samo exit code</h2>
<p>TON Sandbox omogućava lokalno izvršavanje contracta iz TypeScript testova, bez slanja na javnu mrežu i bez pokretanja punog noda.</p>
<p>Kod testiranja nije dovoljno proveriti:</p>
<pre><code class="language-text">transaction.success === true
</code></pre>
<p>Treba proveriti:</p>
<ul>
<li><p>ko je poslao dolaznu poruku</p>
</li>
<li><p>koji contract ju je primio</p>
</li>
<li><p>koliko je izlaznih poruka napravljeno</p>
</li>
<li><p>kome su poruke poslate</p>
</li>
<li><p>da li je neka poruka bounceovana</p>
</li>
<li><p>stanje svakog uključenog contracta</p>
</li>
<li><p><code>exitCode</code> compute faze</p>
</li>
<li><p><code>actionResultCode</code></p>
</li>
<li><p>ukupne naknade</p>
</li>
<li><p>finalni status naloga</p>
</li>
<li><p>sadržaj operation code i <code>query_id</code> polja</p>
</li>
</ul>
<p>Sandbox nema sve karakteristike realne mreže. Posebno ne simulira pravi blokovski i sharding kontekst. Zato testnet i dalje ima ulogu u proveri deploya, wallet kompatibilnosti, API indeksiranja i ponašanja kompletnog frontend toka.</p>
<p>Minimalan kvalitetan skup scenarija za contract koji prima uplate uključuje:</p>
<ol>
<li><p>validnu poruku sa dovoljnim TON iznosom</p>
</li>
<li><p>poruku sa nedovoljno sredstava za gas</p>
</li>
<li><p>pogrešan opcode</p>
</li>
<li><p>duplirani <code>query_id</code></p>
</li>
<li><p>bounce udaljene operacije</p>
</li>
<li><p>nepoznatog pošiljaoca</p>
</li>
<li><p>maksimalnu očekivanu veličinu payload-a</p>
</li>
<li><p>stanje posle neuspešne action faze</p>
</li>
<li><p>više poruka različitim redosledom</p>
</li>
<li><p>ponovno izvršavanje backend indeksiranja istog trace-a</p>
</li>
</ol>
<h2>Jetton nije ERC-20 contract sa drugim ABI-jem</h2>
<p>Jetton je standard za fungibilne tokene na TON-u, definisan kroz TEP-74.</p>
<p>U ERC-20 modelu jedan token contract obično čuva mapu svih balansa. Kod Jettona postoje najmanje dve vrste ugovora:</p>
<ul>
<li><p>Jetton master, koji predstavlja vrstu tokena, metapodatke i supply logiku</p>
</li>
<li><p>Jetton wallet, zaseban contract za određenog vlasnika i određeni Jetton</p>
</li>
</ul>
<p>Ako Alice i Bob drže isti Jetton, svako ima svoj Jetton wallet contract. Njihove obične TON wallet adrese i njihove Jetton wallet adrese nisu iste.</p>
<p>Transfer tipično prolazi ovako:</p>
<ol>
<li><p>Korisnik šalje <code>transfer</code> svom Jetton walletu.</p>
</li>
<li><p>Pošiljaočev Jetton wallet proverava zahtev i smanjuje balans.</p>
</li>
<li><p>On šalje <code>internal_transfer</code> primaočevom Jetton walletu.</p>
</li>
<li><p>Primaočev Jetton wallet povećava balans.</p>
</li>
<li><p>Ako je prosleđena odgovarajuća TON vrednost, šalje <code>transfer_notification</code> vlasniku primaoca.</p>
</li>
<li><p>Višak TON-a može biti vraćen na response adresu.</p>
</li>
</ol>
<p>To je više contracta i više transakcija. Zato backend ne treba da smatra prvi wallet zahtev konačnom potvrdom da je primalac dobio tokene.</p>
<h2>Bezbedna obrada Jetton uplata</h2>
<p>Najopasnija greška je verovanje bilo kom contractu koji tvrdi da je wallet za određeni token.</p>
<p>Napadač može deployovati lažni contract, postaviti proizvoljne podatke i poslati poruku koja liči na <code>transfer_notification</code>. Ako backend proverava samo ticker, naziv ili sadržaj poruke, može evidentirati uplatu bez stvarne vrednosti.</p>
<p>Siguran tok zahteva:</p>
<ol>
<li><p>Održavanje allowliste očekivanih Jetton master adresa.</p>
</li>
<li><p>Čitanje vlasnika i master adrese iz Jetton wallet contracta.</p>
</li>
<li><p>Proveru da li je wallet adresa deterministički očekivana za dati master i owner.</p>
</li>
<li><p>Parsiranje standardne <code>transfer_notification</code> poruke.</p>
</li>
<li><p>Proveru iznosa u osnovnim jedinicama tokena.</p>
</li>
<li><p>Proveru <code>decimals</code> metapodatka.</p>
</li>
<li><p>Idempotentno evidentiranje događaja.</p>
</li>
<li><p>Čuvanje trace ili transaction identifikatora za kasnije poravnanje.</p>
</li>
</ol>
<p>Ticker <code>USDT</code> nije identitet tokena. Identitet je očekivana master contract adresa, uz proverenu Jetton wallet derivaciju.</p>
<p><code>forward_ton_amount</code> je takođe bitan. Da bi primalac dobio <code>transfer_notification</code>, transfer mora proslediti pozitivan iznos TON-a. Zvanična dokumentacija navodi najmanje jedan nanoton za generisanje obaveštenja. Servis koji zavisi od notification poruke mora to uzeti u obzir pri konstruisanju transfera.</p>
<h2>NFT model prati istu distribuiranu logiku</h2>
<p>TON NFT standard koristi collection i item contracte. Kolekcija predstavlja zajedničke metapodatke i pravila, dok svaki NFT item može imati sopstveni contract i adresu.</p>
<p>To smanjuje potrebu da jedan contract drži sve vlasnike i sve iteme u jednoj ogromnoj mapi. Istovremeno, indeksiranje kolekcije zahteva praćenje više naloga.</p>
<p>Ako je aplikaciji potreban samo off-chain katalog sa dokazivim vlasništvom, nije neophodno čuvati sve pretražive podatke u contract storage-u. Čest obrazac je:</p>
<ul>
<li><p>on-chain vlasništvo i ključni identifikatori</p>
</li>
<li><p>off-chain metapodaci i pretraga</p>
</li>
<li><p>URI ili content reference u standardnom formatu</p>
</li>
<li><p>backend indeks koji se može ponovo izgraditi iz blockchain podataka</p>
</li>
</ul>
<h2>TON Connect: wallet konekcija bez privatnih ključeva</h2>
<p>TON Connect je standardni protokol koji povezuje dApp sa korisničkim walletom.</p>
<p>DApp može da:</p>
<ul>
<li><p>pročita povezanu adresu</p>
</li>
<li><p>zatraži potpis podataka</p>
</li>
<li><p>zatraži slanje transakcije</p>
</li>
<li><p>obnovi prethodnu sesiju</p>
</li>
<li><p>zatraži dokaz kontrole adrese kroz <code>ton_proof</code></p>
</li>
</ul>
<p>DApp ne dobija privatni ključ i ne potpisuje umesto korisnika.</p>
<p>Sesija između dApp-a i walleta je end-to-end enkriptovana. Komunikacija može ići kroz bridge, ali bridge ne bi trebalo da vidi sadržaj zahteva u čitljivom obliku.</p>
<p>Za React aplikaciju aktuelni paket je:</p>
<pre><code class="language-bash">npm install @tonconnect/ui-react
</code></pre>
<p>Minimalni manifest:</p>
<pre><code class="language-json">{
  "url": "https://app.example.com",
  "name": "Example App",
  "iconUrl": "https://app.example.com/icon-180.png"
}
</code></pre>
<p>Manifest mora biti javno dostupan preko HTTPS-a. Wallet ga učitava kako bi prikazao naziv i ikonu aplikacije pre uspostavljanja sesije. Endpoint ne sme zahtevati autentikaciju niti vraćati anti-bot stranicu umesto JSON-a.</p>
<p>Provider i dugme mogu izgledati ovako:</p>
<pre><code class="language-tsx">import {
  TonConnectButton,
  TonConnectUIProvider,
} from '@tonconnect/ui-react';

export function App() {
  return (
    &lt;TonConnectUIProvider
      manifestUrl="https://app.example.com/tonconnect-manifest.json"
    &gt;
      &lt;Header /&gt;
      &lt;Checkout /&gt;
    &lt;/TonConnectUIProvider&gt;
  );
}

function Header() {
  return &lt;TonConnectButton /&gt;;
}
</code></pre>
<p>Za Next.js provider i komponente koje koriste wallet hookove moraju se izvršavati na klijentu. TON Connect koristi browser storage i druge browser API-je, pa wallet stanje nije poznato tokom server-side renderovanja.</p>
<h2>Slanje jednostavne TON transakcije</h2>
<p>Primer zahteva da wallet pošalje <code>0.1 TON</code>:</p>
<pre><code class="language-tsx">import {
  useTonAddress,
  useTonConnectUI,
  useTonWallet,
} from '@tonconnect/ui-react';

export function PayButton() {
  const [tonConnectUi] = useTonConnectUI();
  const wallet = useTonWallet();
  const sender = useTonAddress();

  async function pay() {
    if (!wallet || !sender) {
      return;
    }

    await tonConnectUi.sendTransaction({
      validUntil: Math.floor(Date.now() / 1000) + 300,
      network: '-239',
      messages: [
        {
          address: 'UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKZ',
          amount: '100000000',
        },
      ],
    });
  }

  return (
    &lt;button type="button" disabled={!wallet} onClick={pay}&gt;
      Plati 0.1 TON
    &lt;/button&gt;
  );
}
</code></pre>
<p>Primer koristi burn adresu samo kao sintaksno validno odredište. U stvarnoj aplikaciji postavlja se verifikovana treasury ili contract adresa.</p>
<p><code>sendTransaction</code> nije dokaz da je poslovna operacija završena. Rezultat potvrđuje da je wallet konstruisao i potpisao zahtev, a zatim vratio serijalizovanu poruku ili odgovarajući rezultat protokola. Backend i dalje treba da pronađe transakciju, proveri primaoca, iznos, payload i finalni ishod.</p>
<p>Wallet može podržavati ograničen broj poruka po jednom zahtevu. Capability treba pročitati iz wallet feature podataka, a ne pretpostaviti univerzalni maksimum.</p>
<h2><code>ton_proof</code> nije isto što i connect</h2>
<p>Povezana adresa nije dovoljna za autentikaciju korisnika. Frontend stanje može reći koja je adresa izabrana, ali backendu treba kriptografski dokaz da korisnik kontroliše odgovarajući ključ.</p>
<p>Tipičan <code>ton_proof</code> tok:</p>
<ol>
<li><p>Backend generiše jednokratni nonce.</p>
</li>
<li><p>Frontend prosleđuje nonce walletu kroz TON Connect zahtev.</p>
</li>
<li><p>Wallet potpisuje definisani proof payload.</p>
</li>
<li><p>Frontend šalje proof backendu.</p>
</li>
<li><p>Backend proverava domen, timestamp, payload, javni ključ i potpis.</p>
</li>
<li><p>Nonce se označava kao iskorišćen.</p>
</li>
<li><p>Backend izdaje sopstvenu aplikativnu sesiju.</p>
</li>
</ol>
<p>Nonce treba da bude:</p>
<ul>
<li><p>dovoljno nasumičan</p>
</li>
<li><p>kratkog veka</p>
</li>
<li><p>vezan za pokušaj autentikacije</p>
</li>
<li><p>jednokratan</p>
</li>
<li><p>proveravan na serveru</p>
</li>
</ul>
<p>Wallet konekcija i aplikativna login sesija imaju različit životni ciklus. Korisnik može diskonektovati wallet, promeniti wallet ili ostati prijavljen u aplikaciju. Ta stanja treba eksplicitno definisati.</p>
<h2>Realan use-case: pretplata u Telegram Mini App aplikaciji</h2>
<p>Zamislimo Mini App koja prodaje mesečni pristup premium sadržaju. Korisnik može platiti Toncoinom ili podržanim stablecoin Jettonom.</p>
<p>Sistem ima četiri sloja:</p>
<pre><code class="language-mermaid">flowchart LR
    U[Korisnik u Telegramu]
    F[Mini App frontend]
    W[TON wallet]
    B[Backend i baza]
    N[TON mreža]

    U --&gt; F
    F &lt;--&gt; W
    W --&gt; N
    B &lt;--&gt; N
    F &lt;--&gt; B
</code></pre>
<p>Telegram daje aplikaciji podatke o korisničkoj sesiji. TON Connect povezuje wallet. Blockchain predstavlja settlement sloj. Backend održava porudžbine, prava pristupa i idempotentnu evidenciju uplata.</p>
<h3>Kreiranje porudžbine</h3>
<p>Backend prvo kreira porudžbinu:</p>
<pre><code class="language-text">order_id
telegram_user_id
expected_asset
expected_amount
recipient
expires_at
status = pending
</code></pre>
<p>Za Toncoin uplatu aplikacija može koristiti:</p>
<ul>
<li><p>jedinstvenu deposit adresu</p>
</li>
<li><p>zajedničku adresu i komentar sa invoice ID-jem</p>
</li>
<li><p>namenski payment contract</p>
</li>
</ul>
<p>Za Jetton uplatu može koristiti:</p>
<ul>
<li><p>jedinstvenu deposit wallet strategiju</p>
</li>
<li><p><code>forward_payload</code> sa invoice identifikatorom</p>
</li>
<li><p>namenski contract koji prima notification poruke</p>
</li>
</ul>
<p>Ne oslanjajte se samo na iznos kao identifikator porudžbine. Dve porudžbine mogu imati isti iznos, a korisnik može platiti sa druge adrese.</p>
<h3>Wallet potvrda</h3>
<p>Frontend generiše TON Connect zahtev sa tačnim:</p>
<ul>
<li><p>network identifikatorom</p>
</li>
<li><p>rokom važenja</p>
</li>
<li><p>primaocem</p>
</li>
<li><p>iznosom u osnovnim jedinicama</p>
</li>
<li><p>payload-om, ako je potreban</p>
</li>
</ul>
<p>Wallet prikazuje detalje i traži potvrdu korisnika. Frontend nakon potpisivanja može prikazati status <code>submitted</code>, ali ne i <code>paid</code>.</p>
<h3>Blockchain praćenje</h3>
<p>Backend prati relevantne adrese i poruke preko indeksiranog API-ja, streaming interfejsa ili sopstvene infrastrukture.</p>
<p>Za Toncoin uplatu proverava:</p>
<ul>
<li><p>odredišnu adresu</p>
</li>
<li><p>primljenu vrednost</p>
</li>
<li><p>telo poruke ili invoice identifikator</p>
</li>
<li><p>uspeh transakcije</p>
</li>
<li><p>da događaj nije već obrađen</p>
</li>
</ul>
<p>Za Jetton proverava:</p>
<ul>
<li><p>očekivani Jetton master</p>
</li>
<li><p>legitimitet Jetton walleta</p>
</li>
<li><p><code>transfer_notification</code></p>
</li>
<li><p>token iznos i decimals</p>
</li>
<li><p>invoice podatke iz <code>forward_payload</code></p>
</li>
<li><p>kompletan trace kada je potreban</p>
</li>
</ul>
<h3>Aktivacija pretplate</h3>
<p>Tek nakon validacije backend atomskom baznom operacijom:</p>
<ol>
<li><p>upisuje payment event</p>
</li>
<li><p>označava porudžbinu kao plaćenu</p>
</li>
<li><p>produžava pristup korisniku</p>
</li>
<li><p>čuva transaction ili trace reference</p>
</li>
</ol>
<p>Ako isti blockchain događaj stigne ponovo, unique constraint nad identifikatorom događaja sprečava duplo knjiženje.</p>
<h3>Refund</h3>
<p>Refund nije običan SQL update. To je nova on-chain operacija.</p>
<p>Sistem treba da evidentira:</p>
<pre><code class="language-text">refund_requested
refund_queued
refund_sent
refund_confirmed
refund_failed
</code></pre>
<p>Ako je refund u Jettonu, opet se radi o višeporučnom toku. Backend ne treba da označi povraćaj kao završen samo zato što je withdrawal worker predao poruku walletu.</p>
<h2>API v2, API v3, Streaming API i liteserver</h2>
<p>TON aplikacija može pristupati blockchainu na više nivoa.</p>
<h3>Liteserver</h3>
<p>Liteserver govori protokole bliže samoj mreži. Pogodan je kada želite neposredan pristup stanju i kriptografskim dokazima, ali zahteva više razumevanja TL-B struktura, blokova i shardova.</p>
<h3>API v2</h3>
<p>API v2 pruža REST i JSON-RPC pristup funkcijama koje su bliske liteserver operacijama. Pogodan je za:</p>
<ul>
<li><p>stanje naloga</p>
</li>
<li><p>slanje poruka</p>
</li>
<li><p>izvršavanje get metoda</p>
</li>
<li><p>osnovne blockchain upite</p>
</li>
</ul>
<p>Pošto je bliži izvornom blockchain modelu, aplikacija ponekad mora sama da povezuje podatke i parsira strukture.</p>
<h3>API v3</h3>
<p>API v3 koristi indeksiranu bazu i pogodniji je za aplikativne upite:</p>
<ul>
<li><p>pretragu transakcija</p>
</li>
<li><p>filtriranje poruka</p>
</li>
<li><p>pregled naloga</p>
</li>
<li><p>istorijske podatke</p>
</li>
<li><p>povezivanje događaja sa adresama</p>
</li>
</ul>
<p>Indeksirani API može kasniti za mrežom. Zato <code>not found</code> odmah nakon slanja ne mora značiti neuspeh.</p>
<h3>Streaming API</h3>
<p>Streaming interfejs služi za promene statusa i događaje bez agresivnog polling-a. I dalje su potrebni reconnect, checkpoint i deduplikacija.</p>
<p>Pouzdan consumer čuva poslednju obrađenu poziciju ili dovoljno informacija da nakon prekida ponovo preuzme propušten period.</p>
<h2>Hosted API ili sopstveni node</h2>
<p>Za prototip je hosted API racionalan izbor. Za produkciju odluka zavisi od rizika.</p>
<table>
<thead>
<tr>
<th>Pristup</th>
<th>Prednosti</th>
<th>Nedostaci</th>
</tr>
</thead>
<tbody><tr>
<td>Hosted API</td>
<td>Brzo postavljanje, indeksirani podaci</td>
<td>Rate limit, vendor zavisnost</td>
</tr>
<tr>
<td>Sopstveni liteserver</td>
<td>Veća kontrola i direktniji pristup</td>
<td>Operativna složenost</td>
</tr>
<tr>
<td>Sopstveni API indeks</td>
<td>Kontrola modela i istorije</td>
<td>Storage, održavanje i monitoring</td>
</tr>
<tr>
<td>Hibrid</td>
<td>Failover i nezavisna provera</td>
<td>Više implementacionog rada</td>
</tr>
</tbody></table>
<p>Payment servis ne bi trebalo da zavisi od jednog neproverenog HTTP odgovora. Razumna arhitektura uključuje:</p>
<ul>
<li><p>retry sa backoff algoritmom</p>
</li>
<li><p>idempotentnu obradu</p>
</li>
<li><p>praćenje kašnjenja indeksiranja</p>
</li>
<li><p>alert kada consumer zaostane</p>
</li>
<li><p>periodično usklađivanje baze sa blockchainom</p>
</li>
<li><p>mogućnost ponovnog indeksiranja određenog opsega</p>
</li>
<li><p>rezervnog provajdera ili sopstvenu proveru za kritične tokove</p>
</li>
</ul>
<h2>Kako se obračunavaju TON naknade</h2>
<p>TON nema jednu fiksnu cenu transakcije. Ukupan trošak zavisi od faza izvršenja i mrežne konfiguracije.</p>
<p>Glavne komponente su:</p>
<ul>
<li><p>storage fee</p>
</li>
<li><p>compute fee</p>
</li>
<li><p>forward fee</p>
</li>
<li><p>action fee</p>
</li>
<li><p>import fee</p>
</li>
</ul>
<h3>Storage fee</h3>
<p>Storage trošak zavisi od broja bitova, broja ćelija i perioda tokom kojeg se podaci čuvaju.</p>
<p>Praktično, veći persistent state znači veći dugoročni trošak. Deljeni identični podgrafovi ćelija mogu biti deduplikovani pri obračunu, ali aplikacija ne treba da računa na deduplikaciju kao zamenu za dobar model podataka.</p>
<h3>Compute fee</h3>
<p>TVM instrukcije troše gas. Mrežna konfiguracija definiše cenu, a korisnik je ne bira kao proizvoljan gas price.</p>
<p>Postoji minimalna, odnosno flat komponenta do određenog gas limita, nakon čega se dodatno izvršavanje obračunava prema potrošnji.</p>
<h3>Forward i action fee</h3>
<p>Internal poruka mora biti preneta od izvornog ka odredišnom nalogu. Cena zavisi od osnovne naknade i veličine poruke u bitovima i ćelijama.</p>
<p>Veliki payload, mnogo referenci ili <code>StateInit</code> povećavaju trošak. Ako jedna poslovna operacija generiše pet internal poruka, svaka doprinosi ukupnom trošku.</p>
<h3>Import fee</h3>
<p>Eksterna poruka mora biti uvezena u mrežu pre izvršenja. Za nju postoji import komponenta slična trošku prosleđivanja.</p>
<h3>Zašto ne treba hardkodirati fee</h3>
<p>Fee parametri se nalaze u blockchain konfiguraciji i mogu se menjati. Hardkodirana vrednost koja prolazi u testu može kasnije biti nedovoljna.</p>
<p>Bolji pristup je:</p>
<ul>
<li><p>emulirati poruku pre slanja kada wallet ili API to podržava</p>
</li>
<li><p>čitati aktuelne config parametre za precizne proračune</p>
</li>
<li><p>dodati razumnu rezervu za višeporučne tokove</p>
</li>
<li><p>vratiti višak pošiljaocu kroz odgovarajuću response adresu</p>
</li>
<li><p>meriti realnu potrošnju u testovima</p>
</li>
<li><p>izbegavati ogromna tela poruka i nepotreban <code>StateInit</code></p>
</li>
</ul>
<p>Ne postoji univerzalna cena za „poziv contracta“. Jednostavan transfer i Jetton transfer sa deployem primaočevog Jetton walleta nemaju isti trošak.</p>
<h2>Message modes i upravljanje vrednošću</h2>
<p>Kada contract šalje internal poruku, mode i flagovi određuju kako se tretiraju vrednost, naknade i greške.</p>
<p>Mogu se koristiti za:</p>
<ul>
<li><p>obično slanje definisanog iznosa</p>
</li>
<li><p>plaćanje forward fee-a odvojeno od poslate vrednosti</p>
</li>
<li><p>prosleđivanje preostale vrednosti dolazne poruke</p>
</li>
<li><p>slanje celog preostalog balansa</p>
</li>
<li><p>ignorisanje određenih action grešaka</p>
</li>
<li><p>generisanje bounce ponašanja</p>
</li>
<li><p>brisanje contracta kada balans padne na nulu</p>
</li>
</ul>
<p>Ovo je područje gde „radi u happy path testu“ nije dovoljno.</p>
<p>Posebno je opasno kombinovati slanje skoro celog balansa sa zanemarivanjem action grešaka. Contract može ostati bez sredstava potrebnih za storage ili narednu poruku. Takođe, flag koji ignoriše grešku ne znači da je ciljana poslovna operacija završena.</p>
<p>Message mode treba posmatrati kao deo sigurnosnog dizajna contracta, ne kao magičan broj preuzet iz tuđeg primera.</p>
<h2>Potvrda, finalnost i stanje korisničkog interfejsa</h2>
<p>Frontend ne bi trebalo da ima samo stanja <code>loading</code> i <code>success</code>.</p>
<p>Praktičniji model:</p>
<pre><code class="language-text">idle
wallet_confirmation
submitted
observed
confirmed
finalized
business_verified
failed
expired
</code></pre>
<p>Razlika između <code>submitted</code> i <code>business_verified</code> je važna:</p>
<ul>
<li><p><code>submitted</code> znači da je wallet prihvatio zahtev za slanje</p>
</li>
<li><p><code>observed</code> znači da je poruka ili transakcija pronađena</p>
</li>
<li><p><code>confirmed</code> znači da je ušla u relevantan blok</p>
</li>
<li><p><code>finalized</code> znači da aplikacija primenjuje svoju politiku konačnosti</p>
</li>
<li><p><code>business_verified</code> znači da su primalac, asset, iznos i payload provereni</p>
</li>
</ul>
<p>Kod složenog trace-a korisniku je često bolje prikazati „obrada u toku“ nego prerano „uspešno“.</p>
<h2>Najčešće produkcione greške</h2>
<h3>Verovanje tickeru tokena</h3>
<p>Naziv i simbol nisu identitet Jettona. Proverava se master contract.</p>
<h3>Pretpostavka da je wallet potpis isto što i uplata</h3>
<p>Potpisana poruka može isteći, ostati bez sredstava ili proizvesti neuspešnu udaljenu transakciju.</p>
<h3>Provera samo compute exit code-a</h3>
<p>Action faza i naredne transakcije u trace-u mogu neuspeti.</p>
<h3>Korišćenje floating-point iznosa</h3>
<p>Blockchain iznose treba držati kao integer osnovne jedinice.</p>
<h3>Mešanje raw i user-friendly adresa</h3>
<p>Ista adresa može imati više tekstualnih reprezentacija. Pre poređenja treba je parsirati i normalizovati.</p>
<h3>Nedostatak idempotency zaštite</h3>
<p>Polling i streaming potrošači mogu ponovo isporučiti isti događaj. Finansijsko knjiženje mora imati unique identifikator.</p>
<h3>Neobrađene bounce poruke</h3>
<p>Contract može promeniti lokalno stanje, poslati poruku i ostati bez recovery puta ako udaljeni korak ne uspe.</p>
<h3>Hardkodirane naknade</h3>
<p>Višeporučni tok ili deploy novog wallet contracta može zahtevati više sredstava od jednostavnog transfera.</p>
<h3>Neograničene petlje</h3>
<p>Dictionary obrada i batch isplate moraju imati granicu po transakciji.</p>
<h3>Povezivanje Telegram identiteta i walleta bez dokaza</h3>
<p>Telegram <code>initData</code> dokazuje Telegram sesiju. <code>ton_proof</code> dokazuje kontrolu wallet adrese. To nisu isti dokaz.</p>
<h2>Kada TON ima smisla</h2>
<p>TON je dobar kandidat kada aplikacija ima:</p>
<ul>
<li><p>Telegram kao glavni kanal distribucije</p>
</li>
<li><p>česte male transfere</p>
</li>
<li><p>digitalnu robu ili tokene</p>
</li>
<li><p>veliki broj nezavisnih korisničkih operacija</p>
</li>
<li><p>potrebu za wallet povezivanjem bez čuvanja ključeva</p>
</li>
<li><p>arhitekturu koja prirodno može biti asinhrona</p>
</li>
<li><p>backend koji može indeksirati i usklađivati on-chain događaje</p>
</li>
</ul>
<p>Posebno prirodni use-caseovi su:</p>
<ul>
<li><p>Telegram Mini App igre</p>
</li>
<li><p>plaćeni sadržaj i članarine</p>
</li>
<li><p>creator tipping</p>
</li>
<li><p>loyalty poeni kao Jettoni</p>
</li>
<li><p>marketplace digitalnih predmeta</p>
</li>
<li><p>masovne isplate</p>
</li>
<li><p>custody i payment servisi</p>
</li>
<li><p>aplikacije koje primaju Toncoin ili podržane stablecoin Jetton tokene</p>
</li>
</ul>
<h2>Kada TON verovatno nije pravi izbor</h2>
<p>TON nije automatski dobar izbor samo zato što su naknade niske.</p>
<p>Druga platforma može biti pogodnija ako projekat zahteva:</p>
<ul>
<li><p>direktan redeploy postojećeg Solidity sistema</p>
</li>
<li><p>duboku EVM kompozabilnost</p>
</li>
<li><p>sinhrone pozive kroz više protokola</p>
</li>
<li><p>postojeći audit i monitoring stack vezan isključivo za EVM</p>
</li>
<li><p>poslovni tok koji teško podnosi delimičan uspeh</p>
</li>
<li><p>integraciju sa likvidnošću koja postoji samo na drugom lancu</p>
</li>
<li><p>jednostavan centralizovani payment sistem bez potrebe za blockchain settlementom</p>
</li>
</ul>
<p>Ako aplikacija nema razlog da koristi on-chain stanje ili korisničko vlasništvo, obična baza i standardni payment provider mogu biti jednostavniji i jeftiniji za održavanje.</p>
<h2>Praktičan razvojni workflow</h2>
<p>Razuman put od ideje do produkcije izgleda ovako.</p>
<h3>1. Definišite poslovni događaj</h3>
<p>Pre contracta odredite šta tačno znači:</p>
<ul>
<li><p>uplata je poslata</p>
</li>
<li><p>uplata je potvrđena</p>
</li>
<li><p>pravo je aktivirano</p>
</li>
<li><p>refund je završen</p>
</li>
</ul>
<p>Bez toga nije moguće pravilno odabrati transakciju ili poruku koja predstavlja uspeh.</p>
<h3>2. Napravite TON Connect prototip</h3>
<p>Hostujte manifest, povežite test wallet i pošaljite jednostavnu testnet transakciju. Time proveravate UX pre nego što uvedete contract logiku.</p>
<h3>3. Modelujte trace</h3>
<p>Na papiru ili u Mermaid dijagramu nacrtajte svaki account i svaku poruku. Dodajte grane za bounce, timeout i duplu obradu.</p>
<h3>4. Izaberite najjednostavniji settlement model</h3>
<p>Ako je dovoljan direktan Toncoin transfer, nemojte odmah pisati contract. Contract uvodite kada su potrebni automatska pravila, zajedničko stanje ili verifikabilna koordinacija više učesnika.</p>
<h3>5. Pišite wrapper uz contract</h3>
<p>Wire format poruka treba da bude definisan na jednom mestu. Frontend i testovi ne bi trebalo svaki zasebno da ručno pakuju opcodes.</p>
<h3>6. Testirajte neuspehe</h3>
<p>Happy path je najmanji deo TON testiranja. Testirajte bounce, nedovoljan gas, pogrešnog pošiljaoca, duple ID-jeve i neuspešnu action fazu.</p>
<h3>7. Uvedite blockchain consumer</h3>
<p>Consumer mora biti restart-safe, idempotentan i sposoban da nadoknadi propuštene događaje.</p>
<h3>8. Testirajte kompletan tok na testnetu</h3>
<p>Proverite različite wallete, reconnect, istek zahteva, odbijanje potpisa, API kašnjenje i ponovno učitavanje Mini App-a.</p>
<h3>9. Uvedite reconciliation</h3>
<p>Periodični posao treba da poredi internu evidenciju sa blockchain stanjem i prijavi razlike.</p>
<h3>10. Mainnet krenite sa ograničenjima</h3>
<p>Ograničite iznose, broj operacija i podržane assete dok monitoring ne pokaže da trace obrada, fee rezerva i recovery tokovi rade kako je predviđeno.</p>
<h2>Zaključak</h2>
<p>TON je tehnički zanimljiv jer pokušava da skaliranje reši na nivou same arhitekture: workchainovima, dinamičkim shardovima i asinhronim porukama. Cena tog pristupa je složeniji mentalni model.</p>
<p>Developer koji dolazi sa EVM-a mora da prestane da razmišlja u call stackovima i počne da razmišlja u porukama, stanjima procesa i trace-ovima. Jetton nije jedan token contract. Wallet nije samo ekstenzija browsera. Uspešna transakcija jednog naloga nije nužno uspešna poslovna operacija. Storage nije besplatan, a forward fee nije sporedan detalj.</p>
<p>Najbolji prvi eksperiment nije sopstveni token niti DEX. Korisniji je mali end-to-end sistem: Telegram Mini App, TON Connect, testnet uplata, backend consumer i idempotentna potvrda porudžbine. Taj prototip dovoljno brzo otkriva da li TON-ov distribucioni kanal i model troškova vrede dodatne složenosti asinhronog protokola.</p>
<h3><em>Ovaj članak je sponzorisan od strane</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet.com</em></a><em>. Na Volet.com možete kupiti i prodati Ton. Više informacija nalazi se na stranici</em> <a href="https://volet.srbija.workers.dev/"><em>Volet za korisnike iz Srbije</em></a><em>. Za otvaranje naloga koristi</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet referral link</em></a><em>. Link je referral link autora članka.</em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://docs.ton.org/">TON Documentation</a></p>
</li>
<li><p><a href="https://docs.ton.org/start-here">TON: Start here</a></p>
</li>
<li><p><a href="https://docs.ton.org/foundations/overview">Blockchain foundations overview</a></p>
</li>
<li><p><a href="https://docs.ton.org/foundations/shards">Blockchain sharding</a></p>
</li>
<li><p><a href="https://docs.ton.org/foundations/whitepapers/simplex">Catchain 2.0: Simplex Consensus in TON</a></p>
</li>
<li><p><a href="https://docs.ton.org/foundations/whitepapers/tblkch">TON blockchain specification</a></p>
</li>
<li><p><a href="https://docs.ton.org/foundations/serialization/cells">Cells</a></p>
</li>
<li><p><a href="https://docs.ton.org/foundations/serialization/boc">Bag of Cells</a></p>
</li>
<li><p><a href="https://docs.ton.org/foundations/phases">Execution phases</a></p>
</li>
<li><p><a href="https://docs.ton.org/foundations/fees">Transaction fees</a></p>
</li>
<li><p><a href="https://docs.ton.org/tolk/overview">Tolk language</a></p>
</li>
<li><p><a href="https://docs.ton.org/contracts/overview">Introduction to smart contract development</a></p>
</li>
<li><p><a href="https://docs.ton.org/contracts/blueprint/overview">Blueprint overview</a></p>
</li>
<li><p><a href="https://docs.ton.org/contracts/blueprint/testing/overview">TON Sandbox testing overview</a></p>
</li>
<li><p><a href="https://docs.ton.org/applications/ton-connect/overview">TON Connect overview</a></p>
</li>
<li><p><a href="https://docs.ton.org/applications/ton-connect/get-started">Get started with TON Connect</a></p>
</li>
<li><p><a href="https://github.com/ton-blockchain/ton-connect">TON Connect protocol specification</a></p>
</li>
<li><p><a href="https://docs.ton.org/applications/payments/overview">Payment processing overview</a></p>
</li>
<li><p><a href="https://docs.ton.org/applications/payments/toncoin">Toncoin payment processing</a></p>
</li>
<li><p><a href="https://docs.ton.org/applications/payments/jettons">Jetton payment processing</a></p>
</li>
<li><p><a href="https://docs.ton.org/contracts/standard/tokens/jettons/overview">Jetton standard overview</a></p>
</li>
<li><p><a href="https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md">TEP-74 Jetton standard</a></p>
</li>
<li><p><a href="https://docs.ton.org/applications/api/toncenter/v2-overview">TON Center API v2 overview</a></p>
</li>
<li><p><a href="https://docs.ton.org/applications/api/toncenter/v3-overview">TON Center API v3 overview</a></p>
</li>
<li><p><a href="https://docs.ton.org/applications/api/toncenter/streaming-overview">TON Streaming API overview</a></p>
</li>
<li><p><a href="https://docs.ton.org/contracts/blueprint/debug">Debugging smart contracts</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/ton-coin-for-developers-how-the-network-actually-works-43m0">TON Coin for Developers: How the Network Actually Works</a></p>
]]></content:encoded></item><item><title><![CDATA[Solana za developere: transakcije koje rade u praksi]]></title><description><![CDATA[Solana je blockchain platforma na kojoj aplikacija može da menja zajedničko stanje kroz potpisane, atomske transakcije. Za developera je važnije to što Solana nije samo mreža za slanje tokena. Ona je ]]></description><link>https://kripto-pocetnica.hashnode.dev/solana-za-developere-transakcije-koje-rade-u-praksi</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/solana-za-developere-transakcije-koje-rade-u-praksi</guid><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Fri, 18 Sep 2026 16:46:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/17a49321-fc3f-4062-9ca5-2810e19c58fe.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Solana je blockchain platforma na kojoj aplikacija može da menja zajedničko stanje kroz potpisane, atomske transakcije. Za developera je važnije to što Solana nije samo mreža za slanje tokena. Ona je distribuirani runtime u kome su kod, podaci i dozvole eksplicitno razdvojeni.</p>
<p>To utiče na gotovo svaku tehničku odluku. Program ne čuva stanje u sopstvenoj memoriji, već dobija naloge koje sme da čita ili menja. Transakcija unapred navodi koje naloge koristi. Klijent sastavlja instrukcije, pribavlja potpise i šalje serijalizovanu transakciju RPC čvoru. Mreža zatim izvršava sve instrukcije kao jednu atomsku celinu.</p>
<p>Ovaj model ima smisla kada aplikaciji trebaju javno proverljive promene stanja, interoperabilni tokeni ili izvršenje koje ne zavisi od jedne baze podataka. Nema mnogo smisla kada je običan PostgreSQL dovoljan.</p>
<h2>Šta Solana zapravo izvršava</h2>
<p>Osnovna jedinica stanja na Solani zove se account, odnosno nalog. Svaki nalog ima adresu od 32 bajta, stanje izraženo u lamportima, proizvoljne podatke, vlasnički program i nekoliko runtime polja.</p>
<p>Važno je razlikovati tri pojma:</p>
<ul>
<li><p>Wallet predstavlja par ključeva i može da potpisuje transakcije.</p>
</li>
<li><p>Account je zapis na mreži koji sadrži sredstva ili podatke.</p>
</li>
<li><p>Program je izvršni nalog sa sBPF kodom koji obrađuje instrukcije.</p>
</li>
</ul>
<p>Programi su stateless u uobičajenom smislu. Promenljivo stanje nalazi se u odvojenim data account nalozima. Samo program koji poseduje nalog može da menja njegove podatke ili da iz njega oduzima lamporte.</p>
<p>To je bitna razlika u odnosu na platforme na kojima smart contract izgleda kao objekat sa internim poljima. Na Solani je program bliži servisnoj funkciji kojoj runtime prosleđuje tačno određene resurse.</p>
<p>Jedna instrukcija tipično sadrži:</p>
<ul>
<li><p>ID programa koji treba pozvati</p>
</li>
<li><p>listu naloga koje program sme da koristi</p>
</li>
<li><p>oznake koji su nalozi writable</p>
</li>
<li><p>oznake koji nalozi moraju da potpišu</p>
</li>
<li><p>binarne podatke specifične za instrukciju</p>
</li>
</ul>
<p>Transakcija može da sadrži više instrukcija. Ako bilo koja instrukcija ne uspe, promene svih instrukcija se poništavaju. Naknada se ipak plaća.</p>
<h2>Zašto je eksplicitna lista naloga važna</h2>
<p>Kada runtime unapred zna koje stanje transakcija čita i menja, može da prepozna transakcije koje se međusobno ne sudaraju. Dve transakcije koje menjaju različite writable naloge mogu se obrađivati nezavisno.</p>
<p>Cena tog modela je dodatna složenost na strani aplikacije. Klijent često mora unapred da izračuna sve adrese koje će programu biti potrebne. Ako zaboravi nalog ili ga označi pogrešnim pravom pristupa, instrukcija neće proći.</p>
<p>Tu se pojavljuje Program Derived Address, odnosno PDA. To je deterministička adresa izvedena iz ID-ja programa i skupa seed vrednosti. PDA nema privatni ključ. Program može da potpisuje za svoj PDA tokom izvršavanja, pod pravilima runtime-a.</p>
<p>Na primer, sistem za fakture može da izvede stanje fakture iz sledećih semantičkih delova:</p>
<pre><code class="language-text">["invoice", merchant_address, invoice_id]
</code></pre>
<p>Isti ulazi daju istu adresu. Backend, frontend i program mogu nezavisno da pronađu isti zapis bez centralnog registra adresa.</p>
<p>Seed vrednosti ipak ne treba tretirati kao tajne. One služe za adresiranje i namespacing, ne za enkripciju.</p>
<h2>Realan use-case: stablecoin naplata sa evidencijom fakture</h2>
<p>Razmotrimo servis koji naplaćuje digitalnu uslugu stablecoin tokenom na Solani. Najjednostavnija verzija šalje korisniku adresu i zatim traži dolaznu transakciju. To radi za prototip, ali brzo otvara pitanja:</p>
<ul>
<li><p>Kojoj fakturi pripada uplata?</p>
</li>
<li><p>Da li je poslat pravi token ili samo token sa istim simbolom?</p>
</li>
<li><p>Da li je primalac ispravan token account?</p>
</li>
<li><p>Da li je iznos izražen uz odgovarajući broj decimala?</p>
</li>
<li><p>Da li je transakcija samo primećena ili dovoljno potvrđena?</p>
</li>
<li><p>Šta se dešava ako klijent pošalje istu fakturu dva puta?</p>
</li>
</ul>
<p>Simbol tokena nije dovoljan identifikator. Aplikacija mora da proverava tačnu mint adresu. Iznose treba čuvati kao cele brojeve u najmanjoj jedinici tokena, nikada kao JavaScript <code>number</code> ili decimalni <code>float</code>.</p>
<p>Dve arhitekture su uobičajene.</p>
<h3>Off-chain evidencija</h3>
<p>Backend kreira fakturu u sopstvenoj bazi. Frontend zatim sastavlja transakciju koja prenosi token na merchant token account. Nakon potpisa backend dobija signature i proverava transakciju preko RPC-ja.</p>
<p>Prednosti su manje on-chain logike, jednostavnije izmene poslovnih pravila i niži operativni troškovi. Nedostatak je što mapiranje transakcije na fakturu ostaje odgovornost backend sistema.</p>
<p>Veza može da se uspostavi kroz jedinstvenu adresu primaoca, dodatnu instrukciju sa referencom ili unapred konstruisanu transakciju. Nijedna od ovih tehnika ne zamenjuje proveru stvarnog token transfera.</p>
<h3>On-chain evidencija</h3>
<p>Aplikacija uvodi sopstveni program koji u istoj transakciji prima uplatu i menja PDA fakture iz <code>unpaid</code> u <code>paid</code>.</p>
<p>Prednost je atomsko pravilo: token transfer i promena statusa uspevaju zajedno ili se oba poništavaju. Program može da odbije pogrešan mint, iznos, primaoca ili već plaćenu fakturu.</p>
<p>Nedostatak je veći bezbednosni i operativni teret. Potrebni su program, deploy procedura, upravljanje upgrade autoritetom, testiranje svih account ograničenja i plan migracije podataka.</p>
<p>Za većinu prvih integracija razumno je početi off-chain verifikacijom. Sopstveni program postaje koristan kada atomska promena stanja zaista rešava poslovni problem, a ne samo zato što je smart contract dostupan.</p>
<h2>Workflow jedne uplate</h2>
<p>Praktičan tok izgleda ovako:</p>
<ol>
<li><p>Backend kreira fakturu sa internim ID-jem, mint adresom, iznosom u najmanjoj jedinici i rokom važenja.</p>
</li>
<li><p>Frontend dobija parametre plaćanja i proverava da je wallet povezan sa očekivanim clusterom.</p>
</li>
<li><p>Klijent od RPC čvora uzima svež blockhash.</p>
</li>
<li><p>Klijent sastavlja token transfer i eventualnu aplikacionu instrukciju.</p>
</li>
<li><p>Wallet prikazuje transakciju korisniku i potpisuje je.</p>
</li>
<li><p>Potpisana transakcija šalje se RPC čvoru.</p>
</li>
<li><p>Backend čuva signature uz fakturu.</p>
</li>
<li><p>Worker proverava status i zatim preuzima kompletnu transakciju.</p>
</li>
<li><p>Backend proverava grešku izvršenja, mint, primaoca, iznos i očekivane instrukcije.</p>
</li>
<li><p>Faktura se označava kao plaćena idempotentnom promenom stanja.</p>
</li>
</ol>
<p>Recent blockhash sprečava da obična transakcija ostane važeća neograničeno dugo. Ako istekne pre nego što transakcija stigne do mreže, klijent mora da dobije novi blockhash, ponovo sastavi poruku i pribavi novi potpis.</p>
<p>Zbog toga unapred potpisane transakcije nisu datoteke koje se mogu čuvati danima. Za posebne scenarije postoje durable nonce mehanizmi, ali oni uvode dodatno stanje i drugačiji lifecycle.</p>
<h2>Slanje nije isto što i potvrda</h2>
<p>RPC metoda <code>sendTransaction</code> vraća signature kada čvor prihvati transakciju za prosleđivanje. To nije dokaz da je transakcija izvršena niti da je završila bez greške.</p>
<p>Backend treba da posmatra njen status. Minimalna provera može da koristi standardni JSON-RPC metod <code>getSignatureStatuses</code>:</p>
<pre><code class="language-ts">type SignatureState = {
    slot: number;
    err: unknown;
    confirmationStatus?: "processed" | "confirmed" | "finalized";
};

async function getSignatureState(
    rpcUrl: string,
    signature: string
): Promise&lt;SignatureState | null&gt; {
    const response = await fetch(rpcUrl, {
        method: "POST",
        headers: { "content-type": "application/json" },
        body: JSON.stringify({
            jsonrpc: "2.0",
            id: 1,
            method: "getSignatureStatuses",
            params: [
                [signature],
                { searchTransactionHistory: true }
            ]
        })
    });

    if (!response.ok) {
        throw new Error(`RPC returned HTTP ${response.status}`);
    }

    const body = await response.json();

    if (body.error) {
        throw new Error(body.error.message);
    }

    return body.result.value[0];
}
</code></pre>
<p>Ovaj kod odgovara samo na pitanje da li RPC vidi signature, na kom je statusu i da li je izvršenje prijavilo grešku. Nije dovoljna verifikacija plaćanja.</p>
<p>Kada status dostigne nivo koji aplikacija zahteva, backend treba da pozove <code>getTransaction</code> i proveri sadržaj transakcije. Kod token transfera to znači najmanje:</p>
<ul>
<li><p><code>meta.err</code> mora biti <code>null</code></p>
</li>
<li><p>mint mora biti tačno očekivani mint</p>
</li>
<li><p>destinacija mora pripadati merchantu</p>
</li>
<li><p>preneti iznos mora odgovarati fakturi</p>
</li>
<li><p>transakcija ne sme već biti iskorišćena za drugu fakturu</p>
</li>
<li><p>cluster mora biti produkcioni cluster koji aplikacija očekuje</p>
</li>
</ul>
<p>Treba obraditi i inner instructions. Program može kroz cross-program invocation da pozove token program, pa relevantan transfer nije nužno samo među instrukcijama najvišeg nivoa.</p>
<p>Poređenje pre i posle token balance vrednosti ponekad je korisnije od oslanjanja samo na parsed instruction prikaz, ali ni tada ne treba pretpostaviti da je svaka promena salda uplata konkretnoj fakturi. Verifikator mora da prati poslovnu nameru transakcije, ne samo konačan broj.</p>
<h2><code>processed</code>, <code>confirmed</code> i <code>finalized</code></h2>
<p>Solana RPC izlaže različite commitment nivoe:</p>
<ul>
<li><p><code>processed</code> znači da je čvor obradio transakciju u svom trenutnom fork-u.</p>
</li>
<li><p><code>confirmed</code> znači da je transakcija dobila potvrdu supervećine stake-a.</p>
</li>
<li><p><code>finalized</code> predstavlja stroži nivo u kome je blok završen prema pravilima mreže.</p>
</li>
</ul>
<p>Ne postoji jedan pravilan nivo za sve proizvode. Interaktivni UI može brzo prikazati privremeni status na <code>processed</code>, zatim normalnu potvrdu na <code>confirmed</code>. Nepovratna isporuka robe ili eksterno poravnanje mogu zahtevati <code>finalized</code>.</p>
<p>Dobar model statusa zato nije samo boolean <code>paid</code>:</p>
<pre><code class="language-text">created
wallet_signed
submitted
processed
confirmed
finalized
failed
expired
</code></pre>
<p>Aplikacija ne mora korisniku prikazati sve interne statuse, ali ih backend treba razlikovati. To značajno olakšava retry logiku i istragu spornih uplata.</p>
<h2>Koliko Solana transakcija košta</h2>
<p>Svaka transakcija plaća naknadu u SOL-u. Dokumentovana struktura ima dve komponente:</p>
<ul>
<li><p>osnovnu naknadu za potpise</p>
</li>
<li><p>opcionu prioritization naknadu</p>
</li>
</ul>
<p>Aktuelna dokumentacija navodi osnovnu naknadu od 5.000 lamporta po potpisu. Prioritization naknada zavisi od izabranog compute unit limita i cene po compute unit-u. Ona povećava verovatnoću da lider ranije rasporedi transakciju kada postoji konkurencija za izvršenje.</p>
<p>Ne treba prevoditi tu vrednost u fiksan fiat iznos u kodu ili poslovnoj dokumentaciji. Cena SOL-a se menja, a složenije transakcije mogu imati više potpisa i dodatnu priority naknadu.</p>
<p>Pored same transakcije, postoje i drugi troškovi:</p>
<ul>
<li><p>Nalozi koji čuvaju podatke moraju imati minimalan depozit u lamportima proporcionalan veličini podataka.</p>
</li>
<li><p>Kreiranje token account naloga zahteva taj depozit.</p>
</li>
<li><p>Deploy i upgrade programa troše SOL.</p>
</li>
<li><p>Produkcioni RPC provajder može imati poseban tarifni model.</p>
</li>
<li><p>Indeksiranje istorije i webhook infrastruktura često koštaju više od samih on-chain naknada.</p>
</li>
</ul>
<p>Depozit za storage nije isto što i nepovratna transakciona naknada. Minimalni balans naloga može se vratiti kada se nalog pravilno zatvori, ako program i tip naloga to dozvoljavaju.</p>
<p>Ako korisnik plaća tokenom, i dalje je potreban SOL za mrežnu naknadu. Aplikacija može koristiti posebnog fee payer-a i tako sponzorisati transakciju, ali tada backend mora da odluči koje poruke sme da potpiše. Fee payer servis koji slepo potpisuje proizvoljne transakcije predstavlja otvoren račun za napadača.</p>
<h2>Ograničenja koja se vide tek u produkciji</h2>
<h3>Transakcija ima ograničenu veličinu</h3>
<p>Dokumentacija navodi maksimalnu veličinu transakcije od 1.232 bajta. Potpisi, adrese naloga i instrukcije dele taj prostor.</p>
<p>Transakcija sa mnogo naloga može preći limit iako njen program troši malo compute units. Versioned transakcije i Address Lookup Tables mogu smanjiti broj adresa koje se direktno upisuju u poruku, ali uvode dodatne objekte koje klijenti i backend moraju pravilno da podrže.</p>
<h3>Writable nalozi postaju tačke konkurencije</h3>
<p>Ako svaka uplata menja isti globalni merchant state account, taj nalog postaje zajednička writable tačka. Transakcije koje ga koriste ne mogu se tretirati kao nezavisne.</p>
<p>Bolje je razložiti stanje po fakturi, korisniku ili drugom prirodnom ključu. PDA model to olakšava, ali zahteva pažljivo projektovanje seed vrednosti i lifecycle-a naloga.</p>
<h3>Compute budget nije isto što i CPU vreme servera</h3>
<p>Izvršenje programa meri se kroz compute units. Transakcija može eksplicitno postaviti compute limit i cenu prioriteta. Previsok limit uz visoku cenu može nepotrebno povećati naknadu, dok prenizak limit dovodi do neuspeha.</p>
<p>Simulacija pomaže u proceni, ali rezultat simulacije nije garancija da će transakcija stići i uspeti u promenjenom stanju mreže.</p>
<h3>RPC nije blockchain</h3>
<p>RPC čvor je pristupna tačka, ne izvor apsolutne dostupnosti. Javni endpointi imaju rate limite i nisu namenjeni kao jedina produkciona infrastruktura.</p>
<p>Produkcioni sistem treba da očekuje:</p>
<ul>
<li><p>HTTP greške i timeout</p>
</li>
<li><p>privremeno različite rezultate između čvorova</p>
</li>
<li><p>rate limiting</p>
</li>
<li><p>sporije indeksiranje starijih transakcija</p>
</li>
<li><p>prekid WebSocket konekcije</p>
</li>
<li><p>duplicate notification događaje</p>
</li>
</ul>
<p>Signature treba čuvati u sopstvenoj bazi, a obradu napraviti idempotentnom. WebSocket može ubrzati obaveštenje, ali periodični reconciliation preko HTTP RPC-ja ostaje koristan.</p>
<h2>Bezbednosna granica je često van blockchaina</h2>
<p>Smart contract audit ne rešava kompromitovan frontend, procureli backend ključ ili pogrešan RPC odgovor koji aplikacija nekritički prihvati.</p>
<p>Praktičan threat model obuhvata najmanje:</p>
<ul>
<li><p>zamenu adrese primaoca u frontendu</p>
</li>
<li><p>potpisivanje drugačije transakcije od one koju UI opisuje</p>
</li>
<li><p>pogrešan cluster</p>
</li>
<li><p>lažni token sa istim nazivom i simbolom</p>
</li>
<li><p>ponovnu upotrebu validne transakcije</p>
</li>
<li><p>kompromitovan fee payer</p>
</li>
<li><p>kompromitovan program upgrade authority</p>
</li>
<li><p>parsiranje samo top-level instrukcija</p>
</li>
<li><p>gubitak privatnog ključa treasury walleta</p>
</li>
</ul>
<p>Backend ne bi trebalo da čuva korisničke privatne ključeve. Za serverske autoritete razumno je odvojiti fee payer, treasury i upgrade ključeve, ograničiti njihove uloge i ne držati značajna sredstva na ključu koji automatizovani servis koristi za svakodnevno potpisivanje.</p>
<p>Ako program ostane upgradeable, upgrade authority praktično zadržava mogućnost promene pravila. Ako se authority ukloni, program postaje nepromenljiv, ali se gubi mogućnost ispravke greške. Multisig, vremensko odlaganje i javna politika nadogradnje mogu biti bolji kompromis od jednog administratorskog ključa.</p>
<h2>Lokalni razvoj, devnet i mainnet</h2>
<p>Solana razlikuje više clustera:</p>
<ul>
<li><p>Devnet je javno okruženje za razvoj aplikacija.</p>
</li>
<li><p>Testnet je prvenstveno namenjen testiranju mreže i validatora.</p>
</li>
<li><p>Mainnet je produkciona mreža sa stvarnom ekonomskom vrednošću.</p>
</li>
</ul>
<p>Za svakodnevni razvoj koristan je lokalni validator jer daje brz i determinističniji testni ciklus. Devnet zatim proverava ponašanje sa udaljenim RPC-jem, walletom i realnijim mrežnim uslovima.</p>
<p>Devnet ipak nije verna kopija produkcije. Token mint adrese se razlikuju, dostupnost može varirati, a testni SOL nema tržišnu vrednost. Konfiguracija zato mora eksplicitno vezati sledeće vrednosti za cluster:</p>
<ul>
<li><p>RPC endpoint</p>
</li>
<li><p>program ID</p>
</li>
<li><p>token mint</p>
</li>
<li><p>merchant adrese</p>
</li>
<li><p>explorer linkove</p>
</li>
<li><p>dozvoljene wallet mreže</p>
</li>
</ul>
<p>Najopasnija konfiguraciona greška nije neuspešna transakcija, već uspešna transakcija na pogrešnoj mreži ili sa pogrešnim tokenom.</p>
<h2>Kada pisati sopstveni program</h2>
<p>Sopstveni Solana program ima smisla kada aplikacija mora da sprovede pravilo koje nijedna strana ne bi trebalo samostalno da zaobiđe.</p>
<p>Primeri uključuju:</p>
<ul>
<li><p>escrow između više strana</p>
</li>
<li><p>atomsko plaćanje i izdavanje on-chain prava</p>
</li>
<li><p>tržište sa pravilima poravnanja</p>
</li>
<li><p>delegirane dozvole ograničene programskim uslovima</p>
</li>
<li><p>zajedničko stanje koje koristi više nezavisnih aplikacija</p>
</li>
</ul>
<p>Program nije potreban samo da biste prihvatili token transfer ili pročitali stanje walleta. Svaki dodatni on-chain program donosi novi attack surface, naloge koje treba održavati, migracije i upgrade odluke.</p>
<p>Ako ga ipak gradite, Anchor može smanjiti količinu boilerplate koda kroz deklarativnu validaciju naloga i generisani interfejs. To ne uklanja potrebu da razumete ownership, signer i writable pravila. Framework greške su ređe opasne od pogrešnih pretpostavki u poslovnoj logici.</p>
<h2>Gde je Solana dobar izbor, a gde nije</h2>
<p>Solana je zanimljiva kada proizvod ima mnogo manjih interakcija, želi da kombinuje više programa u jednoj transakciji ili zahteva korisničko potpisivanje promena bez čuvanja privatnih ključeva na serveru.</p>
<p>Dobar fit može biti:</p>
<ul>
<li><p>stablecoin naplata</p>
</li>
<li><p>on-chain tržište</p>
</li>
<li><p>loyalty sistem sa prenosivim tokenima</p>
</li>
<li><p>gaming inventar koji komunicira sa drugim aplikacijama</p>
</li>
<li><p>escrow i programabilno poravnanje</p>
</li>
<li><p>javno proverljiva evidencija vlasništva</p>
</li>
</ul>
<p>Slabiji fit je sistem u kome:</p>
<ul>
<li><p>sve strane već veruju jednom operateru</p>
</li>
<li><p>podaci moraju ostati privatni</p>
</li>
<li><p>zapise često treba brisati ili retroaktivno menjati</p>
</li>
<li><p>poslovna pravila se menjaju svake nedelje</p>
</li>
<li><p>korisničko upravljanje ključevima donosi više problema nego vrednosti</p>
</li>
<li><p>regulatorni ili računovodstveni tok zahteva centralizovanu kontrolu</p>
</li>
</ul>
<p>Blockchain ne smanjuje automatski složenost. On menja mesto na kome se složenost nalazi. Manje je poverenja u centralnu bazu, ali ima više rada oko potpisa, finalnosti, javnog stanja, indeksera i upravljanja ključevima.</p>
<p>Za prvi ozbiljan eksperiment dovoljno je napraviti mali payment verifier: faktura u lokalnoj bazi, transfer na devnetu, čuvanje signature-a, provera statusa i stroga validacija kompletne transakcije. To otkriva najveći deo praktičnog Solana modela bez prerane izgradnje sopstvenog programa.</p>
<h3><em>Ovaj članak je sponzorisan od strane</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet.com</em></a><em>. Na Volet.com možete kupiti i prodati Solana. Više informacija nalazi se na stranici</em> <a href="https://volet.srbija.workers.dev/"><em>Volet za korisnike iz Srbije</em></a><em>. Za otvaranje naloga koristi</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet referral link</em></a><em>. Link je referral link autora članka.</em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://solana.com/docs/core/transactions">Solana dokumentacija: Transactions</a></p>
</li>
<li><p><a href="https://solana.com/docs/core/accounts">Solana dokumentacija: Accounts</a></p>
</li>
<li><p><a href="https://solana.com/docs/core/programs">Solana dokumentacija: Programs</a></p>
</li>
<li><p><a href="https://solana.com/docs/rpc/http/sendtransaction">Solana RPC dokumentacija: sendTransaction</a></p>
</li>
<li><p><a href="https://solana.com/docs/rpc/http/getsignaturestatuses">Solana RPC dokumentacija: getSignatureStatuses</a></p>
</li>
<li><p><a href="https://solana.com/docs/rpc/http/gettransaction">Solana RPC dokumentacija: getTransaction</a></p>
</li>
<li><p><a href="https://solana.com/docs/core/fees">Solana dokumentacija: Fees</a></p>
</li>
<li><p><a href="https://solana.com/docs/references/clusters">Solana dokumentacija: Clusters and Public RPC Endpoints</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/solana-for-developers-architecture-without-evm-assumptions-438d">Solana for Developers: Architecture Without EVM Assumptions</a></p>
]]></content:encoded></item><item><title><![CDATA[Litecoin: šta je LTC, kako radi i da li zaista ima praktičnu vrednost?]]></title><description><![CDATA[Gotovo svako ko se makar kratko interesovao za kriptovalute čuo je za Litecoin. Njegova oznaka je LTC, često ga nazivaju „digitalnim srebrom“, a najčešće se opisuje kao brža i jeftinija alternativa Bi]]></description><link>https://kripto-pocetnica.hashnode.dev/litecoin-ta-je-ltc-kako-radi-i-da-li-zaista-ima-prakti-nu-vrednost</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/litecoin-ta-je-ltc-kako-radi-i-da-li-zaista-ima-prakti-nu-vrednost</guid><category><![CDATA[litecoin]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Web3]]></category><category><![CDATA[crypto]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[Bitcoin]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Fri, 18 Sep 2026 16:34:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/4f625f59-50fa-4c1d-89fa-92cd1132e896.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Gotovo svako ko se makar kratko interesovao za kriptovalute čuo je za Litecoin. Njegova oznaka je LTC, često ga nazivaju „digitalnim srebrom“, a najčešće se opisuje kao brža i jeftinija alternativa Bitcoinu.</p>
<p>Međutim, takav opis ne daje odgovor na najvažnija pitanja:</p>
<ul>
<li><p>Šta je Litecoin zapravo?</p>
</li>
<li><p>Ko upravlja njegovom mrežom?</p>
</li>
<li><p>Kako se LTC novčići šalju sa jedne adrese na drugu?</p>
</li>
<li><p>Odakle nastaju novi novčići?</p>
</li>
<li><p>Da li Litecoin mreža i dalje radi i razvija se?</p>
</li>
<li><p>Koliko su transakcije sigurne?</p>
</li>
<li><p>Da li su Litecoin transakcije anonimne?</p>
</li>
<li><p>Po čemu se Litecoin razlikuje od Bitcoina?</p>
</li>
<li><p>Koje su njegove dobre, a koje loše strane?</p>
</li>
</ul>
<p>Najkraće rečeno, Litecoin je decentralizovan sistem digitalnog novca koji omogućava slanje vrednosti preko interneta bez potrebe da svaku transakciju obradi banka, kartična kompanija ili druga centralna institucija.</p>
<p>To, ipak, ne znači da je Litecoin bez rizika, da je potpuno anoniman ili da je svaka njegova upotreba automatski bolja od tradicionalnog plaćanja.</p>
<h2>Osnovni podaci o Litecoinu</h2>
<table>
<thead>
<tr>
<th>Karakteristika</th>
<th>Litecoin</th>
</tr>
</thead>
<tbody><tr>
<td>Naziv</td>
<td>Litecoin</td>
</tr>
<tr>
<td>Oznaka</td>
<td>LTC</td>
</tr>
<tr>
<td>Vrsta mreže</td>
<td>Javni, decentralizovani blokčejn</td>
</tr>
<tr>
<td>Pokretanje mreže</td>
<td>13. oktobar 2011.</td>
</tr>
<tr>
<td>Kreator</td>
<td>Charlie Lee</td>
</tr>
<tr>
<td>Mehanizam konsenzusa</td>
<td>Proof of Work</td>
</tr>
<tr>
<td>Algoritam rudarenja</td>
<td>Scrypt</td>
</tr>
<tr>
<td>Prosečno vreme bloka</td>
<td>Oko 2,5 minuta</td>
</tr>
<tr>
<td>Maksimalna ponuda</td>
<td>Približno 84 miliona LTC</td>
</tr>
<tr>
<td>Model transakcija</td>
<td>UTXO</td>
</tr>
<tr>
<td>Period prepolovljavanja nagrade</td>
<td>Svakih 840.000 blokova</td>
</tr>
<tr>
<td>Najmanja jedinica</td>
<td>0,00000001 LTC</td>
</tr>
<tr>
<td>Opciona privatnost</td>
<td>MWEB</td>
</tr>
<tr>
<td>Izvorni kod</td>
<td>Otvoren</td>
</tr>
</tbody></table>
<p>Parametri kao što su prosečno vreme bloka od 2,5 minuta, period prilagođavanja težine od približno 3,5 dana i prepolovljavanje nagrade na svakih 840.000 blokova zapisani su u parametrima Litecoin protokola. (<a href="https://github.com/litecoin-project/litecoin/blob/master/src/chainparams.cpp">github.com</a>)</p>
<h2>Kako je Litecoin nastao?</h2>
<p>Litecoin je napravio Charlie Lee, softverski inženjer koji je u tom periodu radio u kompaniji Google. Projekat je najavljen početkom oktobra 2011. godine, dok je mreža zvanično pokrenuta 13. oktobra iste godine.</p>
<p>Litecoin nije napravljen od nule. Njegov kod je zasnovan na Bitcoin kodu, zbog čega se često opisuje kao fork Bitcoina.</p>
<p>Reč „fork“ u ovom slučaju ne znači da se Litecoin odvojio od postojeće istorije Bitcoin transakcija. Litecoin je pokrenuo potpuno novu mrežu, sa sopstvenim početnim blokom, sopstvenim novčićima, rudarima i istorijom transakcija. Preciznije je reći da je nastao modifikovanjem Bitcoin softvera, a ne podelom postojećeg Bitcoin blokčejna.</p>
<p>Charlie Lee je želeo da zadrži glavne osobine Bitcoina, uključujući ograničenu ponudu, Proof of Work rudarenje i odsustvo centralne kontrole, ali da promeni nekoliko važnih parametara:</p>
<ul>
<li><p>kraće prosečno vreme između blokova;</p>
</li>
<li><p>drugačiji algoritam rudarenja;</p>
</li>
<li><p>veći maksimalan broj novčića;</p>
</li>
<li><p>češće prilagođavanje težine rudarenja;</p>
</li>
<li><p>praktičnije korišćenje za manje i češće transakcije.</p>
</li>
</ul>
<p>Litecoin je javno najavljen pre pokretanja, a početak rudarenja bio je unapred poznat zajednici. U početnom bloku nalazi se naslov o smrti Stevea Jobsa, koji je poslužio kao vremenska referenca pri stvaranju mreže. Istoriju pokretanja i parametre prvobitnog predstavljanja detaljno je opisala Litecoin Foundation. (<a href="https://litecoin.com/news/deep-dive-to-celebrate-litecoins-12th-birthday">litecoin.com</a>)</p>
<h2>Da li Litecoin stvarno radi?</h2>
<p>Da. Litecoin nije samo naziv novčića kojim se trguje na platformama, već aktivna blokčejn mreža na kojoj se proizvode blokovi, potvrđuju transakcije i pokreću čvorovi.</p>
<p>Korisnici mogu da pošalju LTC sa jedne kompatibilne adrese na drugu, dok mrežni čvorovi proveravaju transakciju i rudari je uključuju u blok. Stanje mreže moguće je nezavisno pratiti pomoću blokčejn istraživača, odnosno blockchain explorera, koji prikazuju blokove, transakcije, provizije i stanje mempoola. Litecoin Space, na primer, pruža javni explorer i API za proveru poslednjeg bloka i drugih mrežnih podataka. (<a href="https://litecoinspace.org/docs/api">litecoinspace.org</a>)</p>
<p>Aktivan je i razvoj Litecoin Core softvera. Objavljuju se nove verzije koje donose bezbednosne ispravke, poboljšanja MWEB validacije, prenosa transakcija, rudarenja i upravljanja resursima. To je važan pokazatelj da Litecoin nije napušten projekat sa neodržavanim kodom. (<a href="https://github.com/litecoin-project/litecoin/releases">github.com</a>)</p>
<p>Ipak, pitanje „da li radi“ može imati tri različita značenja:</p>
<ol>
<li><p>Da li protokol tehnički funkcioniše? Da.</p>
</li>
<li><p>Da li se LTC može slati između korisnika? Da.</p>
</li>
<li><p>Da li će zbog toga cena LTC-a rasti? To niko ne može pouzdano garantovati.</p>
</li>
</ol>
<p>Tehnička funkcionalnost mreže i tržišna uspešnost novčića nisu ista stvar.</p>
<h2>Šta je Litecoin blokčejn?</h2>
<p>Litecoin blokčejn je javna, hronološki uređena baza podataka koja sadrži potvrđene transakcije.</p>
<p>Transakcije se grupišu u blokove. Svaki blok, između ostalog, sadrži:</p>
<ul>
<li><p>skup potvrđenih transakcija;</p>
</li>
<li><p>kriptografski sažetak prethodnog bloka;</p>
</li>
<li><p>vremensku oznaku;</p>
</li>
<li><p>podatke vezane za rudarenje;</p>
</li>
<li><p>dokaz da je izvršen potreban Proof of Work.</p>
</li>
</ul>
<p>Pošto svaki blok sadrži hash prethodnog bloka, blokovi su kriptografski povezani. Promena stare transakcije promenila bi podatke njenog bloka, zatim njegov hash, a samim tim i vezu sa svim kasnijim blokovima.</p>
<p>Napadač zato ne bi mogao jednostavno da izmeni jednu staru transakciju. Morao bi ponovo da izračuna Proof of Work za taj blok i sve blokove koji dolaze posle njega, a zatim da sustigne i prestigne ostatak mreže.</p>
<p>Zbog toga transakcija postaje sve teža za poništavanje što se više novih blokova izgradi iznad bloka u kojem je potvrđena.</p>
<h2>Ko upravlja Litecoinom?</h2>
<p>Litecoin nema jednog vlasnika koji može samostalno da:</p>
<ul>
<li><p>odštampa proizvoljnu količinu LTC-a;</p>
</li>
<li><p>oduzme novčiće sa tuđe adrese;</p>
</li>
<li><p>poništi uredno potvrđenu transakciju;</p>
</li>
<li><p>promeni maksimalnu ponudu jednim pritiskom na dugme;</p>
</li>
<li><p>ugasi celu mrežu.</p>
</li>
</ul>
<p>U funkcionisanju učestvuje nekoliko grupa:</p>
<ul>
<li><p>Korisnici šalju i primaju LTC.</p>
</li>
<li><p>Vlasnici čvorova proveravaju blokove i transakcije.</p>
</li>
<li><p>Rudari stvaraju kandidate za nove blokove i pružaju računarsku snagu.</p>
</li>
<li><p>Programeri održavaju i predlažu izmene softvera.</p>
</li>
<li><p>Berze, procesori plaćanja i trgovci odlučuju koje verzije i funkcije podržavaju.</p>
</li>
<li><p>Ekonomski učesnici odlučuju koji lanac i koja pravila smatraju legitimnim.</p>
</li>
</ul>
<p>Programeri mogu da napišu novu verziju softvera, ali ne mogu automatski da nateraju sve ostale učesnike da je koriste. Ako predložena izmena menja pravila konsenzusa, njeno prihvatanje zavisi od podrške mreže i ekonomskih učesnika.</p>
<p>Litecoin Foundation može da finansira razvoj, edukaciju i promociju, ali nije centralna banka Litecoina i nema administratorski ključ kojim kontroliše sva sredstva.</p>
<h2>Kako izgleda jedna Litecoin transakcija?</h2>
<p>Pretpostavimo da Ana želi da pošalje Borisu 1 LTC.</p>
<p>Proces se pojednostavljeno odvija ovako:</p>
<ol>
<li><p>Boris daje Ani svoju Litecoin adresu.</p>
</li>
<li><p>Ana u novčaniku unosi Borisovu adresu i iznos.</p>
</li>
<li><p>Novčanik bira odgovarajuće nepotrošene izlaze koje Ana kontroliše.</p>
</li>
<li><p>Kreiraju se izlaz za Borisa i, ako je potrebno, izlaz za povrat kusura Ani.</p>
</li>
<li><p>Transakcija se potpisuje privatnim ključem.</p>
</li>
<li><p>Potpisana transakcija šalje se Litecoin mreži.</p>
</li>
<li><p>Čvorovi proveravaju njenu ispravnost.</p>
</li>
<li><p>Ispravna transakcija ulazi u mempool.</p>
</li>
<li><p>Rudar je uključuje u novi blok.</p>
</li>
<li><p>Dodavanjem novih blokova raste broj potvrda.</p>
</li>
</ol>
<h3>Šta su ulazi, izlazi i kusur?</h3>
<p>Litecoin, kao i Bitcoin, koristi UTXO model. Skraćenica UTXO znači „unspent transaction output“, odnosno nepotrošeni izlaz prethodne transakcije.</p>
<p>Novčanik se ne ponaša baš kao bankovni račun sa jednom promenljivom koja predstavlja stanje. Umesto toga, prati skup nepotrošenih izlaza koje korisnik može da potroši.</p>
<p>Ako Ana poseduje jedan UTXO od 3 LTC i želi da Borisu pošalje 1 LTC, novčanik može napraviti:</p>
<ul>
<li><p>izlaz od 1 LTC za Borisa;</p>
</li>
<li><p>izlaz od približno 2 LTC za Anu;</p>
</li>
<li><p>malu razliku namenjenu rudaru kao proviziju.</p>
</li>
</ul>
<p>Drugi izlaz naziva se kusur. On se uglavnom šalje na novu adresu pod kontrolom istog novčanika.</p>
<h3>Od čega zavisi provizija?</h3>
<p>Provizija se ne određuje prvenstveno prema vrednosti koju korisnik šalje. Transakcija od 100 LTC ne mora automatski imati veću proviziju od transakcije od 1 LTC.</p>
<p>Važniji faktori su:</p>
<ul>
<li><p>veličina transakcije u bajtovima ili virtuelnim bajtovima;</p>
</li>
<li><p>broj ulaza;</p>
</li>
<li><p>broj izlaza;</p>
</li>
<li><p>vrsta korišćenih adresa i skripti;</p>
</li>
<li><p>trenutno opterećenje mreže;</p>
</li>
<li><p>provizija po jedinici veličine koju je korisnik izabrao.</p>
</li>
</ul>
<p>Transakcija sa mnogo malih ulaza može biti veća i skuplja od transakcije koja prenosi mnogo veću vrednost koristeći samo jedan ulaz.</p>
<h2>Privatni ključ, javni ključ i adresa nisu isto</h2>
<p>Za razumevanje kriptovaluta važno je razlikovati tri pojma.</p>
<h3>Privatni ključ</h3>
<p>Privatni ključ je tajni podatak koji omogućava potpisivanje transakcije. Osoba koja poseduje privatni ključ može da potroši sredstva vezana za njega.</p>
<p>Privatni ključ ne treba:</p>
<ul>
<li><p>slati drugoj osobi;</p>
</li>
<li><p>unositi na nepoznate internet stranice;</p>
</li>
<li><p>čuvati u običnoj fotografiji;</p>
</li>
<li><p>objavljivati u poruci;</p>
</li>
<li><p>mešati sa javnom adresom.</p>
</li>
</ul>
<h3>Javni ključ</h3>
<p>Javni ključ se matematički izvodi iz privatnog ključa. Koristi se u postupku provere digitalnog potpisa.</p>
<p>Iz javnog ključa nije praktično izvodljivo izračunati privatni ključ korišćenjem uobičajeno dostupne računarske opreme, pod uslovom da je ključ pravilno generisan i implementacija nema grešku.</p>
<h3>Litecoin adresa</h3>
<p>Adresa je formatirani identifikator koji se koristi za prijem sredstava.</p>
<p>Zavisno od vrste adrese i podržanog formata, Litecoin adrese mogu počinjati različitim znakovima, uključujući:</p>
<ul>
<li><p><code>L</code> za određene tradicionalne adrese;</p>
</li>
<li><p><code>M</code> za novije P2SH adrese;</p>
</li>
<li><p><code>ltc1</code> za SegWit adrese;</p>
</li>
<li><p><code>ltcmweb</code> za MWEB adrese.</p>
</li>
</ul>
<p>Zbog postojanja više formata, tvrdnja da „svaka Litecoin adresa počinje slovom L“ nije tačna.</p>
<p>Prilikom slanja uvek treba proveriti:</p>
<ul>
<li><p>da li platforma podržava izabranu mrežu;</p>
</li>
<li><p>da li podržava vrstu adrese;</p>
</li>
<li><p>da li je adresa pravilno kopirana;</p>
</li>
<li><p>da li je MWEB podržan na obe strane;</p>
</li>
<li><p>da li postoji zahtev za minimalan depozit.</p>
</li>
</ul>
<h2>Šta je digitalni potpis?</h2>
<p>Kada korisnik šalje LTC, mreži ne šalje privatni ključ. Umesto toga, novčanik privatnim ključem generiše digitalni potpis.</p>
<p>Čvorovi pomoću odgovarajućih javnih podataka proveravaju:</p>
<ul>
<li><p>da li potpis odgovara uslovima potrošnje;</p>
</li>
<li><p>da li pošiljalac ima pravo da potroši navedene izlaze;</p>
</li>
<li><p>da li su ulazi već potrošeni;</p>
</li>
<li><p>da li zbir izlaza prelazi zbir ulaza;</p>
</li>
<li><p>da li transakcija poštuje pravila protokola.</p>
</li>
</ul>
<p>Digitalni potpis dokazuje ovlašćenje za potrošnju, ali ne otkriva sam privatni ključ.</p>
<p>Ako korisnik izgubi privatni ključ ili seed frazu, ne postoji centralna služba koja može da mu izda novi pristup. To je jedna od najvećih prednosti samostalnog čuvanja sredstava, ali istovremeno i jedan od njegovih najvećih rizika.</p>
<h2>Šta je mempool?</h2>
<p>Mempool je privremeni skup validnih, ali još nepotvrđenih transakcija koje je određeni čvor primio.</p>
<p>Litecoin nema jedan globalni mempool koji je apsolutno isti na svakom računaru. Svaki čvor održava svoj skup nepotvrđenih transakcija, mada se oni uglavnom preklapaju jer čvorovi prosleđuju transakcije jedni drugima.</p>
<p>Kada korisnik pošalje LTC, transakcija može za nekoliko sekundi postati vidljiva u mempoolu. To još nije isto što i potvrda u bloku.</p>
<p>Ako je provizija suviše niska, transakcija može duže čekati. Ako je nevažeća, čvorovi će je odbiti. Ako dve transakcije pokušavaju da potroše isti UTXO, mreža ne može na kraju potvrditi obe.</p>
<h2>Koliko traje Litecoin transakcija?</h2>
<p>Prosečno vreme između Litecoin blokova iznosi približno 2,5 minuta. To ne znači da će svaka transakcija biti potvrđena tačno za 150 sekundi.</p>
<p>Proof of Work rudarenje je verovatnosni proces. Jedan blok može biti pronađen veoma brzo, dok se na sledeći može čekati duže od proseka.</p>
<p>Vreme potvrde zavisi od:</p>
<ul>
<li><p>trenutka kada je transakcija poslata;</p>
</li>
<li><p>izabrane provizije;</p>
</li>
<li><p>popunjenosti mempoola;</p>
</li>
<li><p>pravila rudara i rudarskih poolova;</p>
</li>
<li><p>broja potvrda koje primalac zahteva.</p>
</li>
</ul>
<p>Jedna potvrda znači da je transakcija uključena u blok. Dve potvrde znače da je iznad tog bloka napravljen još jedan blok.</p>
<p>Pošto je prosečan razmak između blokova 2,5 minuta, šest potvrda bi u statističkom proseku trajalo oko 15 minuta. To je samo procena, a ne obećani rok.</p>
<h3>Da li je nepotvrđena transakcija sigurna?</h3>
<p>Nepotvrđena ili „zero-confirmation“ transakcija može biti korisna kod veoma malih plaćanja, ali nosi veći rizik.</p>
<p>To što novčanik pokazuje da je transakcija stigla ne znači da je ona konačno potvrđena. Pošiljalac može pokušati dvostruku potrošnju ili zamenu nepotvrđene transakcije, zavisno od načina na koji je transakcija napravljena i pravila učesnika.</p>
<p>Za veće iznose razumno je sačekati više potvrda.</p>
<h2>Kako radi Litecoin rudarenje?</h2>
<p>Litecoin koristi Proof of Work. Rudari koriste specijalizovanu opremu da izračunavaju veliki broj hash vrednosti u pokušaju da pronađu rezultat koji zadovoljava trenutni cilj težine.</p>
<p>Rudar pravi kandidat za novi blok koji sadrži:</p>
<ul>
<li><p>prethodni hash;</p>
</li>
<li><p>izabrane transakcije;</p>
</li>
<li><p>coinbase transakciju;</p>
</li>
<li><p>Merkle root;</p>
</li>
<li><p>vremensku oznaku;</p>
</li>
<li><p>nonce i druge potrebne podatke.</p>
</li>
</ul>
<p>Zatim menja određene podatke i ponavlja Scrypt računanje. Ako rezultat bude ispod ciljne vrednosti koju određuje težina, blok može biti prosleđen mreži.</p>
<p>Čvorovi ne veruju rudaru na reč. Svaki čvor može nezavisno proveriti:</p>
<ul>
<li><p>Proof of Work;</p>
</li>
<li><p>strukturu bloka;</p>
</li>
<li><p>dozvoljenu nagradu;</p>
</li>
<li><p>potpise transakcija;</p>
</li>
<li><p>odsustvo dvostruke potrošnje;</p>
</li>
<li><p>pridržavanje ostalih pravila konsenzusa.</p>
</li>
</ul>
<p>Ako blok krši pravila, ispravni čvorovi ga odbacuju bez obzira na to koliko je električne energije rudar potrošio.</p>
<h2>Šta rudari dobijaju?</h2>
<p>Rudar koji proizvede prihvaćen blok može da dobije:</p>
<ul>
<li><p>novostvorene LTC novčiće;</p>
</li>
<li><p>provizije transakcija uključenih u blok.</p>
</li>
</ul>
<p>Nagrada za blok počela je sa 50 LTC i periodično se prepolovljava. Trenutna subvencija iznosi 6,25 LTC po bloku, a interval prepolovljavanja je 840.000 blokova. (<a href="https://litecoin.com/learning-center/what-makes-litecoin-different">litecoin.com</a>)</p>
<p>Novčići iz coinbase transakcije ne mogu se odmah potrošiti. U parametrima mreže definisana je zrelost od 100 blokova, što pri prosečnom vremenu bloka predstavlja približno četiri sata i deset minuta. (<a href="https://github.com/ltcsuite/ltcd/blob/master/chaincfg/params.go">github.com</a>)</p>
<p>Kako se subvencija bude smanjivala, dugoročno bi provizije trebalo da imaju sve značajniju ulogu u finansiranju bezbednosti mreže.</p>
<h2>Zašto Litecoin koristi Scrypt?</h2>
<p>Bitcoin koristi SHA-256, dok Litecoin koristi Scrypt kao osnovu svog Proof of Work sistema.</p>
<p>Scrypt je prvobitno izabran zato što je memorijski zahtevniji. Ideja je bila da se smanji početna prednost specijalizovanog hardvera i omogući širem krugu korisnika da učestvuju u rudarenju pomoću običnih procesora i grafičkih kartica.</p>
<p>To danas više nije realna prednost. Razvijeni su Scrypt ASIC uređaji koji su daleko efikasniji od običnih procesora i grafičkih kartica.</p>
<p>U praksi to znači:</p>
<ul>
<li><p>tehnički je moguće pokušati rudarenje običnim računarom;</p>
</li>
<li><p>takvo rudarenje je uglavnom ekonomski neefikasno;</p>
</li>
<li><p>profesionalno rudarenje zahteva specijalizovanu opremu;</p>
</li>
<li><p>profitabilnost zavisi od cene struje, efikasnosti uređaja, težine mreže, vrednosti nagrade i pool provizije.</p>
</li>
</ul>
<p>Litecoin edukativni centar takođe navodi da su ASIC uređaji postali najefikasniji način Scrypt rudarenja, dok su CPU i GPU rešenja uglavnom nekonkurentna. (<a href="https://litecoin.com/learningcenter">litecoin.com</a>)</p>
<h2>Kako se prilagođava težina rudarenja?</h2>
<p>Ako bi veliki broj novih rudara uključio uređaje, blokovi bi privremeno počeli da dolaze brže. Ako bi značajan deo rudara napustio mrežu, blokovi bi dolazili sporije.</p>
<p>Da bi dugoročni prosek ostao blizu 2,5 minuta, mreža periodično prilagođava težinu rudarenja.</p>
<p>Litecoinov ciljni period prilagođavanja iznosi približno 3,5 dana, što odgovara intervalu od 2.016 blokova pri prosečnom vremenu od 2,5 minuta po bloku. Parametri su navedeni u Litecoin izvornom kodu. (<a href="https://github.com/litecoin-project/litecoin/blob/master/src/chainparams.cpp">github.com</a>)</p>
<h2>Litecoin i Dogecoin mogu se zajedno rudariti</h2>
<p>Jedna zanimljiva karakteristika Litecoina je merged mining, odnosno objedinjeno rudarenje sa Dogecoinom.</p>
<p>Litecoin i Dogecoin koriste Scrypt. Zahvaljujući sistemu Auxiliary Proof of Work, rudarski pool može koristiti isti rad za učestvovanje u obezbeđivanju obe mreže.</p>
<p>To ne znači da su Litecoin i Dogecoin isti blokčejn. Oni imaju:</p>
<ul>
<li><p>odvojene blokove;</p>
</li>
<li><p>različita pravila;</p>
</li>
<li><p>različitu ponudu;</p>
</li>
<li><p>sopstvene transakcije;</p>
</li>
<li><p>posebne novčiće.</p>
</li>
</ul>
<p>Prednost objedinjenog rudarenja jeste što rudari mogu ostvarivati prihode iz obe mreže bez proporcionalnog udvostručavanja osnovnog računarskog rada. To može pomoći profitabilnosti rudara i povećati bezbednost Scrypt ekosistema.</p>
<p>Dogecoin je prešao na ovaj model u avgustu 2014. godine. (<a href="https://litecoin.com/news/how-litecoin-and-dogecoin-created-one-of-the-most-robust-pow-networks">litecoin.com</a>)</p>
<p>Mogući nedostatak jeste dodatno oslanjanje na velike poolove i ekonomsku povezanost dve mreže.</p>
<h2>Koliko Litecoina može postojati?</h2>
<p>Maksimalna ponuda Litecoina je približno 84 miliona LTC. To je četiri puta više od maksimalne Bitcoin ponude od približno 21 milion BTC.</p>
<p>Veća ponuda ne znači automatski da je Litecoin „jeftiniji“ ili manje vredan. Cena jedne jedinice zavisi od odnosa ponude i tražnje, likvidnosti, očekivanja učesnika i drugih tržišnih faktora.</p>
<p>Jedan LTC deljiv je na 100 miliona najmanjih jedinica:</p>
<p>$$1\ \mathrm{LTC} = 100.000.000\ \text{najmanjih jedinica}$$</p>
<p>Zbog toga nije potrebno kupiti ceo Litecoin. Korisnik može posedovati i veoma mali deo LTC-a.</p>
<p>Takođe treba razlikovati:</p>
<ul>
<li><p>maksimalnu ponudu;</p>
</li>
<li><p>količinu izdatih novčića;</p>
</li>
<li><p>količinu novčića u opticaju;</p>
</li>
<li><p>količinu stvarno dostupnu tržištu.</p>
</li>
</ul>
<p>Deo LTC-a verovatno je trajno izgubljen zbog izgubljenih privatnih ključeva, starih uređaja ili grešaka korisnika. Blokčejn ne može pouzdano utvrditi da li je određena nepomična adresa izgubljena ili njen vlasnik samo dugo čuva sredstva.</p>
<h2>Šta je halving?</h2>
<p>Halving je prepolovljavanje subvencije koju rudar dobija za novi blok.</p>
<p>Litecoinova subvencija razvijala se ovako:</p>
<table>
<thead>
<tr>
<th>Period nagrade</th>
<th>Subvencija po bloku</th>
</tr>
</thead>
<tbody><tr>
<td>Početna nagrada</td>
<td>50 LTC</td>
</tr>
<tr>
<td>Posle prvog halvinga</td>
<td>25 LTC</td>
</tr>
<tr>
<td>Posle drugog halvinga</td>
<td>12,5 LTC</td>
</tr>
<tr>
<td>Posle trećeg halvinga</td>
<td>6,25 LTC</td>
</tr>
</tbody></table>
<p>Prepolovljavanje se dešava na svakih 840.000 blokova. Pošto je ciljno vreme bloka približno 2,5 minuta, halving se događa otprilike jednom u četiri godine.</p>
<p>Halving smanjuje tempo stvaranja novih LTC novčića, ali sam po sebi ne garantuje rast cene. Tržište može unapred uračunati očekivano smanjenje ponude, dok na cenu istovremeno utiču potražnja, regulativa, makroekonomski uslovi i stanje celog kripto-tržišta.</p>
<h2>Litecoin i Bitcoin: glavne razlike</h2>
<table>
<thead>
<tr>
<th>Karakteristika</th>
<th>Bitcoin</th>
<th>Litecoin</th>
</tr>
</thead>
<tbody><tr>
<td>Oznaka</td>
<td>BTC</td>
<td>LTC</td>
</tr>
<tr>
<td>Početak rada</td>
<td>2009.</td>
<td>2011.</td>
</tr>
<tr>
<td>Algoritam</td>
<td>SHA-256</td>
<td>Scrypt</td>
</tr>
<tr>
<td>Prosečno vreme bloka</td>
<td>Oko 10 minuta</td>
<td>Oko 2,5 minuta</td>
</tr>
<tr>
<td>Maksimalna ponuda</td>
<td>Približno 21 milion</td>
<td>Približno 84 miliona</td>
</tr>
<tr>
<td>Halving interval</td>
<td>210.000 blokova</td>
<td>840.000 blokova</td>
</tr>
<tr>
<td>Osnovna tržišna uloga</td>
<td>Skladište vrednosti i monetarna mreža</td>
<td>Plaćanja i prenos vrednosti</td>
</tr>
<tr>
<td>Opciona privatnost na osnovnom protokolu</td>
<td>Nema MWEB</td>
<td>MWEB</td>
</tr>
<tr>
<td>Dominantni rudarski uređaji</td>
<td>SHA-256 ASIC</td>
<td>Scrypt ASIC</td>
</tr>
</tbody></table>
<p>Litecoin proizvodi blokove približno četiri puta brže i ima približno četiri puta veću maksimalnu ponudu. To ne znači da obrađuje svaku transakciju tačno četiri puta brže, ali znači da korisnik u proseku kraće čeka sledeći blok.</p>
<p>Bitcoin ima znatno veću prepoznatljivost i drugačiji bezbednosni budžet. Litecoin, s druge strane, može biti praktičniji kada korisniku prioritet predstavljaju niska provizija i brža potvrda na osnovnom sloju.</p>
<p>Zvanični Litecoin materijali detaljno opisuju ove razlike, uključujući vreme bloka, ponudu, algoritam i ritam halvinga. (<a href="https://litecoin.com/learning-center/bitcoin-vs-litecoin-what-are-the-differences">litecoin.com</a>)</p>
<h2>Da li je Litecoin samo kopija Bitcoina?</h2>
<p>Litecoin jeste zasnovan na Bitcoin kodu, ali naziv „obična kopija“ zanemaruje činjenicu da mreža ima:</p>
<ul>
<li><p>sopstveni genesis blok;</p>
</li>
<li><p>odvojenu istoriju transakcija;</p>
</li>
<li><p>drugačiji Proof of Work algoritam;</p>
</li>
<li><p>posebnu rudarsku infrastrukturu;</p>
</li>
<li><p>sopstvene parametre emisije;</p>
</li>
<li><p>objedinjeno rudarenje sa Dogecoinom;</p>
</li>
<li><p>MWEB ekstenzione blokove;</p>
</li>
<li><p>odvojenu zajednicu i ekonomsku aktivnost.</p>
</li>
</ul>
<p>Mnoga softverska rešenja nastaju iz postojećeg otvorenog koda. Samo poreklo koda ne govori da li će nova mreža uspeti. Ključni su bezbednost, održavanje, infrastruktura, korisnici, likvidnost i spremnost tržišta da joj pripiše vrednost.</p>
<p>Litecoin je takođe služio kao mreža na kojoj su ranije aktivirane ili praktično testirane određene tehnologije povezane sa Bitcoin ekosistemom. Najpoznatiji primer je SegWit, koji je na Litecoinu aktiviran pre Bitcoina. (<a href="https://litecoin.com/learning-center/how-litecoin-helps-bitcoin">litecoin.com</a>)</p>
<h2>Šta je SegWit?</h2>
<p>SegWit je skraćenica od Segregated Witness. Reč je o promeni strukture transakcija kojom su podaci digitalnog potpisa odvojeni od osnovnog dela transakcije.</p>
<p>SegWit je doneo nekoliko koristi:</p>
<ul>
<li><p>rešavanje problema promenljivosti identifikatora transakcije;</p>
</li>
<li><p>efikasnije korišćenje prostora u bloku;</p>
</li>
<li><p>mogućnost nižih provizija za određene vrste transakcija;</p>
</li>
<li><p>pogodniju osnovu za protokole drugog sloja, uključujući Lightning Network.</p>
</li>
</ul>
<p>Litecoin je aktivirao SegWit tokom 2017. godine, pre aktivacije na Bitcoin mreži. (<a href="https://litecoin.com/learning-center/how-litecoin-helps-bitcoin">litecoin.com</a>)</p>
<h2>Da li Litecoin podržava Lightning Network?</h2>
<p>Litecoin može podržavati Lightning Network, sistem kanala za plaćanje izvan glavnog lanca.</p>
<p>Osnovna ideja je da dve strane otvore kanal transakcijom na blokčejnu, a zatim unutar kanala obavljaju veći broj ažuriranja bez zapisivanja svakog pojedinačnog plaćanja u poseban blok.</p>
<p>Na kraju se konačno stanje kanala može poravnati na osnovnom sloju.</p>
<p>Potencijalne prednosti su:</p>
<ul>
<li><p>brzo plaćanje;</p>
</li>
<li><p>veoma male provizije;</p>
</li>
<li><p>veći broj transakcija van osnovnog lanca;</p>
</li>
<li><p>praktičnost za mikroplaćanja.</p>
</li>
</ul>
<p>Ograničenja su:</p>
<ul>
<li><p>složenije upravljanje kanalima;</p>
</li>
<li><p>potreba za likvidnošću;</p>
</li>
<li><p>ograničena podrška novčanika i servisa;</p>
</li>
<li><p>znatno manji ekosistem nego kod Bitcoin Lightning mreže.</p>
</li>
</ul>
<p>Zbog toga činjenica da Litecoin tehnički podržava Lightning ne znači da ga svaki Litecoin novčanik ili servis automatski podržava.</p>
<h2>Šta je MWEB?</h2>
<p>MWEB znači MimbleWimble Extension Blocks. To je opcioni dodatak Litecoin protokolu koji omogućava poverljivije transakcije i efikasnije upravljanje određenim podacima.</p>
<p>MWEB nije poseban novčić. Korisnik ne kupuje „MWEB token“. LTC se može prebaciti iz standardnog dela Litecoin mreže u MWEB ekstenzioni blok, koristiti unutar njega i zatim vratiti u standardni deo mreže.</p>
<p>Proces se može podeliti na:</p>
<ul>
<li><p>peg-in, prebacivanje LTC-a u MWEB;</p>
</li>
<li><p>MWEB transakciju unutar ekstenzionog bloka;</p>
</li>
<li><p>peg-out, vraćanje LTC-a u standardni deo lanca.</p>
</li>
</ul>
<p>Tehnički predlog opisuje MWEB kao opt-in format koji radi u ekstenzionim blokovima paralelno sa glavnim blokovima. (<a href="https://github.com/litecoin-project/lips/blob/master/lip-0003.mediawiki">github.com</a>)</p>
<h3>Šta MWEB skriva?</h3>
<p>Standardni Litecoin blokčejn je transparentan. Kod MWEB transakcija moguće je sakriti iznose i otežati direktno povezivanje učesnika i transakcija.</p>
<p>MWEB koristi kriptografske tehnike poput:</p>
<ul>
<li><p>Pedersen commitments;</p>
</li>
<li><p>range proofs;</p>
</li>
<li><p>stealth adresa;</p>
</li>
<li><p>agregacije;</p>
</li>
<li><p>cut-through mehanizma.</p>
</li>
</ul>
<p>Cut-through omogućava uklanjanje određenih međukoraka prilikom objedinjavanja transakcija, što može smanjiti količinu podataka potrebnu za proveru konačnog stanja.</p>
<h3>Da li je MWEB potpuno anoniman?</h3>
<p>Ne bi ga trebalo predstavljati kao garanciju potpune anonimnosti.</p>
<p>Privatnost može biti oslabljena:</p>
<ul>
<li><p>analizom trenutka peg-in i peg-out transakcija;</p>
</li>
<li><p>malim brojem učesnika;</p>
</li>
<li><p>obrascima korišćenja;</p>
</li>
<li><p>podacima koje čuvaju berze;</p>
</li>
<li><p>IP adresama i mrežnim metapodacima;</p>
</li>
<li><p>povezivanjem identiteta sa prethodnim ili kasnijim transakcijama;</p>
</li>
<li><p>deljenjem view ključeva sa nepouzdanim servisom.</p>
</li>
</ul>
<p>Dokumentacija za MWEB lake klijente upozorava da određeni modeli filtriranja mogu oslabiti privatnost, naročito kada se korisnik povezuje sa nepouzdanim čvorom. (<a href="https://github.com/litecoin-project/litecoin/blob/master/doc/mweb/light-clients.md">github.com</a>)</p>
<h3>Da li sve berze podržavaju MWEB?</h3>
<p>Ne.</p>
<p>Neke platforme podržavaju samo standardne Litecoin depozite i isplate. Slanje MWEB transakcije na platformu koja je ne podržava može dovesti do toga da depozit ne bude automatski evidentiran ili da sredstva zahtevaju komplikovan postupak oporavka.</p>
<p>Binance je, na primer, objavio da ne podržava LTC depozite i isplate koji koriste MWEB funkciju i upozorio korisnike da na tu platformu ne šalju LTC preko MWEB-a. (<a href="https://www.binance.com/en/support/announcement/detail/61d4510b1ada4ba78b5384e8c2d3527c">binance.com</a>)</p>
<p>Zato pre slanja treba proveriti aktuelna pravila konkretne platforme.</p>
<h2>Da li su Litecoin transakcije anonimne?</h2>
<p>Standardne Litecoin transakcije nisu anonimne u klasičnom smislu. Bolje ih je opisati kao pseudonimne.</p>
<p>Blokčejn javno prikazuje:</p>
<ul>
<li><p>adrese;</p>
</li>
<li><p>iznose;</p>
</li>
<li><p>vreme transakcije;</p>
</li>
<li><p>ulaze i izlaze;</p>
</li>
<li><p>istoriju kretanja sredstava.</p>
</li>
</ul>
<p>Adresa sama po sebi ne mora sadržati ime vlasnika. Međutim, ako je adresa povezana sa identitetom preko menjačnice, trgovca, javne objave ili drugih podataka, moguće je analizirati njenu istoriju.</p>
<p>MWEB može poboljšati privatnost, ali nije univerzalno podržan i ne uklanja sve moguće načine identifikacije.</p>
<h2>Gde se Litecoin čuva?</h2>
<p>Tehnički gledano, LTC se ne nalazi „u novčaniku“. Novčići postoje kao zapisi na blokčejnu, dok novčanik čuva ključeve potrebne za njihovu potrošnju.</p>
<h3>Softverski novčanici</h3>
<p>Instaliraju se na računar ili telefon.</p>
<p>Prednosti:</p>
<ul>
<li><p>jednostavan pristup;</p>
</li>
<li><p>često besplatni;</p>
</li>
<li><p>pogodni za manje iznose i svakodnevno korišćenje.</p>
</li>
</ul>
<p>Nedostaci:</p>
<ul>
<li><p>uređaj može biti zaražen;</p>
</li>
<li><p>telefon može biti izgubljen;</p>
</li>
<li><p>lažna aplikacija može ukrasti seed frazu;</p>
</li>
<li><p>podaci mogu biti kompromitovani ako nema odgovarajuće zaštite.</p>
</li>
</ul>
<h3>Hardverski novčanici</h3>
<p>Privatne ključeve čuvaju u posebnom uređaju i potpisuju transakcije bez njihovog direktnog izlaganja računaru.</p>
<p>Prednosti:</p>
<ul>
<li><p>bolja izolacija ključeva;</p>
</li>
<li><p>pogodniji za dugoročno čuvanje;</p>
</li>
<li><p>manji rizik od određenih vrsta malvera.</p>
</li>
</ul>
<p>Nedostaci:</p>
<ul>
<li><p>koštaju;</p>
</li>
<li><p>mogu se fizički izgubiti ili oštetiti;</p>
</li>
<li><p>korisnik i dalje mora zaštititi seed;</p>
</li>
<li><p>lažni ili kompromitovani uređaji predstavljaju rizik.</p>
</li>
</ul>
<h3>Berzanski novčanik</h3>
<p>Kada korisnik ostavi LTC na centralizovanoj platformi, privatne ključeve uglavnom kontroliše platforma.</p>
<p>Prednosti:</p>
<ul>
<li><p>lakša kupovina i prodaja;</p>
</li>
<li><p>oporavak naloga je ponekad moguć;</p>
</li>
<li><p>praktičnost za trgovanje.</p>
</li>
</ul>
<p>Nedostaci:</p>
<ul>
<li><p>platforma može ograničiti isplate;</p>
</li>
<li><p>nalog može biti blokiran ili kompromitovan;</p>
</li>
<li><p>platforma može pretrpeti napad ili poslovni problem;</p>
</li>
<li><p>korisnik zavisi od njenih procedura.</p>
</li>
</ul>
<p>Poznata kripto izreka „not your keys, not your coins“ ukazuje da korisnik nema potpunu kontrolu nad sredstvima ako ne kontroliše privatne ključeve. Ipak, samostalno čuvanje takođe zahteva znanje i disciplinu.</p>
<h2>Za šta se Litecoin koristi?</h2>
<h3>Slanje novca između korisnika</h3>
<p>Korisnik može poslati LTC osobi u drugom gradu ili državi bez direktnog oslanjanja na radno vreme banke.</p>
<p>Primalac ipak mora imati odgovarajući novčanik, a pretvaranje LTC-a u lokalnu valutu može zahtevati korišćenje platforme i identifikaciju.</p>
<h3>Plaćanje robe i usluga</h3>
<p>Trgovac može prihvatiti LTC direktno ili preko procesora plaćanja.</p>
<p>Prednost su relativno brza potvrda i obično niska mrežna provizija. Nedostatak je promenljiva tržišna cena, kao i činjenica da LTC nije prihvaćen svuda.</p>
<h3>Prenos između platformi</h3>
<p>Neki korisnici koriste Litecoin za prenos vrednosti između berzi zbog nižih provizija i kraćeg čekanja nego kod pojedinih drugih mreža.</p>
<p>Takav prenos i dalje nosi rizik:</p>
<ul>
<li><p>pogrešne adrese;</p>
</li>
<li><p>pogrešne mreže;</p>
</li>
<li><p>privremeno obustavljenih depozita;</p>
</li>
<li><p>minimalnog iznosa;</p>
</li>
<li><p>čekanja na potreban broj potvrda;</p>
</li>
<li><p>promene tržišne cene tokom prenosa.</p>
</li>
</ul>
<h3>Dugoročno čuvanje</h3>
<p>Neki korisnici drže LTC kao spekulativnu imovinu ili kao deo kripto-portfolija.</p>
<p>To nije isto što i štedni račun. Ne postoji garantovana kamata, garantovana cena niti zaštita od tržišnog pada.</p>
<h2>Dobre strane Litecoina</h2>
<h3>Brže potvrde od Bitcoina</h3>
<p>Prosečno vreme bloka od 2,5 minuta omogućava da prva potvrda stigne brže nego na Bitcoin osnovnom sloju.</p>
<h3>Uglavnom niske mrežne provizije</h3>
<p>Litecoin blokovi često imaju dovoljno slobodnog kapaciteta, pa korisnici obično ne moraju agresivno da se nadmeću visokim provizijama.</p>
<p>To nije garancija da će provizija uvek biti ista. Ona zavisi od mrežnih uslova i konstrukcije transakcije.</p>
<h3>Duga istorija rada</h3>
<p>Litecoin mreža postoji od 2011. godine. Duga istorija ne garantuje buduću bezbednost, ali znači da protokol nije potpuno nov i neproveren eksperiment.</p>
<p>Zvanični Litecoin sajt navodi stotine miliona obrađenih transakcija i dug period rada bez prekida mreže. Te podatke treba posmatrati kao podatke samog projekta, ali javni blokčejn omogućava nezavisnu proveru transakcija i blokova. (<a href="https://litecoin.com/">litecoin.com</a>)</p>
<h3>Otvoren izvorni kod</h3>
<p>Kod je javno dostupan, što omogućava programerima da ga pregledaju, testiraju, prijave probleme i predlažu poboljšanja. (<a href="https://github.com/litecoin-project/litecoin">github.com</a>)</p>
<h3>Ograničena ponuda</h3>
<p>Protokol predviđa maksimalnu ponudu od približno 84 miliona LTC. Ne postoji centralna institucija koja može jednostavno odlučiti da izda neograničenu količinu novčića.</p>
<h3>Visoka deljivost</h3>
<p>LTC je deljiv na 100 miliona manjih jedinica, pa korisnik ne mora posedovati ceo novčić.</p>
<h3>MWEB kao opcija</h3>
<p>Korisnici kojima je potrebna veća poverljivost mogu koristiti MWEB ako njihov novčanik i druga strana podržavaju tu funkciju.</p>
<h3>Objedinjeno rudarenje sa Dogecoinom</h3>
<p>Merged mining može povećati prihod Scrypt rudara i doprineti ekonomskom podsticaju za održavanje rudarske infrastrukture.</p>
<h3>Jednostavna monetarna politika</h3>
<p>Pravila emisije su relativno laka za razumevanje:</p>
<ul>
<li><p>početna subvencija;</p>
</li>
<li><p>periodični halving;</p>
</li>
<li><p>ograničena maksimalna ponuda;</p>
</li>
<li><p>nagrade rudarima;</p>
</li>
<li><p>mrežne provizije.</p>
</li>
</ul>
<h2>Loše strane i rizici Litecoina</h2>
<h3>Velika promenljivost cene</h3>
<p>LTC može brzo izgubiti značajan deo tržišne vrednosti. Brza i jeftina mreža ne štiti vlasnika od pada cene.</p>
<h3>Slabiji mrežni efekat od Bitcoina</h3>
<p>Bitcoin ima veću prepoznatljivost, širu institucionalnu infrastrukturu i snažniji monetarni brend. Litecoin je poznat, ali nije dostigao isti nivo globalnog prihvatanja.</p>
<h3>Konkurencija drugih mreža</h3>
<p>Litecoin se ne takmiči samo sa Bitcoinom. Konkurenti su:</p>
<ul>
<li><p>stabilni novčići;</p>
</li>
<li><p>jeftiniji blokčejnovi;</p>
</li>
<li><p>mreže sa bržim konačnim poravnanjem;</p>
</li>
<li><p>Lightning i druga layer-2 rešenja;</p>
</li>
<li><p>tradicionalni instant sistemi plaćanja.</p>
</li>
</ul>
<p>Poseban problem predstavlja činjenica da mnogi korisnici za međunarodni prenos preferiraju stablecoine, jer njihova vrednost manje oscilira u odnosu na fiat valutu.</p>
<h3>Proof of Work troši električnu energiju</h3>
<p>Rudarenje zahteva specijalizovanu opremu i struju. Kritičari smatraju da takav sistem ima previsok energetski trošak, dok pristalice tvrde da je potrošnja energije deo cene decentralizovane bezbednosti.</p>
<h3>Rudarenje više nije dostupno prosečnom korisniku</h3>
<p>Scrypt je prvobitno trebalo da bude pristupačniji običnom hardveru, ali danas dominiraju ASIC uređaji.</p>
<p>To stvara visoke ulazne troškove i pogoduje profesionalnim rudarima.</p>
<h3>Koncentracija rudarskih poolova</h3>
<p>Veliki broj rudara koristi poolove da bi dobio redovnije isplate. Ako mali broj poolova kontroliše veliki deo prijavljenog hashratea, može se pojaviti zabrinutost zbog koncentracije.</p>
<p>Pool nije nužno vlasnik svih uređaja koji su sa njim povezani, ali često odlučuje koje će transakcije uključiti u blokove koje priprema.</p>
<h3>MWEB može stvoriti regulatorne i operativne probleme</h3>
<p>Opciona privatnost korisnicima donosi veću poverljivost, ali može izazvati ograničenja na centralizovanim platformama.</p>
<p>Neke platforme ne prihvataju MWEB depozite, dok su pojedine ranije ograničavale ili uklanjale trgovanje privatnijim kriptovalutama zbog regulatornih zahteva.</p>
<h3>Transakcije se uglavnom ne mogu poništiti</h3>
<p>Ako korisnik pošalje LTC na pogrešnu adresu, nema banke koja može jednostavno stornirati uplatu.</p>
<p>Povrat zavisi od dobre volje primaoca, ako je njegov identitet uopšte poznat.</p>
<h3>Gubitak seed fraze može značiti gubitak sredstava</h3>
<p>Samostalno čuvanje daje korisniku kontrolu, ali i potpunu odgovornost. Gubitak pristupa može biti trajan.</p>
<h3>Lažni novčanici i prevare</h3>
<p>Prevaranti koriste:</p>
<ul>
<li><p>lažne aplikacije;</p>
</li>
<li><p>phishing stranice;</p>
</li>
<li><p>lažne nagradne igre;</p>
</li>
<li><p>obećanja garantovane zarade;</p>
</li>
<li><p>lažnu korisničku podršku;</p>
</li>
<li><p>zlonamerne ekstenzije;</p>
</li>
<li><p>lažne rudarske platforme.</p>
</li>
</ul>
<p>Sam Litecoin protokol može raditi ispravno, a da korisnik ipak izgubi sredstva zbog prevare izvan protokola.</p>
<h3>Nema garancije buduće potražnje</h3>
<p>Ograničena ponuda nije dovoljna ako nema tražnje. Novčić može biti matematički redak, ali tržišna vrednost zavisi od toga da li ga ljudi žele koristiti, držati ili prihvatati.</p>
<h2>Može li Litecoin doživeti napad od 51%?</h2>
<p>Napad od 51% nastaje kada jedan učesnik ili koordinisana grupa kontroliše dovoljno računarske snage da privremeno utiče na redosled blokova.</p>
<p>Takav napadač bi mogao pokušati da:</p>
<ul>
<li><p>poništi sopstvene nedavne transakcije;</p>
</li>
<li><p>izvrši dvostruku potrošnju;</p>
</li>
<li><p>sprečava uključivanje određenih transakcija;</p>
</li>
<li><p>reorganizuje deo nedavne istorije.</p>
</li>
</ul>
<p>Ne bi mogao jednostavno:</p>
<ul>
<li><p>stvoriti neograničenu količinu LTC-a;</p>
</li>
<li><p>potrošiti novčiće bez odgovarajućih ključeva;</p>
</li>
<li><p>promeniti pravila koja ispravni čvorovi proveravaju;</p>
</li>
<li><p>ukrasti sredstva sa proizvoljne adrese.</p>
</li>
</ul>
<p>Veliki hashrate i trošak Scrypt opreme otežavaju napad, ali nijedna Proof of Work mreža nema matematičku garanciju da je napad zauvek nemoguć.</p>
<p>Za velike uplate primalac zbog toga može čekati više potvrda.</p>
<h2>Da li je Litecoin dobra investicija?</h2>
<p>Na ovo pitanje ne postoji univerzalan odgovor.</p>
<p>Litecoin može imati smisla za osobu koja:</p>
<ul>
<li><p>razume rizik kriptovaluta;</p>
</li>
<li><p>želi izloženost LTC-u;</p>
</li>
<li><p>veruje da će mreža zadržati korisnost;</p>
</li>
<li><p>može podneti veliki pad cene;</p>
</li>
<li><p>ne ulaže novac potreban za osnovne životne troškove.</p>
</li>
</ul>
<p>Možda nije prikladan za osobu koja:</p>
<ul>
<li><p>očekuje garantovan profit;</p>
</li>
<li><p>ne može podneti volatilnost;</p>
</li>
<li><p>ne razume čuvanje privatnih ključeva;</p>
</li>
<li><p>koristi pozajmljeni novac;</p>
</li>
<li><p>kupuje samo zbog objava na društvenim mrežama;</p>
</li>
<li><p>nema plan upravljanja rizikom.</p>
</li>
</ul>
<p>Pre kupovine treba istražiti:</p>
<ul>
<li><p>način čuvanja;</p>
</li>
<li><p>ukupne troškove kupovine i prodaje;</p>
</li>
<li><p>provizije za isplatu;</p>
</li>
<li><p>poreske obaveze;</p>
</li>
<li><p>likvidnost;</p>
</li>
<li><p>rizik izabrane platforme;</p>
</li>
<li><p>sopstveni vremenski horizont.</p>
</li>
</ul>
<p>Ovaj članak predstavlja informativni sadržaj, a ne individualni finansijski, poreski ili pravni savet.</p>
<h2>Kako bezbednije kupiti i poslati LTC?</h2>
<ul>
<li><p>Koristite poznatu i proverenu platformu.</p>
</li>
<li><p>Uključite dvofaktorsku autentifikaciju.</p>
</li>
<li><p>Ne koristite isti pristupni kod na više mesta.</p>
</li>
<li><p>Proverite da li platforma podržava Litecoin mrežu.</p>
</li>
<li><p>Proverite format adrese.</p>
</li>
<li><p>Za veći iznos prvo pošaljite malu probnu transakciju.</p>
</li>
<li><p>Nikome ne šaljite seed frazu ili privatni ključ.</p>
</li>
<li><p>Proverite proviziju i minimalan iznos isplate.</p>
</li>
<li><p>Ako koristite MWEB, proverite da li ga primalac podržava.</p>
</li>
<li><p>Ne instalirajte novčanik preko sponzorisanog oglasa bez provere izvora.</p>
</li>
<li><p>Za dugoročno čuvanje razmotrite samostalni novčanik.</p>
</li>
<li><p>Napravite bezbednu rezervnu kopiju seed fraze.</p>
</li>
<li><p>Ne oslanjajte se samo na fotografiju ili cloud kopiju seeda.</p>
</li>
<li><p>Za veće iznose razmotrite hardverski novčanik.</p>
</li>
</ul>
<h2>Kako proveriti Litecoin transakciju?</h2>
<p>Za proveru su najčešće potrebni:</p>
<ul>
<li><p>TXID, odnosno identifikator transakcije;</p>
</li>
<li><p>Litecoin adresa;</p>
</li>
<li><p>hash bloka;</p>
</li>
<li><p>visina bloka.</p>
</li>
</ul>
<p>Unošenjem TXID-a u Litecoin blockchain explorer mogu se proveriti:</p>
<ul>
<li><p>status transakcije;</p>
</li>
<li><p>broj potvrda;</p>
</li>
<li><p>vreme uključivanja u blok;</p>
</li>
<li><p>ulazi i izlazi;</p>
</li>
<li><p>plaćena mrežna provizija;</p>
</li>
<li><p>blok u kojem je potvrđena.</p>
</li>
</ul>
<p>Ako platforma tvrdi da je poslala LTC, ali korisnik ga ne vidi u novčaniku, prvo treba proveriti TXID.</p>
<p>Moguće situacije su:</p>
<ul>
<li><p>platforma još nije emitovala transakciju;</p>
</li>
<li><p>transakcija je u mempoolu;</p>
</li>
<li><p>novčanik nije sinhronizovan;</p>
</li>
<li><p>pogrešno je izabrana mreža;</p>
</li>
<li><p>korišćena je nepodržana MWEB transakcija;</p>
</li>
<li><p>depozit čeka dodatne potvrde;</p>
</li>
<li><p>iznos je manji od minimalnog depozita platforme.</p>
</li>
</ul>
<h2>Zaključak: šta je Litecoin u jednoj rečenici?</h2>
<p>Litecoin je otvorena i decentralizovana mreža digitalnog novca, zasnovana na Proof of Work konsenzusu, koja koristi Scrypt rudarenje, proizvodi blokove približno svaka 2,5 minuta i namenjena je relativno brzom i jeftinom prenosu vrednosti.</p>
<p>Njegove najveće prednosti su:</p>
<ul>
<li><p>duga istorija rada;</p>
</li>
<li><p>niske provizije;</p>
</li>
<li><p>relativno brze potvrde;</p>
</li>
<li><p>jednostavna monetarna politika;</p>
</li>
<li><p>otvoren izvorni kod;</p>
</li>
<li><p>široka podrška novčanika i platformi;</p>
</li>
<li><p>opciona MWEB privatnost;</p>
</li>
<li><p>merged mining sa Dogecoinom.</p>
</li>
</ul>
<p>Njegovi najveći nedostaci su:</p>
<ul>
<li><p>promenljiva tržišna cena;</p>
</li>
<li><p>slabiji mrežni efekat od Bitcoina;</p>
</li>
<li><p>jaka konkurencija drugih platnih mreža i stablecoina;</p>
</li>
<li><p>energetski zahtevno rudarenje;</p>
</li>
<li><p>dominacija ASIC uređaja;</p>
</li>
<li><p>rizik koncentracije poolova;</p>
</li>
<li><p>ograničena podrška za MWEB;</p>
</li>
<li><p>nepovratne greške korisnika;</p>
</li>
<li><p>neizvesna buduća potražnja.</p>
</li>
</ul>
<p>Litecoin, dakle, nije „brži Bitcoin“ u svakom mogućem smislu, niti je potpuno anonimna valuta. Ali nije ni mrtav ili nefunkcionalan projekat. To je aktivna, samostalna i tehnički proverljiva blokčejn mreža sa sopstvenim pravilima, infrastrukturom i tržištem.</p>
<h2>Kupovina i prodaja kriptovaluta preko Voleta</h2>
<h3><em>Ovaj članak je sponzorisan od strane</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet.com</em></a><em>. Na Volet.com možete kupiti i prodati Litecoin. Više informacija nalazi se na stranici</em> <a href="https://volet.srbija.workers.dev/"><em>Volet za korisnike iz Srbije</em></a><em>. Za otvaranje naloga koristi</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet referral link</em></a><em>. Link je referral link autora članka.</em></h3>
<h2>Reference i dodatna literatura</h2>
<ol>
<li><p><a href="https://litecoin.com/news/deep-dive-to-celebrate-litecoins-12th-birthday">Litecoin Project: istorija nastanka i pokretanja mreže.</a></p>
</li>
<li><p><a href="https://litecoin.com/">Litecoin Project: zvanični opis mreže i njene namene.</a></p>
</li>
<li><p><a href="https://github.com/litecoin-project/litecoin">Litecoin Core: izvorni kod i razvojni repozitorijum.</a></p>
</li>
<li><p><a href="https://github.com/litecoin-project/litecoin/releases">Litecoin Core: zvanične softverske verzije i bezbednosna ažuriranja.</a></p>
</li>
<li><p><a href="https://github.com/litecoin-project/litecoin/blob/master/src/chainparams.cpp">Litecoin Core: parametri vremena bloka, težine i halvinga.</a></p>
</li>
<li><p><a href="https://github.com/litecoin-project/lips">Litecoin Improvement Proposals: standardi i status MWEB predloga.</a></p>
</li>
<li><p><a href="https://github.com/litecoin-project/lips/blob/master/lip-0003.mediawiki">LIP-0003: tehnički opis MimbleWimble ekstenzionih blokova.</a></p>
</li>
<li><p><a href="https://github.com/litecoin-project/litecoin/blob/master/doc/mweb/light-clients.md">Litecoin Core: dokumentacija za MWEB lake klijente.</a></p>
</li>
<li><p><a href="https://litecoin.com/news/how-litecoin-and-dogecoin-created-one-of-the-most-robust-pow-networks">Litecoin Project: objašnjenje merged mininga sa Dogecoinom.</a></p>
</li>
<li><p><a href="https://litecoin.com/learning-center/bitcoin-vs-litecoin-what-are-the-differences">Litecoin Project: poređenje Bitcoina i Litecoina.</a></p>
</li>
<li><p><a href="https://litecoinspace.org/docs/api">Litecoin Space: dokumentacija blockchain explorera i API-ja.</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/litecoin-for-developers-reliable-payment-infrastructure-18hp">Litecoin for Developers: Reliable Payment Infrastructure</a></p>
]]></content:encoded></item><item><title><![CDATA[Ethereum iznutra: EVM, konsenzus i razvoj modernih dappova]]></title><description><![CDATA[Ethereum se često opisuje kao „svetski računar“. Ta formulacija je korisna za konferencijski slajd, ali developeru ne govori gotovo ništa. Ne objašnjava gde se program izvršava, ko čuva stanje, kako m]]></description><link>https://kripto-pocetnica.hashnode.dev/ethereum-iznutra-evm-konsenzus-i-razvoj-modernih-dappova</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/ethereum-iznutra-evm-konsenzus-i-razvoj-modernih-dappova</guid><category><![CDATA[Ethereum]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[crypto]]></category><category><![CDATA[eth]]></category><category><![CDATA[Smart Contracts]]></category><category><![CDATA[Web3]]></category><category><![CDATA[EVM]]></category><category><![CDATA[layer2]]></category><category><![CDATA[Solidity]]></category><category><![CDATA[dapp]]></category><category><![CDATA[defi]]></category><category><![CDATA[viem]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Fri, 18 Sep 2026 01:48:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/b9e08b73-01d0-49c8-b3de-8999b7a81f9c.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ethereum se često opisuje kao „svetski računar“. Ta formulacija je korisna za konferencijski slajd, ali developeru ne govori gotovo ništa. Ne objašnjava gde se program izvršava, ko čuva stanje, kako mreža rešava konflikt, zašto neuspešna transakcija košta niti zbog čega bi neko izabrao blockchain umesto Postgresa i običnog API-ja.</p>
<p>Preciznije rečeno, Ethereum je javna distribuirana mašina stanja. Hiljade nezavisnih računara proveravaju iste transakcije prema istim pravilima i dolaze do istog rezultata. Programi koji menjaju to stanje zovu se smart ugovori, okruženje u kojem se izvršavaju je Ethereum Virtual Machine, a izvršavanje se plaća nativnom valutom ETH .</p>
<p>Ethereum zato nije zamena za cloud, bazu podataka ili backend framework. To je specijalizovan koordinacioni sloj za slučajeve u kojima više strana mora da deli stanje, ali nijedna ne treba da ima jednostranu kontrolu nad njim.</p>
<h2>Šta je Ethereum, bez marketinške definicije</h2>
<p>Klasična aplikacija obično ima vlasnika infrastrukture. Kompanija kontroliše server, bazu, administratorske naloge i pravila sistema. Korisnik mora da veruje da operator neće retroaktivno promeniti podatke, blokirati nalog, izvršiti nedokumentovanu transakciju ili jednostavno ugasiti servis.</p>
<p>Ethereum menja model autoriteta.</p>
<p>Pravila aplikacije mogu biti objavljena kao kod na javnoj mreži. Kada se ugovor jednom pozove, rezultat ne određuje backend jedne kompanije, već protokol koji nezavisno izvršavaju Ethereum čvorovi. Korisnik ne mora da veruje konkretnom serveru, ali mora da veruje proverljivom kodu, pravilima protokola, kriptografiji i ekonomskim podsticajima mreže.</p>
<p>To je važna, ali ograničena osobina. Ethereum ne garantuje da je aplikacija korisna, da ugovor nema bug, da je oracle poslao tačnu cenu ili da je frontend bezbedan. Garantuje mnogo užu stvar: validne transakcije biće izvršene prema pravilima protokola, a prihvaćeno stanje može nezavisno da se proveri.</p>
<p>Ethereum ima četiri osnovne uloge:</p>
<ul>
<li><p>Ethereum protokol definiše pravila validnih blokova i tranzicija stanja.</p>
</li>
<li><p>EVM deterministički izvršava bytecode smart ugovora.</p>
</li>
<li><p>Proof-of-stake konsenzus bira kanonski lanac i obezbeđuje ekonomsku finalnost.</p>
</li>
<li><p>ETH služi za plaćanje izvršavanja i kao ekonomski kolateral validatora.</p>
</li>
</ul>
<h2>Kada Ethereum zaista ima smisla</h2>
<p>Ethereum ima smisla kada aplikacija zahteva bar jednu od sledećih osobina:</p>
<ul>
<li><p>više organizacija menja zajedničko stanje bez centralnog administratora</p>
</li>
<li><p>korisnici moraju samostalno da poseduju i prenose digitalnu imovinu</p>
</li>
<li><p>pravila poravnanja treba da budu javna i proverljiva</p>
</li>
<li><p>aplikacija mora da komunicira sa postojećim tokenima i protokolima</p>
</li>
<li><p>istorija promena mora da bude otporna na naknadno prepravljanje</p>
</li>
<li><p>sredstva treba da budu kontrolisana kodom, a ne nalogom jedne firme</p>
</li>
<li><p>korisnik treba da može da napusti jedan frontend i nastavi kroz drugi</p>
</li>
<li><p>aplikacija zahteva otvoren pristup bez prethodnog ugovora sa operatorom</p>
</li>
</ul>
<p>Tipični primeri su decentralizovane berze, tržišta kapitala, stablecoin plaćanja, escrow sistemi, zajednički trezori, tokenizovana prava, digitalno vlasništvo, transparentne aukcije i protokoli kojima mogu da pristupaju druge aplikacije.</p>
<p>Ethereum nema smisla samo zato što aplikacija ima korisnike, plaćanja ili audit log.</p>
<p>Ako jedna kompanija legitimno kontroliše sva pravila, ako se podaci često menjaju, ako je privatnost podrazumevana ili ako je potreban veliki broj jeftinih operacija, tradicionalni backend je obično bolji izbor. U mnogim realnim sistemima najbolje rešenje je hibrid: kritično vlasništvo i poravnanje su na lancu, dok pretraga, analitika, dokumenti, notifikacije i poslovni procesi ostaju van lanca.</p>
<h2>Ethereum kao deterministička mašina stanja</h2>
<p>Najkorisniji mentalni model nije „distribuirana baza“, već deterministička mašina stanja.</p>
<p>Možemo je opisati ovako:</p>
<pre><code class="language-text">novo_stanje = tranzicija_stanja(staro_stanje, transakcije)
</code></pre>
<p>Svaki puni čvor uzima prethodno validno stanje i isti uređeni skup transakcija. Ako implementira ista pravila protokola, mora dobiti isti rezultat. Čvor koji dobije drugi rezultat odbaciće blok kao nevalidan.</p>
<p>Globalno stanje sadrži naloge, njihove ETH balanse, nonce vrednosti, bytecode ugovora i persistent storage svakog ugovora. Stanje je kriptografski sažeto u root vrednost koja se nalazi u zaglavlju bloka .</p>
<p>Determinističnost nameće ograničenja koja u običnom backendu ne postoje. Smart ugovor ne može proizvoljno da pozove HTTP API, pročita lokalni sat servera ili direktno upita banku. Kada bi različiti čvorovi mogli da dobiju različit odgovor, ne bi mogli da se slože oko rezultata.</p>
<p>Zato EVM kod može da koristi samo podatke dostupne u transakciji, trenutnom stanju i ograničenom skupu podataka o bloku. Spoljni podaci ulaze preko transakcija i oracle sistema.</p>
<h2>Nalozi: EOA i smart ugovori</h2>
<p>Ethereum protokol razlikuje dve osnovne vrste naloga :</p>
<table>
<thead>
<tr>
<th>Vrsta naloga</th>
<th>Kontrola</th>
<th>Može sam da inicira transakciju</th>
<th>Ima bytecode</th>
</tr>
</thead>
<tbody><tr>
<td>EOA</td>
<td>privatni ključ</td>
<td>da</td>
<td>ne</td>
</tr>
<tr>
<td>contract account</td>
<td>programski kod</td>
<td>ne, reaguje na poziv</td>
<td>da</td>
</tr>
</tbody></table>
<p>EOA, odnosno externally owned account, tradicionalno je nalog kojim upravlja privatni ključ. Adresa se izvodi iz javnog ključa, dok privatni ključ omogućava potpisivanje transakcija.</p>
<p>Contract account nastaje deploymentom smart ugovora. Ima adresu, može držati ETH i tokene, poseduje persistent storage i izvršava bytecode kada primi poziv.</p>
<p>Važna posledica je da ugovor ne radi u pozadini. Nema cron job, thread ili event loop. Kod ugovora izvršava se samo u okviru transakcije koju je inicirao neki nalog. Jedan ugovor tokom tog izvršavanja može pozvati druge ugovore, ali ceo lanac poziva pripada istoj početnoj transakciji.</p>
<h3>Šta se nalazi u Ethereum nalogu</h3>
<p>Konceptualno, nalog sadrži:</p>
<ul>
<li><p><code>nonce</code></p>
</li>
<li><p>ETH balans</p>
</li>
<li><p><code>storageRoot</code></p>
</li>
<li><p><code>codeHash</code></p>
</li>
</ul>
<p>Kod EOA naloga nonce prati broj poslatih transakcija. Kod contract naloga njegova uloga zavisi od kreiranja drugih ugovora. <code>storageRoot</code> kriptografski predstavlja storage ugovora, dok <code>codeHash</code> identifikuje njegov runtime bytecode.</p>
<p>Adresa ima 20 bajtova, odnosno 160 bita. Adrese nisu korisnička imena i same po sebi ne otkrivaju identitet vlasnika. Ipak, sve aktivnosti iste adrese mogu se povezati, pa pseudonimnost ne treba mešati sa privatnošću.</p>
<h3>Privatni ključ nije lozinka</h3>
<p>Gubitak klasične lozinke rešava administrator. Gubitak privatnog ključa uglavnom nema isti recovery model. Ko ima ključ, može potpisivati kao taj nalog.</p>
<p>Zbog toga produkcioni sistemi ne treba da drže privatne ključeve u source kodu, običnom <code>.env</code> fajlu na deljenom serveru ili frontend bundleu. U zavisnosti od modela rizika koriste se:</p>
<ul>
<li><p>hardverski novčanici</p>
</li>
<li><p>multisig ugovori</p>
</li>
<li><p>HSM ili KMS sistemi</p>
</li>
<li><p>odvojeni signing servisi</p>
</li>
<li><p>smart account recovery pravila</p>
</li>
<li><p>ograničeni session ključevi</p>
</li>
<li><p>role-based ugovori sa minimalnim privilegijama</p>
</li>
</ul>
<p>Savremeni account model dodatno se razvija kroz smart accounts, ERC-4337 i delegaciju koda za EOA naloge. ERC-4337 uvodi <code>UserOperation</code>, bundlere, paymastere i standardni <code>EntryPoint</code> bez izmene osnovnog konsenzusa. EIP-7702 omogućava da EOA autorizuje delegaciju izvršnog koda, što otvara prostor za batch operacije, sponzorisani gas i fleksibilnije wallet ponašanje .</p>
<p>To ne znači da je account abstraction jedan proizvod ili jedan API. To je skup protokolskih i aplikativnih mehanizama koji pokušavaju da uklone ograničenja modela „jedan privatni ključ kontroliše sve“.</p>
<h2>Šta je transakcija</h2>
<p>Transakcija je kriptografski potpisana instrukcija koja zahteva promenu Ethereum stanja .</p>
<p>Tipična transakcija sadrži:</p>
<ul>
<li><p><code>chainId</code>, identifikator mreže</p>
</li>
<li><p><code>nonce</code>, redni broj transakcije pošiljaoca</p>
</li>
<li><p><code>to</code>, adresu primaoca ili ugovora</p>
</li>
<li><p><code>value</code>, količinu ETH koja se šalje</p>
</li>
<li><p><code>data</code>, ulazne bajtove za poziv ugovora</p>
</li>
<li><p><code>gasLimit</code>, maksimalno dozvoljenu potrošnju gasa</p>
</li>
<li><p>parametre naknade</p>
</li>
<li><p>potpis pošiljaoca</p>
</li>
</ul>
<p>Ako <code>to</code> nedostaje, transakcija može predstavljati kreiranje ugovora. Ako <code>to</code> pokazuje na EOA i nema relevantnog inputa, najčešće se radi o transferu ETH. Ako pokazuje na contract account, EVM izvršava bytecode tog ugovora sa prosleđenim <code>data</code> i <code>value</code> vrednostima.</p>
<h3>Nonce i redosled</h3>
<p>Nonce sprečava replay iste transakcije i uspostavlja redosled za transakcije istog naloga.</p>
<p>Ako nalog ima potvrđeni nonce 12, sledeća transakcija mora da koristi 12. Transakcija sa nonce 13 može stići u mempool, ali ne može biti izvršena pre transakcije 12. Ako transakcija 12 ostane zaglavljena zbog preniske naknade, sve kasnije transakcije istog naloga mogu čekati iza nje.</p>
<p>Ovo je čest problem backend servisa koji paralelno šalju mnogo transakcija. Potreban je centralizovan nonce manager, red po signing nalogu ili druga arhitektura koja sprečava da više procesa rezerviše isti nonce.</p>
<h3>Potpisivanje i slanje</h3>
<p>Wallet ili signing servis serijalizuje transakciju, izračunava hash i potpisuje ga privatnim ključem. Potpis omogućava mreži da utvrdi adresu pošiljaoca bez slanja privatnog ključa.</p>
<p>Potpisana transakcija se prosleđuje nodeu, obično kroz JSON-RPC metodu <code>eth_sendRawTransaction</code>. Node proverava osnovnu validnost i propagira transakciju peerovima. Transakcija zatim čeka uključivanje u blok.</p>
<p>RPC provider ne poseduje sredstva samo zato što mu šalješ potpisanu transakciju. Privatni ključ nije deo zahteva. Provider, međutim, vidi IP adresu, vreme, upite i transakcije, što je važan privatnosni i infrastrukturni trade-off.</p>
<h2>Životni ciklus jedne transakcije</h2>
<p>Kada korisnik u dappu klikne „Confirm“, dešava se više od jednog API poziva.</p>
<ol>
<li><p>Frontend formira nameru, na primer poziv <code>deposit(orderId)</code>.</p>
</li>
<li><p>ABI encoder pretvara naziv funkcije i argumente u calldata.</p>
</li>
<li><p>Wallet prikazuje mrežu, adresu ugovora, vrednost i procenu naknade.</p>
</li>
<li><p>Korisnik potpisuje transakciju.</p>
</li>
<li><p>Wallet šalje raw transakciju RPC nodeu.</p>
</li>
<li><p>Node je validira i propagira u peer-to-peer mrežu.</p>
</li>
<li><p>Block builder ili validator bira transakcije i određuje redosled.</p>
</li>
<li><p>Execution client izvršava transakciju u EVM-u.</p>
</li>
<li><p>Ako je validna, rezultat ulazi u predloženi blok.</p>
</li>
<li><p>Consensus client proverava blok i prati glasove validatora.</p>
</li>
<li><p>Aplikacija dobija transaction receipt.</p>
</li>
<li><p>Posle dodatnih potvrda blok postaje sigurniji, a zatim finalizovan.</p>
</li>
</ol>
<p>Važno je razlikovati četiri statusa:</p>
<ul>
<li><p>transakcija je potpisana, ali nije poslata</p>
</li>
<li><p>transakcija je u mempoolu</p>
</li>
<li><p>transakcija je uključena u blok</p>
</li>
<li><p>blok je finalizovan</p>
</li>
</ul>
<p>„Transaction hash postoji“ ne znači da je plaćanje završeno. Hash može da postoji za pending transakciju koja nikada neće biti uključena. Čak i uključen blok može kratkotrajno ispasti iz kanonskog lanca tokom reorganizacije.</p>
<p>Za prikaz korisniku često je dovoljno pokazati „potvrđeno“ nakon uključivanja u blok. Za nepovratnu isporuku vredne robe, bridge poravnanje ili knjigovodstveno zatvaranje treba definisati strožu politiku potvrde.</p>
<h2>Blokovi i kanonski lanac</h2>
<p>Blok je uređeni batch transakcija zajedno sa metapodacima i kriptografskim vezama ka prethodnom stanju .</p>
<p>Blok sadrži, između ostalog:</p>
<ul>
<li><p>hash roditeljskog bloka</p>
</li>
<li><p>state root nakon izvršavanja</p>
</li>
<li><p>transaction root</p>
</li>
<li><p>receipts root</p>
</li>
<li><p>listu transakcija</p>
</li>
<li><p>gas limit i potrošeni gas</p>
</li>
<li><p>base fee</p>
</li>
<li><p>timestamp</p>
</li>
<li><p>druge podatke potrebne protokolu</p>
</li>
</ul>
<p>Hash roditelja povezuje blokove. Promena stare transakcije promenila bi njen blok, sve naredne hash veze i izvedeno stanje. Napadač zato ne može samo da izmeni red u istorijskoj „bazi“. Morao bi da proizvede alternativan validan lanac i nadjača konsenzus mreže.</p>
<p>Blok time istovremeno određuje:</p>
<ul>
<li><p>koje su transakcije izvršene</p>
</li>
<li><p>kojim redosledom su izvršene</p>
</li>
<li><p>kakvo je novo stanje</p>
</li>
<li><p>koje event logove su proizvele</p>
</li>
<li><p>koliko gasa je potrošeno</p>
</li>
</ul>
<p>Redosled je presudan. Dve pojedinačno validne transakcije mogu dati drugačiji rezultat u zavisnosti od toga koja je prva. To je osnova problema frontrunninga, sandwich napada i šire kategorije maksimalne izvodljive vrednosti, poznate kao MEV .</p>
<h2>Execution i consensus sloj</h2>
<p>Ethereum node nije jedan monolitni proces. Potpun node koristi najmanje dva klijenta :</p>
<ul>
<li><p>execution client</p>
</li>
<li><p>consensus client</p>
</li>
</ul>
<p>Ako node učestvuje kao validator, koristi i validator client.</p>
<p>Execution client:</p>
<ul>
<li><p>održava EVM stanje</p>
</li>
<li><p>prima i propagira transakcije</p>
</li>
<li><p>izvršava smart ugovore</p>
</li>
<li><p>izlaže JSON-RPC</p>
</li>
<li><p>proverava execution payload blokova</p>
</li>
<li><p>čuva podatke potrebne za izabrani režim sinhronizacije</p>
</li>
</ul>
<p>Consensus client:</p>
<ul>
<li><p>prati proof-of-stake konsenzus</p>
</li>
<li><p>obrađuje blokove Beacon Chain sloja</p>
</li>
<li><p>proverava attestations</p>
</li>
<li><p>bira head lanca</p>
</li>
<li><p>prati justification i finality</p>
</li>
<li><p>komunicira sa execution clientom preko Engine API-ja</p>
</li>
</ul>
<p>Ovo razdvajanje je bitno za developera koji vodi sopstvenu infrastrukturu. Pokretanje samo execution clienta nije dovoljno da node samostalno prati savremeni Ethereum. Klijenti moraju biti sinhronizovani i pravilno povezani.</p>
<p>Raznovrsnost implementacija je namerna. Ako svi koriste isti klijent, jedan bug može ugroziti veliki deo mreže. Različiti execution i consensus klijenti implementiraju istu specifikaciju u različitim jezicima i codebaseovima.</p>
<h2>Kako proof of stake dolazi do dogovora</h2>
<p>Ethereum koristi proof of stake. Validator ulaže ETH kao kolateral, održava potrebne klijente i učestvuje u predlaganju i potvrđivanju blokova .</p>
<p>Za aktiviranje standardnog validatora potreban je depozit od najmanje 32 ETH. Protokol zatim bira validatore za različite dužnosti:</p>
<ul>
<li><p>predlaganje bloka</p>
</li>
<li><p>potvrđivanje predloženog bloka</p>
</li>
<li><p>glasanje o headu lanca</p>
</li>
<li><p>učestvovanje u finalizaciji checkpointa</p>
</li>
<li><p>učestvovanje u sync committee dužnostima kada su izabrani</p>
</li>
</ul>
<p>Vreme je organizovano u slotove i epohe. Slot traje približno 12 sekundi, a epoha sadrži 32 slota. U normalnim uslovima finalnost se postiže kroz glasove supervećine validatora tokom više checkpointa.</p>
<p>Treba razlikovati:</p>
<ul>
<li><p>head, trenutno najbolji blok prema fork-choice pravilu</p>
</li>
<li><p>justified checkpoint, checkpoint koji je dobio potrebnu podršku</p>
</li>
<li><p>finalized checkpoint, stanje čije bi poništavanje zahtevalo ozbiljno kršenje konsenzusa i ekonomske kazne</p>
</li>
</ul>
<p>Validator koji je offline propušta nagrade i može dobijati manje kazne. Validator koji šalje konfliktne poruke ili pokušava da potvrdi nespojive istorije može biti slashovan. Slashing znači uništavanje dela uloženog ETH i prinudni izlazak.</p>
<p>Proof of stake ne sprečava svaki zastoj. Ako dovoljan deo validatora nije dostupan, lanac može nastaviti da proizvodi blokove, ali izgubiti mogućnost finalizacije. Sistem razlikuje safety, da konfliktna stanja ne budu finalizovana, i liveness, da mreža nastavi napredovanje.</p>
<h2>Šta EVM zapravo izvršava</h2>
<p>EVM ne izvršava Solidity source. Solidity compiler proizvodi EVM bytecode, ABI i dodatne metapodatke. Na mrežu se postavlja bytecode .</p>
<p>EVM je stack mašina:</p>
<ul>
<li><p>stack ima maksimalnu dubinu od 1024 elementa</p>
</li>
<li><p>osnovna reč ima 256 bita</p>
</li>
<li><p>instrukcije se nazivaju opcodes</p>
</li>
<li><p>svaki opcode ima definisanu cenu u gasu</p>
</li>
<li><p>izvršavanje je determinističko</p>
</li>
</ul>
<p>Uobičajeni opcodes uključuju:</p>
<ul>
<li><p>aritmetiku kao <code>ADD</code>, <code>SUB</code> i <code>MUL</code></p>
</li>
<li><p>poređenja kao <code>LT</code>, <code>GT</code> i <code>EQ</code></p>
</li>
<li><p>stack operacije kao <code>PUSH</code>, <code>DUP</code> i <code>SWAP</code></p>
</li>
<li><p>kontrolu toka kao <code>JUMP</code> i <code>JUMPI</code></p>
</li>
<li><p>rad sa stanjem kao <code>SLOAD</code> i <code>SSTORE</code></p>
</li>
<li><p>eksterne pozive kao <code>CALL</code>, <code>STATICCALL</code> i <code>DELEGATECALL</code></p>
</li>
<li><p>podatke okruženja kao <code>CALLER</code>, <code>CALLVALUE</code> i <code>BLOCKHASH</code></p>
</li>
<li><p>logove kao <code>LOG0</code> do <code>LOG4</code></p>
</li>
</ul>
<p>Solidity konstrukcija može proizvesti više opcodes. Cena izvornog koda zato se ne procenjuje po broju linija, već prema konkretnoj putanji izvršavanja, pristupu stanju, memoriji i eksternim pozivima.</p>
<h3>Stack, memory, calldata i storage</h3>
<p>EVM ima nekoliko različitih prostora za podatke:</p>
<table>
<thead>
<tr>
<th>Prostor</th>
<th>Trajanje</th>
<th>Promenljiv</th>
<th>Tipična namena</th>
</tr>
</thead>
<tbody><tr>
<td>stack</td>
<td>jedan execution frame</td>
<td>da</td>
<td>operandi i privremene vrednosti</td>
</tr>
<tr>
<td>memory</td>
<td>jedan eksterni poziv</td>
<td>da</td>
<td>privremeni nizovi i strukture</td>
</tr>
<tr>
<td>calldata</td>
<td>ulaz poziva</td>
<td>ne</td>
<td>ABI-enkodovani argumenti</td>
</tr>
<tr>
<td>storage</td>
<td>između transakcija</td>
<td>da</td>
<td>trajno stanje ugovora</td>
</tr>
<tr>
<td>transient storage</td>
<td>trajanje jedne transakcije</td>
<td>da</td>
<td>privremeno stanje između internih poziva</td>
</tr>
<tr>
<td>code</td>
<td>trajno</td>
<td>ne na postojećoj adresi</td>
<td>runtime bytecode</td>
</tr>
</tbody></table>
<p>Storage je najskuplji zato što menja globalno stanje koje svaki odgovarajući node mora da obradi. Memory je privremen i jeftiniji, mada cena raste sa njegovim širenjem. Calldata je read-only ulaz i često je efikasniji od kopiranja podataka u memory.</p>
<p>Transient storage, dostupan kroz <code>TSTORE</code> i <code>TLOAD</code>, traje kroz interne pozive u istoj transakciji, ali se briše na njenom kraju. Koristan je za privremene lockove i komunikaciju između poziva kada podatak ne treba trajno upisati .</p>
<h2>Smart ugovor nije mikroservis</h2>
<p>Smart ugovor nema proces, otvoren port, filesystem, environment variables ni direktnu mrežnu konekciju. To je trajno objavljen bytecode koji se aktivira pozivom.</p>
<p>Ugovor može da:</p>
<ul>
<li><p>čita i menja sopstveni storage</p>
</li>
<li><p>šalje ETH</p>
</li>
<li><p>poziva druge ugovore</p>
</li>
<li><p>kreira druge ugovore</p>
</li>
<li><p>emituje logove</p>
</li>
<li><p>proverava potpis</p>
</li>
<li><p>prekine izvršavanje i vrati grešku</p>
</li>
</ul>
<p>Ne može samostalno da:</p>
<ul>
<li><p>pozove REST API</p>
</li>
<li><p>pročita cenu sa berze</p>
</li>
<li><p>zakaže buduće izvršavanje</p>
</li>
<li><p>sakrije plaintext podatak od svih nodeova</p>
</li>
<li><p>generiše pouzdanu slučajnost iz lokalnog izvora</p>
</li>
<li><p>garantuje da će ga neko pozvati u određenom trenutku</p>
</li>
</ul>
<p>Automatizacija van lanca zato ostaje neophodna. Keeper ili automation servis prati uslov i šalje transakciju kada treba izvršiti funkciju. Oracle šalje proverljiv rezultat spoljnog događaja. Frontend i indexer pretvaraju raw blockchain podatke u upotrebljiv proizvod.</p>
<h2>ABI, calldata i function selector</h2>
<p>Application Binary Interface definiše kako se funkcije i tipovi kodiraju u bajtove. Kada frontend pozove:</p>
<pre><code class="language-solidity">transfer(address recipient, uint256 amount)
</code></pre>
<p>prva četiri bajta calldata predstavljaju function selector. Selector se dobija iz prva četiri bajta Keccak-256 hasha kanonskog potpisa funkcije:</p>
<pre><code class="language-text">transfer(address,uint256)
</code></pre>
<p>Posle selectora dolaze ABI-enkodovani argumenti, raspoređeni u 32-bajtne reči, uz offsete za dinamičke tipove.</p>
<p>ABI fajl omogućava biblioteci da zna:</p>
<ul>
<li><p>koje funkcije postoje</p>
</li>
<li><p>koji su ulazni i izlazni tipovi</p>
</li>
<li><p>koje funkcije menjaju stanje</p>
</li>
<li><p>koji eventovi postoje</p>
</li>
<li><p>kako se dekodiraju custom errors</p>
</li>
</ul>
<p>ABI nije izvršni kod i ne dokazuje da je ugovor bezbedan. To je interfejs između aplikacije i bytecodea.</p>
<h3><code>call</code>, transakcija i simulacija nisu isto</h3>
<p>Read-only poziv obično koristi <code>eth_call</code>. Node lokalno simulira izvršavanje nad izabranim stanjem i vraća rezultat. Nema konsenzusa, nema potpisa i nema naknade protokolu.</p>
<p>Write operacija zahteva potpisanu transakciju. Ona ulazi u mempool, može biti uključena u blok i plaća gas.</p>
<p>Česta greška je verovanje da uspešan <code>eth_call</code> garantuje uspeh kasnije transakcije. Stanje se može promeniti između simulacije i izvršavanja. Cena može skliznuti, nonce može biti iskorišćen, allowance potrošen ili deadline isteći.</p>
<h2>Atomičnost i revert</h2>
<p>Ethereum transakcija je atomska. Ili se sve promene cele execution putanje prihvate, ili se sve vrate.</p>
<p>Ako ugovor A promeni storage, zatim pozove B, a B revertuje bez obrade greške, promene u A takođe se poništavaju. Isto važi za dublji lanac poziva.</p>
<p>Revert, međutim, ne vraća potrošeni gas. Čvorovi su već obavili računarski rad do tačke greške. Pošiljalac plaća taj rad, osim preostalog neiskorišćenog gasa.</p>
<p>Ovo je jedan od razloga zbog kojih se jeftine provere stavljaju rano. Ako operacija nije dozvoljena, bolje je odbiti je pre skupih storage upisa i eksternih poziva.</p>
<h2>Gas: cena izvršavanja, a ne cena ETH</h2>
<p>Gas je obračunska jedinica za EVM resurse . Svaka operacija ima gas cenu. Transakcija troši zbir troškova instrukcija, proširenja memorije, pristupa stanju, calldata i drugih protokolskih operacija.</p>
<p>Gas nije ETH. Korisnik plaća gas u ETH prema ceni po jedinici.</p>
<p>Pojednostavljena formula je:</p>
<pre><code class="language-text">transaction_fee =
    gas_used * effective_gas_price
</code></pre>
<p>Kod transakcija sa EIP-1559 modelom:</p>
<pre><code class="language-text">effective_gas_price =
    base_fee + stvarni_priority_fee
</code></pre>
<p>uz ograničenje koje postavlja <code>maxFeePerGas</code>.</p>
<h3>Base fee</h3>
<p><code>base fee</code> je protokolski određen minimum za blok. Menja se na osnovu iskorišćenosti prethodnog bloka. Ako su blokovi iznad ciljne popunjenosti, base fee raste. Ako su ispod cilja, opada.</p>
<p>Base fee se spaljuje. Ne ide validatoru.</p>
<h3>Priority fee</h3>
<p><code>maxPriorityFeePerGas</code> predstavlja maksimalni tip po jedinici gasa koji je korisnik spreman da plati validatoru. Viši tip može povećati verovatnoću bržeg uključivanja kada se transakcije takmiče za prostor.</p>
<p>Validator ne dobija nužno celu vrednost <code>maxFeePerGas</code>. Efektivna cena je ograničena trenutnim base fee-jem i maksimalnim priority fee-jem.</p>
<h3>Maksimalna naknada</h3>
<p><code>maxFeePerGas</code> je gornja granica cene po jedinici gasa. Wallet može postaviti dovoljno prostora da transakcija ostane validna čak i ako base fee poraste pre uključivanja.</p>
<p>Neiskorišćena razlika između maksimuma i efektivne cene se ne naplaćuje.</p>
<h3>Gas limit</h3>
<p><code>gasLimit</code> je maksimalan broj jedinica gasa koji transakcija sme da potroši.</p>
<p>Običan transfer ETH između standardnih EOA naloga tradicionalno zahteva 21.000 jedinica gasa. Poziv ugovora zavisi od koda i stanja.</p>
<p>Ako transakcija dobije previsok gas limit, ne plaća automatski ceo limit. Plaća stvarno potrošeni gas. Ako dobije prenizak limit i ostane bez gasa tokom izvršavanja, stanje se revertuje, a potrošeni gas se naplaćuje.</p>
<p>EIP-1559 definiše ovaj tržišni model za naknade i typed transaction format koji ga nosi .</p>
<h2>Zašto isti poziv nema uvek isti gas</h2>
<p>Isti Solidity metod ne mora uvek imati isti trošak. Cena zavisi od putanje i postojećeg stanja.</p>
<p>Primeri:</p>
<ul>
<li><p>upis nule u nenultu storage vrednost razlikuje se od prvog upisa</p>
</li>
<li><p>prvi pristup nalogu ili storage slotu u transakciji može biti skuplji od ponovnog</p>
</li>
<li><p>duži niz može zahtevati više iteracija</p>
</li>
<li><p>jedna grana <code>if</code> izraza može pozvati drugi ugovor, druga ne</p>
</li>
<li><p>calldata sa različitim bajtovima može imati drugačiji trošak</p>
</li>
<li><p>deployment zavisi od veličine init i runtime koda</p>
</li>
<li><p>revert na početku troši manje od reverta posle više eksternih poziva</p>
</li>
</ul>
<p>Zato procenu treba raditi sa stvarnim argumentima i aktuelnim stanjem kroz <code>eth_estimateGas</code>. I ta procena je samo simulacija. Stanje se može promeniti pre uključivanja.</p>
<h2>Koliko Ethereum košta</h2>
<p>Ne postoji stabilna cena „jedne Ethereum transakcije“. Ukupan trošak zavisi od:</p>
<ul>
<li><p>potrošenog gasa</p>
</li>
<li><p>base fee-ja u bloku</p>
</li>
<li><p>efektivnog priority fee-ja</p>
</li>
<li><p>cene ETH u valuti koja te zanima</p>
</li>
<li><p>toga da li koristiš L1 ili L2</p>
</li>
<li><p>L2 execution naknade</p>
</li>
<li><p>L1 data komponente L2 transakcije</p>
</li>
<li><p>eventualnih troškova bridgea ili servisa</p>
</li>
</ul>
<p>Za L1 možeš proceniti:</p>
<pre><code class="language-text">trošak_u_ETH =
    procenjeni_gas * procenjena_cena_gasa
</code></pre>
<p>Ako aplikacija prikazuje fiat procenu, mora jasno da navede da se ona menja sa kursom i stanjem mreže.</p>
<p>Pored protokolske naknade, produkcioni sistem može imati i druge troškove:</p>
<ul>
<li><p>RPC infrastruktura</p>
</li>
<li><p>arhivski upiti</p>
</li>
<li><p>indeksiranje događaja</p>
</li>
<li><p>monitoring i alerting</p>
</li>
<li><p>audit ugovora</p>
</li>
<li><p>oracle naknade</p>
</li>
<li><p>bridge naknade</p>
</li>
<li><p>custody ili key-management infrastruktura</p>
</li>
<li><p>pravni i operativni troškovi</p>
</li>
</ul>
<p>Besplatan RPC plan i testnet nisu realna procena produkcionog budžeta. Testnet token nema tržišnu vrednost, a ponašanje testneta nije identično mainnet potražnji.</p>
<h2>Typed transakcije i zašto postoje</h2>
<p>Ethereum podržava različite tipove transakcija kroz typed transaction envelope.</p>
<p>Za aplikativnog developera najvažnije su:</p>
<ul>
<li><p>legacy transakcije</p>
</li>
<li><p>EIP-2930 transakcije sa access listom</p>
</li>
<li><p>EIP-1559 transakcije sa <code>maxFeePerGas</code> i <code>maxPriorityFeePerGas</code></p>
</li>
<li><p>blob transakcije namenjene dostupnosti podataka za rollupe</p>
</li>
<li><p>set-code transakcije povezane sa EOA delegacijom</p>
</li>
</ul>
<p>Biblioteke i walleti uglavnom biraju odgovarajući tip. Ipak, backend koji potpisuje transakcije mora razumeti tip koji generiše, podršku mreže i način računanja naknada.</p>
<p>Blob transakcija nije jeftin način da dapp trajno skladišti proizvoljne fajlove. Blob prostor je posebno tržište za podatke koji su rollupovima privremeno potrebni za verifikaciju i rekonstrukciju stanja. EVM ugovori ne čitaju blob sadržaj na isti način kao calldata .</p>
<h2>Events, logs i indeksiranje</h2>
<p>Smart ugovor može emitovati event. EVM ga zapisuje kao log u transaction receipt.</p>
<p>Event se sastoji od:</p>
<ul>
<li><p>adrese ugovora</p>
</li>
<li><p>topics polja</p>
</li>
<li><p>data polja</p>
</li>
<li><p>reference na blok i transakciju</p>
</li>
</ul>
<p>Prvi topic je kod neanonimnih eventova hash potpisa eventa. Parametri označeni sa <code>indexed</code> mogu postati dodatni topics. Ostali ABI-enkodovani parametri ulaze u <code>data</code>.</p>
<p>Eventovi su dobri za:</p>
<ul>
<li><p>istoriju uplata</p>
</li>
<li><p>promene vlasništva</p>
</li>
<li><p>integraciju backenda</p>
</li>
<li><p>notifikacije</p>
</li>
<li><p>analitiku</p>
</li>
<li><p>rekonstrukciju aplikativnih projekcija</p>
</li>
</ul>
<p>Event nije storage koji ugovor kasnije može normalno da čita. Namenjen je spoljnim potrošačima.</p>
<p>Backend indexer obično:</p>
<ol>
<li><p>pamti poslednji obrađeni blok</p>
</li>
<li><p>dohvaća logove za ograničen raspon blokova</p>
</li>
<li><p>dekodira ih prema ABI-ju</p>
</li>
<li><p>upisuje projekciju u relacionu bazu</p>
</li>
<li><p>čeka definisan broj potvrda ili finality</p>
</li>
<li><p>obrađuje reorganizacije</p>
</li>
<li><p>nastavlja od checkpointa</p>
</li>
</ol>
<p>Dobar idempotency ključ je kombinacija:</p>
<pre><code class="language-text">chainId + transactionHash + logIndex
</code></pre>
<p>Samo <code>transactionHash</code> nije dovoljan jer jedna transakcija može emitovati više logova istog tipa.</p>
<p>Frontend ne treba da pretražuje ceo blockchain pri svakom otvaranju stranice. Blockchain je izvor istine, dok je indeksirana baza read model optimizovan za korisnički interfejs.</p>
<h2>JSON-RPC: osnovni interfejs prema nodeu</h2>
<p>Aplikacija komunicira sa execution clientom kroz JSON-RPC. Protokol je stateless i najčešće se koristi preko HTTP-a ili WebSocketa .</p>
<p>Minimalan zahtev za broj najnovijeg bloka izgleda ovako:</p>
<pre><code class="language-bash">curl -X POST \
  -H "Content-Type: application/json" \
  --data '{
    "jsonrpc": "2.0",
    "method": "eth_blockNumber",
    "params": [],
    "id": 1
  }' \
  http://127.0.0.1:8545
</code></pre>
<p>Rezultat je quantity kodiran kao heksadecimalna vrednost:</p>
<pre><code class="language-json">{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x15f90a0"
}
</code></pre>
<p>Ethereum JSON-RPC razlikuje quantity i raw data kodiranje. Quantity nema vodeće nule, osim <code>0x0</code>, dok byte niz mora imati paran broj heksadecimalnih cifara.</p>
<p>Najkorisnije standardne metode su:</p>
<table>
<thead>
<tr>
<th>Metoda</th>
<th>Namena</th>
</tr>
</thead>
<tbody><tr>
<td><code>eth_chainId</code></td>
<td>identifikacija mreže</td>
</tr>
<tr>
<td><code>eth_blockNumber</code></td>
<td>trenutni head</td>
</tr>
<tr>
<td><code>eth_getBalance</code></td>
<td>ETH balans adrese</td>
</tr>
<tr>
<td><code>eth_getCode</code></td>
<td>bytecode na adresi</td>
</tr>
<tr>
<td><code>eth_getTransactionCount</code></td>
<td>nonce naloga</td>
</tr>
<tr>
<td><code>eth_call</code></td>
<td>lokalna simulacija poziva</td>
</tr>
<tr>
<td><code>eth_estimateGas</code></td>
<td>procena potrebnog gasa</td>
</tr>
<tr>
<td><code>eth_feeHistory</code></td>
<td>podaci za procenu naknade</td>
</tr>
<tr>
<td><code>eth_sendRawTransaction</code></td>
<td>slanje potpisane transakcije</td>
</tr>
<tr>
<td><code>eth_getTransactionByHash</code></td>
<td>podaci o transakciji</td>
</tr>
<tr>
<td><code>eth_getTransactionReceipt</code></td>
<td>rezultat izvršavanja</td>
</tr>
<tr>
<td><code>eth_getLogs</code></td>
<td>filtriranje event logova</td>
</tr>
<tr>
<td><code>eth_getBlockByNumber</code></td>
<td>čitanje bloka</td>
</tr>
</tbody></table>
<p>Za state upite može se koristiti block tag:</p>
<ul>
<li><p><code>latest</code></p>
</li>
<li><p><code>safe</code></p>
</li>
<li><p><code>finalized</code></p>
</li>
<li><p><code>pending</code></p>
</li>
<li><p><code>earliest</code></p>
</li>
<li><p>konkretan broj bloka</p>
</li>
</ul>
<p>To nije samo sintaktički detalj. Finansijski dashboard koji traži <code>latest</code> prikazuje najnovije poznato stanje. Sistem za poravnanje možda treba <code>finalized</code>.</p>
<h3>Hosted RPC ili sopstveni node</h3>
<p>Hosted provider je najbrži put do prototipa. Dobijaš endpoint, skaliranje i često dodatne API-je.</p>
<p>Trade-off je zavisnost od:</p>
<ul>
<li><p>dostupnosti provajdera</p>
</li>
<li><p>njegovih rate limita</p>
</li>
<li><p>politike čuvanja istorije</p>
</li>
<li><p>geografske infrastrukture</p>
</li>
<li><p>privatnosti upita</p>
</li>
<li><p>podrške za napredne RPC metode</p>
</li>
</ul>
<p>Sopstveni node daje veću kontrolu i mogućnost nezavisne provere, ali zahteva disk, bandwidth, monitoring, nadogradnje i poznavanje klijenata.</p>
<p>Razuman produkcioni kompromis može biti više RPC endpointa, health checking i jasna razlika između standardnog JSON-RPC-ja i proprietarnih metoda provajdera.</p>
<h2>Integracija kroz viem</h2>
<p>Sirovi JSON-RPC je koristan za razumevanje sistema. U TypeScript aplikaciji se češće koristi biblioteka koja radi ABI encoding, tipizaciju i transport.</p>
<p>Minimalno čitanje ETH balansa kroz viem izgleda ovako:</p>
<pre><code class="language-ts">import { createPublicClient, formatEther, http } from "viem";
import { mainnet } from "viem/chains";

const client = createPublicClient({
  chain: mainnet,
  transport: http(process.env.RPC_URL),
});

const balance = await client.getBalance({
  address: "0x0000000000000000000000000000000000000000",
});

console.log(formatEther(balance));
</code></pre>
<p><code>PublicClient</code> služi za čitanje podataka i simulacije. Za write operacije koristi se wallet client ili eksterni wallet. Produkcioni frontend ne treba da sadrži hardkodovan privatni ključ.</p>
<p>Primer čitanja ugovora:</p>
<pre><code class="language-ts">import {
  createPublicClient,
  http,
  parseAbi,
} from "viem";
import { mainnet } from "viem/chains";

const abi = parseAbi([
  "function balanceOf(address owner) view returns (uint256)",
]);

const client = createPublicClient({
  chain: mainnet,
  transport: http(process.env.RPC_URL),
});

const balance = await client.readContract({
  address: "0xContractAddress",
  abi,
  functionName: "balanceOf",
  args: ["0xOwnerAddress"],
});
</code></pre>
<p>Adrese su ovde placeholderi. Za realan poziv moraju biti validne adrese ugovora i naloga na izabranoj mreži.</p>
<p>Za write workflow poželjno je:</p>
<ol>
<li><p>proveriti <code>chainId</code></p>
</li>
<li><p>validirati korisničke argumente</p>
</li>
<li><p>simulirati poziv</p>
</li>
<li><p>zatražiti potpis</p>
</li>
<li><p>poslati transakciju</p>
</li>
<li><p>prikazati hash</p>
</li>
<li><p>čekati receipt</p>
</li>
<li><p>proveriti status</p>
</li>
<li><p>ažurirati UI i backend projekciju</p>
</li>
</ol>
<p>Nikada ne pretpostavljaj uspeh samo zato što je wallet vratio hash.</p>
<h2>Realan use-case: escrow za isporuku digitalnog rada</h2>
<p>Zamislimo platformu koja povezuje klijenta i izvođača. Klasična verzija drži novac na računu kompanije. To uvodi custody, ručnu kontrolu isplata i zavisnost od operatora.</p>
<p>On-chain escrow može da drži sredstva u ugovoru i izvrši jedno od javno definisanih pravila:</p>
<ul>
<li><p>klijent odobrava isplatu izvođaču</p>
</li>
<li><p>arbitar rešava spor</p>
</li>
<li><p>klijent dobija refund posle roka ako posao nije odobren</p>
</li>
</ul>
<p>Pojednostavljen primer koristi pull-payment obrazac, tako da se sredstva prvo knjiže korisniku, a zatim ih korisnik sam povlači:</p>
<pre><code class="language-solidity">// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract MilestoneEscrow {
    enum State {
        AwaitingFunding,
        Funded,
        Released,
        Refunded
    }

    address public immutable client;
    address public immutable contractor;
    address public immutable arbiter;
    uint256 public immutable amount;
    uint256 public immutable deadline;

    State public state;
    mapping(address =&gt; uint256) public credits;

    error Unauthorized();
    error InvalidState();
    error InvalidAmount();
    error DeadlineNotReached();
    error TransferFailed();

    event Funded(uint256 amount);
    event Resolved(State state, address indexed beneficiary);
    event Withdrawn(address indexed account, uint256 amount);

    constructor(
        address contractor_,
        address arbiter_,
        uint256 amount_,
        uint256 deadline_
    ) {
        if (
            contractor_ == address(0) ||
            arbiter_ == address(0) ||
            amount_ == 0 ||
            deadline_ &lt;= block.timestamp
        ) {
            revert InvalidAmount();
        }

        client = msg.sender;
        contractor = contractor_;
        arbiter = arbiter_;
        amount = amount_;
        deadline = deadline_;
    }

    function fund() external payable {
        if (msg.sender != client) revert Unauthorized();
        if (state != State.AwaitingFunding) revert InvalidState();
        if (msg.value != amount) revert InvalidAmount();

        state = State.Funded;
        emit Funded(msg.value);
    }

    function release() external {
        if (msg.sender != client) revert Unauthorized();
        _resolve(contractor, State.Released);
    }

    function refundAfterDeadline() external {
        if (msg.sender != client) revert Unauthorized();
        if (block.timestamp &lt; deadline) revert DeadlineNotReached();

        _resolve(client, State.Refunded);
    }

    function resolveDispute(bool payContractor) external {
        if (msg.sender != arbiter) revert Unauthorized();

        if (payContractor) {
            _resolve(contractor, State.Released);
        } else {
            _resolve(client, State.Refunded);
        }
    }

    function withdraw() external {
        uint256 value = credits[msg.sender];
        if (value == 0) revert InvalidAmount();

        credits[msg.sender] = 0;

        (bool ok, ) = payable(msg.sender).call{value: value}("");
        if (!ok) revert TransferFailed();

        emit Withdrawn(msg.sender, value);
    }

    function _resolve(address beneficiary, State nextState) private {
        if (state != State.Funded) revert InvalidState();

        state = nextState;
        credits[beneficiary] += amount;

        emit Resolved(nextState, beneficiary);
    }
}
</code></pre>
<p>Ovo je edukativni primer, ne auditovan produkcioni escrow. Ipak, pokazuje nekoliko korisnih obrazaca:</p>
<ul>
<li><p>stanje je eksplicitni <code>enum</code></p>
</li>
<li><p>kritične adrese i iznos su <code>immutable</code></p>
</li>
<li><p>autorizacija se proverava pre promene</p>
</li>
<li><p>stanje se menja pre eksternog transfera</p>
</li>
<li><p>isplata koristi pull model</p>
</li>
<li><p>koriste se custom errors</p>
</li>
<li><p>događaji opisuju poslovne tranzicije</p>
</li>
<li><p>ugovor nema administrativnu funkciju koja proizvoljno uzima sredstva</p>
</li>
</ul>
<p>Produkciona verzija morala bi da odgovori i na druga pitanja:</p>
<ul>
<li><p>Da li se plaća ETH ili ERC-20 token?</p>
</li>
<li><p>Šta se dešava sa tokenima koji naplaćuju fee pri transferu?</p>
</li>
<li><p>Da li ugovor podržava više milestoneova?</p>
</li>
<li><p>Kako se bira i menja arbitar?</p>
</li>
<li><p>Može li klijent beskonačno da odlaže odobrenje?</p>
</li>
<li><p>Kako se rešava delimična isplata?</p>
</li>
<li><p>Da li je potreban emergency pause?</p>
</li>
<li><p>Da li proxy administrator može promeniti pravila?</p>
</li>
<li><p>Kako se rešava pogrešno poslata imovina?</p>
</li>
<li><p>Da li pravni ugovor odgovara on-chain pravilima?</p>
</li>
</ul>
<p>Ovo je dobar primer zašto blockchain deo treba da bude mali. Dokumenti, chat, dostavljeni fajlovi, pretraga i notifikacije nemaju razlog da budu u EVM storageu. Na lancu treba da ostanu samo stanje escrowa, iznos, strane, rok i rezultat.</p>
<h2>Solidity storage i layout</h2>
<p>Solidity state promenljive pakuje u storage slotove od 32 bajta kada pravila layouta to dozvoljavaju. Redosled deklaracija zato može uticati na gas i kompatibilnost upgradea.</p>
<p>Jednostavni value tipovi mogu deliti slot. Dinamički nizovi, mapping strukture i <code>bytes</code> koriste izračunate lokacije. Mapping ne čuva listu ključeva koju ugovor može automatski iterirati. Lokacija vrednosti izvodi se iz ključa i osnovnog slota.</p>
<p>Posledice za dizajn:</p>
<ul>
<li><p>ne pokušavaj da imitiraš relacionu bazu</p>
</li>
<li><p>izbegavaj neograničene petlje kroz rastuće nizove</p>
</li>
<li><p>ne čuvaj podatak samo zato što bi možda nekada mogao zatrebati</p>
</li>
<li><p>emituj event za istoriju koju ugovor ne mora ponovo čitati</p>
</li>
<li><p>čuvaj agregirano stanje kada je to dovoljno</p>
</li>
<li><p>planiraj storage layout pre upgradeabilnog deploymenta</p>
</li>
</ul>
<p>Promena rasporeda state promenljivih u proxy implementaciji može korumpirati postojeći storage. Upgradeabilnost nije samo mogućnost da se zameni kod. To je dugoročna obaveza očuvanja storage layouta, inicijalizacije, administratorskih ključeva i kompatibilnosti .</p>
<h2>Tokeni nisu posebna vrsta naloga</h2>
<p>ERC-20 token obično je smart ugovor sa mappingom balansa i standardnim funkcijama .</p>
<p>Najpoznatiji interfejs uključuje:</p>
<ul>
<li><p><code>totalSupply()</code></p>
</li>
<li><p><code>balanceOf(address)</code></p>
</li>
<li><p><code>transfer(address,uint256)</code></p>
</li>
<li><p><code>approve(address,uint256)</code></p>
</li>
<li><p><code>allowance(address,address)</code></p>
</li>
<li><p><code>transferFrom(address,address,uint256)</code></p>
</li>
</ul>
<p>Korisnik ne „drži token u wallet aplikaciji“. Token ugovor čuva podatak da određena adresa ima određeni balans. Wallet samo čita ugovor i prikazuje rezultat.</p>
<p>ERC-721 standardizuje nezamenljive tokene, gde svaki <code>tokenId</code> može imati posebnog vlasnika . ERC-1155 podržava više tipova fungible i non-fungible tokena u jednom ugovoru .</p>
<p>Standard pruža interoperabilnost, ne ekonomsku vrednost. Token koji implementira ERC-20 nije automatski pouzdan, likvidan, stabilan ili pravilno obezbeđen.</p>
<h3><code>approve</code> i allowance rizik</h3>
<p>ERC-20 aplikacije često traže da korisnik prvo pozove <code>approve</code>, a zatim protokol koristi <code>transferFrom</code>.</p>
<p>Neograničen allowance poboljšava UX, ali povećava posledice kompromitovanog ugovora. Ako spender ima dozvolu za maksimalan iznos, može povući sve buduće tokene do tog limita.</p>
<p>Frontend treba jasno da pokaže:</p>
<ul>
<li><p>koji ugovor dobija dozvolu</p>
</li>
<li><p>za koji token</p>
</li>
<li><p>za koji iznos</p>
</li>
<li><p>da li je allowance ograničen ili neograničen</p>
</li>
</ul>
<p>Potpis nije uvek bezazlen samo zato što ne troši gas. EIP-712 typed-data potpis može autorizovati stvarnu akciju u drugom ugovoru. Korisnik treba da vidi domen, chain ID, verifying contract, nonce i sadržaj poruke .</p>
<h2>Layer 2 i rollup-centric arhitektura</h2>
<p>Ethereum L1 optimizuje neutralnost, sigurnost i dostupnost podataka, a ne jeftino izvršavanje svake korisničke akcije. Skaliranje se zato velikim delom oslanja na layer 2 rollupe .</p>
<p>Rollup:</p>
<ol>
<li><p>izvršava transakcije izvan Ethereum L1 EVM-a</p>
</li>
<li><p>grupiše ih u batch</p>
</li>
<li><p>objavljuje potrebne podatke ili sažetke na Ethereum</p>
</li>
<li><p>održava ugovor na L1 koji predstavlja rollup stanje</p>
</li>
<li><p>koristi fraud ili validity mehanizam za dokazivanje ispravnosti</p>
</li>
</ol>
<p>Rollup nije isto što i sidechain. Sidechain ima sopstveni konsenzus i sigurnosni model. Rollup pokušava da nasledi deo Ethereum sigurnosti korišćenjem L1 za poravnanje i dostupnost podataka.</p>
<h3>Optimistic rollupi</h3>
<p>Optimistic rollup pretpostavlja da je objavljena tranzicija validna osim ako neko u definisanom periodu ne podnese dokaz prevare .</p>
<p>Prednosti:</p>
<ul>
<li><p>visoka EVM kompatibilnost</p>
</li>
<li><p>jednostavnije prebacivanje postojećih ugovora</p>
</li>
<li><p>niže korisničke naknade od L1 u tipičnim uslovima</p>
</li>
</ul>
<p>Trade-offi:</p>
<ul>
<li><p>povlačenje na L1 može zavisiti od challenge perioda</p>
</li>
<li><p>sequencer može privremeno uticati na dostupnost i ordering</p>
</li>
<li><p>bridge i fraud-proof implementacija postaju deo sigurnosnog modela</p>
</li>
</ul>
<h3>ZK rollupi</h3>
<p>ZK rollup uz batch šalje kriptografski validity proof. L1 ugovor proverava dokaz da je nova tranzicija pravilno izračunata .</p>
<p>Prednosti:</p>
<ul>
<li><p>kriptografski dokaz validnosti</p>
</li>
<li><p>nema istog fraud challenge modela</p>
</li>
<li><p>potencijalno brža finalizacija povlačenja kada je dokaz prihvaćen</p>
</li>
</ul>
<p>Trade-offi:</p>
<ul>
<li><p>generisanje dokaza je složeno</p>
</li>
<li><p>implementacije proverera i prover sistema su kritična površina</p>
</li>
<li><p>EVM kompatibilnost i razvojni alat mogu se razlikovati među mrežama</p>
</li>
<li><p>sequencer i upgrade ključevi i dalje moraju biti analizirani</p>
</li>
</ul>
<h3>Data availability i blobovi</h3>
<p>Rollup mora omogućiti drugima da rekonstruišu stanje i provere tranzicije. Ako operator objavi samo tvrdnju o novom stanju, ali sakrije podatke potrebne za proveru, korisnici mogu ostati bez mogućnosti nezavisnog izlaska.</p>
<p>Data availability zato nije isto što i storage. Pitanje nije samo gde podatak postoji, već da li je pravovremeno dostupan svim verifikatorima .</p>
<p>Blob-carrying transakcije uvedene su da rollupovima daju namenski, jeftiniji prostor za objavu podataka, odvojen od trajnog EVM calldata storage modela .</p>
<h2>Kako izabrati L1 ili L2</h2>
<p>Ne biraj mrežu samo po prosečnoj naknadi. Posmatraj ceo trust model.</p>
<table>
<thead>
<tr>
<th>Kriterijum</th>
<th>Ethereum L1</th>
<th>Tipičan rollup</th>
</tr>
</thead>
<tbody><tr>
<td>izvršavanje</td>
<td>direktno na L1</td>
<td>na L2</td>
</tr>
<tr>
<td>trošak</td>
<td>obično viši</td>
<td>obično niži</td>
</tr>
<tr>
<td>throughput</td>
<td>ograničeniji</td>
<td>viši</td>
</tr>
<tr>
<td>finalno poravnanje</td>
<td>direktno</td>
<td>oslanja se na L1</td>
</tr>
<tr>
<td>dodatne pretpostavke</td>
<td>osnovni protokol</td>
<td>sequencer, bridge, proof sistem, upgrade model</td>
</tr>
<tr>
<td>povlačenje</td>
<td>nije primenljivo</td>
<td>zavisi od rollup dizajna</td>
</tr>
<tr>
<td>UX</td>
<td>sporiji i skuplji za česte akcije</td>
<td>pogodniji za aplikativni promet</td>
</tr>
</tbody></table>
<p>Za svaki L2 proveri:</p>
<ul>
<li><p>ko kontroliše sequencer</p>
</li>
<li><p>šta se dešava ako sequencer stane</p>
</li>
<li><p>postoji li forced inclusion ili escape mehanizam</p>
</li>
<li><p>ko može nadograditi bridge ugovor</p>
</li>
<li><p>postoji li security council</p>
</li>
<li><p>koliki je upgrade delay</p>
</li>
<li><p>gde se objavljuju podaci</p>
</li>
<li><p>kako funkcioniše povlačenje</p>
</li>
<li><p>da li je proof sistem aktivan i dozvoljen svima</p>
</li>
<li><p>koji chain ID, RPC i explorer koristi mreža</p>
</li>
</ul>
<p>EVM kompatibilnost ne znači identične operativne osobine.</p>
<h2>Bridge nije običan transfer</h2>
<p>Kada korisnik šalje imovinu sa L1 na L2, token se često zaključava u bridge ugovoru, dok se odgovarajuća reprezentacija kreira ili knjiži na odredišnoj mreži.</p>
<p>Iz perspektive korisnika izgleda kao transfer. Iz perspektive sistema to je cross-domain protokol sa više koraka, poruka i pretpostavki.</p>
<p>Rizici uključuju:</p>
<ul>
<li><p>bug u bridge ugovoru</p>
</li>
<li><p>pogrešnu validaciju poruke</p>
</li>
<li><p>kompromitovane administrativne ključeve</p>
</li>
<li><p>lažni token na odredišnoj mreži</p>
</li>
<li><p>pogrešan chain ili destination address</p>
</li>
<li><p>challenge period</p>
</li>
<li><p>neusklađenost liquidity bridgea i canonical bridgea</p>
</li>
</ul>
<p>Bridge je često sigurnosno osetljiviji od samog token transfera. Aplikacija treba eksplicitno da razlikuje canonical bridge od third-party liquidity bridgea .</p>
<h2>Oracle problem</h2>
<p>Smart ugovor ne zna cenu ETH u evrima, rezultat utakmice ili da li je paket isporučen. Te informacije nisu deo konsenzusa.</p>
<p>Oracle dovodi spoljne podatke na lanac. Time uvodi novi trust model:</p>
<ul>
<li><p>Ko prikuplja podatke?</p>
</li>
<li><p>Iz koliko izvora?</p>
</li>
<li><p>Koliko često se ažuriraju?</p>
</li>
<li><p>Šta ako cena kasni?</p>
</li>
<li><p>Šta ako tržište nema likvidnost?</p>
</li>
<li><p>Da li napadač može kratkotrajno manipulisati izvorom?</p>
</li>
<li><p>Da li ugovor proverava da podatak nije zastareo?</p>
</li>
</ul>
<p>DeFi ugovor koji koristi trenutnu cenu iz jednog plitkog poola može biti napadnut flash likvidnošću. Razuman dizajn koristi odgovarajući oracle, proverava freshness, decimals, granice vrednosti i ponašanje pri prekidu feeda .</p>
<p>Blockchain ne pretvara netačan spoljni podatak u istinu. Samo dosledno izvršava pravila nad podatkom koji je dobio.</p>
<h2>MEV i redosled transakcija</h2>
<p>Mempool je uglavnom vidljiv. Drugi učesnici mogu videti pending transakciju pre nego što uđe u blok.</p>
<p>Ako transakcija otkriva profitabilnu akciju, bot može poslati svoju transakciju sa boljom ponudom za redosled. Primeri uključuju:</p>
<ul>
<li><p>arbitražu između poolova</p>
</li>
<li><p>likvidaciju pozicije</p>
</li>
<li><p>kupovinu pre velike kupovine</p>
</li>
<li><p>prodaju odmah nakon nje</p>
</li>
<li><p>preuzimanje javno otkrivene tajne</p>
</li>
<li><p>front-running naivnog commita</p>
</li>
</ul>
<p>MEV je vrednost izvedena uključivanjem, izostavljanjem ili promenom redosleda transakcija u bloku .</p>
<p>Zaštita zavisi od use-casea:</p>
<ul>
<li><p>postavi razuman slippage</p>
</li>
<li><p>koristi deadline</p>
</li>
<li><p>koristi commit-reveal kada priroda akcije to zahteva</p>
</li>
<li><p>ne stavljaj tajnu u calldata</p>
</li>
<li><p>koristi batch aukciju ako ordering ne treba da odlučuje pobednika</p>
</li>
<li><p>razmotri privatno slanje transakcije</p>
</li>
<li><p>dizajniraj funkciju tako da frontrunner ne može preuzeti tuđi rezultat</p>
</li>
</ul>
<p><code>private</code> promenljiva u Solidityju nije kriptografski privatna. Ona samo ograničava pristup kroz Solidity interfejs. Storage se i dalje može pročitati iz blockchain podataka.</p>
<h2>Smart contract bezbednost</h2>
<p>Smart ugovor može držati sredstva bez mogućnosti chargebacka ili administratorskog vraćanja. Greška zato ima drugačije posledice od baga u običnoj aplikaciji .</p>
<p>Najvažnije klase rizika su sledeće.</p>
<h3>Reentrancy</h3>
<p>Ugovor pozove eksternu adresu pre nego što završi sopstveno stanje. Eksterna adresa ponovo ulazi u ugovor i koristi nedovršeno stanje.</p>
<p>Odbrane:</p>
<ul>
<li><p>checks-effects-interactions</p>
</li>
<li><p>pull-payment obrazac</p>
</li>
<li><p>reentrancy guard kada odgovara modelu</p>
</li>
<li><p>minimalan broj eksternih poziva</p>
</li>
<li><p>razumevanje callback token standarda</p>
</li>
</ul>
<p>Reentrancy nije ograničen na ETH transfer niti na istu funkciju. Može biti cross-function ili cross-contract.</p>
<h3>Access control</h3>
<p>Jedna pogrešna provera može otvoriti mint, upgrade, withdraw ili pause funkciju svima.</p>
<p>Ne koristi <code>tx.origin</code> za autorizaciju. Proveravaj <code>msg.sender</code> ili verifikuj eksplicitno definisan potpis. Za složenije sisteme koristi role-based kontrolu sa jasnim administratorima i minimalnim privilegijama .</p>
<h3>Front-running</h3>
<p>Sve što je vidljivo u mempoolu može biti kopirano ili preduhitreno. Ako funkcija nagrađuje prvog ko pošalje javno poznato rešenje, neko može prekopirati calldata.</p>
<h3>Neograničene petlje</h3>
<p>Petlja preko niza koji neograničeno raste može postati neizvršiva zbog block gas limita. Koristi pagination, pull modele ili obradu u više transakcija.</p>
<h3>Oracle i price manipulation</h3>
<p>Spot cena iz jednog poola nije nužno bezbedan oracle. Flash loan ne stvara bug, ali napadaču daje kapital da iskoristi loš cenovni model.</p>
<h3>Potpis i replay</h3>
<p>Potpis mora biti vezan za:</p>
<ul>
<li><p>chain ID</p>
</li>
<li><p>verifying contract</p>
</li>
<li><p>nonce</p>
</li>
<li><p>rok važenja</p>
</li>
<li><p>konkretnu akciju</p>
</li>
<li><p>konkretne argumente</p>
</li>
</ul>
<p>Bez domena i noncea isti potpis može biti iskorišćen više puta ili na drugoj mreži.</p>
<h3><code>delegatecall</code></h3>
<p><code>delegatecall</code> izvršava tuđi kod u kontekstu storagea pozivaoca. To je osnova mnogih proxy sistema, ali i ozbiljna granica poverenja. Pozvani kod može menjati storage, slati sredstva i narušiti invarijante pozivaoca.</p>
<h3>Upgrade ključevi</h3>
<p>Upgradeable ugovor nije trustless samo zato što je bytecode javan. Ako jedan administrator može odmah zameniti implementaciju, korisnici praktično veruju tom ključu.</p>
<p>Produkcioni sistem treba da objasni:</p>
<ul>
<li><p>ko može izvršiti upgrade</p>
</li>
<li><p>da li je potreban multisig</p>
</li>
<li><p>postoji li timelock</p>
</li>
<li><p>mogu li korisnici izaći pre promene</p>
</li>
<li><p>koje funkcije su trajno nepromenljive</p>
</li>
<li><p>kako se proverava storage kompatibilnost</p>
</li>
</ul>
<h3>Denial of service</h3>
<p>Push isplata kroz petlju može pasti zbog jednog primaoca koji revertuje. Pull isplata izoluje neuspeh na pojedinačnog korisnika.</p>
<h3>Decimalne vrednosti i zaokruživanje</h3>
<p>EVM nema floating-point aritmetiku. Finansijski sistemi koriste cele brojeve i definisanu skalu. Redosled množenja i deljenja utiče na zaokruživanje. Tokeni ne moraju imati 18 decimala.</p>
<h2>Testiranje koje ima smisla</h2>
<p>Unit test sa nekoliko happy-path slučajeva nije dovoljan za ugovor koji drži sredstva.</p>
<p>Dobar test plan uključuje:</p>
<ul>
<li><p>autorizovane i neautorizovane pozive</p>
</li>
<li><p>svaku dozvoljenu tranziciju stanja</p>
</li>
<li><p>svaku zabranjenu tranziciju</p>
</li>
<li><p>granične timestamp vrednosti</p>
</li>
<li><p>nulti iznos i nulte adrese</p>
</li>
<li><p>višestruki poziv iste funkcije</p>
</li>
<li><p>reentrancy pokušaj</p>
</li>
<li><p>neuspešan ETH ili token transfer</p>
</li>
<li><p>promenu redosleda operacija</p>
</li>
<li><p>fuzzing argumenata</p>
</li>
<li><p>invariant testove</p>
</li>
<li><p>fork test sa realnim ugovorima</p>
</li>
<li><p>ponašanje tokom pausea i upgradea</p>
</li>
</ul>
<p>Invariant opisuje osobinu koja uvek mora važiti. Za escrow bi primeri bili:</p>
<pre><code class="language-text">released i refunded ne mogu oba biti tačni
</code></pre>
<pre><code class="language-text">ukupno povučeno ne može preći ukupno uplaćeno
</code></pre>
<pre><code class="language-text">samo klijent ili arbitar mogu rešiti escrow
</code></pre>
<p>Foundry lokalni workflow može početi ovako:</p>
<pre><code class="language-bash">forge init ethereum-demo
cd ethereum-demo
forge build
forge test
</code></pre>
<p>Za lokalni node:</p>
<pre><code class="language-bash">anvil
</code></pre>
<p>Lokalna razvojna mreža daje determinističke naloge, instant blokove, manipulaciju vremenom i lakše debugovanje. Ona nije test mrežne latencije, realnog fee tržišta ili ponašanja javnog mempoola .</p>
<p>Hardhat je druga široko korišćena opcija, naročito u TypeScript projektima. Izbor alata je manje važan od ponovljivog builda, zaključane compiler verzije i ozbiljnog testiranja.</p>
<h2>Workflow od lokalnog ugovora do produkcije</h2>
<p>Praktičan razvojni tok izgleda ovako.</p>
<h3>1. Definiši invarijante</h3>
<p>Pre Solidityja napiši ko može šta da uradi, kada sredstva mogu da izađu i koja stanja su nemoguća.</p>
<p>Ako se poslovno pravilo ne može precizno opisati, blockchain ga neće učiniti preciznijim.</p>
<h3>2. Odredi on-chain granicu</h3>
<p>Na lanac stavi minimum koji mora biti zajednički proverljiv. Velike dokumente i redundantne podatke drži van lanca. Ako je potreban dokaz integriteta, na lanac upiši hash.</p>
<h3>3. Izaberi mrežu</h3>
<p>Za visoku vrednost i minimalan dodatni trust možda biraš L1. Za česte korisničke akcije verovatnije je odgovarajući L2.</p>
<h3>4. Implementiraj minimalni ugovor</h3>
<p>Izbegni generičke administrativne funkcije i nepotrebnu upgradeabilnost. Koristi proverene standardne biblioteke tamo gde rešavaju poznat problem.</p>
<h3>5. Testiraj lokalno</h3>
<p>Pokrij sve grane, fuzzuj ulaze i piši invariants. Koristi odvojene naloge za svaku ulogu.</p>
<h3>6. Testiraj na javnom testnetu</h3>
<p>Sepolia je opšti javni testnet za razvoj aplikacija. Testnet balans i istorija nisu povezani sa mainnet nalogom, čak i kada je adresa izvedena iz istog ključa. Iz bezbednosnih razloga nije dobra praksa koristiti isti operativni ključ za testnet i mainnet .</p>
<h3>7. Verifikuj deployment</h3>
<p>Objavi source i compiler parametre na exploreru. Verifikacija omogućava drugima da povežu bytecode sa source kodom, ali nije audit.</p>
<h3>8. Testiraj frontend protiv pogrešne mreže</h3>
<p>Frontend mora proveriti <code>chainId</code>, adresu ugovora za tu mrežu i očekivani bytecode. Adresa koja postoji na jednoj mreži može biti prazna ili predstavljati drugi ugovor na drugoj.</p>
<h3>9. Obezbedi ključeve</h3>
<p>Deploy, owner, pauser i upgrader ne treba automatski da budu isti EOA. Za kritične uloge koristi multisig i timelock gde je primenljivo.</p>
<h3>10. Prati sistem</h3>
<p>Monitoring treba da obuhvati:</p>
<ul>
<li><p>neuobičajene transfere</p>
</li>
<li><p>admin akcije</p>
</li>
<li><p>upgrade događaje</p>
</li>
<li><p>pause stanje</p>
</li>
<li><p>RPC greške</p>
</li>
<li><p>neuspele transakcije</p>
</li>
<li><p>promene oracle podataka</p>
</li>
<li><p>L2 sequencer status</p>
</li>
<li><p>stanje bridgea</p>
</li>
<li><p>finality i reorganizacije</p>
</li>
</ul>
<h3>11. Pripremi incident proceduru</h3>
<p>Ako ugovor ima pause, definiši ko ga aktivira. Ako nema upgrade, definiši migraciju. Ako frontend bude kompromitovan, korisnici treba da imaju alternativni način direktne interakcije sa ugovorom.</p>
<h2>Reorgovi i eventualna konzistentnost</h2>
<p>Blockchain backend nije klasična baza sa trenutnim definitivnim commitom.</p>
<p>Aplikacija može videti blok, obraditi event i kasnije utvrditi da taj blok više nije deo kanonskog lanca. Kratki reorgovi su normalna mogućnost distribuiranog konsenzusa.</p>
<p>Indexer treba da:</p>
<ul>
<li><p>čuva block hash uz broj bloka</p>
</li>
<li><p>proverava kontinuitet parent hasha</p>
</li>
<li><p>ne smatra svaki novi blok finalnim</p>
</li>
<li><p>može vratiti projekciju unazad</p>
</li>
<li><p>ponovo obradi logove sa nove kanonske grane</p>
</li>
<li><p>razlikuje pending, confirmed i finalized stanje</p>
</li>
</ul>
<p>Za korisnički interfejs često je korisno prikazati više statusa:</p>
<pre><code class="language-text">potpisivanje -&gt; poslato -&gt; uključeno -&gt; potvrđeno -&gt; finalizovano
</code></pre>
<p>Nemoj prikazati „neuspešno“ samo zato što RPC poziv za receipt trenutno vraća <code>null</code>. Transakcija može još biti pending, odbačena iz lokalnog mempoola ili zamenjena drugom transakcijom istog noncea.</p>
<h2>Zamena i otkazivanje transakcije</h2>
<p>Ethereum nema centralno dugme za brisanje pending transakcije.</p>
<p>Pošiljalac može poslati novu transakciju sa istim nonceom i konkurentnijom naknadom. Ako nova transakcija šalje sredstva samom sebi, wallet to može prikazati kao „cancel“. U stvarnosti se stara transakcija ne briše. Dve transakcije se takmiče, a samo jedna može postati kanonska za taj nonce.</p>
<p>Backend treba da prati:</p>
<ul>
<li><p>nonce</p>
</li>
<li><p>originalni hash</p>
</li>
<li><p>replacement hash</p>
</li>
<li><p>fee parametre</p>
</li>
<li><p>receipt transakcije koja je stvarno uključena</p>
</li>
</ul>
<p>Hash nije stabilan poslovni identifikator ako transakcija može biti zamenjena. Koristi aplikativni identifikator u calldata ili eventu.</p>
<h2>Privatnost na javnom lancu</h2>
<p>Ethereum je transparentan po defaultu.</p>
<p>Javno su vidljivi:</p>
<ul>
<li><p>adrese</p>
</li>
<li><p>balansi</p>
</li>
<li><p>calldata</p>
</li>
<li><p>storage koji se može rekonstruisati</p>
</li>
<li><p>event logovi</p>
</li>
<li><p>ugovorni bytecode</p>
</li>
<li><p>redosled i vreme transakcija</p>
</li>
<li><p>interakcije između adresa</p>
</li>
</ul>
<p>Hash ličnog podatka nije automatski anonimizacija. Ako je prostor mogućih vrednosti mali, neko može hashovati kandidate i pronaći original. Čak i kada sadržaj nije poznat, trajni identifikator može povezivati aktivnosti.</p>
<p>Ne upisuj na javni lanac:</p>
<ul>
<li><p>lozinke</p>
</li>
<li><p>privatne ključeve</p>
</li>
<li><p>API ključeve</p>
</li>
<li><p>lična dokumenta</p>
</li>
<li><p>medicinske podatke</p>
</li>
<li><p>poslovne tajne</p>
</li>
<li><p>nešifrovane ugovore sa ličnim podacima</p>
</li>
</ul>
<p>Šifrovan sadržaj takođe ostaje trajno dostupan. Ako ključ kasnije procuri ili kriptografija oslabi, stari ciphertext se može dešifrovati.</p>
<h2>Da li Ethereum zaista radi</h2>
<p>Ako „radi“ znači da mreža održava zajedničko stanje, izvršava javne programe i poravnava veliku količinu vrednosti bez jednog centralnog operatora, odgovor je da.</p>
<p>Ako „radi“ znači da je svaki proizvod automatski decentralizovan, jeftin, brz i bezbedan, odgovor je ne.</p>
<p>Konkretno:</p>
<ul>
<li><p>konsenzus radi bez centralne baze</p>
</li>
<li><p>smart ugovori se izvršavaju deterministički</p>
</li>
<li><p>bilo ko može proveravati blokove</p>
</li>
<li><p>standardi omogućavaju interoperabilnost</p>
</li>
<li><p>L2 mreže smanjuju cenu mnogih aplikativnih transakcija</p>
</li>
</ul>
<p>Ali:</p>
<ul>
<li><p>naknade nisu fiksne</p>
</li>
<li><p>javna mreža nema podrazumevanu privatnost</p>
</li>
<li><p>ugovorni bug može biti katastrofalan</p>
</li>
<li><p>L2 dodaje sopstvene pretpostavke</p>
</li>
<li><p>bridge povećava površinu napada</p>
</li>
<li><p>wallet UX i key management ostaju teški</p>
</li>
<li><p>oracle uvodi poverenje u spoljne podatke</p>
</li>
<li><p>centralizovan frontend može cenzurisati korisnika iako ugovor ne može</p>
</li>
<li><p>upgrade administrator može imati više kontrole nego što marketing sugeriše</p>
</li>
</ul>
<p>Ethereum treba procenjivati kao infrastrukturu, ne kao ideologiju. Dobra implementacija eksplicitno dokumentuje šta je decentralizovano, a šta nije.</p>
<h2>Kompozabilnost kao glavna developerska prednost</h2>
<p>Najzanimljivija osobina Ethereuma nije samo mogućnost da napišeš ugovor. To je mogućnost da tvoj ugovor atomski koristi već objavljene ugovore.</p>
<p>U jednoj transakciji aplikacija može:</p>
<ul>
<li><p>primiti token</p>
</li>
<li><p>zameniti ga kroz liquidity pool</p>
</li>
<li><p>položiti rezultat u lending protokol</p>
</li>
<li><p>izdati reprezentaciju pozicije</p>
</li>
<li><p>vratiti višak korisniku</p>
</li>
</ul>
<p>Ako bilo koji korak ne uspe, cela transakcija se vraća.</p>
<p>To je sličnije povezivanju otvorenih biblioteka nego integraciji klasičnih finansijskih institucija. Ugovor ne mora da dobije API ključ od drugog ugovora. Dovoljni su javna adresa, ABI i pravila protokola.</p>
<p>Kompozabilnost ipak prenosi rizik. Ako zavisiš od tri protokola, zavisiš od:</p>
<ul>
<li><p>njihovih ugovora</p>
</li>
<li><p>oraclea</p>
</li>
<li><p>governancea</p>
</li>
<li><p>upgrade ključeva</p>
</li>
<li><p>likvidnosti</p>
</li>
<li><p>pause mehanizama</p>
</li>
<li><p>ekonomskih pretpostavki</p>
</li>
</ul>
<p>Integracija nije bezbedna samo zato što je tehnički jednostavna.</p>
<h2>Kada ne koristiti Ethereum</h2>
<p>Nemoj koristiti Ethereum ako je primarni zahtev:</p>
<ul>
<li><p>privatna obrada osetljivih podataka</p>
</li>
<li><p>milisekundna latencija</p>
</li>
<li><p>milioni jeftinih trivijalnih upisa</p>
</li>
<li><p>jednostavno brisanje podataka</p>
</li>
<li><p>administrator koji mora moći da ispravi svaku grešku</p>
</li>
<li><p>neprekidna obrada bez eksternih transakcija</p>
</li>
<li><p>rad sa velikim fajlovima</p>
</li>
<li><p>potpuno predvidiv trošak svake operacije</p>
</li>
<li><p>aplikacija bez međusobno nepoverljivih strana</p>
</li>
</ul>
<p>Nemoj praviti token ako je dovoljan red u bazi. Nemoj čuvati PDF u storageu ako je dovoljan hash. Nemoj uvoditi DAO samo zato što aplikacija ima više administratora.</p>
<p>Najbolji Ethereum sistemi često imaju veoma mali on-chain kernel i veliki konvencionalni softverski sloj oko njega.</p>
<h2>Praktična referentna arhitektura</h2>
<p>Realna dapp arhitektura može izgledati ovako:</p>
<pre><code class="language-mermaid">flowchart LR
    U[Korisnik] --&gt; F[Web ili mobilni frontend]
    F --&gt; W[Wallet ili smart account]
    F --&gt; B[Backend API]
    W --&gt; R[RPC node]
    B --&gt; R
    R --&gt; E[Ethereum ili L2]
    E --&gt; C[Smart ugovori]
    E --&gt; I[Indexer]
    I --&gt; D[(Aplikativna baza)]
    B --&gt; D
    B --&gt; O[Oracle i eksterni servisi]
</code></pre>
<p>Odgovornosti treba jasno razdvojiti.</p>
<p>Smart ugovor:</p>
<ul>
<li><p>čuva minimalno kritično stanje</p>
</li>
<li><p>primenjuje pravila autorizacije</p>
</li>
<li><p>kontroliše sredstva</p>
</li>
<li><p>emituje događaje</p>
</li>
</ul>
<p>Frontend:</p>
<ul>
<li><p>povezuje wallet</p>
</li>
<li><p>kodira pozive</p>
</li>
<li><p>prikazuje simulaciju i naknadu</p>
</li>
<li><p>prati status transakcije</p>
</li>
<li><p>nikada ne čuva centralni privatni ključ</p>
</li>
</ul>
<p>Backend:</p>
<ul>
<li><p>indeksira događaje</p>
</li>
<li><p>obavlja pretragu i analitiku</p>
</li>
<li><p>šalje notifikacije</p>
</li>
<li><p>priprema nepotpisane zahteve</p>
</li>
<li><p>obavlja automatizaciju</p>
</li>
<li><p>povezuje spoljne sisteme</p>
</li>
</ul>
<p>Baza:</p>
<ul>
<li><p>služi kao read model</p>
</li>
<li><p>čuva off-chain sadržaj</p>
</li>
<li><p>ubrzava upite</p>
</li>
<li><p>ne glumi autoritativni izvor za on-chain vlasništvo</p>
</li>
</ul>
<p>RPC:</p>
<ul>
<li><p>daje pristup nodeu</p>
</li>
<li><p>nije poslovna baza</p>
</li>
<li><p>mora imati timeout, retry i failover politiku</p>
</li>
</ul>
<h2>Minimalni plan za prvi ozbiljan eksperiment</h2>
<p>Developer koji želi da razume Ethereum ne mora prvo praviti token.</p>
<p>Bolji eksperiment je mali ugovor sa jasnom state mašinom:</p>
<ol>
<li><p>instaliraj Foundry ili Hardhat</p>
</li>
<li><p>pokreni lokalnu mrežu</p>
</li>
<li><p>napiši ugovor sa dve uloge i tri stanja</p>
</li>
<li><p>dodaj event za svaku tranziciju</p>
</li>
<li><p>napiši test za svaki dozvoljen i zabranjen prelaz</p>
</li>
<li><p>napiši invariant</p>
</li>
<li><p>pozovi ugovor kroz <code>cast</code>, viem ili ethers</p>
</li>
<li><p>indeksiraj event u lokalnu bazu</p>
</li>
<li><p>simuliraj reorg ili reset lokalnog chaina</p>
</li>
<li><p>deployuj na Sepolia testnet</p>
</li>
<li><p>verifikuj source</p>
</li>
<li><p>poveži wallet bez čuvanja ključa u frontendu</p>
</li>
</ol>
<p>Posle toga će koncepti kao gas, ABI, receipt, confirmations i event indexing imati konkretno značenje.</p>
<h2>Zaključak</h2>
<p>Ethereum je distribuirana, javno proverljiva mašina stanja. Smart ugovori nisu udaljeni serveri, već deterministički programi koje svaki relevantan node izvršava prema istim pravilima. Transakcije menjaju stanje, gas ograničava i naplaćuje računarski rad, a proof of stake određuje koji blokovi čine kanonsku istoriju.</p>
<p>Za developera je najvažnije da Ethereum ne posmatra kao egzotičnu bazu podataka. On je sloj za koordinaciju i poravnanje između strana koje ne žele da jedna od njih bude jedini administrator.</p>
<p>Dobar Ethereum use-case opravdava cenu i složenost javnom proverljivošću, samostalnim vlasništvom ili neutralnim izvršavanjem. Loš use-case prebacuje običnu CRUD aplikaciju na skuplju, sporiju i javnu infrastrukturu bez stvarne koristi.</p>
<p>Najzdraviji pristup je hibridan: mali i pažljivo testiran on-chain deo, standardan backend za ono što ne zahteva konsenzus, eksplicitno dokumentovane pretpostavke poverenja i dovoljno potvrda pre nego što poslovni sistem neku akciju smatra konačnom.</p>
<h3><em>Ovaj članak je sponzorisan od strane</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet.com</em></a><em>. Na Volet.com možete kupiti i prodati Ethereum. Više informacija nalazi se na stranici</em> <a href="https://volet.srbija.workers.dev/"><em>Volet za korisnike iz Srbije</em></a><em>. Za otvaranje naloga koristi</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet referral link</em></a><em>. Link je referral link autora članka.</em></h3>
<h3>Izvori</h3>
<ol>
<li><p><a href="https://ethereum.org/en/developers/docs/intro-to-ethereum/">Ethereum.org, Technical introduction to Ethereum</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/evm/">Ethereum.org, Ethereum Virtual Machine</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/gas/">Ethereum.org, Gas and fees</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/apis/json-rpc/">Ethereum.org, JSON-RPC API</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/accounts/">Ethereum.org, Ethereum accounts</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-4337">EIP-4337, Account Abstraction Using Alt Mempool</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-7702">EIP-7702, Set Code for EOAs</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/transactions/">Ethereum.org, Transactions</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/blocks/">Ethereum.org, Blocks</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/mev/">Ethereum.org, Maximal extractable value</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/nodes-and-clients/">Ethereum.org, Nodes and clients</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/">Ethereum.org, Proof of stake</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/smart-contracts/anatomy/">Ethereum.org, Anatomy of smart contracts</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-1559">EIP-1559, Fee market change for ETH 1.0 chain</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-4844">EIP-4844, Shard Blob Transactions</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/smart-contracts/upgrading/">Ethereum.org, Upgrading smart contracts</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-20">EIP-20, Token Standard</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-721">EIP-721, Non-Fungible Token Standard</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-1155">EIP-1155, Multi Token Standard</a></p>
</li>
<li><p><a href="https://eips.ethereum.org/EIPS/eip-712">EIP-712, Typed structured data hashing and signing</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/scaling/">Ethereum.org, Scaling</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/scaling/optimistic-rollups/">Ethereum.org, Optimistic rollups</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/scaling/zk-rollups/">Ethereum.org, Zero-knowledge rollups</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/data-availability/">Ethereum.org, Data availability</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/bridges/">Ethereum.org, Blockchain bridges</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/oracles/">Ethereum.org, Oracles</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/smart-contracts/security/">Ethereum.org, Smart contract security</a></p>
</li>
<li><p><a href="https://docs.soliditylang.org/en/latest/security-considerations.html">Solidity documentation, Security considerations</a></p>
</li>
<li><p><a href="https://docs.openzeppelin.com/contracts/5.x/access-control">OpenZeppelin Contracts, Access control</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/development-networks/">Ethereum.org, Development networks</a></p>
</li>
<li><p><a href="https://ethereum.org/en/developers/docs/networks/">Ethereum.org, Ethereum networks</a></p>
</li>
<li><p><a href="https://getfoundry.sh/introduction/getting-started/">Foundry documentation, Getting started</a></p>
</li>
<li><p><a href="https://hardhat.org/docs/getting-started">Hardhat documentation, Getting started</a></p>
</li>
<li><p><a href="https://viem.sh/docs/getting-started">viem documentation, Getting started</a></p>
</li>
<li><p><a href="https://docs.ethers.org/v6/getting-started/">ethers documentation, Getting started</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/ethereum-from-a-developers-perspective-evm-gas-and-smart-contracts-m75">Ethereum from a Developer’s Perspective: EVM, Gas, and Smart Contracts</a></p>
]]></content:encoded></item><item><title><![CDATA[Bitcoin iznutra: protokol, transakcije i konsenzus]]></title><description><![CDATA[Svi znaju za Bitcoin kao digitalnu imovinu. Mnogo manje ljudi zna šta se zapravo dešava između trenutka kada wallet prikaže dugme „Send“ i trenutka kada primalac dobije transakciju sa nekoliko potvrda]]></description><link>https://kripto-pocetnica.hashnode.dev/bitcoin-iznutra-protokol-transakcije-i-konsenzus</link><guid isPermaLink="true">https://kripto-pocetnica.hashnode.dev/bitcoin-iznutra-protokol-transakcije-i-konsenzus</guid><category><![CDATA[Bitcoin]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[serbia]]></category><category><![CDATA[bitcoin core]]></category><category><![CDATA[Blockchain development]]></category><category><![CDATA[Web3]]></category><category><![CDATA[lightning network]]></category><category><![CDATA[Cryptography]]></category><category><![CDATA[fintech]]></category><category><![CDATA[payments]]></category><dc:creator><![CDATA[Dora Milen]]></dc:creator><pubDate>Fri, 18 Sep 2026 01:02:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aac7638362f4cfeb6c07be2/17004a3d-564f-4ff8-925b-e3cd1aedc3de.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Svi znaju za Bitcoin kao digitalnu imovinu. Mnogo manje ljudi zna šta se zapravo dešava između trenutka kada wallet prikaže dugme „Send“ i trenutka kada primalac dobije transakciju sa nekoliko potvrda.</p>
<p>Ispod jednostavnog interfejsa nalazi se distribuirani sistem sastavljen od kriptografskih ključeva, transakcija, ograničenog programskog jezika, peer-to-peer mreže, lokalnih baza podataka, tržišta naknada i proof-of-work konsenzusa. Nijedna od tih komponenti sama po sebi nije Bitcoin. Bitcoin nastaje tek kada ih spojimo u sistem u kojem svaki učesnik može samostalno da proveri pravila.</p>
<p>Za developera je to važniji uvid od dnevne cene jednog BTC-a. Bitcoin je protokol za prenos i verifikaciju digitalne vrednosti bez centralnog servera koji određuje konačno stanje. Njegova baza nije brza kao PostgreSQL, programski model nije fleksibilan kao Ethereum Virtual Machine, a transakcije nisu besplatne. Zauzvrat dobijaš sistem koji možeš samostalno da validiraš, bez dozvole provajdera, procesora plaćanja ili administratora baze.</p>
<p>Ovaj tekst objašnjava šta je Bitcoin, kako transakcije stvarno rade, kako nastaje konsenzus, gde se uklapaju wallet-i i Lightning Network, kako izgleda realna integracija i koje kompromise moraš da prihvatiš pre nego što ga staviš u produkciju.</p>
<h2>Šta je Bitcoin, precizno</h2>
<p>Bitcoin je istovremeno:</p>
<ul>
<li><p>protokol sa pravilima za validaciju transakcija i blokova</p>
</li>
<li><p>peer-to-peer mreža za razmenu tih podataka</p>
</li>
<li><p>distribuirana evidencija prethodno potvrđenih transakcija</p>
</li>
<li><p>digitalna obračunska jedinica označena kao BTC</p>
</li>
<li><p>skup softverskih implementacija koje izvršavaju ista pravila</p>
</li>
</ul>
<p>Bitcoin nije kompanija, API servis niti jedna konkretna aplikacija. Ne postoji centralni Bitcoin server koji može da promeni saldo korisnika. Postoje nezavisni node-ovi koji primaju podatke od svojih peer-ova, proveravaju ih i prosleđuju dalje samo ako zadovoljavaju lokalno implementirana pravila.</p>
<p>Najčešće korišćena full-node implementacija je Bitcoin Core, ali protokol nije isto što i Bitcoin Core. Druga implementacija može da učestvuje u mreži pod uslovom da validira konsenzusna pravila na kompatibilan način. U praksi je ta kompatibilnost veoma zahtevna, jer čak i mala razlika u interpretaciji transakcije može da podeli mrežu na dva nekompatibilna pogleda na stanje.</p>
<p>Bitcoin zato nije sistem u kojem čvorovi glasaju o tome koja je transakcija validna. Svaki node samostalno dolazi do binarnog zaključka: blok ili zadovoljava pravila ili ih ne zadovoljava.</p>
<h2>Koji problem Bitcoin pokušava da reši</h2>
<p>Digitalni podatak je lako kopirati. Ako pošalješ fotografiju, i ti i primalac možete da imate istu fotografiju. Novac ne sme da radi tako. Ako isti digitalni novčić možeš da pošalješ dvema osobama, sistem nema pouzdanu vrednost.</p>
<p>Tradicionalni platni sistemi rešavaju double-spend problem centralnom bazom. Banka ili procesor plaćanja vodi stanje naloga i određuje koja je transakcija prva, dozvoljena ili konačna.</p>
<p>Bitcoin pokušava da postigne sličan rezultat bez centralnog operatora. Mreža mora da se dogovori o redosledu transakcija čak i kada:</p>
<ul>
<li><p>učesnici ne veruju jedni drugima</p>
</li>
<li><p>node-ovi mogu da nestanu ili se ponovo pojave</p>
</li>
<li><p>mrežne poruke stižu različitim redosledom</p>
</li>
<li><p>neko pokušava da potroši isti izlaz više puta</p>
</li>
<li><p>napadač aktivno proizvodi alternativnu istoriju</p>
</li>
</ul>
<p>Bitcoin rešava problem kombinacijom digitalnih potpisa, hash funkcija, javne istorije transakcija i proof-of-work mehanizma koji čini prepisivanje potvrđene istorije ekonomski skupim.</p>
<p>Važno je razumeti granicu tog rešenja. Bitcoin ne dokazuje da je roba isporučena, da je kupac punoletan ili da je spoljašnji događaj zaista nastupio. Protokol dokazuje samo da je određeni skup ključeva zadovoljio uslove za trošenje postojećih izlaza i da je mreža tu transakciju uključila u lanac sa određenom količinom akumuliranog rada.</p>
<h2>Mentalni model: Bitcoin nije tabela naloga</h2>
<p>Najčešća početna greška je zamišljanje blockchaina kao tabele:</p>
<pre><code class="language-text">alice: 1.2 BTC
bob:   0.7 BTC
</code></pre>
<p>Bitcoin protokol ne čuva takve naloge. Umesto njih koristi UTXO model, odnosno skup nepotrošenih transakcionih izlaza.</p>
<p>UTXO je izlaz prethodne transakcije koji još nije potrošen. Svaki izlaz sadrži:</p>
<ul>
<li><p>iznos izražen u satoshijima</p>
</li>
<li><p>skript koji definiše uslov pod kojim izlaz može da se potroši</p>
</li>
</ul>
<p>Jedan BTC sadrži 100.000.000 satoshija. Na nivou protokola iznosi se obrađuju kao celi brojevi satoshija, ne kao floating-point BTC vrednosti.</p>
<p>Ako wallet prikazuje balans od 0,08 BTC, to ne mora da bude jedan zapis. Balans može da bude zbir više UTXO-a:</p>
<pre><code class="language-text">UTXO A: 2.000.000 sat
UTXO B: 1.500.000 sat
UTXO C: 4.500.000 sat
Ukupno: 8.000.000 sat
</code></pre>
<p>Da bi wallet poslao 5.000.000 satoshija, mora da izabere jedan ili više UTXO-a čiji zbir pokriva:</p>
<ul>
<li><p>iznos primaocu</p>
</li>
<li><p>transakcionu naknadu</p>
</li>
</ul>
<p>Ako izabere sva tri izlaza, transakcija može da napravi dva nova izlaza:</p>
<pre><code class="language-text">Primalac: 5.000.000 sat
Kusur:    2.990.000 sat
Naknada:     10.000 sat
</code></pre>
<p>Naknada nije poseban izlaz namenjen rudaru. Ona je razlika između ukupne vrednosti ulaza i ukupne vrednosti izlaza:</p>
<pre><code class="language-text">naknada = zbir ulaza - zbir izlaza
</code></pre>
<p>U primeru:</p>
<pre><code class="language-text">8.000.000 - 7.990.000 = 10.000 sat
</code></pre>
<p>Rudar koji uključi transakciju u blok može tu razliku da prikupi kroz coinbase transakciju.</p>
<h2>Kako izgleda Bitcoin transakcija</h2>
<p>Transakcija je serijalizovana struktura podataka. U pojednostavljenom obliku sadrži:</p>
<ul>
<li><p>verziju transakcije</p>
</li>
<li><p>listu ulaza</p>
</li>
<li><p>listu izlaza</p>
</li>
<li><p>eventualne SegWit witness podatke</p>
</li>
<li><p><code>locktime</code></p>
</li>
</ul>
<p>Svaki ulaz referencira konkretan izlaz prethodne transakcije pomoću:</p>
<ul>
<li><p>identifikatora prethodne transakcije, <code>txid</code></p>
</li>
<li><p>indeksa izlaza unutar te transakcije, <code>vout</code></p>
</li>
</ul>
<p>Kombinacija <code>txid:vout</code> naziva se outpoint.</p>
<p>Pojednostavljen dekodiran prikaz može da izgleda ovako:</p>
<pre><code class="language-json">{
  "txid": "7d3f...",
  "version": 2,
  "vin": [
    {
      "txid": "98ab...",
      "vout": 1,
      "sequence": 4294967293
    }
  ],
  "vout": [
    {
      "value": 0.0015,
      "n": 0,
      "scriptPubKey": {
        "type": "witness_v1_taproot",
        "address": "bc1p..."
      }
    },
    {
      "value": 0.00047,
      "n": 1,
      "scriptPubKey": {
        "type": "witness_v1_taproot",
        "address": "bc1p..."
      }
    }
  ],
  "locktime": 0
}
</code></pre>
<p>Prvi izlaz može biti uplata primaocu, a drugi kusur koji se vraća wallet-u pošiljaoca. Posmatrač blockchaina ne dobija eksplicitnu oznaku koja govori koji je izlaz uplata, a koji kusur. Wallet to zna na osnovu svojih derivacionih putanja i interne evidencije.</p>
<p>Kada transakcija potroši UTXO, troši ga u celini. Ne postoji delimično trošenje izlaza. Ako UTXO vredi više od potrebnog iznosa, razlika mora da se vrati kroz novi change izlaz ili će završiti kao naknada.</p>
<p>Ova osobina ima posledice za:</p>
<ul>
<li><p>coin selection</p>
</li>
<li><p>privatnost korisnika</p>
</li>
<li><p>veličinu transakcije</p>
</li>
<li><p>buduće naknade</p>
</li>
<li><p>računovodstvo i praćenje depozita</p>
</li>
</ul>
<h2>Odakle dolazi <code>txid</code></h2>
<p>Identifikator klasične transakcije dobija se hashiranjem njene serijalizovane reprezentacije dvostrukim SHA-256 postupkom. U korisničkim alatima rezultat se obično prikazuje obrnutim redosledom bajtova u odnosu na internu serijalizaciju.</p>
<p>SegWit je razdvojio podatke potpisa od dela transakcije koji učestvuje u računanju tradicionalnog <code>txid</code>. Zbog toga SegWit transakcije imaju i <code>wtxid</code>, identifikator koji obuhvata witness podatke.</p>
<p>To nije samo terminološki detalj. Pre SegWita potpisani deo transakcije mogao je u nekim slučajevima da se modifikuje bez promene ekonomskog efekta, ali uz promenu <code>txid</code> vrednosti. Ta osobina, poznata kao transaction malleability, komplikovala je protokole koji unapred zavise od identifikatora nepotvrđenih transakcija. Lightning Network je jedan od sistema kojem je stabilniji identitet transakcija bio posebno važan.</p>
<h2>Coin selection je ozbiljan deo wallet dizajna</h2>
<p>Izbor UTXO-a nije samo problem pronalaženja dovoljnog zbira. Loš algoritam može da:</p>
<ul>
<li><p>napravi nepotrebno veliku transakciju</p>
</li>
<li><p>spoji UTXO-e koji otkrivaju zajedničko vlasništvo</p>
</li>
<li><p>proizvede premali kusur</p>
</li>
<li><p>ostavi skupe, male izlaze za budućnost</p>
</li>
<li><p>potroši UTXO koji je korisnik želeo da zadrži odvojeno</p>
</li>
</ul>
<p>Transakcija sa više ulaza obično zauzima više prostora, a time plaća veću naknadu. Istovremeno, spajanje ulaza može da naruši privatnost jer sugeriše da ista strana kontroliše sve korišćene ključeve.</p>
<p>Produkcijski wallet zato obično vodi računa o:</p>
<ul>
<li><p>efektivnoj vrednosti UTXO-a nakon troška budućeg trošenja</p>
</li>
<li><p>ciljnom fee rate-u</p>
</li>
<li><p>starosti i broju potvrda</p>
</li>
<li><p>oznakama porekla sredstava</p>
</li>
<li><p>izbegavanju nepotrebnog spajanja</p>
</li>
<li><p>kreiranju ili izbegavanju change izlaza</p>
</li>
<li><p>granici ispod koje je izlaz ekonomski nepraktičan</p>
</li>
</ul>
<p>„Dust“ nije univerzalni konsenzusni iznos koji važi zauvek. To je uglavnom relay-policy koncept povezan sa veličinom izlaza, procenjenom cenom njegovog budućeg trošenja i pravilima konkretnog node-a.</p>
<h2>Ključevi, potpisi i stvarno značenje vlasništva</h2>
<p>Bitcoin ne čuva ime vlasnika. Protokol proverava da li je uslov vezan za određeni izlaz ispunjen.</p>
<p>Kod tipičnog izlaza, taj uslov zahteva validan digitalni potpis napravljen odgovarajućim privatnim ključem. Privatni ključ je veliki slučajno izabran broj. Iz njega se računa javni ključ na eliptičkoj krivi secp256k1.</p>
<p>Javni ključ može da se deli. Privatni ključ ne bi smeo da napusti bezbedno okruženje u kojem se koristi za potpisivanje.</p>
<p>Digitalni potpis dokazuje da je potpisnik posedovao privatni ključ i odobrio konkretan sadržaj transakcije. Ne otkriva sam privatni ključ.</p>
<p>Bitcoin tradicionalno koristi ECDSA potpise. Taproot je uveo Schnorr potpise definisane BIP340 standardom. Schnorr konstrukcija ima korisne osobine za agregaciju ključeva i višestruke potpisnike, ali to ne znači da protokol automatski spaja sve potpise u jedan. Konkretan multisig protokol i način koordinacije i dalje moraju da budu pažljivo dizajnirani.</p>
<p>Fraza „ko ima privatni ključ, ima bitcoin“ je korisna aproksimacija, ali tehnički nije potpuna. Sredstva pripadaju UTXO-u čiji <code>scriptPubKey</code> definiše uslove trošenja. Taj uslov može zahtevati:</p>
<ul>
<li><p>jedan potpis</p>
</li>
<li><p>više potpisa</p>
</li>
<li><p>određeni vremenski period</p>
</li>
<li><p>određeni blok</p>
</li>
<li><p>otkrivanje hash preimage-a</p>
</li>
<li><p>kombinaciju više uslova</p>
</li>
<li><p>Taproot key-path ili script-path trošenje</p>
</li>
</ul>
<h2>Adresa nije nalog</h2>
<p>Bitcoin adresa je kodirana reprezentacija informacije koju wallet koristi da konstruiše odgovarajući locking script. Ona nije korisnički nalog i ne postoji kao poseban objekat u konsenzusnom stanju.</p>
<p>Česti formati uključuju:</p>
<ul>
<li><p>Base58Check adrese koje počinju sa <code>1</code>, obično P2PKH</p>
</li>
<li><p>Base58Check adrese koje počinju sa <code>3</code>, često P2SH</p>
</li>
<li><p>Bech32 adrese koje počinju sa <code>bc1q</code>, SegWit v0</p>
</li>
<li><p>Bech32m adrese koje počinju sa <code>bc1p</code>, Taproot</p>
</li>
</ul>
<p>Prefiks zavisi i od mreže. Mainnet, testnet, signet i regtest ne koriste iste adresne parametre.</p>
<p>Dobra praksa je da wallet ne koristi istu adresu za svaku uplatu. Ponovno korišćenje adrese olakšava povezivanje transakcija i korisničkih aktivnosti. HD wallet-i upravo zato mogu da generišu veliki broj adresa iz jednog korena.</p>
<p>Adresa takođe nema pouzdano ugrađen iznos, rok važenja ili identitet primaoca. Za složeniji payment request potreban je dodatni format ili aplikacioni protokol.</p>
<h2>HD wallet-i, seed fraze i derivacione putanje</h2>
<p>Moderni wallet-i uglavnom ne generišu potpuno nepovezan privatni ključ za svaku adresu. BIP32 definiše hijerarhijski determinističke wallet-e u kojima se iz jednog korena izvodi stablo ključeva.</p>
<p>Prednosti su praktične:</p>
<ul>
<li><p>jedan backup može pokriti veliki broj budućih adresa</p>
</li>
<li><p>javni deo stabla može da generiše adrese bez pristupa privatnim ključevima</p>
</li>
<li><p>različiti nalozi i namene mogu da imaju odvojene grane</p>
</li>
<li><p>signing uređaj može ostati izolovan od servera koji prati uplate</p>
</li>
</ul>
<p>BIP39 definiše popularan način predstavljanja entropije kao liste reči i izvođenja seed-a iz mnemonic fraze. Važno je da BIP39 nije konsenzusno pravilo Bitcoina. Mreža ne zna da seed fraza postoji. To je wallet standard, a nisu svi wallet-i obavezni da ga koriste.</p>
<p>Za native SegWit wallet često se sreće BIP84 putanja:</p>
<pre><code class="language-text">m/84'/0'/0'/0/15
</code></pre>
<p>Delovi putanje tipično označavaju:</p>
<ul>
<li><p>purpose</p>
</li>
<li><p>coin type</p>
</li>
<li><p>account</p>
</li>
<li><p>eksterni ili change lanac</p>
</li>
<li><p>indeks adrese</p>
</li>
</ul>
<p>Ručno pretpostavljanje putanje prilikom oporavka nije idealno. Descriptor wallet-i daju precizniji opis skripta, ključeva, derivacije i raspona adresa koje wallet prati.</p>
<p>Primer deskriptora, skraćen i bez stvarnog ključa:</p>
<pre><code class="language-text">wpkh([fingerprint/84h/0h/0h]xpub.../0/*)
</code></pre>
<p>Deskriptor govori više od same adrese. On može da opiše koji tip izlaza se koristi, odakle dolazi ključ, kako se izvode potomci i koji skript wallet očekuje.</p>
<p>Za watch-only servis ovo je posebno korisno. Backend može da dobije javni deskriptor, generiše depozitne adrese i prati uplate, dok privatni ključevi ostaju na odvojenom signer-u.</p>
<h2>Bitcoin Script nije smart-contract platforma opšte namene</h2>
<p>Svaki izlaz sadrži program, odnosno skript koji određuje kako može da se potroši. Kada nova transakcija pokušava da potroši izlaz, node izvršava odgovarajuće podatke za otključavanje i proverava da li je rezultat validan.</p>
<p>Klasični P2PKH obrazac se često prikazuje ovako:</p>
<pre><code class="language-text">OP_DUP OP_HASH160 &lt;pubKeyHash&gt; OP_EQUALVERIFY OP_CHECKSIG
</code></pre>
<p>Script je stack-based i namerno ograničen. Nema opšte petlje i nije zamišljen kao runtime za arbitrarne aplikacije. Njegova glavna uloga je verifikacija uslova trošenja.</p>
<p>Pomoću Script-a moguće je izraziti konstrukcije kao što su:</p>
<ul>
<li><p>single-signature plaćanje</p>
</li>
<li><p>multisig</p>
</li>
<li><p>apsolutni timelock</p>
</li>
<li><p>relativni timelock</p>
</li>
<li><p>hashlock</p>
</li>
<li><p>kombinacije potpisa i vremenskih uslova</p>
</li>
</ul>
<p>Ograničenost je dizajnerski izbor. Svaki full node mora da izvrši skript svake relevantne transakcije koju validira. Nepredvidivo ili neograničeno izvršavanje bilo bi problem za resurse mreže i determinističku validaciju.</p>
<h2>SegWit, težina transakcije i <code>vbyte</code></h2>
<p>Segregated Witness je promenio format transakcije tako što je podatke potrebne za zadovoljavanje uslova trošenja smestio u posebnu witness strukturu. Time je:</p>
<ul>
<li><p>ublažena transaction malleability za SegWit ulaze</p>
</li>
<li><p>uveden block-weight model</p>
</li>
<li><p>omogućena efikasnija upotreba prostora za witness podatke</p>
</li>
<li><p>postavljena osnova za kasnije nadogradnje poput Taproota</p>
</li>
</ul>
<p>Blok nema samo jednostavno ograničenje izraženo u bajtovima. Konsenzus koristi težinu bloka, sa maksimalno 4.000.000 weight units. Ne-witness bajtovi imaju veću težinu od witness bajtova.</p>
<p>Za praktičnu procenu naknada wallet-i koriste virtual bytes, odnosno <code>vbytes</code>. Pojednostavljeno, virtualna veličina dobija se iz težine zaokruživanjem naviše nakon deljenja sa četiri.</p>
<p>Naknada se zato obično posmatra kao:</p>
<pre><code class="language-text">fee = feerate × virtual size
</code></pre>
<p>Fee rate se često izražava u satoshijima po virtualnom bajtu, <code>sat/vB</code>.</p>
<p>Iznos koji šalješ nije glavni faktor naknade. Transakcija koja prenosi malu vrednost kroz mnogo ulaza može da bude skuplja od transakcije koja prenosi veliku vrednost kroz jedan ulaz.</p>
<h2>Taproot: key path, script path i privatnost</h2>
<p>Taproot kombinuje nekoliko poboljšanja definisanih kroz BIP340, BIP341 i BIP342.</p>
<p>Taproot izlaz može da se potroši na dva osnovna načina:</p>
<ul>
<li><p>key-path trošenjem, validnim Schnorr potpisom</p>
</li>
<li><p>script-path trošenjem, otkrivanjem potrebne skriptne grane</p>
</li>
</ul>
<p>Skriptne grane organizovane su kroz Merkle strukturu. Prilikom trošenja nije neophodno otkriti svaku moguću granu, već samo onu koja je iskorišćena i podatke potrebne da se potvrdi njeno članstvo u stablu.</p>
<p>To može da poboljša privatnost i efikasnost složenijih politika. Na primer, normalan slučaj može da koristi kooperativni key-path potpis, dok se rezervni timelock uslov otkriva samo ako saradnja zakaže.</p>
<p>Taproot ipak ne pretvara Bitcoin u platformu za proizvoljne pametne ugovore. I dalje postoji ograničen skup operacija, troškovi on-chain prostora i potreba da svaki izvršeni uslov bude deterministički validiran.</p>
<h2>Šta node zapravo čuva</h2>
<p>Full node tipično upravlja sa više vrsta podataka:</p>
<ul>
<li><p>blokovima i njihovim header-ima</p>
</li>
<li><p>chainstate bazom</p>
</li>
<li><p>UTXO skupom</p>
</li>
<li><p>mempool-om nepotvrđenih transakcija</p>
</li>
<li><p>podacima o peer-ovima</p>
</li>
<li><p>opcionim indeksima</p>
</li>
<li><p>wallet podacima, ako je wallet funkcionalnost uključena</p>
</li>
</ul>
<p>Blockchain istorija i UTXO skup nisu ista stvar. UTXO skup predstavlja trenutno potrošivo stanje potrebno za proveru da ulaz postoji i da još nije potrošen. Istorija blokova omogućava rekonstrukciju i audit prethodnih događaja.</p>
<p>Pruned node validira lanac, ali nakon validacije može da uklanja stare block fajlove i zadrži samo potrebnu količinu novijih podataka. To smanjuje potreban disk, ali takav node ne može proizvoljno da posluži svaki istorijski blok drugom peer-u ili aplikaciji.</p>
<p>Ako aplikaciji trebaju upiti po adresi, istorija svake transakcije ili napredna analitika, sam Bitcoin Core RPC nije zamena za specijalizovani indeks. Core namerno nije opšti blockchain explorer backend.</p>
<h2>Kako node dolazi do mreže</h2>
<p>Bitcoin koristi peer-to-peer mrežu. Kada se node prvi put pokrene, mora da pronađe početne peer-ove. Nakon toga održava sopstvenu bazu poznatih adresa i uspostavlja veze sa više drugih čvorova.</p>
<p>Node od peer-ova prima objave o transakcijama i blokovima, ali im ne veruje. Primljeni podatak prolazi lokalnu validaciju.</p>
<p>Pojednostavljen tok izgleda ovako:</p>
<pre><code class="language-mermaid">flowchart LR
    A[Wallet kreira transakciju] --&gt; B[Lokalni node]
    B --&gt; C{Validna po pravilima i policy-ju?}
    C --&gt;|Ne| D[Odbijanje]
    C --&gt;|Da| E[Mempool]
    E --&gt; F[P2P prosleđivanje]
    F --&gt; G[Node-ovi drugih učesnika]
    E --&gt; H[Rudar bira transakciju]
    H --&gt; I[Blok]
    I --&gt; J[Nezavisna validacija bloka]
</code></pre>
<p>P2P mreža nije potpuno sinhrona. Različiti node-ovi mogu privremeno imati različit sadržaj mempool-a. Transakcija koju vidi jedan node ne mora odmah da bude poznata svakom drugom node-u.</p>
<p>Mempool zato nije globalna baza. To je lokalni skup nepotvrđenih transakcija koje konkretan node trenutno prihvata kao kandidate za buduće blokove.</p>
<h2>Konsenzusna pravila i relay policy nisu isto</h2>
<p>Ovo je jedna od najvažnijih razlika za integratore.</p>
<p>Konsenzusna pravila određuju da li je transakcija ili blok validan u lancu. Ako node prihvati blok koji krši konsenzus, rizikuje da pređe na nevažeći lanac.</p>
<p>Policy pravila određuju šta će node prihvatiti u svoj mempool i proslediti peer-ovima. Transakcija može biti konsenzusno validna, ali nestandardna i zbog toga neprihvaćena za uobičajeno prosleđivanje.</p>
<p>Policy može obuhvatiti:</p>
<ul>
<li><p>minimalni fee rate</p>
</li>
<li><p>standardne tipove skriptova</p>
</li>
<li><p>ograničenja paketa i zavisnosti</p>
</li>
<li><p>dust pravila</p>
</li>
<li><p>pravila zamene nepotvrđene transakcije</p>
</li>
<li><p>zaštitu resursa mempool-a</p>
</li>
</ul>
<p>Ne treba zaključivati da će transakcija biti lako potvrđena samo zato što ju je moguće uključiti u konsenzusno validan blok.</p>
<p>Ova razlika je bitna i pri nadogradnjama. Stroža lokalna relay politika nije automatski promena konsenzusa.</p>
<h2>Životni ciklus jedne uplate</h2>
<p>Realističan on-chain payment workflow izgleda ovako:</p>
<ol>
<li><p>Aplikacija dobija novu adresu vezanu za order ili korisnika.</p>
</li>
<li><p>Pošiljalac konstruiše transakciju.</p>
</li>
<li><p>Wallet bira UTXO-e i procenjuje naknadu.</p>
</li>
<li><p>Transakcija se potpisuje.</p>
</li>
<li><p>Potpisana transakcija se šalje jednom ili više node-ova.</p>
</li>
<li><p>Node proverava format, skriptove, UTXO-e i lokalni policy.</p>
</li>
<li><p>Prihvaćena transakcija ulazi u lokalni mempool.</p>
</li>
<li><p>Drugi node-ovi je primaju i zasebno proveravaju.</p>
</li>
<li><p>Rudar je bira za kandidat blok.</p>
</li>
<li><p>Validan blok se objavljuje mreži.</p>
</li>
<li><p>Full node-ovi proveravaju blok i ažuriraju UTXO skup.</p>
</li>
<li><p>Svaki naredni blok povećava broj potvrda transakcije.</p>
</li>
</ol>
<p>Status „seen in mempool“ nije isto što i „confirmed“. Nepotvrđena transakcija može:</p>
<ul>
<li><p>dugo ostati u mempool-u</p>
</li>
<li><p>biti izbačena zbog ograničenja memorije</p>
</li>
<li><p>biti zamenjena drugom transakcijom</p>
</li>
<li><p>biti deo lanca nepotvrđenih zavisnosti</p>
</li>
<li><p>stići samo do dela mreže</p>
</li>
<li><p>biti u konfliktu sa transakcijom koju aplikacija još nije videla</p>
</li>
</ul>
<p>Produkcijski sistem zato mora da modeluje stanja, a ne samo boolean <code>paid</code>.</p>
<p>Na primer:</p>
<pre><code class="language-text">created
address_assigned
seen_unconfirmed
confirmed
settled
expired
conflicted
reorged
</code></pre>
<p>Tačan state machine zavisi od poslovnog rizika, ali mora da postoji.</p>
<h2>Šta znači potvrda</h2>
<p>Transakcija dobija prvu potvrdu kada se nalazi u bloku koji je node prihvatio kao deo najboljeg validnog lanca. Svaki naredni blok iznad njega dodaje još jednu potvrdu.</p>
<p>Potvrda nije matematička garancija apsolutne nepovratnosti. Bitcoin ima probabilističku finalnost. Moguće je da se pojavi konkurentska grana lanca sa više akumuliranog proof-of-work-a, nakon čega node reorganizuje svoj pogled na istoriju.</p>
<p>Takva reorganizacija naziva se reorg.</p>
<p>Ako blok ispadne iz aktivnog lanca, transakcija iz tog bloka može:</p>
<ul>
<li><p>vratiti se u mempool</p>
</li>
<li><p>ostati potvrđena u konkurentskom bloku</p>
</li>
<li><p>postati konfliktna</p>
</li>
<li><p>nestati iz lokalnog pogleda ako više nije prihvatljiva</p>
</li>
</ul>
<p>Broj potrebnih potvrda zato nije univerzalna konstanta. Zavisi od:</p>
<ul>
<li><p>vrednosti transakcije</p>
</li>
<li><p>mogućnosti povraćaja isporučene robe</p>
</li>
<li><p>rizika prevare</p>
</li>
<li><p>kvaliteta detekcije konflikta</p>
</li>
<li><p>toga da li aplikacija prihvata nepotvrđene uplate</p>
</li>
<li><p>internog risk modela</p>
</li>
</ul>
<p>„Šest potvrda“ je poznata heuristika, ne protokolsko pravilo koje svaki sistem mora slepo da primeni.</p>
<h2>Replace-by-fee i ubrzavanje transakcije</h2>
<p>Korisnik može da pošalje transakciju sa preniskom naknadom. Ako je mreža opterećena, ona može dugo ostati nepotvrđena.</p>
<p>Replace-by-fee, RBF, omogućava zamenu nepotvrđene transakcije novom verzijom koja plaća višu naknadu i ispunjava relevantna pravila zamene.</p>
<p>Druga tehnika je child-pays-for-parent, CPFP. Primalac ili vlasnik change izlaza kreira child transakciju sa dovoljno visokom naknadom da rudarima paket parent plus child bude ekonomski privlačan.</p>
<p>Za payment backend važno je da:</p>
<ul>
<li><p>prati outpoint, ne samo <code>txid</code></p>
</li>
<li><p>prepoznaje zamene i konflikte</p>
</li>
<li><p>ne tretira nepotvrđenu transakciju kao nepovratnu</p>
</li>
<li><p>razlikuje fee bump od promene ekonomskog rezultata</p>
</li>
<li><p>prati zavisnosti između transakcija</p>
</li>
</ul>
<p>Ako aplikacija samo sačuva prvi viđeni <code>txid</code> i nikada ponovo ne proveri stanje, RBF i reorg mogu da je dovedu u nekonzistentno stanje.</p>
<h2>Blokovi i Merkle root</h2>
<p>Blok se sastoji od header-a i liste transakcija. Header sadrži:</p>
<ul>
<li><p>verziju</p>
</li>
<li><p>hash prethodnog block header-a</p>
</li>
<li><p>Merkle root transakcija</p>
</li>
<li><p>vreme</p>
</li>
<li><p>kodirani difficulty target</p>
</li>
<li><p>nonce</p>
</li>
</ul>
<p>Transakcije su sažete u Merkle stablo. Menjanje transakcije menja njen hash, zatim hash odgovarajuće grane i na kraju Merkle root u header-u.</p>
<p>To omogućava dokaz da je transakcija uključena u blok bez slanja svake transakcije iz tog bloka. Takav dokaz sam po sebi ipak nije dovoljan da dokaže validnost celog lanca. Klijent mora da zna kojem header lancu veruje i kako proverava proof-of-work.</p>
<p>Prva transakcija u bloku je coinbase transakcija. Ona nema standardne ulaze koji troše prethodne UTXO-e. Njome rudar dodeljuje sebi:</p>
<ul>
<li><p>dozvoljenu block subsidy vrednost</p>
</li>
<li><p>zbir naknada iz uključenih transakcija</p>
</li>
</ul>
<p>Coinbase izlazi ne mogu odmah da se potroše. Konsenzus zahteva period sazrevanja.</p>
<h2>Proof-of-work bez marketinških metafora</h2>
<p>Rudar konstruiše kandidat blok i pokušava da pronađe header čiji je dvostruki SHA-256 hash numerički manji ili jednak trenutnom target-u.</p>
<p>Pošto je rezultat hash funkcije nepredvidiv, praktičan način je ponavljanje pokušaja uz menjanje nonce-a, coinbase podataka, redosleda transakcija ili drugih dozvoljenih elemenata kandidata.</p>
<p>Provera pronađenog rezultata je jeftina. Pronalaženje zahteva veliki broj pokušaja.</p>
<p>Proof-of-work ima dve uloge:</p>
<ul>
<li><p>uvodi merljiv trošak proizvodnje blokova</p>
</li>
<li><p>omogućava node-ovima da biraju validni lanac sa najviše akumuliranog rada</p>
</li>
</ul>
<p>Često se kaže da node bira „najduži lanac“, ali to nije dovoljno precizno. Relevantna je akumulirana količina proof-of-work-a, ne prost broj blokova.</p>
<p>Rudar ne može da promeni pravila samo zato što poseduje mnogo hash power-a. Može da bira redosled transakcija u svojim blokovima, da cenzuriše transakcije u blokovima koje sam proizvodi ili da pokuša reorganizaciju. Ne može da natera ispravno konfigurisan full node da prihvati:</p>
<ul>
<li><p>nevalidan potpis</p>
</li>
<li><p>trošenje nepostojećeg UTXO-a</p>
</li>
<li><p>preveliku coinbase nagradu</p>
</li>
<li><p>blok koji krši aktivna konsenzusna pravila</p>
</li>
</ul>
<p>Full node takav blok jednostavno odbacuje.</p>
<p>To ne znači da su ekonomska koordinacija, rudarska koncentracija i razvoj softvera nebitni. Znači samo da se konsenzusna validnost ne određuje autoritetom rudara.</p>
<h2>Difficulty i ritam blokova</h2>
<p>Bitcoin cilja prosečan interval od približno deset minuta između blokova. To ne znači da će blok stizati tačno na svakih deset minuta. Mining je probabilistički proces. Dva bloka mogu stići veoma brzo jedan za drugim, a sledeći se može čekati znatno duže.</p>
<p>Difficulty se periodično prilagođava na svakih 2016 blokova. Cilj je da se prosečni ritam vrati približno na planiranu vrednost kada se ukupna hash snaga promeni.</p>
<p>Timestamp u block header-u nije precizan globalni sat. Konsenzus postavlja ograničenja, ali aplikacija ne bi trebalo da ga tretira kao visokoprecizan dokaz vremena spoljašnjeg događaja.</p>
<h2>Izdavanje novih bitcoina</h2>
<p>Novi bitcoin nastaje kroz block subsidy u coinbase transakciji. Početna subvencija se prepolovljava na svakih 210.000 blokova.</p>
<p>Subvencija je nakon poslednjeg prepolovljenja 3,125 BTC po bloku. Vremenom nastavlja geometrijski da opada dok, zbog celobrojnog obračuna u satoshijima, više ne bude novih jedinica kroz subsidy.</p>
<p>Često se navodi maksimalna ponuda od 21 milion BTC. Tehnički, ukupan iznos koji može biti izdat ostaje malo ispod tačno 21 milion zbog načina prepolovljavanja i zaokruživanja.</p>
<p>Stvarna raspoloživa količina može biti dodatno manja zato što su neki privatni ključevi izgubljeni ili su sredstva poslata u praktično nepotrošive skriptove.</p>
<p>Kako subsidy opada, relativni značaj transakcionih naknada za rudare raste. Dugoročna održivost tržišta naknada jedna je od važnih ekonomskih tema protokola, ali konkretan ishod nije nešto što sam kod može unapred garantovati.</p>
<h2>Mempool i tržište naknada</h2>
<p>Blok prostor je ograničen resurs. Korisnici se takmiče za uključivanje nudeći transakcione naknade, a rudari uglavnom biraju transakcije prema efektivnoj zaradi po jedinici prostora, uz tehnička ograničenja zavisnosti i paketa.</p>
<p>Cena transakcije nije fiksna i ne zavisi direktno od tržišne vrednosti BTC-a. Ona zavisi od:</p>
<ul>
<li><p>virtualne veličine transakcije</p>
</li>
<li><p>ponuđenog fee rate-a</p>
</li>
<li><p>trenutne i očekivane potražnje</p>
</li>
<li><p>zavisnosti od drugih nepotvrđenih transakcija</p>
</li>
<li><p>lokalne politike rudara i node-ova</p>
</li>
</ul>
<p>Wallet može da koristi <code>estimatesmartfee</code>, ali procena ostaje procena. Niko ne može garantovati sledeći blok bez kontrole nad njegovom proizvodnjom.</p>
<p>Aplikacija treba da omogućava:</p>
<ul>
<li><p>izbor ciljne brzine potvrde</p>
</li>
<li><p>prikaz procenjene naknade pre potpisa</p>
</li>
<li><p>RBF kada je primenljiv</p>
</li>
<li><p>razumno rukovanje promenom uslova u mempool-u</p>
</li>
<li><p>izbegavanje hardkodovanog fee rate-a</p>
</li>
</ul>
<p>Hardkodovanje jedne vrednosti <code>sat/vB</code> za sve transakcije pre ili kasnije proizvodi loše rezultate.</p>
<h2>Koliko Bitcoin integracija košta</h2>
<p>Ne postoji jedna cena korišćenja Bitcoina.</p>
<p>On-chain slanje plaća mrežnu naknadu koja zavisi od veličine transakcije i tržišta block space-a. Primanje transakcije ne zahteva da primalac plati protokolsku naknadu, ali će kasnije platiti kada bude trošio primljeni UTXO.</p>
<p>Pokretanje node-a nema protokolsku licencu, ali ima infrastrukturne troškove:</p>
<ul>
<li><p>disk i rast podataka</p>
</li>
<li><p>bandwidth</p>
</li>
<li><p>CPU tokom početne sinhronizacije i validacije</p>
</li>
<li><p>RAM za cache i mempool</p>
</li>
<li><p>monitoring, backup i održavanje</p>
</li>
<li><p>inženjersko vreme</p>
</li>
<li><p>bezbedno upravljanje ključevima</p>
</li>
</ul>
<p>Custodial sistem dodaje troškove:</p>
<ul>
<li><p>izolovanih signer-a</p>
</li>
<li><p>hardware security uređaja ili hardware wallet-a</p>
</li>
<li><p>kontrole pristupa</p>
</li>
<li><p>multisig procedure</p>
</li>
<li><p>operativnih odobrenja</p>
</li>
<li><p>računovodstva</p>
</li>
<li><p>regulatornih i bezbednosnih procesa</p>
</li>
</ul>
<p>Lightning dodaje druge troškove:</p>
<ul>
<li><p>on-chain otvaranje i zatvaranje kanala</p>
</li>
<li><p>likvidnost</p>
</li>
<li><p>routing naknade</p>
</li>
<li><p>održavanje node-a</p>
</li>
<li><p>monitoring kanala</p>
</li>
<li><p>backup i recovery procedure</p>
</li>
</ul>
<p>Ako koristiš eksternog provajdera, plaćaš njegovu naknadu i prihvataš njegove limite, dostupnost, custody model i API zavisnost.</p>
<p>Dakle, „Bitcoin transakcija košta X“ nije stabilan tehnički odgovor. Ispravan odgovor zahteva konkretan tip transakcije, njenu virtualnu veličinu, ciljni rok potvrde i trenutne uslove tržišta naknada.</p>
<h2>Kako se Bitcoin integriše u aplikaciju</h2>
<p>Postoje tri česta pristupa.</p>
<h3>Sopstveni Bitcoin Core node</h3>
<p>Aplikacija komunicira sa sopstvenim node-om preko JSON-RPC interfejsa.</p>
<p>Prednosti:</p>
<ul>
<li><p>samostalna validacija</p>
</li>
<li><p>kontrola nad konfiguracijom</p>
</li>
<li><p>nema poverenja u tuđi blockchain explorer</p>
</li>
<li><p>bolja privatnost upita</p>
</li>
<li><p>direktan pristup mempool-u i lokalnom pogledu na lanac</p>
</li>
</ul>
<p>Nedostaci:</p>
<ul>
<li><p>inicijalna sinhronizacija</p>
</li>
<li><p>storage i bandwidth</p>
</li>
<li><p>održavanje i nadogradnje</p>
</li>
<li><p>potreba za dodatnim indeksiranjem</p>
</li>
<li><p>RPC bezbednost i segmentacija mreže</p>
</li>
</ul>
<p>RPC interfejs ne treba javno izlagati internetu. Aplikacioni server i node treba povezati kroz kontrolisanu privatnu mrežu, uz autentifikaciju, firewall pravila i najmanji potreban skup privilegija.</p>
<h3>Sopstveni node sa odvojenim indexer-om</h3>
<p>Ako aplikaciji trebaju upiti poput „vrati sve transakcije za ovu adresu“, praktično je dodati indexer ili wallet-aware servis.</p>
<p>Tipična arhitektura izgleda ovako:</p>
<pre><code class="language-mermaid">flowchart TD
    A[Web ili mobilni klijent] --&gt; B[Payment API]
    B --&gt; C[Interna baza]
    B --&gt; D[Bitcoin indexer]
    D --&gt; E[Bitcoin Core]
    B --&gt; F[Signing servis]
    F --&gt; G[Hardware wallet ili izolovani ključ]
    E --&gt; H[Bitcoin P2P mreža]
</code></pre>
<p>Ovim se razdvajaju odgovornosti:</p>
<ul>
<li><p>Bitcoin Core validira mrežu</p>
</li>
<li><p>indexer optimizuje aplikacione upite</p>
</li>
<li><p>interna baza čuva order i korisničko stanje</p>
</li>
<li><p>signer kontroliše privatne ključeve</p>
</li>
<li><p>API orkestrira poslovni workflow</p>
</li>
</ul>
<h3>Eksterni API provajder</h3>
<p>Najbrži prototip može koristiti tuđi API ili explorer.</p>
<p>Prednosti:</p>
<ul>
<li><p>nema sinhronizacije node-a</p>
</li>
<li><p>jednostavniji početak</p>
</li>
<li><p>često gotovi webhook-ovi i indeksirani upiti</p>
</li>
</ul>
<p>Nedostaci:</p>
<ul>
<li><p>provajder vidi tvoje upite</p>
</li>
<li><p>moraš da veruješ njegovom prikazu lanca</p>
</li>
<li><p>rate limit i prekidi utiču na aplikaciju</p>
</li>
<li><p>API može da se promeni</p>
</li>
<li><p>vendor lock-in</p>
</li>
<li><p>podaci mogu kasniti ili biti pogrešno interpretirani</p>
</li>
</ul>
<p>Za ozbiljan payment sistem eksterni izvor može biti koristan kao sekundarna provera, ali je problematično da bude jedini izvor istine.</p>
<h2>Realan use-case: naplata digitalne usluge</h2>
<p>Pretpostavimo da prodaješ hosting, API kredit ili digitalnu pretplatu.</p>
<p>Za svaki order generišeš novu Bitcoin adresu. U bazi čuvaš:</p>
<pre><code class="language-json">{
  "orderId": "ord_2048",
  "address": "bc1q...",
  "expectedAmountSat": 250000,
  "status": "address_assigned",
  "requiredConfirmations": 2
}
</code></pre>
<p>Backend prati transakcije koje plaćaju očekivani skript.</p>
<p>Kada je transakcija viđena:</p>
<pre><code class="language-json">{
  "orderId": "ord_2048",
  "txid": "4ea1...",
  "vout": 0,
  "receivedAmountSat": 250000,
  "confirmations": 0,
  "status": "seen_unconfirmed"
}
</code></pre>
<p>Nakon dovoljnog broja potvrda:</p>
<pre><code class="language-json">{
  "orderId": "ord_2048",
  "txid": "4ea1...",
  "vout": 0,
  "receivedAmountSat": 250000,
  "confirmations": 2,
  "status": "settled"
}
</code></pre>
<p>Ali realna implementacija mora da reši i:</p>
<ul>
<li><p>uplatu manjeg iznosa</p>
</li>
<li><p>uplatu većeg iznosa</p>
</li>
<li><p>dve delimične uplate</p>
</li>
<li><p>uplatu nakon isteka order-a</p>
</li>
<li><p>pogrešnu valutu ili mrežu</p>
</li>
<li><p>RBF zamenu</p>
</li>
<li><p>reorg</p>
</li>
<li><p>dupliranu webhook poruku</p>
</li>
<li><p>ponovno pokretanje servisa</p>
</li>
<li><p>idempotentnu obradu</p>
</li>
<li><p>promenu kursa između kreiranja i plaćanja</p>
</li>
<li><p>konsolidaciju velikog broja malih UTXO-a</p>
</li>
</ul>
<p>Najbolje je identifikovati uplatu preko outpoint-a, a događaje obrađivati idempotentno. Blockchain event handler ne sme pretpostaviti da će poruka stići samo jednom ili u savršenom redosledu.</p>
<h2>Zašto interna baza i dalje postoji</h2>
<p>Blockchain nije zamena za aplikacionu bazu.</p>
<p>Na lancu možeš da vidiš transakcije i skriptove, ali ne i:</p>
<ul>
<li><p>kojem korisniku pripada order</p>
</li>
<li><p>šta je kupljeno</p>
</li>
<li><p>da li je račun poslat</p>
</li>
<li><p>koji interni kurs je korišćen</p>
</li>
<li><p>da li je roba isporučena</p>
</li>
<li><p>status KYC ili poreskog procesa</p>
</li>
<li><p>retry istoriju webhook-a</p>
</li>
</ul>
<p>Interna baza mora da poveže on-chain događaje sa poslovnim objektima. Blockchain je settlement i verification sloj, ne CRM.</p>
<p>Dobar dizajn obično tretira node kao izvor protokolskih činjenica, a internu bazu kao izvor poslovnog konteksta.</p>
<h2>Watch-only backend i odvojeno potpisivanje</h2>
<p>Payment server koji prima uplate ne mora da drži privatne ključeve.</p>
<p>Watch-only wallet može da:</p>
<ul>
<li><p>generiše ili prati adrese iz javnog deskriptora</p>
</li>
<li><p>detektuje uplate</p>
</li>
<li><p>računa balans</p>
</li>
<li><p>priprema nepotpisane transakcije</p>
</li>
</ul>
<p>Potpisivanje se obavlja na odvojenom uređaju ili servisu.</p>
<p>Ovakva podela smanjuje posledice kompromitovanja web servera. Napadač koji dobije pristup javnom deskriptoru može ugroziti privatnost i menjati aplikaciono ponašanje, ali ne mora automatski dobiti mogućnost da potroši sredstva.</p>
<p>Za prenos nepotpisane transakcije i pratećih metapodataka između coordinator-a i signer-a koristi se PSBT.</p>
<h2>PSBT workflow</h2>
<p>Partially Signed Bitcoin Transaction standardizuje format za transakciju koja još nije kompletno potpisana. Pored same transakcije, PSBT može sadržati informacije potrebne različitim učesnicima:</p>
<ul>
<li><p>prethodne izlaze</p>
</li>
<li><p>skriptove</p>
</li>
<li><p>derivacione putanje</p>
</li>
<li><p>javne ključeve</p>
</li>
<li><p>delimične potpise</p>
</li>
<li><p>podatke potrebne za finalizaciju</p>
</li>
</ul>
<p>Tipičan workflow je:</p>
<ol>
<li><p>Online coordinator bira UTXO-e i izlaze.</p>
</li>
<li><p>Kreira PSBT bez privatnih ključeva.</p>
</li>
<li><p>PSBT se prenosi signer-u.</p>
</li>
<li><p>Signer proverava iznose, adrese i naknadu.</p>
</li>
<li><p>Signer dodaje potpis.</p>
</li>
<li><p>Kod multisig-a drugi signer-i dodaju svoje potpise.</p>
</li>
<li><p>PSBT se finalizuje.</p>
</li>
<li><p>Dobijena raw transakcija se šalje mreži.</p>
</li>
</ol>
<p>Bitcoin Core podržava RPC metode kao što su:</p>
<ul>
<li><p><code>walletcreatefundedpsbt</code></p>
</li>
<li><p><code>walletprocesspsbt</code></p>
</li>
<li><p><code>analyzepsbt</code></p>
</li>
<li><p><code>combinepsbt</code></p>
</li>
<li><p><code>finalizepsbt</code></p>
</li>
<li><p><code>sendrawtransaction</code></p>
</li>
</ul>
<p>PSBT nije bezbednosna magija. Signer mora korisniku ili operatoru jasno prikazati šta se potpisuje. Ako slepo potpisuje svaki zahtev koji stigne sa kompromitovanog servera, izolacija ključa ima ograničenu vrednost.</p>
<h2>Lokalni razvoj na regtest mreži</h2>
<p>Regtest je privatna lokalna Bitcoin mreža na kojoj sam generišeš blokove. Nema pravog novca, javnih rudara ni čekanja na blok.</p>
<p>Nakon instalacije aktuelnog Bitcoin Core izdanja možeš pokrenuti node:</p>
<pre><code class="language-bash">bitcoind -regtest -daemon
</code></pre>
<p>Kreiraj descriptor wallet:</p>
<pre><code class="language-bash">bitcoin-cli -regtest createwallet "dev"
</code></pre>
<p>Generiši adresu:</p>
<pre><code class="language-bash">ADDRESS=$(bitcoin-cli -regtest -rpcwallet=dev getnewaddress)
echo "$ADDRESS"
</code></pre>
<p>Generiši 101 blok na tu adresu:</p>
<pre><code class="language-bash">bitcoin-cli -regtest generatetoaddress 101 "$ADDRESS"
</code></pre>
<p>Zašto 101? Coinbase izlazi moraju da sazru pre trošenja. Nakon generisanja dovoljno blokova, bar prvi coinbase izlaz postaje potrošiv.</p>
<p>Proveri balans:</p>
<pre><code class="language-bash">bitcoin-cli -regtest -rpcwallet=dev getbalance
</code></pre>
<p>Pogledaj trenutnu visinu:</p>
<pre><code class="language-bash">bitcoin-cli -regtest getblockcount
</code></pre>
<p>Pogledaj hash poslednjeg bloka:</p>
<pre><code class="language-bash">BEST_HASH=$(bitcoin-cli -regtest getbestblockhash)
bitcoin-cli -regtest getblockheader "$BEST_HASH"
</code></pre>
<p>Pošalji sredstva na novu adresu:</p>
<pre><code class="language-bash">DEST=$(bitcoin-cli -regtest -rpcwallet=dev getnewaddress)
TXID=$(bitcoin-cli -regtest -rpcwallet=dev sendtoaddress "$DEST" 1.0)
echo "$TXID"
</code></pre>
<p>Transakcija je sada nepotvrđena. Možeš je pronaći u mempool-u:</p>
<pre><code class="language-bash">bitcoin-cli -regtest getmempoolentry "$TXID"
</code></pre>
<p>Generiši novi blok:</p>
<pre><code class="language-bash">MINER_ADDRESS=$(bitcoin-cli -regtest -rpcwallet=dev getnewaddress)
bitcoin-cli -regtest generatetoaddress 1 "$MINER_ADDRESS"
</code></pre>
<p>Zatim proveri transakciju:</p>
<pre><code class="language-bash">bitcoin-cli -regtest -rpcwallet=dev gettransaction "$TXID"
</code></pre>
<p>Ovaj mali eksperiment pokazuje razliku između wallet stanja, mempool-a, mining-a i potvrđene transakcije.</p>
<h2>Signet i testnet nisu isto što i regtest</h2>
<p>Za razvoj postoje različita okruženja:</p>
<table>
<thead>
<tr>
<th>Mreža</th>
<th>Kontrola blokova</th>
<th>Javna</th>
<th>Pravi BTC</th>
<th>Tipična upotreba</th>
</tr>
</thead>
<tbody><tr>
<td>Regtest</td>
<td>Lokalna i trenutna</td>
<td>Ne</td>
<td>Ne</td>
<td>Unit i integration testovi</td>
</tr>
<tr>
<td>Signet</td>
<td>Kontrolisana produkcija blokova</td>
<td>Da</td>
<td>Ne</td>
<td>Stabilniji javni testovi</td>
</tr>
<tr>
<td>Testnet</td>
<td>Javno rudarenje</td>
<td>Da</td>
<td>Ne</td>
<td>Interoperabilnost i testiranje</td>
</tr>
<tr>
<td>Mainnet</td>
<td>Proof-of-work mreža</td>
<td>Da</td>
<td>Da</td>
<td>Produkcija</td>
</tr>
</tbody></table>
<p>Regtest je najbolji za determinističke testove jer aplikacija kontroliše kada nastaje blok. Javne test mreže su korisne za integraciju između nezavisnih sistema, ali njihove kovanice nemaju protokolsku novčanu vrednost i mrežno ponašanje nije isto kao na mainnet-u.</p>
<p>Aplikacija mora strogo odvojiti konfiguraciju mreža. Adrese, ključevi i podaci iz testnog okruženja ne smeju slučajno završiti u produkcionom workflow-u.</p>
<h2>JSON-RPC, ZMQ i praćenje događaja</h2>
<p>Bitcoin Core nudi JSON-RPC za zahteve i odgovore. Aplikacija njime može da:</p>
<ul>
<li><p>dobije informacije o lancu</p>
</li>
<li><p>proveri mempool</p>
</li>
<li><p>upravlja wallet-om</p>
</li>
<li><p>konstruiše transakcije</p>
</li>
<li><p>šalje potpisane transakcije</p>
</li>
<li><p>čita blokove i headere</p>
</li>
<li><p>procenjuje naknade</p>
</li>
</ul>
<p>Polling RPC-a je dovoljan za mali prototip, ali produkcijski sistem često želi događaje sa manjom latencijom. Bitcoin Core podržava ZMQ notifikacije za određene tipove događaja, kao što su nove transakcije i blokovi.</p>
<p>ZMQ poruka ipak ne treba automatski da postane poslovna istina. Ona je signal da aplikacija treba da pročita i proveri trenutno stanje. Consumer mora da podnese:</p>
<ul>
<li><p>izgubljenu poruku</p>
</li>
<li><p>ponovno povezivanje</p>
</li>
<li><p>duplikat</p>
</li>
<li><p>restart node-a</p>
</li>
<li><p>reorg</p>
</li>
<li><p>razliku između mempool i block događaja</p>
</li>
</ul>
<p>Periodični reconciliation job je i dalje dobra ideja. On može ponovo skenirati relevantan opseg blokova i popraviti stanje ako je realtime event propušten.</p>
<h2>Bezbedno čuvanje ključeva</h2>
<p>Najveći rizik Bitcoin aplikacije često nije SHA-256 niti secp256k1. To je operativna bezbednost.</p>
<p>Privatni ključ može biti izgubljen zbog:</p>
<ul>
<li><p>kompromitovanog servera</p>
</li>
<li><p>lošeg backup-a</p>
</li>
<li><p>logovanja tajnih podataka</p>
</li>
<li><p>clipboard malware-a</p>
</li>
<li><p>pogrešne kontrole pristupa</p>
</li>
<li><p>kompromitovanog dependency-ja</p>
</li>
<li><p>greške u deployment-u</p>
</li>
<li><p>neproverene recovery procedure</p>
</li>
</ul>
<p>Produkcijski custody sistem treba da razmotri:</p>
<ul>
<li><p>odvajanje hot i cold sredstava</p>
</li>
<li><p>limite po transakciji i vremenskom periodu</p>
</li>
<li><p>više potpisnika</p>
</li>
<li><p>fizički odvojene backup-e</p>
</li>
<li><p>kontrolu pristupa po ulozi</p>
</li>
<li><p>pregled izlaza pre potpisivanja</p>
</li>
<li><p>audit log koji ne sadrži seed ili privatni ključ</p>
</li>
<li><p>testiranu proceduru oporavka</p>
</li>
<li><p>plan za gubitak jednog uređaja ili operatera</p>
</li>
</ul>
<p>Backup koji nikada nije testiran nije pouzdan backup.</p>
<p>Seed fraza ne treba da bude u screenshot-u, password manager belešci bez jasnog threat modela, cloud logu, issue tracker-u ili chat poruci.</p>
<h2>Multisig i raspodela poverenja</h2>
<p>Multisig omogućava da trošenje zahteva više ključeva. Primer <code>2-of-3</code> politike znači da su potrebna dva od tri potpisa.</p>
<p>To može omogućiti:</p>
<ul>
<li><p>odvajanje operativnog i recovery ključa</p>
</li>
<li><p>zajedničko upravljanje treasury sredstvima</p>
</li>
<li><p>smanjenje rizika jednog kompromitovanog uređaja</p>
</li>
<li><p>geografski odvojene backup-e</p>
</li>
</ul>
<p>Multisig ipak povećava kompleksnost. Potrebno je sačuvati ne samo seed-ove nego i konfiguraciju wallet-a:</p>
<ul>
<li><p>javne ključeve svih učesnika</p>
</li>
<li><p>derivacione putanje</p>
</li>
<li><p>redosled ključeva</p>
</li>
<li><p>descriptor ili odgovarajući skript</p>
</li>
<li><p>pravila koordinacije</p>
</li>
</ul>
<p>Tri seed fraze bez informacije kako su bile kombinovane mogu biti nedovoljne za jednostavan oporavak.</p>
<p>Taproot i MuSig2 mogu omogućiti efikasnije višestranačko potpisivanje u određenim scenarijima, ali zahtevaju pravilnu interaktivnu koordinaciju, nonce upravljanje i implementaciju proverenog protokola. Ručno pravljenje kriptografskog protokola nije razumna prečica.</p>
<h2>Privatnost nije podrazumevana</h2>
<p>Bitcoin adrese nisu neposredno vezane za ime u protokolu, ali je istorija transakcija javna. Pseudonimnost nije anonimnost.</p>
<p>Analiza može koristiti heuristike kao što su:</p>
<ul>
<li><p>zajedničko trošenje više ulaza</p>
</li>
<li><p>prepoznavanje change izlaza</p>
</li>
<li><p>ponovno korišćenje adrese</p>
</li>
<li><p>poznate adrese servisa</p>
</li>
<li><p>vremenska korelacija</p>
</li>
<li><p>mrežno poreklo transakcije</p>
</li>
<li><p>povezivanje sa KYC servisom</p>
</li>
</ul>
<p>Developer može napraviti privatnosni problem i bez curenja privatnog ključa. Ako backend šalje sve korisničke adrese jednom javnom explorer API-ju, provajder može povezati te upite sa IP adresom, nalogom i vremenom.</p>
<p>Osnovne mere uključuju:</p>
<ul>
<li><p>novu adresu za svaku uplatu</p>
</li>
<li><p>sopstveni node</p>
</li>
<li><p>izbegavanje nepotrebnog spajanja UTXO-a</p>
</li>
<li><p>coin control i označavanje izvora</p>
</li>
<li><p>ograničavanje logova</p>
</li>
<li><p>pažljiv network-layer dizajn</p>
</li>
<li><p>izbegavanje objavljivanja xpub-a</p>
</li>
</ul>
<p>Extended public key nije ključ za trošenje, ali njegovo curenje može otkriti veliki deo istorije i budućih adresa wallet-a.</p>
<h2>Lightning Network: plaćanja izvan baznog lanca</h2>
<p>On-chain Bitcoin je settlement sloj sa ograničenim block space-om. Nije idealan za svaku sitnu i trenutnu uplatu.</p>
<p>Lightning Network koristi payment channel-e. Dve strane zaključaju sredstva kroz on-chain transakciju i zatim razmenjuju nova stanja kanala bez objavljivanja svake promene na blockchainu.</p>
<p>Plaćanje može proći kroz više kanala:</p>
<pre><code class="language-mermaid">flowchart LR
    A[Ana] --&gt; B[Routing node 1]
    B --&gt; C[Routing node 2]
    C --&gt; D[Prodavac]
</code></pre>
<p>Učesnici ne moraju da veruju posrednicima da će dobrovoljno proslediti novac. Kriptografski i vremenski uslovi omogućavaju atomsku realizaciju: plaćanje kroz rutu uspeva kao celina ili se sredstva vraćaju prema pravilima protokola.</p>
<p>Lightning donosi:</p>
<ul>
<li><p>veoma brza plaćanja</p>
</li>
<li><p>male iznose</p>
</li>
<li><p>manje oslanjanje na on-chain prostor za svaku uplatu</p>
</li>
<li><p>drugačiji model privatnosti i skaliranja</p>
</li>
</ul>
<p>Ali uvodi i novu kompleksnost:</p>
<ul>
<li><p>inbound i outbound likvidnost</p>
</li>
<li><p>pronalaženje rute</p>
</li>
<li><p>upravljanje kanalima</p>
</li>
<li><p>online dostupnost</p>
</li>
<li><p>channel backup</p>
</li>
<li><p>timeout i failure handling</p>
</li>
<li><p>on-chain troškove otvaranja i zatvaranja</p>
</li>
<li><p>izbor između sopstvenog i custodial node-a</p>
</li>
</ul>
<p>Lightning invoice tradicionalno koristi BOLT11 format. Noviji tokovi mogu koristiti BOLT12 offers ako ih konkretna implementacija i counterpart podržavaju. Integracija mora proveriti mogućnosti izabrane Lightning implementacije umesto da pretpostavi podršku.</p>
<p>Poznate implementacije uključuju LND, Core Lightning i Eclair. Njihovi RPC, REST ili gRPC interfejsi nisu međusobno identični.</p>
<h2>On-chain ili Lightning</h2>
<p>Izbor zavisi od use-case-a.</p>
<table>
<thead>
<tr>
<th>Zahtev</th>
<th>On-chain</th>
<th>Lightning</th>
</tr>
</thead>
<tbody><tr>
<td>Veliko konačno poravnanje</td>
<td>Dobar izbor</td>
<td>Zavisi od likvidnosti</td>
</tr>
<tr>
<td>Mikroplaćanje</td>
<td>Često nepraktično</td>
<td>Dobar izbor</td>
</tr>
<tr>
<td>Trenutna potvrda</td>
<td>Ne</td>
<td>Praktično da</td>
</tr>
<tr>
<td>Dugoročno čuvanje</td>
<td>Da</td>
<td>Nije primarna namena</td>
</tr>
<tr>
<td>Jednostavan recovery model</td>
<td>Relativno jednostavniji</td>
<td>Složeniji</td>
</tr>
<tr>
<td>Česta ponovljena plaćanja</td>
<td>Skuplje</td>
<td>Efikasnije</td>
</tr>
<tr>
<td>Rad bez upravljanja kanalima</td>
<td>Da</td>
<td>Samo uz provajdera ili automatizaciju</td>
</tr>
</tbody></table>
<p>Česta arhitektura kombinuje oba sloja. Lightning služi za brzu naplatu, a on-chain mreža za otvaranje kanala, veća poravnanja i treasury operacije.</p>
<h2>Custodial i non-custodial dizajn</h2>
<p>Ako aplikacija kontroliše ključeve korisnika, ona je custodial sistem. To pojednostavljuje deo korisničkog iskustva, ali stvara ozbiljnu bezbednosnu, operativnu i potencijalno regulatornu odgovornost.</p>
<p>Non-custodial aplikacija omogućava korisniku da zadrži kontrolu nad ključevima. Server može pripremiti transakciju, ali korisnikov wallet odlučuje da li će je potpisati.</p>
<p>Postoje i hibridni modeli:</p>
<ul>
<li><p>server prati watch-only wallet</p>
</li>
<li><p>korisnik potpisuje na svom uređaju</p>
</li>
<li><p>kompanija i korisnik učestvuju u multisig-u</p>
</li>
<li><p>mali iznosi ostaju u hot wallet-u, veliki u cold storage-u</p>
</li>
<li><p>Lightning servis upravlja kanalima, ali ne i korisnikovim on-chain ključem</p>
</li>
</ul>
<p>Pre izbora SDK-a treba odgovoriti na pitanja:</p>
<ul>
<li><p>Ko poseduje privatne ključeve?</p>
</li>
<li><p>Ko može samostalno da potroši sredstva?</p>
</li>
<li><p>Šta se dešava ako server nestane?</p>
</li>
<li><p>Kako korisnik radi recovery?</p>
</li>
<li><p>Ko snosi gubitak nakon kompromitovanja?</p>
</li>
<li><p>Koji podaci se otkrivaju provajderu?</p>
</li>
<li><p>Može li sistem da zamrzne ili cenzuriše isplatu?</p>
</li>
</ul>
<p>Arhitektura sledi iz odgovora, ne obrnuto.</p>
<h2>Najčešće greške u Bitcoin backend-u</h2>
<h3>Korišćenje floating-point brojeva</h3>
<p>Novčane iznose čuvaj kao cele satoshije.</p>
<p>Loše:</p>
<pre><code class="language-js">const amount = 0.1 + 0.2;
</code></pre>
<p>Bolje:</p>
<pre><code class="language-js">const amountSat = 10_000_000n + 20_000_000n;
</code></pre>
<p>Na API granici jasno definiši da li polje predstavlja BTC string ili satoshije. Ne dozvoli da se značenje zaključuje iz konteksta.</p>
<h3>Jedna adresa za sve korisnike</h3>
<p>Ovo otežava povezivanje uplata i ozbiljno narušava privatnost. Generiši posebnu adresu za svaki order ili payment intent.</p>
<h3>Verovanje prvom explorer-u</h3>
<p>Jedan API odgovor nije konsenzus. Za važan sistem koristi sopstveni node ili više nezavisnih izvora sa jasno definisanim pravilom autoriteta.</p>
<h3>Smatranje mempool transakcije konačnom</h3>
<p>Nepotvrđena transakcija može biti zamenjena, izbačena ili konfliktna.</p>
<h3>Ignorisanje reorg-a</h3>
<p>Svaki status potvrde mora biti reverzibilan dok poslovni risk model ne smatra uplatu dovoljno stabilnom.</p>
<h3>Logovanje previše podataka</h3>
<p>Seed, privatni ključ, PSBT sa osetljivim metapodacima, xpub i autentifikacioni cookie ne pripadaju standardnim application logovima.</p>
<h3>Pisanje sopstvene kriptografije</h3>
<p>Koristi održavane i pregledane biblioteke. Kriptografski kod koji „radi na testnom primeru“ nije dokaz bezbednosti.</p>
<h3>Mešanje mreža</h3>
<p>Mainnet i testne konfiguracije drži odvojeno kroz jasne deployment profile, različite baze i validaciju adresnih prefiksa.</p>
<h3>Fiksna naknada</h3>
<p>Koristi fee rate i virtualnu veličinu, uz mogućnost naknadnog fee bump-a.</p>
<h2>Operativni workflow za produkciju</h2>
<p>Razuman payment sistem može biti organizovan ovako:</p>
<ol>
<li><p>Payment servis kreira jedinstven payment intent.</p>
</li>
<li><p>Watch-only wallet izvodi novu adresu.</p>
</li>
<li><p>Adresa i očekivani iznos čuvaju se u bazi.</p>
</li>
<li><p>Node ili indexer detektuje relevantan output.</p>
</li>
<li><p>Sistem upisuje outpoint i stanje <code>unconfirmed</code>.</p>
</li>
<li><p>Background worker prati aktivni lanac.</p>
</li>
<li><p>Nakon definisanog broja potvrda order postaje settled.</p>
</li>
<li><p>Reconciliation periodično poredi bazu sa node-om.</p>
</li>
<li><p>UTXO-i se kasnije troše kroz PSBT workflow.</p>
</li>
<li><p>Odvojeni signer proverava i potpisuje transakciju.</p>
</li>
<li><p>Broadcast servis šalje finalizovanu transakciju.</p>
</li>
<li><p>Monitoring prati potvrdu, zamenu ili konflikt.</p>
</li>
</ol>
<p>Za pouzdan rad dodaj metrike:</p>
<ul>
<li><p>visina lokalnog lanca</p>
</li>
<li><p>vreme poslednjeg primljenog bloka</p>
</li>
<li><p>broj peer-ova</p>
</li>
<li><p>veličina mempool-a</p>
</li>
<li><p>razlika u visini između nezavisnih izvora</p>
</li>
<li><p>broj nepotvrđenih depozita</p>
</li>
<li><p>broj konflikata i reorg događaja</p>
</li>
<li><p>hot-wallet balans</p>
</li>
<li><p>broj neuspelih potpisivanja</p>
</li>
<li><p>starost najstarije nepotvrđene isplate</p>
</li>
</ul>
<p>Node koji radi kao proces, ali je satima iza mreže, nije zdrav node.</p>
<h2>Šta Bitcoin radi dobro</h2>
<p>Bitcoin je dobar izbor kada su važne osobine:</p>
<ul>
<li><p>javno proverljiva monetarna pravila</p>
</li>
<li><p>globalno poravnanje bez centralnog operatora</p>
</li>
<li><p>samostalna validacija</p>
</li>
<li><p>otvoren protokol</p>
</li>
<li><p>kontrola sredstava kroz ključeve</p>
</li>
<li><p>otpornost na jednostranu promenu baze</p>
</li>
<li><p>mogućnost automatizovanog skriptnog trošenja</p>
</li>
<li><p>interoperabilnost između nezavisnih wallet-a i node-ova</p>
</li>
</ul>
<p>Developer može da pokrene node, proveri istoriju i emituje transakciju bez otvaranja API naloga kod centralnog vlasnika protokola.</p>
<h2>Šta Bitcoin namerno ne radi dobro</h2>
<p>Bitcoin nije optimalan za svaki problem.</p>
<p>Ograničenja uključuju:</p>
<ul>
<li><p>nisku propusnost baznog sloja u poređenju sa centralnim bazama</p>
</li>
<li><p>probabilističku finalnost</p>
</li>
<li><p>promenljive naknade</p>
</li>
<li><p>javnu istoriju</p>
</li>
<li><p>ograničen Script</p>
</li>
<li><p>nepostojanje ugrađenog identiteta i chargeback-a</p>
</li>
<li><p>nepovratne greške u adresi ili upravljanju ključevima</p>
</li>
<li><p>složen custody</p>
</li>
<li><p>zahtevno računovodstvo UTXO-a</p>
</li>
<li><p>operativnu složenost Lightning-a</p>
</li>
</ul>
<p>Ako aplikaciji treba milion jeftinih internih promena stanja u sekundi, obična baza je verovatno bolje rešenje. Ako dve strane već potpuno veruju istom administratoru, blockchain može biti nepotrebna komplikacija.</p>
<p>Bitcoin ima smisla kada uklanjanje centralnog autoriteta ili omogućavanje samostalne verifikacije opravdava dodatne troškove.</p>
<h2>Najkorisniji prvi eksperiment</h2>
<p>Najbolji način da developer razume Bitcoin nije kupovina, već lokalni regtest.</p>
<p>Napravi dva wallet-a, pošalji transakciju između njih, pogledaj je pre potvrde, generiši blok i zatim je dekodiraj. Posle toga probaj da:</p>
<ul>
<li><p>napraviš transakciju sa dva izlaza</p>
</li>
<li><p>identifikuješ change</p>
</li>
<li><p>promeniš fee rate</p>
</li>
<li><p>napraviš PSBT</p>
</li>
<li><p>potpišeš ga drugim wallet-om</p>
</li>
<li><p>testiraš RBF</p>
</li>
<li><p>vratiš razvojnu mrežu na prethodno stanje</p>
</li>
<li><p>simuliraš nekoliko potvrda</p>
</li>
<li><p>napraviš watch-only wallet</p>
</li>
<li><p>napišeš idempotentni payment listener</p>
</li>
</ul>
<p>Tada Bitcoin prestaje da bude apstraktna priča o „novcu na blockchainu“ i postaje ono što jeste: skup preciznih pravila, serijalizovanih podataka i distribuiranih state transition-a.</p>
<h2>Zaključak</h2>
<p>Bitcoin radi tako što vlasništvo ne predstavlja kao red u tabeli naloga, već kao skup nepotrošenih izlaza sa programabilnim uslovima trošenja. Wallet bira te izlaze, konstruiše nove, potpisuje transakciju i šalje je peer-to-peer mreži.</p>
<p>Node-ovi proveravaju transakciju prema konsenzusnim i lokalnim policy pravilima. Rudari biraju transakcije, grade kandidat blokove i ulažu proof-of-work. Kada se validan blok pojavi, svaki full node ga samostalno proverava i ažurira svoj UTXO skup. Naredni blokovi povećavaju praktičnu sigurnost prethodnih transakcija.</p>
<p>Za developera su najvažniji praktični zaključci:</p>
<ul>
<li><p>koristi satoshije kao cele brojeve</p>
</li>
<li><p>razlikuj mempool od potvrđenog lanca</p>
</li>
<li><p>dizajniraj sistem za RBF i reorg</p>
</li>
<li><p>ne mešaj konsenzus i relay policy</p>
</li>
<li><p>odvoji praćenje adresa od potpisivanja</p>
</li>
<li><p>koristi descriptor i PSBT workflow gde odgovara</p>
</li>
<li><p>ne izlaži Bitcoin Core RPC javno</p>
</li>
<li><p>tretiraj privatne ključeve kao kritičnu infrastrukturu</p>
</li>
<li><p>koristi Lightning kada use-case zahteva česta i mala plaćanja</p>
</li>
<li><p>pokreni regtest pre nego što dizajniraš produkcioni payment flow</p>
</li>
</ul>
<p>Bitcoin nije brz, besplatan niti jednostavan distribuirani database servis. Njegova vrednost kao tehnologije nalazi se upravo u drugačijem skupu prioriteta: verifikacija umesto poverenja, otvorena pravila umesto privatnog API-ja i kontrola ključevima umesto dozvole centralnog administratora.</p>
<h3><em>Ovaj članak je sponzorisan od strane</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet.com</em></a><em>. Na Volet.com možete kupiti i prodati Bitcoin. Više informacija nalazi se na stranici</em> <a href="https://volet.srbija.workers.dev/"><em>Volet za korisnike iz Srbije</em></a><em>. Za otvaranje naloga koristi</em> <a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;deep_link_value=dyPrtg1m"><em>Volet referral link</em></a><em>. Link je referral link autora članka.</em></h3>
<h2>Izvori</h2>
<ol>
<li><p><a href="https://bitcoin.org/bitcoin.pdf">Satoshi Nakamoto, Bitcoin: A Peer-to-Peer Electronic Cash System</a></p>
</li>
<li><p><a href="https://bitcoincore.org/en/releases/">Bitcoin Core, aktuelna izdanja</a></p>
</li>
<li><p><a href="https://bitcoincore.org/en/doc/">Bitcoin Core, JSON-RPC dokumentacija</a></p>
</li>
<li><p><a href="https://developer.bitcoin.org/devguide/transactions.html">Bitcoin Developer Guide, Transactions</a></p>
</li>
<li><p><a href="https://developer.bitcoin.org/reference/transactions.html">Bitcoin Developer Reference, Transactions</a></p>
</li>
<li><p><a href="https://developer.bitcoin.org/reference/block_chain.html">Bitcoin Developer Reference, Blockchain</a></p>
</li>
<li><p><a href="https://developer.bitcoin.org/devguide/p2p_network.html">Bitcoin Developer Guide, P2P Network</a></p>
</li>
<li><p><a href="https://developer.bitcoin.org/devguide/mining.html">Bitcoin Developer Guide, Mining</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki">BIP32, Hierarchical Deterministic Wallets</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">BIP39, Mnemonic Code for Generating Deterministic Keys</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki">BIP84, Derivation Scheme for P2WPKH Accounts</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki">BIP141, Segregated Witness</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki">BIP174, Partially Signed Bitcoin Transaction Format</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki">BIP340, Schnorr Signatures for secp256k1</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki">BIP341, Taproot</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki">BIP342, Validation of Taproot Scripts</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki">BIP125, Opt-in Full Replace-by-Fee Signaling</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md">Bitcoin Core, Output Script Descriptors</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md">Bitcoin Core, JSON-RPC Interface</a></p>
</li>
<li><p><a href="https://github.com/bitcoin/bitcoin/blob/master/doc/zmq.md">Bitcoin Core, ZeroMQ Notifications</a></p>
</li>
<li><p><a href="https://github.com/lightning/bolts">Lightning Network, BOLT Specifications</a></p>
</li>
<li><p><a href="https://github.com/lightning/bolts/blob/master/11-payment-encoding.md">Lightning Network, BOLT11 Payment Encoding</a></p>
</li>
<li><p><a href="https://volet.srbija.workers.dev/">Volet Srbija</a></p>
</li>
</ol>
<p><em>English version:</em> Read on Dev.to: <a href="https://dev.to/kriptomuza/bitcoin-from-a-developers-perspective-protocol-nodes-and-code-212n">Bitcoin from a Developer’s Perspective: Protocol, Nodes, and Code</a></p>
]]></content:encoded></item></channel></rss>