<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dora Milen</title>
    <description>The latest articles on DEV Community by Dora Milen (@kriptomuza).</description>
    <link>https://dev.to/kriptomuza</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4130593%2F3c03eb2a-eb1e-4bf7-a5aa-8434e1cced99.jpg</url>
      <title>DEV Community: Dora Milen</title>
      <link>https://dev.to/kriptomuza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kriptomuza"/>
    <language>en</language>
    <item>
      <title>USDT i USDC u praksi: stablecoin izbor za developere</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Sat, 19 Sep 2026 16:53:56 +0000</pubDate>
      <link>https://dev.to/kriptomuza/usdt-i-usdc-u-praksi-stablecoin-izbor-za-developere-141o</link>
      <guid>https://dev.to/kriptomuza/usdt-i-usdc-u-praksi-stablecoin-izbor-za-developere-141o</guid>
      <description>&lt;p&gt;USDT i USDC se često svode na istu rečenicu: tokeni čija bi vrednost trebalo da prati američki dolar. Za developera je to nedovoljno precizno.&lt;/p&gt;

&lt;p&gt;Oba stablecoina predstavljaju programabilnu vrednost koja može da se šalje preko javnih blockchain mreža, koristi u smart contractima i uključi u automatizovane finansijske tokove. Ipak, razlikuju se po izdavaču, sastavu rezervi, dostupnim mrežama, načinu direktnog otkupa, cross-chain infrastrukturi i pojedinim detaljima smart contract implementacije.&lt;/p&gt;

&lt;p&gt;Te razlike postaju važne kada aplikacija prestane da bude prototip. Pogrešna pretpostavka o token adresi, mreži ili varijanti tokena može da proizvede veći problem od pogrešno izabranog API endpointa. Blockchain transakcija uglavnom ne može da se opozove, a oznaka &lt;code&gt;USDC&lt;/code&gt; ili &lt;code&gt;USDT&lt;/code&gt; u korisničkom interfejsu ne govori dovoljno o tome koji se asset zaista prenosi.&lt;/p&gt;

&lt;p&gt;Dokumentacija i uslovi navedeni u članku provereni su 19. septembra 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta je USDT
&lt;/h2&gt;

&lt;p&gt;USDT, često pisan i kao USD₮, jeste stablecoin koji izdaje Tether. Ideja je da jedan USDT predstavlja vrednost jednog američkog dolara i da se može kupiti ili otkupiti u odnosu jedan prema jedan, u skladu sa uslovima izdavača i uz primenljive naknade.&lt;/p&gt;

&lt;p&gt;USDT nije samostalan blockchain. To je token izdat na više blockchain mreža. Tether trenutno navodi podršku za mreže i protokole kao što su Ethereum, Tron, Solana, Avalanche, TON, Aptos, Near, Tezos, Polkadot Asset Hub, Liquid i nekoliko EVM kompatibilnih mreža.&lt;/p&gt;

&lt;p&gt;Isti simbol zato može da predstavlja različite tehničke objekte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Na Ethereum mreži USDT je ERC-20 token.&lt;/li&gt;
&lt;li&gt;Na Tron mreži je TRC-20 token.&lt;/li&gt;
&lt;li&gt;Na Solani je SPL token.&lt;/li&gt;
&lt;li&gt;Na TON mreži je Jetton.&lt;/li&gt;
&lt;li&gt;Na Aptosu je fungible asset.&lt;/li&gt;
&lt;li&gt;Na Polkadot Asset Hubu identifikuje se preko asset ID-ja.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kada korisnik kaže da želi da pošalje USDT, developer mora da postavi dodatno pitanje: koji USDT i na kojoj mreži?&lt;/p&gt;

&lt;p&gt;Tether navodi da su tokeni u opticaju pokriveni rezervama čija je vrednost najmanje jednaka vrednosti izdatih tokena. Prema uslovima izdavača, rezerve mogu da uključuju novac, novčane ekvivalente i druge vrste imovine, uključujući određena potraživanja.&lt;/p&gt;

&lt;p&gt;Proces na visokom nivou izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verifikovani klijent prenosi fiat sredstva Tetheru.&lt;/li&gt;
&lt;li&gt;Tether izdaje odgovarajuću količinu USDT-a na podržanoj mreži.&lt;/li&gt;
&lt;li&gt;Tokeni se prenose između adresa i koriste na sekundarnom tržištu.&lt;/li&gt;
&lt;li&gt;Pri direktnom otkupu USDT se vraća izdavaču.&lt;/li&gt;
&lt;li&gt;Otkupljeni tokeni se povlače iz opticaja ili ostaju u treasury adresama dok ponovo ne budu izdati.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tether pravi razliku između tokena koji su autorizovani, ali se još nalaze u treasury adresama, i tokena koji su stvarno izdati i nalaze se u opticaju. To je važno kada se on-chain supply pokušava direktno porediti sa tržišnom kapitalizacijom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta je USDC
&lt;/h2&gt;

&lt;p&gt;USDC je stablecoin koji izdaje Circle. Kao i USDT, dizajniran je da predstavlja američki dolar na blockchain mrežama i da bude otkupljiv u odnosu jedan USDC za jedan USD, pod uslovima izdavača.&lt;/p&gt;

&lt;p&gt;Circle navodi da je USDC u potpunosti pokriven visokolikvidnim novcem i novčanim ekvivalentima. Većina rezervi drži se kroz Circle Reserve Fund, državni money market fond registrovan u SAD, kojim upravlja BlackRock i koji može sadržati gotovinu, kratkoročne američke trezorske zapise i overnight repo transakcije obezbeđene američkim državnim hartijama. Preostali deo rezervi drži se u gotovini kod finansijskih institucija.&lt;/p&gt;

&lt;p&gt;Circle objavljuje podatke o rezervama, mint i burn tokovima, kao i mesečne izveštaje o potvrdi rezervi treće strane.&lt;/p&gt;

&lt;p&gt;Tehnički, USDC takođe postoji na većem broju blockchain mreža. Circle je 16. septembra 2026. navodio 38 mreža sa nativnim USDC-em, uključujući Ethereum, Solanu, Base, Arbitrum, Avalanche, Polygon PoS, OP Mainnet, Aptos, Sui, Stellar, Noble, XRPL i druge.&lt;/p&gt;

&lt;p&gt;Ovde je ključna reč &lt;strong&gt;nativni&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nativni USDC izdaje Circle na konkretnoj mreži. Bridged USDC nastaje kada nezavisni bridge zaključa token na jednoj mreži i izda njegovu reprezentaciju na drugoj. Takav token može imati simbol &lt;code&gt;USDC&lt;/code&gt;, &lt;code&gt;USDC.e&lt;/code&gt; ili nešto slično, ali nije nužno isto što i Circle-issued USDC.&lt;/p&gt;

&lt;p&gt;Circle eksplicitno upozorava da se bridged USDC ili drugi nepodržani tokeni ne šalju na Circle Mint adrese, jer sredstva možda neće biti automatski prepoznata ili vraćena.&lt;/p&gt;

&lt;p&gt;USDC mint i redemption workflow izgleda slično kao kod USDT-a:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Institucionalni klijent šalje USD kroz podržani bankarski kanal.&lt;/li&gt;
&lt;li&gt;Circle izdaje odgovarajući broj USDC tokena.&lt;/li&gt;
&lt;li&gt;USDC se prenosi na javnoj mreži ili koristi u smart contractima.&lt;/li&gt;
&lt;li&gt;Pri otkupu tokeni se vraćaju Circleu.&lt;/li&gt;
&lt;li&gt;USDC se spaljuje, a fiat sredstva šalju na registrovani bankovni račun.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Circle Mint je namenjen institucijama, a ne individualnim korisnicima i malim kompanijama. Manji sistemi obično dolaze do USDC-a preko berzi, payment providera, custodiana ili drugih on-ramp servisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stablecoin nije isto što i dolar na bankovnom računu
&lt;/h2&gt;

&lt;p&gt;USDT i USDC pokušavaju da prate vrednost dolara, ali nisu depoziti na korisnikovom bankovnom računu. Holder poseduje blockchain token i oslanja se na kombinaciju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rezervi izdavača,&lt;/li&gt;
&lt;li&gt;ugovornog prava na otkup,&lt;/li&gt;
&lt;li&gt;operativne sposobnosti izdavača,&lt;/li&gt;
&lt;li&gt;bankarskih partnera,&lt;/li&gt;
&lt;li&gt;blockchain mreže,&lt;/li&gt;
&lt;li&gt;smart contract implementacije,&lt;/li&gt;
&lt;li&gt;tržišne likvidnosti.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cena na sekundarnom tržištu zato može privremeno da odstupi od jednog USD. Izdavač može nuditi direktan otkup po nominalnoj vrednosti, ali to ne znači da će svaka berza, DEX ili OTC desk u svakom trenutku ponuditi istu cenu.&lt;/p&gt;

&lt;p&gt;Postoji i administrativni sloj. USDT i USDC nisu decentralizovani u smislu da nijedna strana nema kontrolu nad token ugovorom. Oba izdavača zadržavaju mogućnost blokiranja određenih adresa ili zamrzavanja tokena u okolnostima definisanim njihovim uslovima, uključujući pravne i compliance zahteve.&lt;/p&gt;

&lt;p&gt;Za payment aplikaciju to nije skriven detalj. To je deo operativnog modela.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zašto bi developer koristio stablecoin
&lt;/h2&gt;

&lt;p&gt;Najbolji razlog nije spekulacija, već settlement.&lt;/p&gt;

&lt;p&gt;Stablecoin omogućava da aplikacija prenosi vrednost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bez čekanja na radno vreme banke,&lt;/li&gt;
&lt;li&gt;preko jedinstvenog programabilnog interfejsa,&lt;/li&gt;
&lt;li&gt;između walleta, smart contracta i custodial sistema,&lt;/li&gt;
&lt;li&gt;uz javno proverljiv status transakcije,&lt;/li&gt;
&lt;li&gt;bez izlaganja korisnika volatilnosti tipičnoj za BTC ili ETH,&lt;/li&gt;
&lt;li&gt;kroz automatizovane treasury i payout procese.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Realan use-case može biti platforma koja naplaćuje usluge međunarodnim klijentima i isplaćuje izvođače u različitim državama.&lt;/p&gt;

&lt;p&gt;Klijent može platiti USDC na Base mreži, dok izvođač traži USDT na Tronu. Platforma tada mora da reši više problema od običnog &lt;code&gt;transfer&lt;/code&gt; poziva:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generisanje ili dodeljivanje deposit adrese.&lt;/li&gt;
&lt;li&gt;Prepoznavanje tačnog token ugovora.&lt;/li&gt;
&lt;li&gt;Praćenje blockchain događaja.&lt;/li&gt;
&lt;li&gt;Čekanje odgovarajućeg broja potvrda.&lt;/li&gt;
&lt;li&gt;Knjiženje u internom ledgeru.&lt;/li&gt;
&lt;li&gt;Konverziju između asseta ili mreža, ako je potrebna.&lt;/li&gt;
&lt;li&gt;Finansiranje gas walleta.&lt;/li&gt;
&lt;li&gt;Kreiranje i slanje payout transakcije.&lt;/li&gt;
&lt;li&gt;Reconciliation između internog stanja, blockchaina i custodiana.&lt;/li&gt;
&lt;li&gt;Upravljanje compliance i operativnim rizicima.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sam token transfer je najkraći deo sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako se USDT i USDC integrišu
&lt;/h2&gt;

&lt;p&gt;Postoje tri uobičajena nivoa integracije.&lt;/p&gt;

&lt;h3&gt;
  
  
  Direktna on-chain integracija
&lt;/h3&gt;

&lt;p&gt;Aplikacija komunicira sa token ugovorom preko RPC noda. Za EVM mreže to obično znači rad sa funkcijama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;balanceOf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transfer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;approve&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allowance&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transferFrom&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aplikacija sama upravlja privatnim ključevima, gasom, nonce vrednostima, potvrdom transakcija i indeksiranjem događaja.&lt;/p&gt;

&lt;p&gt;Prednost je puna kontrola nad funds flow logikom. Mana je to što tim preuzima odgovornost za wallet bezbednost i blockchain infrastrukturu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custodial ili wallet infrastruktura
&lt;/h3&gt;

&lt;p&gt;Provider upravlja ključevima ili pruža MPC, policy engine, transaction signing i webhookove. Aplikacija radi preko API-ja umesto direktnog potpisivanja svake transakcije.&lt;/p&gt;

&lt;p&gt;Ovaj model smanjuje količinu blockchain koda u aplikaciji, ali uvodi novog dobavljača, njegov pricing model, ograničenja i operativni rizik.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integracija sa izdavačem ili on-ramp providerom
&lt;/h3&gt;

&lt;p&gt;Institucionalni sistemi mogu direktno integrisati mint i redemption tokove, dok manje aplikacije obično koriste berzu, payment processor ili on-ramp.&lt;/p&gt;

&lt;p&gt;Ovo je potreban sloj kada sistem mora da prelazi između bankovnog novca i stablecoina. Smart contract sam po sebi ne može da pošalje bankarski transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nemoj identifikovati token samo simbolom
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;USDT&lt;/code&gt; i &lt;code&gt;USDC&lt;/code&gt; nisu dovoljni identifikatori.&lt;/p&gt;

&lt;p&gt;Minimalni identitet tokena treba da uključuje:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blockchain namespace + chain ID + token address ili asset ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Za EVM mreže model može izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"asset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USDC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chainId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8453&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contract"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"native"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Circle navodi ovu adresu kao nativni USDC contract na Base mreži.&lt;/p&gt;

&lt;p&gt;Produkcioni token registry treba da bude eksplicitna allowlista. Ne treba automatski prihvatiti token samo zato što njegov contract vraća &lt;code&gt;symbol() == "USDC"&lt;/code&gt;. Bilo ko može da deployuje token sa tim simbolom.&lt;/p&gt;

&lt;p&gt;Isto važi za ime, logo i broj decimala. To su metapodaci, ne dokaz identiteta.&lt;/p&gt;

&lt;p&gt;Registry obično treba da čuva:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interni asset ID,&lt;/li&gt;
&lt;li&gt;mrežu i chain ID,&lt;/li&gt;
&lt;li&gt;contract adresu ili asset ID,&lt;/li&gt;
&lt;li&gt;očekivani broj decimala,&lt;/li&gt;
&lt;li&gt;status depozita i povlačenja,&lt;/li&gt;
&lt;li&gt;minimalni iznos,&lt;/li&gt;
&lt;li&gt;potrebne potvrde,&lt;/li&gt;
&lt;li&gt;oznaku &lt;code&gt;native&lt;/code&gt;, &lt;code&gt;bridged&lt;/code&gt; ili &lt;code&gt;wrapped&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;datum poslednje provere prema dokumentaciji izdavača.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podrška za mreže se menja. Tether je, na primer, prestao da izdaje i bude obavezan da otkupljuje USDT na pojedinim starijim mrežama, uključujući Omni, Algorand i EOS/Vaulta. Hardkodovana lista bez procesa ažuriranja vremenom postaje rizik.&lt;/p&gt;

&lt;h2&gt;
  
  
  USDT ima važan ERC-20 detalj
&lt;/h2&gt;

&lt;p&gt;Ethereum USDT ugovor zasnovan je na starijoj implementaciji koja u &lt;code&gt;transfer&lt;/code&gt; funkciji ne vraća standardnu Boolean vrednost. Tether to eksplicitno navodi u integration smernicama i preporučuje korišćenje &lt;code&gt;SafeERC20&lt;/code&gt; biblioteke.&lt;/p&gt;

&lt;p&gt;Ako smart contract očekuje da svaki ERC-20 token strogo prati moderni interfejs, integracija može da se ponaša neočekivano.&lt;/p&gt;

&lt;p&gt;Kratak primer ugovora koji prihvata unapred odobrene stablecoine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

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

contract StablecoinCheckout {
    using SafeERC20 for IERC20;

    address public immutable merchant;

    mapping(address token =&amp;gt; bool supported) public supportedTokens;
    mapping(bytes32 invoiceId =&amp;gt; bool settled) public settledInvoices;

    event PaymentReceived(
        bytes32 indexed invoiceId,
        address indexed payer,
        address indexed token,
        uint256 amount
    );

    constructor(address merchant_, address[] memory tokens) {
        require(merchant_ != address(0), "invalid merchant");
        merchant = merchant_;

        for (uint256 i = 0; i &amp;lt; tokens.length; i++) {
            supportedTokens[tokens[i]] = true;
        }
    }

    function pay(
        bytes32 invoiceId,
        address token,
        uint256 amount
    ) external {
        require(supportedTokens[token], "unsupported token");
        require(!settledInvoices[invoiceId], "invoice settled");
        require(amount &amp;gt; 0, "zero amount");

        settledInvoices[invoiceId] = true;

        IERC20(token).safeTransferFrom(
            msg.sender,
            merchant,
            amount
        );

        emit PaymentReceived(
            invoiceId,
            msg.sender,
            token,
            amount
        );
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ovo nije kompletan checkout sistem. Nedostaju autorizovano kreiranje faktura, očekivani token i iznos, rok važenja, refund logika, pause mehanizam i administracija allowliste.&lt;/p&gt;

&lt;p&gt;Primer pokazuje dve bitne stvari:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tokeni se prihvataju preko contract adresa, ne preko simbola,&lt;/li&gt;
&lt;li&gt;transfer koristi &lt;code&gt;SafeERC20&lt;/code&gt;, koji podržava i tokene bez standardne povratne vrednosti.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deposit workflow je više od slušanja &lt;code&gt;Transfer&lt;/code&gt; događaja
&lt;/h2&gt;

&lt;p&gt;Najjednostavniji deposit servis prati &lt;code&gt;Transfer&lt;/code&gt; događaje za poznati token contract i traži transfere ka adresama platforme. To je početak, ali nije dovoljan produkcioni dizajn.&lt;/p&gt;

&lt;p&gt;Pouzdan workflow izgleda približno ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Indekser detektuje kandidata za uplatu.&lt;/li&gt;
&lt;li&gt;Proverava &lt;code&gt;chainId&lt;/code&gt; i contract adresu.&lt;/li&gt;
&lt;li&gt;Čuva transaction hash, log index i block number.&lt;/li&gt;
&lt;li&gt;Čeka definisan nivo finalnosti.&lt;/li&gt;
&lt;li&gt;Ponovo proverava receipt i canonical block hash.&lt;/li&gt;
&lt;li&gt;U jednoj atomskoj operaciji upisuje depozit i ledger stavku.&lt;/li&gt;
&lt;li&gt;Emituje interni događaj &lt;code&gt;DepositCredited&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Periodični reconciliation proverava stanje na blockchainu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kombinacija &lt;code&gt;transactionHash + logIndex&lt;/code&gt; može da služi kao idempotency ključ za EVM događaje. Transaction hash sam nije dovoljan jer jedna transakcija može emitovati više transfer događaja.&lt;/p&gt;

&lt;p&gt;Sistem treba da razlikuje najmanje sledeća stanja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;detected -&amp;gt; confirming -&amp;gt; confirmed -&amp;gt; credited
                      \-&amp;gt; reorged
                      \-&amp;gt; rejected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Broj potvrda ne treba univerzalno hardkodovati za sve mreže. Ethereum, L2 rollup, Solana i Tron nemaju isti model finalnosti niti isti profil rizika.&lt;/p&gt;

&lt;h2&gt;
  
  
  Iznose čuvaj kao cele brojeve
&lt;/h2&gt;

&lt;p&gt;Stablecoin iznos ne treba čuvati kao floating-point broj.&lt;/p&gt;

&lt;p&gt;Umesto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.25 USDC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ledger treba da čuva:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10250000 base units
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ako konkretan token koristi šest decimala.&lt;/p&gt;

&lt;p&gt;Broj decimala ne treba slepo pretpostaviti za svaki token na svakoj mreži. Može se pročitati iz ugovora tokom procesa registracije asseta, proveriti prema zvaničnoj dokumentaciji i zatim čuvati u token registryju.&lt;/p&gt;

&lt;p&gt;U finansijskom ledgeru korisno je čuvati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;asset_id&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;amount_base_units&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;direction&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;account_id&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reference_type&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reference_id&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;created_at&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blockchain balance nije zamena za interni ledger. Jedna on-chain adresa može držati zbir sredstava velikog broja korisnika, dok poslovni sistem i dalje mora da zna kome pripada koji deo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-chain nije običan transfer
&lt;/h2&gt;

&lt;p&gt;USDC na Ethereumu i USDC na Base mreži nisu isti smart contract. Činjenica da oba predstavljaju USDC ne znači da token može direktno biti poslat sa jedne mreže na drugu.&lt;/p&gt;

&lt;p&gt;Za nativni USDC Circle nudi Cross-Chain Transfer Protocol, odnosno CCTP. On koristi burn-and-mint model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;USDC se spaljuje na izvornoj mreži.&lt;/li&gt;
&lt;li&gt;Circleov attestation servis potvrđuje događaj.&lt;/li&gt;
&lt;li&gt;Potvrda se prosleđuje odredišnoj mreži.&lt;/li&gt;
&lt;li&gt;Isti iznos nativnog USDC-a mintuje se na odredištu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CCTP zato ne zavisi od klasičnog bridge liquidity poola. I dalje postoje mrežne naknade, podržani parovi mreža, potvrde, vreme čekanja i protokolarni uslovi koje integracija mora da obradi.&lt;/p&gt;

&lt;p&gt;Za USDT ne postoji direktan ekvivalent CCTP-u namenjen opštoj developerskoj integraciji. Prelazak između mreža u praksi se obično obavlja preko berze, custodiana, liquidity providera ili bridge sistema. Svaka od tih opcija uvodi svoj counterparty i smart contract rizik.&lt;/p&gt;

&lt;p&gt;Ako aplikacija ne mora sama da obavlja cross-chain konverziju, često je jednostavnije da korisniku jasno prikaže podržane kombinacije:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;USDC on Base
USDC on Ethereum
USDT on Tron
USDT on Ethereum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To je preciznije od jednog generičkog dugmeta „Deposit USDC“.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko košta integracija
&lt;/h2&gt;

&lt;p&gt;Ne postoji jedna cena USDT ili USDC integracije. Trošak se sastoji od više slojeva.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blockchain naknade
&lt;/h3&gt;

&lt;p&gt;Svaki on-chain transfer zahteva mrežnu naknadu. Na EVM mrežama plaća se native gas tokenom, čak i kada se prenosi USDT ili USDC.&lt;/p&gt;

&lt;p&gt;Wallet sa 100.000 USDC i nula native gas tokena ne može da pošalje standardnu transakciju. Treasury servis zato mora odvojeno da prati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stablecoin balance,&lt;/li&gt;
&lt;li&gt;gas balance,&lt;/li&gt;
&lt;li&gt;minimalni gas threshold,&lt;/li&gt;
&lt;li&gt;gas top-up transakcije.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cena se menja u zavisnosti od mreže i opterećenja, pa je ne treba hardkodovati u poslovnu logiku.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastruktura
&lt;/h3&gt;

&lt;p&gt;Direktna integracija može da uključuje troškove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RPC providera,&lt;/li&gt;
&lt;li&gt;arhivskih ili dedicated nodova,&lt;/li&gt;
&lt;li&gt;blockchain indexera,&lt;/li&gt;
&lt;li&gt;wallet ili MPC providera,&lt;/li&gt;
&lt;li&gt;chain analytics sistema,&lt;/li&gt;
&lt;li&gt;monitoring i alerting infrastrukture,&lt;/li&gt;
&lt;li&gt;eksternih bezbednosnih provera.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ovi troškovi često postanu veći od samog gasa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konverzija na sekundarnom tržištu
&lt;/h3&gt;

&lt;p&gt;Ako se USDT kupuje za USDC ili stablecoin prodaje za fiat, pojavljuju se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trading fee,&lt;/li&gt;
&lt;li&gt;spread,&lt;/li&gt;
&lt;li&gt;slippage,&lt;/li&gt;
&lt;li&gt;withdrawal fee,&lt;/li&gt;
&lt;li&gt;bankarska naknada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ti troškovi dolaze od izabrane berze ili liquidity providera, ne iz samog ERC-20 standarda.&lt;/p&gt;

&lt;h3&gt;
  
  
  Direktan rad sa Tetherom
&lt;/h3&gt;

&lt;p&gt;Prema Tetherovom cenovniku proverenom u septembru 2026, minimalni iznos za direktnu kupovinu ili otkup iznosi 100.000 USD. Naknada za otkup je veći iznos od 1.000 USD ili 0,1%, naknada za kupovinu je 0,1%, a verifikacija naloga košta 150 USD u Tether tokenima.&lt;/p&gt;

&lt;p&gt;To direktan issuer workflow čini prvenstveno institucionalnim mehanizmom. Većina manjih aplikacija USDT nabavlja i prodaje preko sekundarnog tržišta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Direktan rad sa Circleom
&lt;/h3&gt;

&lt;p&gt;Circle Mint takođe je institucionalni proizvod. Circle navodi da za USD wire tokenizaciju Circle i njegovi bankarski partneri ne naplaćuju naknadu ako je transfer denominovan u USD, mada korisnikova banka može naplatiti svoj deo.&lt;/p&gt;

&lt;p&gt;Outbound on-chain transferi naplaćuju se prema stvarnom mrežnom trošku. Redemption pricing od 15. marta 2026. zavisi od izabranog Circle Mint nivoa, dnevnog obima i mesečne neto mint ili redemption aktivnosti. Određeni nivoi imaju osnovne naknade i dodatne pragove za veliki neto redemption.&lt;/p&gt;

&lt;p&gt;Zbog toga „USDC redemption je besplatan“ više nije dovoljno precizan opis za svaki institucionalni scenario. Konkretna cena zavisi od Circle Mint ugovora, nivoa i tokova klijenta.&lt;/p&gt;

&lt;h2&gt;
  
  
  USDT vs USDC: ključne razlike
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Oblast&lt;/th&gt;
&lt;th&gt;USDT&lt;/th&gt;
&lt;th&gt;USDC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Izdavač&lt;/td&gt;
&lt;td&gt;Tether&lt;/td&gt;
&lt;td&gt;Circle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Osnovni model&lt;/td&gt;
&lt;td&gt;Fiat-backed stablecoin&lt;/td&gt;
&lt;td&gt;Fiat-backed stablecoin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rezerve&lt;/td&gt;
&lt;td&gt;Novac, novčani ekvivalenti i druga imovina prema objavama izdavača&lt;/td&gt;
&lt;td&gt;Visokolikvidan novac i novčani ekvivalenti, većinom kroz Circle Reserve Fund&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direktan pristup izdavaču&lt;/td&gt;
&lt;td&gt;Institucionalan, uz minimum i eksplicitne naknade&lt;/td&gt;
&lt;td&gt;Circle Mint, namenjen institucijama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blockchain podrška&lt;/td&gt;
&lt;td&gt;Snažno prisustvo na mrežama kao što su Tron, Ethereum, Solana i TON&lt;/td&gt;
&lt;td&gt;Veliki broj nativno podržanih mreža, uključujući više EVM i non-EVM ekosistema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zvanični cross-chain mehanizam&lt;/td&gt;
&lt;td&gt;Nema opšti developerski ekvivalent CCTP-u&lt;/td&gt;
&lt;td&gt;CCTP burn-and-mint za podržane mreže&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EVM integracioni detalj&lt;/td&gt;
&lt;td&gt;Ethereum contract ima stariji &lt;code&gt;transfer&lt;/code&gt; bez standardnog Boolean povratnog rezultata&lt;/td&gt;
&lt;td&gt;Standardniji ERC-20 interfejs, uz specifične Circle ekstenzije i administrativne kontrole&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bridged varijante&lt;/td&gt;
&lt;td&gt;Potrebna pažljiva provera izvora i bridge modela&lt;/td&gt;
&lt;td&gt;Jasna razlika između native USDC i bridged varijanti kao što je &lt;code&gt;USDC.e&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Administrativna kontrola&lt;/td&gt;
&lt;td&gt;Izdavač može blokirati adrese i zamrznuti tokene&lt;/td&gt;
&lt;td&gt;Izdavač koristi blocklist mehanizam i može ograničiti transfere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tipičan razlog za izbor&lt;/td&gt;
&lt;td&gt;Kontrapartneri, berze ili payout tržišta već koriste USDT na konkretnoj mreži&lt;/td&gt;
&lt;td&gt;Nativni multichain deployment, CCTP ili direktniji institucionalni fiat workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Prednosti i mane USDT-a
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prednosti
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Široka praktična prihvaćenost&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;USDT je često već deo treasury i settlement procesa berzi, OTC deskova, walleta i međunarodnih kontrapartnera. Ako primalac eksplicitno traži USDT na Tronu ili TON-u, izbor drugog stablecoina može samo prebaciti trošak konverzije na njega.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dostupnost na različitim tipovima mreža&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;USDT nije ograničen na EVM ekosistem. To omogućava integraciju sa mrežama koje imaju različite troškove, finalnost i wallet infrastrukturu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jednostavan osnovni token model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na podržanoj mreži USDT se uglavnom integriše kao standardni fungible token, uz poznate specifičnosti pojedinih ugovora.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mane
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Nepotpuno standardna Ethereum implementacija&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Smart contract kod koji pretpostavlja strogo standardan ERC-20 povratni rezultat može imati problem sa Ethereum USDT-om. &lt;code&gt;SafeERC20&lt;/code&gt; ili ekvivalentna proverena biblioteka praktično je obavezna.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visok prag za direktan issuer workflow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Minimum od 100.000 USD i redemption fee čine direktan rad sa izdavačem nepraktičnim za male tokove.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nema jedinstvenog developerskog cross-chain protokola poput CCTP-a&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Platforma mora sama da izabere bridge, exchange ili custodian workflow za prebacivanje USDT likvidnosti između mreža.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promene u podršci mrežama&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tether je prestao da izdaje ili otkupljuje tokene na pojedinim legacy mrežama. Integracija zato zahteva održavan token registry i periodičnu proveru zvanične podrške.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prednosti i mane USDC-a
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prednosti
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Jasno dokumentovane nativne implementacije&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Circle održava listu contract adresa i podržanih mreža. To olakšava izgradnju pouzdane allowliste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CCTP za nativni cross-chain USDC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Burn-and-mint model smanjuje zavisnost od bridge liquidity poolova i izbegava kreiranje dodatne wrapped reprezentacije za podržane transfere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparentno opisan model rezervi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Circle javno opisuje sastav rezervi, objavljuje podatke o rezervama i obezbeđuje mesečne potvrde treće strane.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Široka podrška nativnog USDC-a&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Veliki broj EVM i non-EVM mreža omogućava da se isti poslovni asset koristi kroz više tehničkih okruženja, bez nužnog oslanjanja na nezavisne wrapped tokene.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mane
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Native i bridged USDC lako se mogu pomešati&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Korisnički interfejsi često prikazuju isti ili sličan simbol za tehnički različite assete. Pogrešna varijanta može ostati zaglavljena u deposit workflowu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circle Mint nije proizvod za svakog developera&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Direktan fiat mint i redemption zahteva odgovarajući institucionalni nalog. Mala aplikacija i dalje mora da izabere eksternog on-ramp providera.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing direktnog redemptiona nije jedna fiksna cifra&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cena zavisi od Circle Mint nivoa i obima. Finansijski model mora uzeti u obzir konkretan ugovor, a ne samo mrežni gas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centralizovane administrativne kontrole&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kao i USDT, USDC ima issuer-level mogućnost blokiranja adresa i ograničavanja tokena.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako izabrati između USDT-a i USDC-a
&lt;/h2&gt;

&lt;p&gt;Izbor ne treba početi pitanjem „koji stablecoin je bolji“, već pitanjem „koji settlement tok pokušavamo da izgradimo“.&lt;/p&gt;

&lt;h3&gt;
  
  
  Izaberi prema primaocu
&lt;/h3&gt;

&lt;p&gt;Ako payout korisnici gotovo uvek traže USDT na Tronu, USDC na Ethereumu ne rešava isti problem. Uveo bi dodatnu konverziju, gas i operativni korak.&lt;/p&gt;

&lt;p&gt;Ako poslovni partneri koriste Circle Mint, nativni USDC i bankarske tokove, USDC može biti prirodniji izbor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Izaberi mrežu pre biblioteke
&lt;/h3&gt;

&lt;p&gt;Chain izbor određuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trošak transakcije,&lt;/li&gt;
&lt;li&gt;brzinu i finalnost,&lt;/li&gt;
&lt;li&gt;wallet podršku,&lt;/li&gt;
&lt;li&gt;RPC i indexing infrastrukturu,&lt;/li&gt;
&lt;li&gt;likvidnost,&lt;/li&gt;
&lt;li&gt;on-ramp i off-ramp dostupnost,&lt;/li&gt;
&lt;li&gt;dostupnost tokena za gas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tek posle toga ima smisla birati SDK ili wallet provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proveri izlaz pre ulaza
&lt;/h3&gt;

&lt;p&gt;Jedna od skupljih arhitektonskih grešaka jeste izgraditi jednostavan deposit flow, a tek kasnije proveriti kako će kompanija prodati stablecoin za fiat ili ga isplatiti korisnicima.&lt;/p&gt;

&lt;p&gt;Pre implementacije proveri:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ko može izvršiti redemption,&lt;/li&gt;
&lt;li&gt;koji su minimalni iznosi,&lt;/li&gt;
&lt;li&gt;koje bankarske države i valute su podržane,&lt;/li&gt;
&lt;li&gt;koliko traje settlement,&lt;/li&gt;
&lt;li&gt;kako se obračunavaju naknade,&lt;/li&gt;
&lt;li&gt;šta se dešava tokom bankarskog vikenda ili praznika,&lt;/li&gt;
&lt;li&gt;šta se dešava ako je asset ili adresa blokirana.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ne moraš podržati oba
&lt;/h3&gt;

&lt;p&gt;Podrška za dva stablecoina na četiri mreže nije jedna funkcionalnost. To je najmanje osam kombinacija asseta i mreže, sa zasebnim contract adresama, gas modelima, confirmation pravilima, hot walletima i reconciliation procesima.&lt;/p&gt;

&lt;p&gt;Razuman prvi deployment često podržava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jedan stablecoin,&lt;/li&gt;
&lt;li&gt;jednu mrežu,&lt;/li&gt;
&lt;li&gt;jedan custody model,&lt;/li&gt;
&lt;li&gt;jedan fiat izlaz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drugi asset treba dodati kada postoji merljiva potreba korisnika ili partnera, ne zato što je još jedan ERC-20 poziv jednostavan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Produkciona checklista
&lt;/h2&gt;

&lt;p&gt;Pre uključivanja stvarnih sredstava proveri sledeće:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token se identifikuje preko mreže i contract adrese.&lt;/li&gt;
&lt;li&gt;Contract adrese dolaze iz dokumentacije izdavača.&lt;/li&gt;
&lt;li&gt;Native, bridged i wrapped varijante imaju različite interne asset ID-jeve.&lt;/li&gt;
&lt;li&gt;Iznosi se čuvaju kao integer base units.&lt;/li&gt;
&lt;li&gt;Deposit obrada je idempotentna.&lt;/li&gt;
&lt;li&gt;Sistem obrađuje reorg i neuspešne transakcije.&lt;/li&gt;
&lt;li&gt;Confirmation policy je definisan po mreži.&lt;/li&gt;
&lt;li&gt;Wallet servis prati stablecoin i gas balance.&lt;/li&gt;
&lt;li&gt;Withdrawal se prvo simulira kada infrastruktura to podržava.&lt;/li&gt;
&lt;li&gt;Privatni ključevi nisu u aplikacionoj bazi ili &lt;code&gt;.env&lt;/code&gt; fajlu produkcionog servera.&lt;/li&gt;
&lt;li&gt;Postoje transaction i dnevni withdrawal limiti.&lt;/li&gt;
&lt;li&gt;Velike transakcije zahtevaju dodatnu autorizaciju.&lt;/li&gt;
&lt;li&gt;Interni ledger ne zavisi od trenutnog blockchain balansa.&lt;/li&gt;
&lt;li&gt;Reconciliation se izvršava nezavisno od webhookova.&lt;/li&gt;
&lt;li&gt;Postoji procedura za pogrešnu mrežu ili pogrešan token.&lt;/li&gt;
&lt;li&gt;Issuer i provider naknade nisu hardkodovane.&lt;/li&gt;
&lt;li&gt;Dokumentacija o podržanim mrežama periodično se ponovo proverava.&lt;/li&gt;
&lt;li&gt;Postoji plan za pause depozita i povlačenja po assetu i mreži.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Zaključak
&lt;/h2&gt;

&lt;p&gt;USDT i USDC rešavaju sličan problem, ali nisu međusobno zamenljivi na nivou implementacije.&lt;/p&gt;

&lt;p&gt;USDT je često praktičan kada postojeći kontrapartneri i payout tržišta već rade sa njim na određenoj mreži. USDC nudi širi skup dokumentovanih nativnih implementacija i CCTP kao standardizovan cross-chain put za podržane mreže. USDT na Ethereumu zahteva pažnju zbog starije ERC-20 implementacije, dok kod USDC-a posebnu pažnju treba posvetiti razlici između native i bridged tokena.&lt;/p&gt;

&lt;p&gt;Najvažnija odluka ipak nije naziv stablecoina. To je kombinacija izdavača, mreže, contract adrese, custody modela i fiat izlaza.&lt;/p&gt;

&lt;p&gt;Dobar prototip može da pošalje token. Dobra produkciona integracija zna koji je token poslat, kada je transakcija konačna, kome sredstva pripadaju, koliko transfer zaista košta i kako će se vrednost na kraju vratiti u bankarski sistem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tether.to/en/supported-protocols/" rel="noopener noreferrer"&gt;Tether, Supported Protocols and Integration Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tether.to/en/legal/" rel="noopener noreferrer"&gt;Tether, Legal Terms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tether.to/en/faqs/" rel="noopener noreferrer"&gt;Tether, Frequently Asked Questions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.circle.com/stablecoins/what-is-usdc" rel="noopener noreferrer"&gt;Circle Docs, What Is USDC?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.circle.com/transparency" rel="noopener noreferrer"&gt;Circle, Transparency and Stability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.circle.com/usdc" rel="noopener noreferrer"&gt;Circle, USDC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.circle.com/circle-mint/references/supported-chains-and-currencies" rel="noopener noreferrer"&gt;Circle Docs, Supported Chains and Currencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.circle.com/legal/usdc-terms" rel="noopener noreferrer"&gt;Circle, USDC Terms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.circle.com/stablecoins/usdc-contract-addresses" rel="noopener noreferrer"&gt;Circle Docs, USDC Contract Addresses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openzeppelin.com/contracts/5.x/api/token/erc20" rel="noopener noreferrer"&gt;OpenZeppelin Contracts, ERC-20 and SafeERC20&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.circle.com/cctp" rel="noopener noreferrer"&gt;Circle Docs, Cross-Chain Transfer Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tether.to/en/fees/" rel="noopener noreferrer"&gt;Tether, Fees&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.circle.com/support/en/circle-mint-product-fee-schedule" rel="noopener noreferrer"&gt;Circle, Circle Mint Product Fee Schedule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.circle.com/support/en/usdc-eurc-redemption-structure" rel="noopener noreferrer"&gt;Circle, USDC and EURC Redemption Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>cryptocurrency</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Polygon POL iz ugla developera: EVM, gas i finalnost</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Sat, 19 Sep 2026 00:23:30 +0000</pubDate>
      <link>https://dev.to/kriptomuza/polygon-pol-iz-ugla-developera-evm-gas-i-finalnost-di7</link>
      <guid>https://dev.to/kriptomuza/polygon-pol-iz-ugla-developera-evm-gas-i-finalnost-di7</guid>
      <description>&lt;p&gt;Polygon je dovoljno dugo prisutan da njegovo ime često znači nekoliko različitih stvari. Za jednog developera to može biti EVM mreža sa chain ID-em &lt;code&gt;137&lt;/code&gt;. Za drugog je to skup alata za pokretanje sopstvenog lanca. Za trećeg je most prema Ethereumu, a za korisnika token koji je nekada u walletu bio prikazan kao MATIC.&lt;/p&gt;

&lt;p&gt;Zato je korisno početi preciznom definicijom:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;POL je nativni token Polygon Chain mreže, ranije poznate kao Polygon PoS. Koristi se za gas i staking, a zamenio je MATIC u odnosu 1:1. Polygon Chain je zasebna EVM-kompatibilna mreža sa sopstvenim validatorima, blokovima i mehanizmom finalnosti, čije se kontrolne tačke objavljuju na Ethereumu.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Za developera je važnije šta iz toga sledi nego sam rebranding. Solidity ugovor ne moraš ponovo da osmišljavaš, ali moraš pravilno da modeluješ gas, finalnost, RPC infrastrukturu, indeksiranje događaja i operacije koje prelaze granicu između Polygon Chain mreže i Ethereuma.&lt;/p&gt;

&lt;h2&gt;
  
  
  POL nije samo novi simbol za MATIC
&lt;/h2&gt;

&lt;p&gt;Na Polygon Chain mreži prelazak sa MATIC-a na POL obavljen je automatski. Balansi nisu zahtevali ručnu migraciju, mada su wallet aplikacije i konfiguracije mreže morale da promene simbol nativne valute iz &lt;code&gt;MATIC&lt;/code&gt; u &lt;code&gt;POL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Za MATIC koji se nalazi na Ethereumu migracija je drugačija. Koristi se migracioni ugovor, a konverzija je 1:1. Stakeri i delegatori nisu morali ručno da migriraju svoj ulog.&lt;/p&gt;

&lt;p&gt;U praksi treba proveriti sledeće:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;konfiguracije mreže treba da prikazuju &lt;code&gt;POL&lt;/code&gt;, ne &lt;code&gt;MATIC&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tekst u interfejsu, dokumentaciji i obaveštenjima o gasu treba ažurirati&lt;/li&gt;
&lt;li&gt;treasury i monitoring sistemi ne treba da tretiraju POL i MATIC kao dva nezavisna nativna sredstva na Polygon Chain mreži&lt;/li&gt;
&lt;li&gt;ugovori i servisi koji očekuju MATIC sa bridge-a moraju biti provereni&lt;/li&gt;
&lt;li&gt;token liste i price feed konfiguracije ne treba menjati samo na osnovu simbola&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Poslednja stavka je posebno važna. Simbol tokena nije identitet tokena. Identitet je kombinacija mreže i adrese ugovora, dok nativni POL na Polygon Chain mreži uopšte nije ERC-20 ugovor.&lt;/p&gt;

&lt;p&gt;POL na Ethereumu jeste ERC-20 token i podržava EIP-2612 dozvole zasnovane na potpisu. Nativni POL na Polygon Chain mreži koristi se kao ETH na Ethereumu: plaća gas i šalje se kao nativna vrednost transakcije.&lt;/p&gt;

&lt;p&gt;Ako aplikacija ima generički model sredstava, razlika treba da bude eksplicitna:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Asset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
          &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;erc20&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
          &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`0x&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
          &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Model u kojem se svaki asset identifikuje samo simbolom pre ili kasnije dovodi do pogrešnog balansa, pogrešnog odobrenja ili slanja tokena na neodgovarajuću mrežu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako Polygon Chain zapravo radi
&lt;/h2&gt;

&lt;p&gt;Polygon Chain ima dva glavna softverska sloja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bor&lt;/strong&gt; je izvršni sloj zasnovan na Go Ethereum kodu. Izvršava EVM transakcije i proizvodi blokove.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heimdall-v2&lt;/strong&gt; je konsenzusni i koordinacioni sloj zasnovan na Cosmos SDK-u i CometBFT-u. Prati staking na Ethereumu, koordinira validatore, finalizuje segmente Bor lanca i šalje kontrolne tačke na Ethereum.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To znači da aplikacija komunicira sa Polygon Chain mrežom preko standardnog Ethereum JSON-RPC interfejsa. Alati kao što su Foundry, Hardhat, viem i ethers mogu se koristiti bez posebnog Polygon programskog modela.&lt;/p&gt;

&lt;p&gt;Ipak, EVM kompatibilnost ne znači da je operativno ponašanje identično Ethereum mainnetu.&lt;/p&gt;

&lt;p&gt;Polygon Chain ima sopstveni raspored blokova, validatore, gas tržište i finalnost. Checkpoint na Ethereumu takođe nije isto što i finalnost transakcije unutar Polygon Chain mreže.&lt;/p&gt;

&lt;p&gt;Heimdall-v2 koristi milestones kako bi obezbedio determinističku finalnost na samom Polygon lancu. Prema aktuelnoj dokumentaciji, milestone obično finalizuje transakciju za približno 2 do 5 sekundi. Checkpointi koji se naknadno šalju na Ethereum služe za dodatno sidrenje stanja i za procese kao što je dokazivanje burn operacije prilikom povlačenja sredstava.&lt;/p&gt;

&lt;p&gt;Ovo daje tri različita stanja koja backend treba da razlikuje:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;transakcija je poslata, ali još nema receipt&lt;/li&gt;
&lt;li&gt;transakcija je uključena u blok&lt;/li&gt;
&lt;li&gt;blok transakcije je finalizovan milestone-om&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mnoge integracije stanu na drugom koraku. To je često dovoljno za optimistički UI, ali nije uvek dovoljno za nepovratnu isporuku robe, izdavanje kupona, knjiženje novca ili pokretanje off-chain procesa koji se ne može vratiti.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kada Polygon ima smisla
&lt;/h2&gt;

&lt;p&gt;Polygon Chain je praktičan kada aplikacija generiše mnogo transakcija čija je pojedinačna vrednost relativno mala.&lt;/p&gt;

&lt;p&gt;Tipični primeri su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;programi nagrađivanja i lojalnosti&lt;/li&gt;
&lt;li&gt;onchain članstva i pristupne dozvole&lt;/li&gt;
&lt;li&gt;evidencija izdavanja i iskorišćavanja digitalnih prava&lt;/li&gt;
&lt;li&gt;igre sa čestim promenama stanja&lt;/li&gt;
&lt;li&gt;marketplace poravnanja&lt;/li&gt;
&lt;li&gt;stablecoin plaćanja&lt;/li&gt;
&lt;li&gt;dokaz o izvršenoj akciji između više organizacija&lt;/li&gt;
&lt;li&gt;NFT ili ERC-1155 imovina koja se često izdaje i prenosi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ključni razlog nije samo niži gas. Važna je kombinacija EVM kompatibilnosti, brze finalnosti i postojeće infrastrukture za wallete, RPC pristup i indeksiranje.&lt;/p&gt;

&lt;p&gt;To ne znači da svaki događaj treba zapisati u blokčejn. Ako je jedna baza podataka jedini autoritet, svi učesnici veruju istom operatoru i podaci nikada ne izlaze iz jedne aplikacije, PostgreSQL je obično jednostavniji izbor.&lt;/p&gt;

&lt;p&gt;Polygon postaje zanimljiv kada više strana treba da deli stanje bez jednog vlasnika baze ili kada korisnik treba da zadrži sredstvo i van originalne aplikacije.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan use-case: program lojalnosti više partnera
&lt;/h2&gt;

&lt;p&gt;Zamisli program lojalnosti u kojem restorani, prodavnice i organizatori događaja izdaju zajedničke kredite. Korisnik može dobiti kredit kod jednog partnera, a iskoristiti ga kod drugog.&lt;/p&gt;

&lt;p&gt;Klasična implementacija zahteva centralni servis koji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vodi saldo svakog korisnika&lt;/li&gt;
&lt;li&gt;određuje ko sme da izdaje kredite&lt;/li&gt;
&lt;li&gt;rešava dvostruko iskorišćavanje&lt;/li&gt;
&lt;li&gt;obračunava dugovanja između partnera&lt;/li&gt;
&lt;li&gt;pruža audit log svim učesnicima&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Onchain implementacija ne uklanja poslovna pravila, ali može da obezbedi zajednički izvor istine za izdavanje i iskorišćavanje kredita.&lt;/p&gt;

&lt;p&gt;Jedan razuman dizajn mogao bi da izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Partnerov backend proverava kupovinu ili drugu kvalifikovanu akciju.&lt;/li&gt;
&lt;li&gt;Backend generiše EIP-712 potpisani voucher sa korisnikom, iznosom, kampanjom, nonce vrednošću i rokom važenja.&lt;/li&gt;
&lt;li&gt;Korisnik ili relayer šalje voucher ugovoru.&lt;/li&gt;
&lt;li&gt;Ugovor proverava potpis, ulogu izdavaoca, rok i nonce.&lt;/li&gt;
&lt;li&gt;Stanje se ažurira i emituje se događaj.&lt;/li&gt;
&lt;li&gt;Indekser svakog partnera obrađuje događaj.&lt;/li&gt;
&lt;li&gt;Nepovratna off-chain isporuka čeka finalizovan blok.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Voucher model smanjuje potrebu da partnerov backend šalje transakciju za svaku akciju. Istovremeno, nonce sprečava ponovno korišćenje istog potpisa.&lt;/p&gt;

&lt;p&gt;Potpisani podaci treba da sadrže najmanje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chainId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;adresu verifying ugovora&lt;/li&gt;
&lt;li&gt;identifikator kampanje&lt;/li&gt;
&lt;li&gt;adresu korisnika&lt;/li&gt;
&lt;li&gt;količinu&lt;/li&gt;
&lt;li&gt;nonce&lt;/li&gt;
&lt;li&gt;rok važenja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bez &lt;code&gt;chainId&lt;/code&gt; i adrese ugovora potpis može postati upotrebljiv na drugoj mreži ili drugoj instanci ugovora. Bez nonce vrednosti dobijaš replay problem. Bez roka važenja stari voucher može ostati aktivan neograničeno dugo.&lt;/p&gt;

&lt;h2&gt;
  
  
  POL ne mora biti vidljiv korisniku
&lt;/h2&gt;

&lt;p&gt;Ako korisnik mora prvo da kupi POL kako bi iskoristio nagradu vrednu nekoliko centi, tehnički je sistem decentralizovan, ali je proizvod verovatno loš.&lt;/p&gt;

&lt;p&gt;Polygon Chain podržava standardne obrasce za odvajanje potpisnika akcije od platioca gasa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;meta-transakcije sa relayerom&lt;/li&gt;
&lt;li&gt;ERC-4337 smart accounti&lt;/li&gt;
&lt;li&gt;paymaster koji sponzoriše gas&lt;/li&gt;
&lt;li&gt;aplikacioni wallet sa kontrolisanim pravilima izvršavanja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kod klasične meta-transakcije korisnik potpisuje poruku, relayer proverava zahtev i šalje standardnu transakciju o svom trošku. Ugovor zatim proverava originalni potpis i izvršava akciju u ime korisnika.&lt;/p&gt;

&lt;p&gt;ERC-4337 uvodi &lt;code&gt;UserOperation&lt;/code&gt;, bundler, &lt;code&gt;EntryPoint&lt;/code&gt; i opcioni paymaster. To pruža više mogućnosti, kao što su sponzorisani gas, grupisanje akcija i pravila specifična za smart account, ali uvodi dodatnu infrastrukturu i složeniji failure model.&lt;/p&gt;

&lt;p&gt;Gas sponsorship zato nije besplatan gas. Samo se menja ko drži POL i ko upravlja budžetom.&lt;/p&gt;

&lt;p&gt;Backend tada mora da kontroliše:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;maksimalan gas po korisniku ili akciji&lt;/li&gt;
&lt;li&gt;dozvoljene metode i ugovore&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;zaštitu od replay napada&lt;/li&gt;
&lt;li&gt;dnevni i mesečni budžet&lt;/li&gt;
&lt;li&gt;ponašanje kada relayer pošalje transakciju, ali izgubi odgovor&lt;/li&gt;
&lt;li&gt;ponovno slanje i zamenu zaglavljene transakcije&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za program lojalnosti ima smisla sponzorisati &lt;code&gt;claim&lt;/code&gt; ili &lt;code&gt;redeem&lt;/code&gt;. Nema smisla sponzorisati proizvoljnu transakciju koju korisnik izabere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integracija je standardni EVM workflow
&lt;/h2&gt;

&lt;p&gt;Za Polygon mainnet koristi se chain ID &lt;code&gt;137&lt;/code&gt;, dok Amoy testnet koristi &lt;code&gt;80002&lt;/code&gt;. Gas token na obe mreže je POL. Javni RPC endpointi postoje, ali zvanična dokumentacija upozorava da mogu imati ograničenja protoka i saobraćaja.&lt;/p&gt;

&lt;p&gt;Razuman razvojni workflow izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ugovore razvijaš i testiraš lokalno pomoću Anvila ili Hardhat Networka.&lt;/li&gt;
&lt;li&gt;Integracione testove pokrećeš na Amoy mreži.&lt;/li&gt;
&lt;li&gt;Frontend proverava aktivni &lt;code&gt;chainId&lt;/code&gt; pre potpisivanja.&lt;/li&gt;
&lt;li&gt;Backend koristi autentifikovani RPC provajder.&lt;/li&gt;
&lt;li&gt;Kritična čitanja imaju fallback RPC.&lt;/li&gt;
&lt;li&gt;Transakcija se prvo simulira, zatim potpisuje i šalje.&lt;/li&gt;
&lt;li&gt;UI prikazuje stanje slanja, uključivanja i finalnosti odvojeno.&lt;/li&gt;
&lt;li&gt;Indekser obrađuje događaje idempotentno.&lt;/li&gt;
&lt;li&gt;Nepovratne off-chain akcije čekaju finalizovan blok.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test POL za Amoy dostupan je preko nezavisnih faucet provajdera. Prema aktuelnoj dokumentaciji, raniji zvanični Polygon Faucet više nije operativan, pa projekat ne treba da ga hardkodira kao jedini deo onboarding procesa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipt nije isto što i finalnost
&lt;/h2&gt;

&lt;p&gt;Standardni Ethereum JSON-RPC tag &lt;code&gt;"finalized"&lt;/code&gt; može se koristiti za dobijanje poslednjeg finalizovanog bloka na Polygon Chain mreži.&lt;/p&gt;

&lt;p&gt;Sledeća skripta proverava da li je blok određene transakcije već finalizovan. Koristi Amoy, ali je isti obrazac primenljiv na mainnet uz promenu chain konfiguracije i RPC URL-a.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;formatEther&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;polygonAmoy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;viem/chains&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rpcUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;POLYGON_AMOY_RPC_URL&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;rpcUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POLYGON_AMOY_RPC_URL nije podešen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="s2"&gt;`0x&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Prosledi transaction hash kao argument&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;polygonAmoy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rpcUrl&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForTransactionReceipt&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;finalizedBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlock&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;blockTag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;finalized&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;finalizedBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RPC nije vratio broj finalizovanog bloka&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gasCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gasUsed&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;effectiveGasPrice&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isFinalized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blockNumber&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;finalizedBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;transactionBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blockNumber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;finalizedBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;finalizedBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;gasCostPOL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;formatEther&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gasCost&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;isFinalized&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Viem izvozi &lt;code&gt;polygonAmoy&lt;/code&gt; kroz &lt;code&gt;viem/chains&lt;/code&gt;, a njegov &lt;code&gt;Public Client&lt;/code&gt; podržava čitanje blokova i čekanje na receipt preko standardnog JSON-RPC transporta.&lt;/p&gt;

&lt;p&gt;U produkciji ovu proveru obično ne treba izvršavati samo jednom. Worker može da sačuva transakciju kao &lt;code&gt;included&lt;/code&gt;, periodično čita finalizovani blok i tek potom pređe u stanje &lt;code&gt;finalized&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko košta transakcija
&lt;/h2&gt;

&lt;p&gt;Polygon nema fiksnu cenu transakcije.&lt;/p&gt;

&lt;p&gt;Stvarni trošak može se izračunati nakon izvršenja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gasUsed × effectiveGasPrice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maksimalni iznos koji je pošiljalac spreman da plati približno je ograničen sa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gasLimit × maxFeePerGas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rezultat je denominovan u POL. Njegova vrednost u fiat valuti zavisi od tržišne cene POL-a u trenutku obračuna.&lt;/p&gt;

&lt;p&gt;Polygon Chain koristi EIP-1559 model sa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;baseFee&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxPriorityFeePerGas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maxFeePerGas&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Legacy transakcije su i dalje kompatibilne, ali se preporučuju Type 2 transakcije. Aktuelna dokumentacija navodi i minimalni priority fee od &lt;code&gt;25 gwei&lt;/code&gt; na mainnetu.&lt;/p&gt;

&lt;p&gt;Ako wallet ili biblioteka automatski popunjava fee polja, obično nije potrebno ručno unositi vrednosti. Ako backend sam konstruiše transakcije, Polygon Gas Station daje preporuke za &lt;code&gt;safeLow&lt;/code&gt;, &lt;code&gt;standard&lt;/code&gt; i &lt;code&gt;fast&lt;/code&gt; profile.&lt;/p&gt;

&lt;p&gt;Mainnet preporuke dostupne su na:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://gasstation.polygon.technology/v2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Za Amoy se koristi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://gasstation.polygon.technology/amoy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vrednosti ne treba kopirati iz dokumentacije i hardkodirati. Gas Station ih izračunava iz &lt;code&gt;eth_feeHistory&lt;/code&gt; podataka poslednjih blokova, pa ih treba čitati neposredno pre slanja transakcije.&lt;/p&gt;

&lt;p&gt;Kod ugovorne funkcije cenu je najbolje proceniti na konkretnoj transakciji:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pripremi calldata&lt;/li&gt;
&lt;li&gt;izvrši simulaciju&lt;/li&gt;
&lt;li&gt;pozovi &lt;code&gt;eth_estimateGas&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;dodaj kontrolisanu rezervu na gas limit&lt;/li&gt;
&lt;li&gt;preuzmi trenutne fee preporuke&lt;/li&gt;
&lt;li&gt;postavi maksimalan prihvatljiv trošak&lt;/li&gt;
&lt;li&gt;pošalji transakciju&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Gas sponsorship zahteva dodatni poslovni limit. Ako aplikacija ima milion korisnika, čak i male pojedinačne naknade postaju značajan operativni trošak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako organizovati backend
&lt;/h2&gt;

&lt;p&gt;Pouzdana Polygon integracija ne završava se pozivom &lt;code&gt;writeContract&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Backend najčešće ima najmanje četiri komponente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transaction service&lt;/li&gt;
&lt;li&gt;nonce manager&lt;/li&gt;
&lt;li&gt;event indexer&lt;/li&gt;
&lt;li&gt;reconciliation worker&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Transaction service
&lt;/h3&gt;

&lt;p&gt;Transaction service simulira zahtev, procenjuje gas, potpisuje i šalje transakciju. Njegov API treba da prima poslovni identifikator, ne samo calldata.&lt;/p&gt;

&lt;p&gt;Na primer, zahtev za izdavanje nagrade može imati interni &lt;code&gt;rewardId&lt;/code&gt;. Ako klijent ponovi HTTP zahtev zbog timeouta, servis proverava da li za isti &lt;code&gt;rewardId&lt;/code&gt; već postoji kreirana ili poslata transakcija.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nonce manager
&lt;/h3&gt;

&lt;p&gt;Ako jedan treasury ili relayer nalog šalje više paralelnih transakcija, oslanjanje na &lt;code&gt;eth_getTransactionCount&lt;/code&gt; neposredno pre svakog slanja nije dovoljno.&lt;/p&gt;

&lt;p&gt;Dva procesa mogu pročitati isti nonce i potpisati različite transakcije. Zato nonce treba rezervisati atomskom operacijom, najčešće kroz bazu ili distribuirani lock.&lt;/p&gt;

&lt;p&gt;Potrebno je podržati i zamenu transakcije sa istim nonce-om i većim fee parametrima.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event indexer
&lt;/h3&gt;

&lt;p&gt;Događaje treba identifikovati kombinacijom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chainId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;adrese ugovora&lt;/li&gt;
&lt;li&gt;transaction hash-a&lt;/li&gt;
&lt;li&gt;indeksa loga&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transaction hash sam po sebi nije dovoljan jer jedna transakcija može emitovati više događaja istog tipa.&lt;/p&gt;

&lt;p&gt;Indexer takođe treba da razlikuje događaj koji je samo primećen od događaja čiji je blok finalizovan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reconciliation worker
&lt;/h3&gt;

&lt;p&gt;RPC timeout ne znači da transakcija nije poslata. Proces može da pošalje raw transaction, izgubi mrežni odgovor i pogrešno zaključi da slanje nije uspelo.&lt;/p&gt;

&lt;p&gt;Reconciliation worker zato proverava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da li transaction hash postoji&lt;/li&gt;
&lt;li&gt;da li je nonce već iskorišćen&lt;/li&gt;
&lt;li&gt;da li je transakcija zamenjena&lt;/li&gt;
&lt;li&gt;da li je receipt uspešan ili reverted&lt;/li&gt;
&lt;li&gt;da li je blok finalizovan&lt;/li&gt;
&lt;li&gt;da li je očekivani događaj emitovan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To je naročito važno kada blockchain transakcija pokreće fakturisanje, izdavanje digitalne robe ili promenu stanja u drugom sistemu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most nije običan transfer
&lt;/h2&gt;

&lt;p&gt;Prebacivanje sredstava između Ethereuma i Polygon Chain mreže nije isto što i transfer unutar jednog lanca.&lt;/p&gt;

&lt;p&gt;Bridge operacija uključuje najmanje dva različita konsenzusna domena i više stanja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inicirana&lt;/li&gt;
&lt;li&gt;potvrđena na izvornom lancu&lt;/li&gt;
&lt;li&gt;dostupna za dokazivanje ili claim&lt;/li&gt;
&lt;li&gt;izvršena na odredišnom lancu&lt;/li&gt;
&lt;li&gt;neuspešna ili zaglavljena&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aplikacija zato ne treba da prikazuje samo &lt;code&gt;pending&lt;/code&gt; i &lt;code&gt;completed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Za povlačenje sa Polygon Chain mreže na Ethereum, checkpointi imaju posebnu ulogu jer obezbeđuju dokaz o burn operaciji. To znači da finalnost na Polygon Chain mreži i spremnost bridge withdrawal operacije nisu ista stvar.&lt;/p&gt;

&lt;p&gt;Ako proizvod često pomera likvidnost između mreža, bridge workflow treba tretirati kao zaseban podsistem sa sopstvenim monitoringom i reconciliation logikom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Glavni trade-offi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dobijaš EVM kompatibilnost
&lt;/h3&gt;

&lt;p&gt;Postojeći Solidity kod, ABI-ji i većina Ethereum alata mogu se koristiti uz relativno male izmene.&lt;/p&gt;

&lt;p&gt;Ali ne treba pretpostaviti da svaka aplikaciona odluka sa Ethereum mainneta ostaje optimalna. Drugačiji gas i brži blokovi mogu opravdati drugačiji batching, indeksiranje i UX.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dobijaš bržu finalnost
&lt;/h3&gt;

&lt;p&gt;Milestones omogućavaju determinističku finalnost bez čekanja na Ethereum checkpoint.&lt;/p&gt;

&lt;p&gt;Ipak, receipt i finalnost treba odvojeno pratiti. Wallet može prikazati potvrdu pre nego što backend transakciju smatra konačnom.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plaćaš manje po akciji, ali dobijaš više akcija
&lt;/h3&gt;

&lt;p&gt;Niže naknade često menjaju ponašanje proizvoda. Funkcija koja se na Ethereumu poziva jednom mesečno na Polygonu može biti pozivana pri svakoj korisničkoj akciji.&lt;/p&gt;

&lt;p&gt;To povećava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;broj nonce konflikata&lt;/li&gt;
&lt;li&gt;opterećenje RPC-a&lt;/li&gt;
&lt;li&gt;broj događaja za indeksiranje&lt;/li&gt;
&lt;li&gt;trošak relayera&lt;/li&gt;
&lt;li&gt;potrebu za batchingom i rate limitingom&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Korisnicima je potreban POL ili sponzor
&lt;/h3&gt;

&lt;p&gt;Ako ne koristiš relayer ili paymaster, korisnik mora imati POL. To je prihvatljivo za DeFi aplikaciju, ali često nije prihvatljivo za consumer proizvod.&lt;/p&gt;

&lt;p&gt;Sponzorisanje rešava UX problem, ali treasury tada preuzima promenljiv gas trošak i rizik zloupotrebe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bezbednosni model nije Ethereum L1
&lt;/h3&gt;

&lt;p&gt;Polygon Chain ima sopstveni skup validatora i sopstveni konsenzus, dok se checkpoint podaci objavljuju na Ethereumu.&lt;/p&gt;

&lt;p&gt;To nije isti model kao direktno izvršavanje na Ethereum L1. Takođe ga ne treba automatski izjednačavati sa rollupom koji stanje dokazuje Ethereumu. Izbor zavisi od vrednosti koja se štiti i posledica eventualnog prekida mreže ili bridge infrastrukture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Javni RPC nije produkcioni SLA
&lt;/h3&gt;

&lt;p&gt;Javni endpoint je koristan za lokalni razvoj i probne skripte. Za produkciju obično su potrebni autentifikovani provajder, metrike, retry pravila i najmanje jedan fallback.&lt;/p&gt;

&lt;p&gt;Retry treba primenjivati pažljivo. Ponoviti &lt;code&gt;eth_call&lt;/code&gt; je jednostavno. Ponoviti poslovnu operaciju koja potpisuje novu transakciju bez idempotency ključa nije.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polygon Chain, CDK i zkEVM nisu ista odluka
&lt;/h2&gt;

&lt;p&gt;Ime Polygon danas obuhvata više slojeva infrastrukture. Izbor Polygon Chain mreže znači da aplikaciju postavljaš na postojeći chain ID &lt;code&gt;137&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Polygon CDK je druga odluka: koristi se kada želiš sopstveni lanac i spreman si da upravljaš dodatnom infrastrukturom, parametrima i interoperabilnošću.&lt;/p&gt;

&lt;p&gt;Polygon zkEVM je ranije bio zasebna javna mreža. Aktuelna Polygon dokumentacija ga označava kao deprecated i ne preporučuje ga za nove integracije. Za nove aplikacije preporučuju se Polygon Chain ili CDK, zavisno od toga da li koristiš postojeću mrežu ili pokrećeš sopstveni lanac.&lt;/p&gt;

&lt;p&gt;Zato zahtev „aplikacija treba da radi na Polygonu” nije dovoljno precizan. Tehnička specifikacija treba da sadrži bar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;naziv mreže&lt;/li&gt;
&lt;li&gt;chain ID&lt;/li&gt;
&lt;li&gt;nativnu valutu&lt;/li&gt;
&lt;li&gt;RPC provajdera&lt;/li&gt;
&lt;li&gt;explorer&lt;/li&gt;
&lt;li&gt;očekivani nivo finalnosti&lt;/li&gt;
&lt;li&gt;bridge koji se koristi&lt;/li&gt;
&lt;li&gt;token adrese po mreži&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Praktična odluka
&lt;/h2&gt;

&lt;p&gt;Polygon Chain je dobar kandidat kada aplikaciji treba EVM okruženje za veliki broj relativno jeftinih transakcija, uz finalnost dovoljno brzu za interaktivni proizvod.&lt;/p&gt;

&lt;p&gt;Nije automatski najbolji izbor kada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sva stanja kontroliše jedan backend&lt;/li&gt;
&lt;li&gt;nema potrebe za prenosivom digitalnom imovinom&lt;/li&gt;
&lt;li&gt;vrednost transakcije zahteva bezbednosni model Ethereum L1&lt;/li&gt;
&lt;li&gt;proizvod ne može operativno da podrži wallet, RPC, indeksiranje i reconciliation&lt;/li&gt;
&lt;li&gt;bridge predstavlja kritičnu tačku koju tim ne može pouzdano da nadgleda&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Najkorisniji prvi eksperiment nije izdavanje novog tokena. Bolje je uzeti jednu ograničenu funkciju, kao što je izdavanje potvrde, redeem potpisanog vouchera ili zapisivanje zajedničkog audit događaja, postaviti je na Amoy i izmeriti ceo workflow.&lt;/p&gt;

&lt;p&gt;Tada postaju vidljive stvari koje se ne vide iz Solidity koda: koliko traje finalnost, kako wallet reaguje na promenu mreže, kako RPC otkazuje, kako se rešava duplo slanje i koliko zaista košta jedna poslovna operacija.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/pos/concepts/tokens/pol/" rel="noopener noreferrer"&gt;POL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/pos/concepts/tokens/matic-to-pol/" rel="noopener noreferrer"&gt;Migrate to POL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/pos/architecture/overview/" rel="noopener noreferrer"&gt;Polygon Chain architecture overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/pos/concepts/finality/finality/" rel="noopener noreferrer"&gt;Finality&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/pos/reference/rpc-endpoints/" rel="noopener noreferrer"&gt;RPC endpoints&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/tools/gas/polygon-gas-station/" rel="noopener noreferrer"&gt;Estimate gas fees&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/pos/concepts/transactions/eip-1559/" rel="noopener noreferrer"&gt;EIP-1559&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/pos/concepts/transactions/meta-transactions/" rel="noopener noreferrer"&gt;Meta transactions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/pos/concepts/transactions/eip-4337/" rel="noopener noreferrer"&gt;EIP-4337&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polygon Developer Docs, &lt;a href="https://docs.polygon.technology/tools/gas/matic-faucet/" rel="noopener noreferrer"&gt;Test token faucets&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Viem Documentation, &lt;a href="https://viem.sh/docs/clients/public" rel="noopener noreferrer"&gt;Public Client&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Viem Documentation, &lt;a href="https://viem.sh/docs/chains/introduction" rel="noopener noreferrer"&gt;Chains&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>polygon</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Avalanche za developere: od C-Chain dAppa do L1 mreže</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Sat, 19 Sep 2026 00:03:45 +0000</pubDate>
      <link>https://dev.to/kriptomuza/avalanche-za-developere-od-c-chain-dappa-do-l1-mreze-5gc8</link>
      <guid>https://dev.to/kriptomuza/avalanche-za-developere-od-c-chain-dappa-do-l1-mreze-5gc8</guid>
      <description>&lt;p&gt;Avalanche je najlakše pogrešno razumeti kao još jedan brži Ethereum kompatibilni blockchain. C-Chain zaista izgleda poznato: Solidity, EVM, JSON-RPC, Foundry, Hardhat i standardni wallet adapteri. Međutim, zanimljiviji deo arhitekture počinje kada aplikaciji više nije dovoljan shared chain.&lt;/p&gt;

&lt;p&gt;Tada Avalanche nudi prelazak sa aplikacije na C-Chainu na sopstvenu L1 mrežu sa odvojenim izvršavanjem, validatorima, gas tokenom i pravilima pristupa. To nije automatski bolja arhitektura. To je zamena jednog skupa ograničenja drugim.&lt;/p&gt;

&lt;p&gt;Praktično pitanje zato nije samo „da li da koristim Avalanche“, već:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Da li je aplikaciji dovoljan javni EVM chain?&lt;/li&gt;
&lt;li&gt;Da li su joj potrebni izolovani resursi i prilagodljiva ekonomija?&lt;/li&gt;
&lt;li&gt;Da li tim zaista želi da postane operator blockchain infrastrukture?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Avalanche nije jedan blockchain
&lt;/h2&gt;

&lt;p&gt;Avalanche Mainnet čine Primary Network i Avalanche L1 mreže. Primary Network sadrži tri ugrađena chaina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C-Chain za EVM smart contracte&lt;/li&gt;
&lt;li&gt;P-Chain za validatore, staking i L1 operacije&lt;/li&gt;
&lt;li&gt;X-Chain za Avalanche native asset operacije&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za većinu dApp developera C-Chain je početna tačka. Njegov EVM chain ID je &lt;code&gt;43114&lt;/code&gt;, dok Fuji C-Chain testnet koristi &lt;code&gt;43113&lt;/code&gt;. Zvanični RPC endpointi su:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mainnet: https://api.avax.network/ext/bc/C/rpc
Fuji:    https://api.avax-test.network/ext/bc/C/rpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C-Chain koristi Coreth, Avalanche implementaciju EVM-a, i izlaže Ethereum kompatibilan JSON-RPC. To znači da frontend ili backend koji već komunicira sa Ethereum mrežama uglavnom mora da promeni samo chain konfiguraciju, RPC URL i način finansiranja gas troškova.&lt;/p&gt;

&lt;p&gt;P-Chain nije mesto na kojem se izvršavaju Solidity ugovori. On koordinira validatore, registraciju L1 mreža i druge platform-level operacije. Developeri ga najčešće dodirnu tek kada pokreću sopstveni L1 ili rade sa stakingom.&lt;/p&gt;

&lt;p&gt;Važna ispravka za stare tehničke tekstove: X-Chain više ne koristi originalni Avalanche DAG consensus u produkciji. Linearizovan je tokom Cortina nadogradnje 2023. godine, pa danas sva tri chaina Primary Networka koriste Snowman porodicu protokola.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta developer dobija na C-Chainu
&lt;/h2&gt;

&lt;p&gt;C-Chain je shared, permissionless EVM okruženje. Aplikacija deli blockspace, validatore i fee market sa drugim aplikacijama, ali zauzvrat dobija već postojeću mrežu, standardne integracije i jednostavniji operativni model.&lt;/p&gt;

&lt;p&gt;Za Ethereum developera migracija obično ne zahteva promenu programske paradigme:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smart contracti ostaju u Solidityju&lt;/li&gt;
&lt;li&gt;ABI i event logovi rade na poznat način&lt;/li&gt;
&lt;li&gt;Transakcije koriste EIP-1559 stil naknada&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt; i ostali standardni RPC pozivi ostaju dostupni&lt;/li&gt;
&lt;li&gt;Postojeći EVM walleti i biblioteke uglavnom mogu da se koriste bez posebnog Avalanche SDK-a&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zbog toga je C-Chain razuman izbor kada je cilj da se proizvod testira, a ne da se odmah dizajnira nova mreža.&lt;/p&gt;

&lt;p&gt;Najveća praktična prednost nije neka posebna Solidity funkcija. To je mogućnost da postojeći EVM sistem bude integrisan bez razvoja sopstvenog execution layera i bez održavanja validatorske infrastrukture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kada shared EVM prestaje da bude dovoljan
&lt;/h2&gt;

&lt;p&gt;Avalanche L1 je suverena mreža sa sopstvenim validatorskim skupom i jednim ili više blockchainova. Svaki blockchain validira tačno jedna L1 mreža, ali jedna L1 može da validira više blockchainova.&lt;/p&gt;

&lt;p&gt;Kod EVM L1 mreža najčešći execution layer je Subnet-EVM. Naziv je ostao iz prethodne Avalanche terminologije, iako aktuelna dokumentacija proizvod uglavnom naziva Avalanche L1.&lt;/p&gt;

&lt;p&gt;Subnet-EVM daje poznato EVM okruženje, ali uz mogućnost menjanja parametara koji su na C-Chainu mrežni standard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native token koji se koristi za gas&lt;/li&gt;
&lt;li&gt;Fee konfiguracija&lt;/li&gt;
&lt;li&gt;Genesis alokacije&lt;/li&gt;
&lt;li&gt;Pravila za deploy smart contracta&lt;/li&gt;
&lt;li&gt;Dozvole za slanje transakcija&lt;/li&gt;
&lt;li&gt;Validatorski model&lt;/li&gt;
&lt;li&gt;Stateful precompile ugovori&lt;/li&gt;
&lt;li&gt;Chain ID i mrežni identitet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To ima smisla kada sama mreža postane deo proizvoda, a ne samo mesto na kojem je proizvod deployovan.&lt;/p&gt;

&lt;p&gt;Tipični signali da vredi razmotriti L1 su:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aplikacija ima predvidivo veliko ili veoma promenljivo opterećenje.&lt;/li&gt;
&lt;li&gt;Gas mora da se plaća sopstvenim tokenom.&lt;/li&gt;
&lt;li&gt;Potrebni su permissioned validatori ili pravila pristupa na nivou protokola.&lt;/li&gt;
&lt;li&gt;Aplikacija ne sme da zavisi od aktivnosti drugih dAppova.&lt;/li&gt;
&lt;li&gt;Standardni EVM nije dovoljan i potrebni su posebni precompile ugovori.&lt;/li&gt;
&lt;li&gt;Organizacija može da finansira i održava nodes, RPC infrastrukturu i monitoring.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ako nijedan od ovih razloga nije presudan, C-Chain je obično jednostavniji izbor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan use-case: mreža za partnerski loyalty sistem
&lt;/h2&gt;

&lt;p&gt;Zamislimo loyalty platformu koju koriste trgovci, distributeri i payment procesori. Korisnik dobija bodove kod jednog partnera i troši ih kod drugog, dok kompanije periodično poravnavaju obaveze.&lt;/p&gt;

&lt;p&gt;Prva verzija sistema može da radi na C-Chainu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ERC-20 predstavlja bodove ili settlement jedinice&lt;/li&gt;
&lt;li&gt;Smart contract vodi mint, burn i transfer pravila&lt;/li&gt;
&lt;li&gt;Backend prati event logove&lt;/li&gt;
&lt;li&gt;Administrativne operacije kontroliše multisig&lt;/li&gt;
&lt;li&gt;Korisnik ili relayer plaća gas u AVAX-u&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ovaj model je dobar za validaciju proizvoda. Nema validatorske infrastrukture, poseban explorer nije obavezan, a ugovori koriste standardni EVM tooling.&lt;/p&gt;

&lt;p&gt;Problemi se pojavljuju kada broj partnera i transakcija poraste:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kompanije žele da gas plaćaju internim utility tokenom&lt;/li&gt;
&lt;li&gt;Samo verifikovani partneri smeju da izvršavaju određene transakcije&lt;/li&gt;
&lt;li&gt;Deploy novih ugovora mora da bude ograničen&lt;/li&gt;
&lt;li&gt;Neočekivana aktivnost na javnom chainu ne sme da utiče na troškove&lt;/li&gt;
&lt;li&gt;Validatori treba da budu raspoređeni između nekoliko poslovnih entiteta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;U tom trenutku Avalanche L1 može biti smislen sledeći korak.&lt;/p&gt;

&lt;p&gt;L1 može koristiti permissioned Proof-of-Authority validatorski model, sopstveni native token za gas i precompile pravila koja ograničavaju ko sme da šalje transakcije ili deployuje ugovore. To ne pretvara blockchain u klasičnu privatnu bazu podataka. Stanje i izvršavanje su i dalje replikovani između validatora, ali članstvo i protokolska pravila kontroliše sama L1 mreža.&lt;/p&gt;

&lt;p&gt;Cena te kontrole je veća odgovornost. Ako tri kompanije kontrolišu sva tri validatora, bezbednosni model je upravo takav, bez obzira na to koliko je Avalanche Primary Network decentralizovan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Praktičan workflow: prvo C-Chain, zatim L1
&lt;/h2&gt;

&lt;p&gt;Najzdraviji razvojni put obično počinje kao standardan EVM projekat.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Izolujte chain-specific delove aplikacije
&lt;/h3&gt;

&lt;p&gt;Contract sloj ne treba da zna RPC URL. Frontend ne treba da hardkoduje chain ID na deset mesta. Backend ne treba da pretpostavlja da je native token uvek ETH.&lt;/p&gt;

&lt;p&gt;Centralizujte najmanje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RPC konfiguraciju&lt;/li&gt;
&lt;li&gt;Chain ID&lt;/li&gt;
&lt;li&gt;Explorer URL&lt;/li&gt;
&lt;li&gt;Native currency metadata&lt;/li&gt;
&lt;li&gt;Contract adrese&lt;/li&gt;
&lt;li&gt;Confirmation i retry politiku&lt;/li&gt;
&lt;li&gt;Podržanu EVM verziju&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tako se C-Chain, Fuji i budući L1 tretiraju kao različita deployment okruženja istog sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Eksplicitno postavite Cancun EVM target
&lt;/h3&gt;

&lt;p&gt;Aktuelna Avalanche dokumentacija navodi da C-Chain i Subnet-EVM podržavaju Cancun, ali ne i novije EVM hard forkove poput Pectre. Ovo je posebno važno sa Solidityjem &lt;code&gt;0.8.30&lt;/code&gt; i novijim verzijama, jer compiler može podrazumevano da cilja noviji EVM.&lt;/p&gt;

&lt;p&gt;Minimalni &lt;code&gt;foundry.toml&lt;/code&gt; može da izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[profile.default]&lt;/span&gt;
&lt;span class="py"&gt;evm_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cancun"&lt;/span&gt;

&lt;span class="nn"&gt;[rpc_endpoints]&lt;/span&gt;
&lt;span class="py"&gt;fuji&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://api.avax-test.network/ext/bc/C/rpc"&lt;/span&gt;
&lt;span class="py"&gt;avalanche&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://api.avax.network/ext/bc/C/rpc"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ovo nije samo podešavanje za testove. Pogrešan EVM target može da proizvede bytecode sa opcodeovima koje ciljna mreža još ne podržava.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Deployujte na Fuji
&lt;/h3&gt;

&lt;p&gt;Ako projekat već ima Foundry deployment skriptu, promena mreže svodi se na izbor RPC konfiguracije i naloga sa testnim AVAX-om.&lt;/p&gt;

&lt;p&gt;Za jednostavan contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;forge create src/Settlement.sol:Settlement &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; fuji &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--private-key&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DEPLOYER_PRIVATE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--broadcast&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Privatni ključ treba da dolazi iz privremenog testnog naloga ili odgovarajućeg signing sistema, a ne iz fajla koji se commitovao u repozitorijum.&lt;/p&gt;

&lt;p&gt;Pre deploya je korisno proveriti da RPC zaista pokazuje na očekivanu mrežu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://api.avax-test.network/ext/bc/C/rpc &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
        "jsonrpc": "2.0",
        "id": 1,
        "method": "eth_chainId",
        "params": []
    }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Očekivani rezultat za Fuji je heksadecimalni chain ID &lt;code&gt;0xa869&lt;/code&gt;, odnosno decimalni &lt;code&gt;43113&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Testirajte ponašanje sistema, ne samo ugovore
&lt;/h3&gt;

&lt;p&gt;Pre razmatranja sopstvenog L1, prikupite podatke sa realnog prototipa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Koliko gasa troše ključne operacije&lt;/li&gt;
&lt;li&gt;Koliko eventova backend mora da indeksira&lt;/li&gt;
&lt;li&gt;Koliko traje end-to-end potvrda u vašem sistemu&lt;/li&gt;
&lt;li&gt;Kako se aplikacija ponaša kada RPC kasni ili odbije zahtev&lt;/li&gt;
&lt;li&gt;Koje operacije zaista zahtevaju on-chain izvršavanje&lt;/li&gt;
&lt;li&gt;Da li je problem u chainu ili u aplikacionoj arhitekturi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L1 neće popraviti neograničene &lt;code&gt;eth_getLogs&lt;/code&gt; upite, loše indeksiranje, serijske backend jobove ili ugovore koji nepotrebno upisuju velike količine podataka.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Napravite lokalni L1 tek kada imate konkretan zahtev
&lt;/h3&gt;

&lt;p&gt;Avalanche-CLI vodi developera kroz kreiranje Subnet-EVM konfiguracije i izbor validatorskog modela. Minimalni lokalni workflow počinje komandama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;avalanche blockchain create loyalty
avalanche blockchain deploy loyalty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prva komanda pokreće interaktivni wizard. Za EVM mrežu bira se &lt;code&gt;Subnet-EVM&lt;/code&gt;, a za jednostavan lokalni prototip može se izabrati Proof of Authority.&lt;/p&gt;

&lt;p&gt;Druga komanda može da podigne lokalnu Avalanche mrežu i deployuje L1. CLI na kraju prikazuje RPC URL, blockchain ID, EVM chain ID i podatke potrebne za povezivanje walleta.&lt;/p&gt;

&lt;p&gt;Lokalni deploy je mesto za eksperimentisanje sa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Genesis alokacijama&lt;/li&gt;
&lt;li&gt;Native gas tokenom&lt;/li&gt;
&lt;li&gt;Validator managerom&lt;/li&gt;
&lt;li&gt;Fee konfiguracijom&lt;/li&gt;
&lt;li&gt;Allowlist precompile ugovorima&lt;/li&gt;
&lt;li&gt;ICM porukama između chainova&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Produkcioni deploy je znatno ozbiljniji projekat. Dokumentacija eksplicitno preporučuje da se dizajn prvo proveri lokalno i na Fuji testnetu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko košta Avalanche
&lt;/h2&gt;

&lt;p&gt;Odgovor zavisi od toga da li se koristi C-Chain ili sopstveni L1.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trošak C-Chain aplikacije
&lt;/h3&gt;

&lt;p&gt;Na C-Chainu korisnik plaća gas u AVAX-u. Za EIP-1559 transakciju efektivna cena gasa određena je kao minimum između fee capa i zbira base fee-a i priority fee-a.&lt;/p&gt;

&lt;p&gt;U praksi je trošak transakcije:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gasUsed × effectiveGasPrice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ne postoji pouzdana fiksna cena za „jednu Avalanche transakciju“. Transfer, ERC-20 operacija, kompleksan swap i deploy ugovora troše veoma različite količine gasa. Base fee se takođe menja sa opterećenjem.&lt;/p&gt;

&lt;p&gt;C-Chain izlaže metode &lt;code&gt;eth_baseFee&lt;/code&gt; i &lt;code&gt;eth_maxPriorityFeePerGas&lt;/code&gt; za procenu parametara transakcije. Dokumentacija navodi minimalni base fee od jednog wei-ja od Fortuna nadogradnje 8. aprila 2025, bez fiksne gornje granice.&lt;/p&gt;

&lt;p&gt;Za aplikacioni budžet zato treba meriti stvarne metode ugovora, a ne koristiti prosečnu cenu transfera kao procenu svih operacija.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trošak sopstvenog L1
&lt;/h3&gt;

&lt;p&gt;L1 ima najmanje četiri kategorije troška:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kategorija&lt;/th&gt;
&lt;th&gt;Šta se plaća&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;P-Chain operacije&lt;/td&gt;
&lt;td&gt;Kreiranje, konverzija i upravljanje validatorima&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L1 validator fee&lt;/td&gt;
&lt;td&gt;Kontinuirana naknada po aktivnom validatoru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastruktura&lt;/td&gt;
&lt;td&gt;Validator, RPC, archive, monitoring i backup nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operacije&lt;/td&gt;
&lt;td&gt;Upgrade, incident response, ključevi, observability i bezbednost&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aktuelna dokumentacija navodi približno &lt;code&gt;1.33 AVAX&lt;/code&gt; mesečno po L1 validatoru, uz napomenu da je protokolska naknada dinamička i da se spaljuje. Validator ima balans sa kojeg se naknada kontinuirano skida. Ako balans stigne do nule, validator postaje neaktivan dok se ponovo ne finansira.&lt;/p&gt;

&lt;p&gt;Pored protokolske naknade postoje infrastrukturni troškovi. Zvanični deployment primer za AWS &lt;code&gt;us-east-1&lt;/code&gt; navodi ilustrativnu procenu od oko &lt;code&gt;USD 651&lt;/code&gt; mesečno za topologiju sa pet &lt;code&gt;c6a.xlarge&lt;/code&gt; validatora, archive RPC nodeom, pruned RPC nodeom, monitoring instancom, S3 i KMS resursima. To nije cena Avalanche proizvoda niti univerzalna produkciona preporuka, već procena za jednu konkretnu infrastrukturu.&lt;/p&gt;

&lt;p&gt;Stvarni trošak zavisi od:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Broja i veličine validatora&lt;/li&gt;
&lt;li&gt;Cloud provajdera i regiona&lt;/li&gt;
&lt;li&gt;Količine stanja i RPC saobraćaja&lt;/li&gt;
&lt;li&gt;Archive zahteva&lt;/li&gt;
&lt;li&gt;Redundanse&lt;/li&gt;
&lt;li&gt;Log retention politike&lt;/li&gt;
&lt;li&gt;DDoS zaštite&lt;/li&gt;
&lt;li&gt;Indeksera i explorera&lt;/li&gt;
&lt;li&gt;Relayera za interchain poruke&lt;/li&gt;
&lt;li&gt;Dežurstava i operativnog tima&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za većinu timova najveći skriveni trošak nije AVAX naknada, već pouzdano održavanje distribuiranog sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Helicon menja detalje fee i execution modela
&lt;/h2&gt;

&lt;p&gt;Na dan provere dokumentacije, 19. septembra 2026, Helicon je aktivan na Fuji testnetu od 28. jula 2026. Aktivacija na Mainnetu zakazana je za 22. septembar 2026. u 15:00 UTC.&lt;/p&gt;

&lt;p&gt;Helicon uvodi Continuous Execution na C-Chainu, gde se consensus i execution razdvajaju kroz queue. Za developere je posebno važna promena obračuna gasa: na mrežama na kojima je Helicon aktivan naplaćeni gas postaje maksimum između stvarno potrošenog gasa i polovine postavljenog gas limita.&lt;/p&gt;

&lt;p&gt;Drugim rečima, posle aktivacije ekstremno konzervativan &lt;code&gt;gasLimit&lt;/code&gt; više nije bezazlen. Ako transakcija koristi mnogo manje od polovine limita, korisnik može platiti više nego što odgovara stvarnom &lt;code&gt;gasUsed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Fuji i Mainnet zato mogu imati različito ponašanje tokom perioda između njihovih aktivacija. Integracioni testovi treba da proveravaju receipt, naplaćenu naknadu i RPC semantiku, a ne samo da li je transakcija završena uspešno.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interoperabilnost nije isto što i jedan shared state
&lt;/h2&gt;

&lt;p&gt;Avalanche Interchain Messaging, odnosno ICM, omogućava razmenu poruka između C-Chaina i Avalanche L1 mreža. Teleporter je contract-level protokol izgrađen iznad ICM-a.&lt;/p&gt;

&lt;p&gt;Tipičan tok izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Contract na izvornom chainu emituje interchain poruku.&lt;/li&gt;
&lt;li&gt;Relayer prikuplja potrebne BLS potpise validatora.&lt;/li&gt;
&lt;li&gt;Poruka se dostavlja odredišnom chainu.&lt;/li&gt;
&lt;li&gt;Odredišni contract verifikuje i obrađuje poruku.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Važan implementation detalj je da Teleporter adresira odredište pomoću Avalanche blockchain ID-a dužine 32 bajta, a ne pomoću EVM chain ID-a.&lt;/p&gt;

&lt;p&gt;To je čest izvor grešaka zato što L1 ima oba identifikatora:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EVM chain ID koristi se za potpisivanje EVM transakcija i wallet konfiguraciju&lt;/li&gt;
&lt;li&gt;Avalanche blockchain ID koristi se za identifikovanje chaina u ICM komunikaciji&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ICM takođe ne znači da chainovi dele sinhrono stanje. Poruka ima lifecycle, relayer i failure modele. Aplikacija mora da razmatra retry, idempotency, kašnjenje i situaciju u kojoj je izvorna transakcija potvrđena, ali poruka još nije obrađena na odredištu.&lt;/p&gt;

&lt;p&gt;Za poslovne procese to često znači da interchain operacija treba da bude state machine, a ne jedan boolean &lt;code&gt;processed&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-off koji marketing obično preskoči
&lt;/h2&gt;

&lt;p&gt;Sopstveni L1 daje izolaciju, ali istovremeno fragmentira sistem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dobijate kontrolu
&lt;/h3&gt;

&lt;p&gt;Možete definisati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ko validira mrežu&lt;/li&gt;
&lt;li&gt;Koji token plaća gas&lt;/li&gt;
&lt;li&gt;Ko sme da šalje transakcije&lt;/li&gt;
&lt;li&gt;Ko sme da deployuje ugovore&lt;/li&gt;
&lt;li&gt;Kakva je fee politika&lt;/li&gt;
&lt;li&gt;Koji precompile ugovori postoje&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Preuzimate odgovornost
&lt;/h3&gt;

&lt;p&gt;Morate rešiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distribuciju i zaštitu administratorskih ključeva&lt;/li&gt;
&lt;li&gt;Validator churn i zamenu nodes&lt;/li&gt;
&lt;li&gt;Upgrade koordinaciju&lt;/li&gt;
&lt;li&gt;RPC skaliranje&lt;/li&gt;
&lt;li&gt;Monitoring consensus i execution sloja&lt;/li&gt;
&lt;li&gt;Backup i recovery procedure&lt;/li&gt;
&lt;li&gt;Interchain relayer dostupnost&lt;/li&gt;
&lt;li&gt;Explorer i indexing infrastrukturu&lt;/li&gt;
&lt;li&gt;Komunikaciju sa walletima i integratorima&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Najvažnije, Avalanche L1 ima sopstveni validatorski skup. Ne treba je predstavljati kao da automatski nasleđuje kompletnu ekonomsku sigurnost Primary Networka. P-Chain koordinira registraciju i interoperabilnost, ali sigurnost izvršavanja L1 mreže zavisi od njenih validatora i pravila upravljanja.&lt;/p&gt;

&lt;p&gt;Permissioned PoA mreža sa nekoliko validatora može biti potpuno racionalan izbor za konzorcijum poznatih kompanija. Nije, međutim, ista bezbednosna pretpostavka kao javni permissionless chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  EVM kompatibilnost ima nekoliko oštrih ivica
&lt;/h2&gt;

&lt;p&gt;Za standardne JavaScript i TypeScript integracije C-Chain se uglavnom ponaša kao očekivani EVM chain. Ipak, kompatibilnost ne znači da je implementacija identična &lt;code&gt;go-ethereum&lt;/code&gt; klijentu.&lt;/p&gt;

&lt;p&gt;Jedan specifičan primer odnosi se na Go sisteme koji preuzmu C-Chain blok i zatim lokalno pozovu &lt;code&gt;block.Hash()&lt;/code&gt; iz standardnog &lt;code&gt;go-ethereum&lt;/code&gt; paketa. C-Chain header sadrži dodatni &lt;code&gt;ExtDataHash&lt;/code&gt;, pa standardni klijent može izračunati drugačiji hash od onog koji je mreža vratila. Zvanična dokumentacija zbog toga preporučuje Avalanche prilagođeni &lt;code&gt;ethclient&lt;/code&gt; kada Go aplikacija lokalno računa block hash.&lt;/p&gt;

&lt;p&gt;Ako aplikacija samo čita JSON-RPC odgovore, logove i receipts bez ponovnog računanja block hasha, ovaj problem se uglavnom ne pojavljuje.&lt;/p&gt;

&lt;p&gt;Druga oštra ivica je oslanjanje na široke &lt;code&gt;eth_getLogs&lt;/code&gt; upite. Public RPC može biti dovoljan za prototip, ali produkcioni indexer treba da koristi ograničene block range upite, checkpointing i sopstvenu retry politiku. Pokretanje L1 mreže ne uklanja potrebu za dobro dizajniranim data pipelineom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako izabrati između C-Chaina i L1 mreže
&lt;/h2&gt;

&lt;p&gt;Odluka se može svesti na nekoliko pitanja:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zahtev&lt;/th&gt;
&lt;th&gt;C-Chain&lt;/th&gt;
&lt;th&gt;Avalanche L1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Standardni Solidity dApp&lt;/td&gt;
&lt;td&gt;Dobar izbor&lt;/td&gt;
&lt;td&gt;Verovatno nepotrebno&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postojeća javna likvidnost&lt;/td&gt;
&lt;td&gt;Prednost&lt;/td&gt;
&lt;td&gt;Zahteva interchain integraciju&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sopstveni gas token&lt;/td&gt;
&lt;td&gt;Ne&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Izolovano opterećenje&lt;/td&gt;
&lt;td&gt;Ne&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissioned validatori&lt;/td&gt;
&lt;td&gt;Ne&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol-level allowlist&lt;/td&gt;
&lt;td&gt;Ograničeno aplikacijom&lt;/td&gt;
&lt;td&gt;Precompile opcije&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimalan operativni teret&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;td&gt;Ne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom execution pravila&lt;/td&gt;
&lt;td&gt;Ne&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Najčešća greška je pokretanje L1 mreže zato što zvuči skalabilnije, pre nego što postoji workload koji zahteva takvu izolaciju.&lt;/p&gt;

&lt;p&gt;Suprotna greška je pokušaj da se svi poslovni zahtevi uguraju u dApp ugovore na shared chainu, iako organizaciji zapravo trebaju sopstvena pravila validacije, gas ekonomija i kontrolisano članstvo.&lt;/p&gt;

&lt;p&gt;Dobar kriterijum je granica odgovornosti: ako mrežni parametri postaju deo specifikacije proizvoda, L1 je vredna ozbiljne evaluacije. Ako je blockchain samo settlement i execution backend, C-Chain će često pružiti bolji odnos jednostavnosti i mogućnosti.&lt;/p&gt;

&lt;p&gt;Avalanche je zato zanimljiv manje kao „brži EVM“, a više kao put od standardnog Solidity deploymenta do aplikaciono specifične mreže. Taj put je postepen: contract može prvo živeti na Fuji testnetu, zatim na C-Chainu, a tek kasnije na L1 mreži, bez trenutnog napuštanja EVM toolinga.&lt;/p&gt;

&lt;p&gt;To smanjuje cenu eksperimenta. Ne uklanja cenu produkcije.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/primary-network" rel="noopener noreferrer"&gt;Primary Network, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/nodes/architecture/consensus" rel="noopener noreferrer"&gt;Consensus Protocols, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/avalanche-l1s" rel="noopener noreferrer"&gt;Avalanche L1s, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/avalanche-l1s/add-utility/deploy-smart-contract" rel="noopener noreferrer"&gt;Deploy a Smart Contract, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/tooling/avalanche-cli/create-deploy-avalanche-l1s/deploy-locally" rel="noopener noreferrer"&gt;Deploying Avalanche L1s Locally, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/tooling/avalanche-cli/create-deploy-avalanche-l1s/deploy-on-production-infra" rel="noopener noreferrer"&gt;Deploy Avalanche L1s on Production Infrastructure, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/rpcs/other/guides/txn-fees" rel="noopener noreferrer"&gt;Transaction Fees, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/blog/l1-validator-fee" rel="noopener noreferrer"&gt;How Do L1 Validator Fees Work, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/tooling/avalanche-deploy/deploy-l1" rel="noopener noreferrer"&gt;Deploy an L1 with Terraform and Ansible, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/primary-network/helicon-upgrade" rel="noopener noreferrer"&gt;Helicon Upgrade, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/tooling/interchain-kit/icm-messaging" rel="noopener noreferrer"&gt;ICM Messaging, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://build.avax.network/docs/primary-network/exchange-integration" rel="noopener noreferrer"&gt;Exchange Integration, Avalanche Builder Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>avalanche</category>
      <category>bitcoin</category>
    </item>
    <item>
      <title>BNB Smart Chain iz ugla EVM developera, bez prečica</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Fri, 18 Sep 2026 23:36:23 +0000</pubDate>
      <link>https://dev.to/kriptomuza/bnb-smart-chain-iz-ugla-evm-developera-bez-precica-517e</link>
      <guid>https://dev.to/kriptomuza/bnb-smart-chain-iz-ugla-evm-developera-bez-precica-517e</guid>
      <description>&lt;h2&gt;
  
  
  BNB Smart Chain nije samo jeftiniji Ethereum
&lt;/h2&gt;

&lt;p&gt;BNB Smart Chain, skraćeno BSC, jeste EVM-kompatibilan Layer 1 blockchain na kojem se transakcije plaćaju tokenom BNB. Pokrenut je 2020. kao Binance Smart Chain, a od februara 2022. nosi sadašnji naziv.&lt;/p&gt;

&lt;p&gt;Najkraći odgovor na pitanje zašto bi ga developer koristio glasi: omogućava primenu poznatog Solidity i Ethereum toolchaina na mreži sa kratkim vremenom bloka i relativno jeftinim izvršavanjem transakcija.&lt;/p&gt;

&lt;p&gt;To, međutim, ne znači da je BSC kopija Ethereuma sa drugim RPC URL-om. EVM kompatibilnost pokriva veliki deo developer iskustva, ali konsenzus, finalnost, infrastruktura, gas tržište i operativni rizici nisu isti.&lt;/p&gt;

&lt;p&gt;BSC mainnet koristi chain ID &lt;code&gt;56&lt;/code&gt;, testnet chain ID &lt;code&gt;97&lt;/code&gt;, a BNB je izvorni token kojim se plaća gas. Većina Ethereum alata, uključujući Foundry, Hardhat, Remix, ethers, viem i web3.js, može da se koristi bez posebnog BSC SDK-a.&lt;/p&gt;

&lt;p&gt;Upravo je to najzanimljivija karakteristika mreže: prelazak sa drugog EVM chaina obično ne zahteva novu programsku paradigmu, ali produkciona integracija ipak traži razumevanje onoga što se nalazi ispod EVM interfejsa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gde se BSC uklapa u BNB Chain
&lt;/h2&gt;

&lt;p&gt;Terminologija ume da bude zbunjujuća:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BNB Chain je naziv šireg ekosistema.&lt;/li&gt;
&lt;li&gt;BNB Smart Chain je EVM-kompatibilan Layer 1 unutar tog ekosistema.&lt;/li&gt;
&lt;li&gt;opBNB je Layer 2 mreža izgrađena iznad BSC-a.&lt;/li&gt;
&lt;li&gt;BNB Greenfield je zasebna mreža usmerena na decentralizovano skladištenje podataka.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stara BNB Beacon Chain ugašena je nakon BNB Chain Fusion procesa tokom 2024. godine. Zato novu arhitekturu ne treba zasnivati na starim tutorijalima koji opisuju dual-chain model između Beacon Chain i BSC mreže.&lt;/p&gt;

&lt;p&gt;Za većinu Solidity developera BSC treba posmatrati kao samostalni EVM Layer 1. Ako aplikaciji treba još jeftinije i učestalije izvršavanje, opBNB može biti sledeća opcija, ali tada u sistem ulaze dodatni L2 koncepti kao što su sekvencer, premošćavanje sredstava i L1 finalnost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako BNB Smart Chain radi ispod EVM sloja
&lt;/h2&gt;

&lt;p&gt;BSC koristi Parlia konsenzus, varijantu Proof of Staked Authority modela. Validator se ne bira samo na osnovu identiteta ili operativne dozvole, već i prema delegiranom BNB ulogu.&lt;/p&gt;

&lt;p&gt;Prema aktuelnoj dokumentaciji, mreža ima 45 aktivnih validatora: 21 validator u Cabinet grupi i 24 kandidata. Za konkretnu epohu bira se skup od 21 konsenzus validatora, sastavljen od 18 Cabinet validatora i tri kandidata. Validator koji ne učestvuje u produkciji blokova ili prekrši konsenzusna pravila može biti kažnjen slashing mehanizmom.&lt;/p&gt;

&lt;p&gt;Ovo proizvodi drugačiji bezbednosni profil od Ethereum Proof of Stake sistema. Manji aktivni skup validatora omogućava kraće intervale između blokova i bržu koordinaciju, ali predstavlja kompromis u pogledu decentralizacije i otpornosti na koordinisani uticaj.&lt;/p&gt;

&lt;p&gt;Fermi nadogradnja aktivirana je na mainnetu 14. januara 2026. i smanjila je ciljani interval bloka na približno &lt;code&gt;0.45&lt;/code&gt; sekundi. BSC koristi i Fast Finality mehanizam, pri kojem blok u uobičajenim uslovima postaje finalan nakon glasova potrebne većine validatora, tipično u okviru dva naredna bloka.&lt;/p&gt;

&lt;p&gt;Za frontend to znači brzu povratnu informaciju. Za backend koji pomera sredstva, izdaje robu ili zaključava stanje, novi blok ipak ne treba automatski tretirati kao neopoziv.&lt;/p&gt;

&lt;p&gt;BSC JSON-RPC podržava &lt;code&gt;finalized&lt;/code&gt; oznaku bloka. Umesto oslanjanja na proizvoljan broj potvrda, servis može eksplicitno pročitati poslednji finalizovani blok:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BSC_RPC_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "jsonrpc": "2.0",
    "method": "eth_getBlockByNumber",
    "params": ["finalized", false],
    "id": 1
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pre upotrebe treba proveriti da izabrani RPC provider podržava ovaj tag i kako dokumentuje BSC finalnost. Aplikacija može prikazati transakciju kao primljenu čim dobije receipt, ali poslovno nepovratnu akciju izvršiti tek kada blok transakcije više nije noviji od finalizovanog bloka.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta EVM kompatibilnost stvarno donosi
&lt;/h2&gt;

&lt;p&gt;BSC je zasnovan na fork-u &lt;code&gt;go-ethereum&lt;/code&gt; klijenta i nastoji da zadrži kompatibilnost sa Geth JSON-RPC API-jima.&lt;/p&gt;

&lt;p&gt;To u praksi znači da se zadržavaju poznati elementi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solidity i Vyper ugovori&lt;/li&gt;
&lt;li&gt;ABI kodiranje&lt;/li&gt;
&lt;li&gt;Ethereum adrese i secp256k1 potpisi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt; i &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ERC-20, ERC-721 i ERC-1155 interfejsi&lt;/li&gt;
&lt;li&gt;događaji i logovi&lt;/li&gt;
&lt;li&gt;proxy obrasci&lt;/li&gt;
&lt;li&gt;MetaMask i drugi EVM walleti&lt;/li&gt;
&lt;li&gt;Foundry, Hardhat i standardne biblioteke&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BEP-20 je naziv koji se na BSC-u tradicionalno koristi za fungibilne tokene. Sa stanovišta savremene implementacije, standardni ERC-20 ugovor i proveren alat poput OpenZeppelin Contracts biblioteke uglavnom su bolja polazna tačka od kopiranja nasumičnog &lt;code&gt;BEP20.sol&lt;/code&gt; fajla iz starog tutorijala.&lt;/p&gt;

&lt;p&gt;Kompatibilnost ipak nije identitet. BSC ima sopstvene sistemske ugovore, konsenzusne API-je, parametre mreže i ritam nadogradnji. Kod koji zavisi od preciznog ponašanja bloka, gas tržišta, validatora ili specifičnih Ethereum hard forkova mora se posebno testirati.&lt;/p&gt;

&lt;p&gt;Posebnu pažnju zaslužuju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aplikacije koje koriste &lt;code&gt;block.timestamp&lt;/code&gt; kao precizan časovnik&lt;/li&gt;
&lt;li&gt;logika zasnovana na broju blokova&lt;/li&gt;
&lt;li&gt;ugovori koji očekuju određenu vrednost &lt;code&gt;block.basefee&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MEV-osetljive transakcije&lt;/li&gt;
&lt;li&gt;oracle ažuriranja&lt;/li&gt;
&lt;li&gt;cross-chain poruke&lt;/li&gt;
&lt;li&gt;indeksiranje velikog broja događaja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako ugovor čuva period od približno jednog dana, izražavanje tog perioda kao fiksnog broja blokova vezuje poslovnu logiku za trenutni interval bloka. Nadogradnje poput Lorentz, Maxwell i Fermi upravo pokazuju da se taj interval može menjati. Za vremenske rokove je obično primereniji &lt;code&gt;block.timestamp&lt;/code&gt;, uz standardno upozorenje da ni on nije precizan zidni sat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan use-case: zajednički registar isporuka
&lt;/h2&gt;

&lt;p&gt;Zamislimo marketplace u kojem prodavac, kupac, loyalty servis i osiguravač nisu deo iste organizacije.&lt;/p&gt;

&lt;p&gt;Centralna baza može jednostavno voditi statuse porudžbina. Blockchain postaje opravdan tek kada više nezavisnih strana treba da proverava isti zapis bez poverenja u administratora jedne baze.&lt;/p&gt;

&lt;p&gt;U tom slučaju nije neophodno odmah praviti on-chain escrow koji čuva novac. Prva korisna iteracija može biti znatno uža:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Marketplace kreira neprovidni identifikator porudžbine.&lt;/li&gt;
&lt;li&gt;Prodavac otvara zapis na BSC-u.&lt;/li&gt;
&lt;li&gt;Kupac potvrđuje isporuku svojim walletom.&lt;/li&gt;
&lt;li&gt;Drugi sistemi slušaju događaj &lt;code&gt;DeliveryConfirmed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Loyalty servis izdaje bodove, a osiguravač zatvara pokriće.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ugovor ne treba da sadrži ime, adresu, broj telefona, opis robe ili interni broj porudžbine. Blockchain nije privatna baza. Umesto toga koristi se nasumično posoljen &lt;code&gt;bytes32&lt;/code&gt; identifikator koji se povezuje sa stvarnim podacima isključivo u kontrolisanom off-chain sistemu.&lt;/p&gt;

&lt;p&gt;Minimalna verzija ugovora mogla bi izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract DeliveryRegistry {
    enum Status {
        None,
        Open,
        Delivered,
        Cancelled
    }

    struct Order {
        address seller;
        address buyer;
        Status status;
    }

    mapping(bytes32 orderId =&amp;gt; Order order) public orders;

    error InvalidBuyer();
    error OrderAlreadyExists();
    error OrderNotOpen();
    error Unauthorized();

    event OrderOpened(
        bytes32 indexed orderId,
        address indexed seller,
        address indexed buyer
    );

    event DeliveryConfirmed(bytes32 indexed orderId);
    event OrderCancelled(bytes32 indexed orderId);

    function open(bytes32 orderId, address buyer) external {
        if (buyer == address(0)) revert InvalidBuyer();
        if (orders[orderId].status != Status.None) {
            revert OrderAlreadyExists();
        }

        orders[orderId] = Order({
            seller: msg.sender,
            buyer: buyer,
            status: Status.Open
        });

        emit OrderOpened(orderId, msg.sender, buyer);
    }

    function confirmDelivery(bytes32 orderId) external {
        Order storage order = orders[orderId];

        if (msg.sender != order.buyer) revert Unauthorized();
        if (order.status != Status.Open) revert OrderNotOpen();

        order.status = Status.Delivered;
        emit DeliveryConfirmed(orderId);
    }

    function cancel(bytes32 orderId) external {
        Order storage order = orders[orderId];

        if (msg.sender != order.seller) revert Unauthorized();
        if (order.status != Status.Open) revert OrderNotOpen();

        order.status = Status.Cancelled;
        emit OrderCancelled(orderId);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ovaj ugovor namerno ne čuva sredstva. Time izbegava čitavu klasu problema vezanih za token kompatibilnost, reentrancy, povraćaj sredstava, sporove i administrativne privilegije.&lt;/p&gt;

&lt;p&gt;Njegova vrednost nije u tome što blockchain zamenjuje bazu, već što daje mali, zajednički i proverljiv protokol između organizacija.&lt;/p&gt;

&lt;p&gt;Produkcijska verzija bi verovatno zahtevala rokove, potpise bez direktne transakcije kupca, poništavanje kompromitovanog walleta i precizniji model sporova. Te funkcije ne treba dodavati pre nego što poslovni proces zaista zahteva njihovu cenu i složenost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Od lokalnog testa do BSC testneta
&lt;/h2&gt;

&lt;p&gt;Pošto je BSC EVM kompatibilan, lokalni workflow se ne razlikuje mnogo od rada na drugim EVM mrežama:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ugovor se razvija i testira lokalno.&lt;/li&gt;
&lt;li&gt;Pokreću se unit, fuzz i invariant testovi.&lt;/li&gt;
&lt;li&gt;Deployment se prvo simulira.&lt;/li&gt;
&lt;li&gt;Ugovor se objavljuje na BSC testnetu.&lt;/li&gt;
&lt;li&gt;Izvorni kod se verifikuje na exploreru.&lt;/li&gt;
&lt;li&gt;Backend i frontend testiraju se protiv stvarnog RPC-ja.&lt;/li&gt;
&lt;li&gt;Tek zatim se priprema mainnet deployment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sa Foundry alatom osnovni projekat može da se napravi komandom:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;forge init delivery-registry
&lt;span class="nb"&gt;cd &lt;/span&gt;delivery-registry
forge &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aktuelni javni testnet endpoint i chain ID mogu se proveriti pre deploymenta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;BSC_TESTNET_RPC_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://bsc-testnet-dataseed.bnbchain.org"&lt;/span&gt;

cast chain-id &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BSC_TESTNET_RPC_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Očekivani rezultat je &lt;code&gt;97&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nakon što testnet wallet dobije tBNB sa zvaničnog faucet-a, ugovor može da se objavi pomoću &lt;code&gt;forge create&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;forge create src/DeliveryRegistry.sol:DeliveryRegistry &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-url&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BSC_TESTNET_RPC_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--private-key&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DEPLOYER_PRIVATE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--broadcast&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--legacy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Foundry podržava deployment preko &lt;code&gt;forge create&lt;/code&gt;, dok je za složenije sisteme sa više ugovora praktičniji &lt;code&gt;forge script&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Opcija &lt;code&gt;--legacy&lt;/code&gt; eksplicitno koristi legacy format transakcije. BSC podržava EIP-1559 strukture, ali njegov protokol ne primenjuje Ethereum model obavezne promenljive osnovne naknade. U BSC klijentu je base fee postavljen na nulu, pa legacy transakcije ostaju praktičan i kompatibilan izbor za deployment alate.&lt;/p&gt;

&lt;p&gt;Privatni ključ u promenljivoj okruženja prihvatljiv je samo kao skraćeni primer. Produkcijski deployment treba da koristi odvojen deployer nalog, hardverski signer ili kontrolisani secrets sistem. Nalog koji objavljuje ugovor ne mora kasnije imati administrativna prava nad njim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend i wallet integracija
&lt;/h2&gt;

&lt;p&gt;Za browser aplikaciju integracija izgleda kao kod drugih EVM mreža. Aplikacija treba da proveri:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da li postoji wallet provider&lt;/li&gt;
&lt;li&gt;da li je povezan odgovarajući nalog&lt;/li&gt;
&lt;li&gt;da li je aktivan chain ID &lt;code&gt;56&lt;/code&gt; ili &lt;code&gt;97&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;da li korisnik ima dovoljno BNB za gas&lt;/li&gt;
&lt;li&gt;da li je simulacija poziva uspešna&lt;/li&gt;
&lt;li&gt;da li je receipt uspešan&lt;/li&gt;
&lt;li&gt;da li je odgovarajući blok finalizovan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ne treba pretpostaviti da je mreža ispravna samo zato što wallet vraća adresu. Potpis validne transakcije za pogrešan chain može dovesti do konfuznog korisničkog iskustva, pogotovo ako je isti ugovor objavljen na više mreža.&lt;/p&gt;

&lt;p&gt;Adrese deploymenta treba verzionisati zajedno sa ABI-jem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"56"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DeliveryRegistry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"97"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DeliveryRegistry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chain ID mora biti deo ključa konfiguracije. Jedna globalna promenljiva &lt;code&gt;CONTRACT_ADDRESS&lt;/code&gt; brzo postaje izvor grešaka kada projekat dobije testnet, staging, mainnet ili multichain deployment.&lt;/p&gt;

&lt;p&gt;Za write operacije dobar frontend workflow je:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pročitaj trenutno stanje.&lt;/li&gt;
&lt;li&gt;Simuliraj poziv.&lt;/li&gt;
&lt;li&gt;Zatraži potpis.&lt;/li&gt;
&lt;li&gt;Prikaži hash transakcije.&lt;/li&gt;
&lt;li&gt;Sačekaj receipt.&lt;/li&gt;
&lt;li&gt;Proveri &lt;code&gt;status&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sačekaj finalnost ako sledeća radnja ima poslovnu vrednost.&lt;/li&gt;
&lt;li&gt;Osveži stanje iz chaina, umesto da trajno veruješ lokalnoj pretpostavci.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Greška nakon slanja transakcije ne znači nužno da transakcija nije poslata. Browser može izgubiti konekciju nakon što RPC prihvati potpisanu transakciju. Zato je hash transakcije važniji od lokalnog statusa Promise objekta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend i indeksiranje događaja
&lt;/h2&gt;

&lt;p&gt;Najveća razlika između demo aplikacije i produkcionog sistema često nije smart contract, već indeksiranje.&lt;/p&gt;

&lt;p&gt;Javni BSC RPC endpointi imaju ograničenja. Zvanična dokumentacija navodi zbirni limit od &lt;code&gt;10.000&lt;/code&gt; zahteva u pet minuta za navedene javne mainnet i testnet endpoint-e. Na navedenim javnim mainnet endpoint-ima &lt;code&gt;eth_getLogs&lt;/code&gt; može biti onemogućen, uz preporuku da se za učestalo praćenje logova koristi odgovarajući provider ili WebSocket infrastruktura.&lt;/p&gt;

&lt;p&gt;To znači da produkcijski backend ne treba graditi oko beskonačnog ponavljanja upita:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eth_getLogs(fromBlock = 0, toBlock = latest)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pouzdaniji indexer čuva najmanje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;poslednji obrađeni blok&lt;/li&gt;
&lt;li&gt;hash poslednjeg obrađenog bloka&lt;/li&gt;
&lt;li&gt;transakcioni hash&lt;/li&gt;
&lt;li&gt;indeks loga&lt;/li&gt;
&lt;li&gt;adresu ugovora&lt;/li&gt;
&lt;li&gt;verziju ABI-ja&lt;/li&gt;
&lt;li&gt;status finalnosti&lt;/li&gt;
&lt;li&gt;sirove argumente događaja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jedinstveni ključ događaja obično se formira od &lt;code&gt;transactionHash&lt;/code&gt; i &lt;code&gt;logIndex&lt;/code&gt;. Potrošač mora biti idempotentan, jer reconnect ili ponovno indeksiranje može isporučiti isti događaj više puta.&lt;/p&gt;

&lt;p&gt;Praktičan model ima dve faze:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;observed&lt;/code&gt;: događaj je pronađen u novom bloku&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;finalized&lt;/code&gt;: blok događaja dostigao je finalnost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frontend može odmah prikazati &lt;code&gt;observed&lt;/code&gt; stanje kao privremeno. Servis koji izdaje nagradu, šalje robu ili pokreće nepovratnu integraciju treba da čeka &lt;code&gt;finalized&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Za manji projekat dovoljan je upravljani RPC sa WebSocket podrškom i PostgreSQL worker. Za veći sistem treba razmotriti namenski indexer, sopstveni node ili servis koji eksplicitno podržava istorijske logove i garantuje potrebni retention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko košta korišćenje BNB Smart Chain mreže
&lt;/h2&gt;

&lt;p&gt;BSC nema fiksnu cenu za deployment ili poziv funkcije. Trošak transakcije određuju dve vrednosti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trošak u BNB = potrošeni gas × efektivna cena gasa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Broj gas jedinica zavisi od izvršenih EVM operacija. Upis nove vrednosti u storage obično je skuplji od čitanja, emitovanje događaja ima cenu, a deployment mora platiti izvršenje konstruktora i čuvanje bytecode-a.&lt;/p&gt;

&lt;p&gt;Cena gasa zavisi od mreže i prioriteta transakcije. Ne treba je hardkodovati na osnovu blog posta ili vrednosti primećene prethodne nedelje. RPC metoda &lt;code&gt;eth_gasPrice&lt;/code&gt; može vratiti trenutnu preporuku providera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BSC_RPC_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
    "jsonrpc": "2.0",
    "method": "eth_gasPrice",
    "params": [],
    "id": 1
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pre slanja write poziva aplikacija treba da koristi &lt;code&gt;eth_estimateGas&lt;/code&gt; ili odgovarajuću metodu biblioteke. Nakon izvršenja, stvarni trošak može se dobiti iz &lt;code&gt;gasUsed&lt;/code&gt; i &lt;code&gt;effectiveGasPrice&lt;/code&gt; polja transaction receipt-a.&lt;/p&gt;

&lt;p&gt;Cena izražena u USD nije protokolarna konstanta. Ona zavisi i od tržišne vrednosti BNB u trenutku transakcije. Za budžetiranje je zato korisnije pratiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gas po konkretnoj funkciji&lt;/li&gt;
&lt;li&gt;trenutnu cenu gasa&lt;/li&gt;
&lt;li&gt;dnevni broj transakcija&lt;/li&gt;
&lt;li&gt;BNB potrošnju po danu&lt;/li&gt;
&lt;li&gt;odvojenu konverziju BNB u USD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako aplikacija subvencioniše korisničke transakcije, trošak nije samo gas. U računicu ulaze relayer infrastruktura, zaštita od zloupotrebe, upravljanje nonce vrednostima, monitoring i punjenje operativnih walleta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gde se najčešće kriju problemi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Brz blok nije isto što i finalizovana poslovna odluka
&lt;/h3&gt;

&lt;p&gt;Receipt potvrđuje da je transakcija izvršena u određenom bloku. Ne govori sam po sebi da aplikacija treba odmah da preduzme nepovratnu off-chain akciju.&lt;/p&gt;

&lt;p&gt;Model finalnosti mora biti deo domenske logike, a ne samo blockchain helper funkcija.&lt;/p&gt;

&lt;h3&gt;
  
  
  Niska cena podstiče nepotrebne upise
&lt;/h3&gt;

&lt;p&gt;Kada je storage jeftiniji, lako je svaki klik pretvoriti u transakciju. To obično pogoršava UX, komplikuje migracije i javno objavljuje podatke koji su mogli ostati van chaina.&lt;/p&gt;

&lt;p&gt;Bolji obrazac je da se na chain stave vlasništvo, autorizacija, konačni obračun i dokazi, a pretraga, analitika i prolazno aplikativno stanje ostave off-chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  EVM kompatibilnost ne eliminiše testiranje po mreži
&lt;/h3&gt;

&lt;p&gt;Fork test na Ethereum stanju ne dokazuje da će deployment, finalnost, oracle, RPC provider i gas strategija raditi na BSC-u.&lt;/p&gt;

&lt;p&gt;Testnet nije potpuna simulacija mainneta, ali otkriva pogrešan chain ID, wallet konfiguraciju, probleme sa transaction type-om, explorer verifikacijom i indeksiranjem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Javni RPC nije produkcioni SLA
&lt;/h3&gt;

&lt;p&gt;Besplatan endpoint je odličan za proveru konekcije i razvoj. Nije zamena za ugovoreni kapacitet, redundantne providere ili sopstvenu infrastrukturu kada aplikacija zavisi od dostupnosti chain podataka.&lt;/p&gt;

&lt;p&gt;RPC sloj treba posmatrati kao distribuiranu zavisnost. Uvedite timeout, retry sa backoff-om, circuit breaker i proveru da različiti provideri vraćaju kompatibilnu visinu lanca.&lt;/p&gt;

&lt;h3&gt;
  
  
  Privatnost se ne dobija heširanjem predvidivih podataka
&lt;/h3&gt;

&lt;p&gt;Hash email adrese ili broja porudžbine nije anoniman ako napadač može pogoditi originalnu vrednost i ponoviti hash.&lt;/p&gt;

&lt;p&gt;Za on-chain identifikatore koristite dovoljno nasumičan salt, domensko razdvajanje i jasnu politiku toga ko čuva mapiranje između internog zapisa i &lt;code&gt;bytes32&lt;/code&gt; identifikatora.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jeftinija greška je i dalje greška
&lt;/h3&gt;

&lt;p&gt;Niži gas ne umanjuje posledice pogrešne kontrole pristupa, kompromitovanog admin ključa ili nebezbednog upgrade proxy-ja.&lt;/p&gt;

&lt;p&gt;BSC ugovor treba tretirati kao ugovor na bilo kom javnom EVM chainu: testovi, statička analiza, pregled privilegija, verifikovan source, monitoring i nezavisna revizija u skladu sa vrednošću koju kontroliše.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kada BSC ima smisla
&lt;/h2&gt;

&lt;p&gt;BNB Smart Chain je racionalan izbor kada projekat ima nekoliko sledećih osobina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tim već poznaje Solidity i EVM alate&lt;/li&gt;
&lt;li&gt;ciljna publika već koristi BNB ili BSC wallete&lt;/li&gt;
&lt;li&gt;transakcije moraju biti dovoljno jeftine za učestaliju upotrebu&lt;/li&gt;
&lt;li&gt;potreban je brz interaktivni UX&lt;/li&gt;
&lt;li&gt;aplikacija se oslanja na postojeće EVM ugovore i biblioteke&lt;/li&gt;
&lt;li&gt;prihvatljiv je PoSA bezbednosni i decentralizacioni model&lt;/li&gt;
&lt;li&gt;projekat može da obezbedi pouzdano indeksiranje i RPC infrastrukturu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manje je privlačan ako aplikacija zahteva bezbednosni model sa veoma velikim skupom validatora, ako korisnici nemaju razlog da drže BNB za gas ili ako sistem uopšte nema više nezavisnih strana kojima treba zajedničko stanje.&lt;/p&gt;

&lt;p&gt;Ako samo jedan backend ima pravo da piše podatke, a svi korisnici mu već veruju, PostgreSQL je verovatno jednostavniji, privatniji i jeftiniji sistem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Produkcijski workflow koji ne zavisi od sreće
&lt;/h2&gt;

&lt;p&gt;Razuman put do mainneta izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Definišite koji deo sistema zaista mora biti on-chain.&lt;/li&gt;
&lt;li&gt;Napravite ugovor bez čuvanja sredstava ako use-case to dozvoljava.&lt;/li&gt;
&lt;li&gt;Napišite unit, fuzz i invariant testove.&lt;/li&gt;
&lt;li&gt;Testirajte kontrole pristupa i sve terminalne state transitions.&lt;/li&gt;
&lt;li&gt;Pokrenite lokalni deployment i simulirajte neuspele pozive.&lt;/li&gt;
&lt;li&gt;Objavite ugovor na BSC testnetu.&lt;/li&gt;
&lt;li&gt;Verifikujte source i compiler konfiguraciju.&lt;/li&gt;
&lt;li&gt;Testirajte wallet promenu mreže i pogrešan chain ID.&lt;/li&gt;
&lt;li&gt;Izmerite gas za realne scenarije, ne samo za happy path.&lt;/li&gt;
&lt;li&gt;Implementirajte idempotentni event indexer.&lt;/li&gt;
&lt;li&gt;Razdvojte observed i finalized stanje.&lt;/li&gt;
&lt;li&gt;Uvedite najmanje dva RPC providera za kritične servise.&lt;/li&gt;
&lt;li&gt;Dokumentujte admin ključeve, mogućnost nadogradnje i proceduru incidenta.&lt;/li&gt;
&lt;li&gt;Objavite mainnet deployment sa odvojenim deployer nalogom.&lt;/li&gt;
&lt;li&gt;Nadgledajte događaje, neuspele transakcije, saldo operativnih walleta i zaostajanje indexera.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;BSC je najlakše razumeti kao pragmatičan EVM Layer 1 sa agresivno optimizovanim vremenom bloka. Njegova prednost nije nova programska paradigma, već mogućnost da postojeći EVM način rada primenite u drugačijem odnosu cene, latencije i decentralizacije.&lt;/p&gt;

&lt;p&gt;To ga čini dobrim kandidatom za eksperiment, naročito kada se počne malim ugovorom koji rešava jasno ograničen problem. Najvažniji deo tog eksperimenta nije deployment, već provera da li aplikacija pravilno obrađuje finalnost, indekse, troškove, privatnost i kvarove infrastrukture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;BNB Chain, “BSC Is Now BNB Chain” i definicija BNB Smart Chain naziva: &lt;a href="https://www.bnbchain.org/en/blog/bsc-is-now-bnb-chain-the-infrastructure-for-the-metafi-universe" rel="noopener noreferrer"&gt;bnbchain.org/en/blog/bsc-is-now-bnb-chain-the-infrastructure-for-the-metafi-universe&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;BNB Chain dokumentacija, “Wallet Configuration” i “Quick Guide”: &lt;a href="https://docs.bnbchain.org/bnb-smart-chain/developers/wallet-configuration/" rel="noopener noreferrer"&gt;docs.bnbchain.org/bnb-smart-chain/developers/wallet-configuration&lt;/a&gt; i &lt;a href="https://docs.bnbchain.org/bnb-smart-chain/developers/quick-guide/" rel="noopener noreferrer"&gt;docs.bnbchain.org/bnb-smart-chain/developers/quick-guide&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;BNB Chain, “BNB Chain Fusion”: &lt;a href="https://www.bnbchain.org/en/bnb-chain-fusion" rel="noopener noreferrer"&gt;bnbchain.org/en/bnb-chain-fusion&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;BNB Chain dokumentacija, “BSC Validator Overview”: &lt;a href="https://docs.bnbchain.org/bnb-smart-chain/validator/overview/" rel="noopener noreferrer"&gt;docs.bnbchain.org/bnb-smart-chain/validator/overview&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;BNB Chain dokumentacija, “Fermi Upgrade of BSC” i “Introduction”: &lt;a href="https://docs.bnbchain.org/announce/fermi-bsc/" rel="noopener noreferrer"&gt;docs.bnbchain.org/announce/fermi-bsc&lt;/a&gt; i &lt;a href="https://docs.bnbchain.org/bnb-smart-chain/introduction/" rel="noopener noreferrer"&gt;docs.bnbchain.org/bnb-smart-chain/introduction&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;BNB Chain dokumentacija, “JSON-RPC Endpoint”: &lt;a href="https://docs.bnbchain.org/bnb-smart-chain/developers/json_rpc/json-rpc-endpoint/" rel="noopener noreferrer"&gt;docs.bnbchain.org/bnb-smart-chain/developers/json_rpc/json-rpc-endpoint&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Foundry dokumentacija, “Deploying and Verifying”: &lt;a href="https://getfoundry.sh/forge/deploying" rel="noopener noreferrer"&gt;getfoundry.sh/forge/deploying&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;BNB Chain BSC source, obračun efektivne cene gasa i nulta osnovna naknada: &lt;a href="https://github.com/bnb-chain/bsc/blob/master/core/types/transaction.go" rel="noopener noreferrer"&gt;github.com/bnb-chain/bsc/blob/master/core/types/transaction.go&lt;/a&gt; i &lt;a href="https://github.com/bnb-chain/bsc/blob/master/params/protocol_params.go" rel="noopener noreferrer"&gt;github.com/bnb-chain/bsc/blob/master/params/protocol_params.go&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>cryptocurrency</category>
      <category>bnb</category>
    </item>
    <item>
      <title>TRON za backend developere: TRC-20 plaćanja u praksi</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Fri, 18 Sep 2026 23:14:39 +0000</pubDate>
      <link>https://dev.to/kriptomuza/tron-za-backend-developere-trc-20-placanja-u-praksi-ap</link>
      <guid>https://dev.to/kriptomuza/tron-za-backend-developere-trc-20-placanja-u-praksi-ap</guid>
      <description>&lt;h2&gt;
  
  
  TRON je zanimljiviji kao infrastruktura nego kao ticker
&lt;/h2&gt;

&lt;p&gt;TRON je Layer 1 blockchain sa sopstvenom virtuelnom mašinom, modelom naloga i Delegated Proof of Stake konsenzusom. TRX je njegov nativni asset, dok su TRC-20 tokeni smart contracti koji implementiraju standardizovani interfejs sličan ERC-20 standardu.&lt;/p&gt;

&lt;p&gt;Za developera je važnija razlika između TRX-a i TRC-20 tokena nego tržišna cena TRX-a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transfer TRX-a je sistemska transakcija&lt;/li&gt;
&lt;li&gt;transfer TRC-20 tokena je poziv smart contracta&lt;/li&gt;
&lt;li&gt;TRX transfer uglavnom troši Bandwidth&lt;/li&gt;
&lt;li&gt;smart contract poziv troši Bandwidth i Energy&lt;/li&gt;
&lt;li&gt;TRC-20 balans ne nalazi se direktno u TRON nalogu, već u stanju token contracta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TRON Virtual Machine, odnosno TVM, izvršava Solidity smart contracte i koristi Solidity ABI. Ipak, TRON nije Ethereum sa drugim RPC URL-om. Adrese, resursi, finalnost i deo API površine dovoljno su različiti da Ethereum integraciju ne treba prekopirati bez prilagođavanja.&lt;/p&gt;

&lt;p&gt;TRON koristi 27 aktivnih Super Representative čvorova za proizvodnju blokova. Novi blok se u normalnim uslovima proizvodi približno svake tri sekunde. To daje brz signal da je transakcija uključena, ali uključenje u blok nije isto što i finalno knjiženje. Za finansijski ledger treba sačekati da blok postane solidified, što tipično traje oko jednog minuta.&lt;/p&gt;

&lt;p&gt;To je prvi važan mentalni model: aplikacija može brzo prikazati da je uplata primećena, ali raspoloživo stanje treba menjati tek kada koristi potvrđene, solidified podatke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gde TRON ima smisla za backend tim
&lt;/h2&gt;

&lt;p&gt;TRON ima smisla kada korisnici ili poslovni partneri već koriste TRX ili TRC-20 tokene. Tipičan primer nije novi DeFi protokol, već mnogo običniji backend problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;SaaS platforma želi da izdaje fakture i automatski prepoznaje uplate podržanog TRC-20 tokena.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sistem za takav slučaj mora da:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;dodeli adresu kupcu ili fakturi&lt;/li&gt;
&lt;li&gt;prepozna dolazni transfer&lt;/li&gt;
&lt;li&gt;proveri mrežu, token contract, primaoca i iznos&lt;/li&gt;
&lt;li&gt;sačeka solidifikaciju&lt;/li&gt;
&lt;li&gt;knjiži uplatu tačno jednom&lt;/li&gt;
&lt;li&gt;kasnije prebaci sredstva u treasury wallet&lt;/li&gt;
&lt;li&gt;uskladi interni ledger sa stanjem na mreži&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Blockchain deo ovde nije najteži. Teži deo je dizajn pouzdanog platnog workflowa oko njega.&lt;/p&gt;

&lt;p&gt;Ako se TRON koristi samo zato što deluje jeftinije od neke druge mreže, to obično nije dovoljan razlog. Trošak zavisi od vrste transakcije, stanja primaoca, trenutnog Energy faktora contracta i raspoloživih resursa naloga. Mnogo bolji signal je postojeća potražnja korisnika i kompatibilnost sa njihovim walletima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model naloga i adresa koji utiče na integraciju
&lt;/h2&gt;

&lt;p&gt;TRON adrese se pojavljuju u dva oblika:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base58Check format, obično dužine 34 karaktera i sa početnim slovom &lt;code&gt;T&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;heksadecimalni format sa prefiksom &lt;code&gt;41&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oba predstavljaju istu 21-bajtnu adresu. Kada koristite native HTTP API, polje &lt;code&gt;visible&lt;/code&gt; određuje koji format endpoint očekuje. Sa &lt;code&gt;visible: true&lt;/code&gt; koriste se Base58Check adrese. Ako je &lt;code&gt;visible&lt;/code&gt; izostavljen ili postavljen na &lt;code&gt;false&lt;/code&gt;, API uglavnom očekuje hex format.&lt;/p&gt;

&lt;p&gt;Kod ABI enkodiranja contract parametara postoji dodatna zamka: prefiks &lt;code&gt;41&lt;/code&gt; se uklanja, pa se enkodira 20-bajtna adresa kao u standardnom Solidity ABI-ju. SDK poput TronWeb-a ovo rešava automatski, ali ručno enkodiranje često dovodi do &lt;code&gt;CONTRACT_VALIDATE_ERROR&lt;/code&gt; grešaka.&lt;/p&gt;

&lt;p&gt;Mreža takođe mora biti deo poslovnog identiteta adrese. Mainnet, Shasta i Nile koriste isti adresni prefiks. Na osnovu stringa koji počinje slovom &lt;code&gt;T&lt;/code&gt; ne možete zaključiti kojoj mreži pripada.&lt;/p&gt;

&lt;p&gt;Praktičan složeni ključ zato izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;network + address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Za token je potreban još stroži identitet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;network + contract_address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simbol poput &lt;code&gt;USDT&lt;/code&gt;, &lt;code&gt;USD&lt;/code&gt; ili &lt;code&gt;TOKEN&lt;/code&gt; nije identitet asseta. Simboli mogu biti duplirani, a bilo ko može postaviti contract sa poznatim imenom. Produkcioni sistem treba da ima eksplicitnu allowlistu contract adresa.&lt;/p&gt;

&lt;h2&gt;
  
  
  TRC-20 nije samo poziv funkcije &lt;code&gt;transfer&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;TRC-20 standard definiše funkcije kao što su &lt;code&gt;balanceOf&lt;/code&gt;, &lt;code&gt;transfer&lt;/code&gt;, &lt;code&gt;transferFrom&lt;/code&gt;, &lt;code&gt;approve&lt;/code&gt; i &lt;code&gt;allowance&lt;/code&gt;, kao i događaje &lt;code&gt;Transfer&lt;/code&gt; i &lt;code&gt;Approval&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na površini, slanje tokena izgleda jednostavno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transfer(address recipient, uint256 amount)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Za payment backend je, međutim, važnije kako se transfer otkriva nego kako se šalje.&lt;/p&gt;

&lt;p&gt;Nije dovoljno pročitati ulazne parametre &lt;code&gt;TriggerSmartContract&lt;/code&gt; transakcije i zaključiti da je izvršen transfer. Smart contract može:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;emitovati više &lt;code&gt;Transfer&lt;/code&gt; događaja&lt;/li&gt;
&lt;li&gt;izvršiti transfer kroz drugi contract&lt;/li&gt;
&lt;li&gt;pozvati &lt;code&gt;transferFrom&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;završiti sa revertom&lt;/li&gt;
&lt;li&gt;imati ulazne parametre koji ne odgovaraju konačnim promenama stanja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pouzdan scanner zato posmatra uspešno izvršenu transakciju i dekodira &lt;code&gt;Transfer(address,address,uint256)&lt;/code&gt; događaje iz receipt logova. Contract koji je emitovao događaj mora odgovarati dozvoljenom token contractu, a primalac mora biti adresa koju platforma kontroliše.&lt;/p&gt;

&lt;p&gt;Jedna transakcija može emitovati više transfer događaja. &lt;code&gt;txID&lt;/code&gt; zato nije nužno dovoljan kao jedinstveni identifikator jednog token transfera. Robusniji ključ je:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;network + tx_id + event_index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ako koristite sopstveni block scanner, sačuvajte i broj bloka, hash bloka, poziciju transakcije i poziciju loga. To kasnije znatno olakšava audit i ponovno procesiranje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realna arhitektura za prijem TRC-20 uplata
&lt;/h2&gt;

&lt;p&gt;Minimalna produkciona arhitektura ima nekoliko odvojenih odgovornosti.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Komponenta&lt;/th&gt;
&lt;th&gt;Odgovornost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Address service&lt;/td&gt;
&lt;td&gt;Dodeljuje i evidentira deposit adrese&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chain scanner&lt;/td&gt;
&lt;td&gt;Pronalazi potvrđene transfere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deposit processor&lt;/td&gt;
&lt;td&gt;Validira pronađene transfere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ledger&lt;/td&gt;
&lt;td&gt;Knjiži poslovnu promenu tačno jednom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sweeper&lt;/td&gt;
&lt;td&gt;Prebacuje sredstva u treasury wallet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signer&lt;/td&gt;
&lt;td&gt;Izolovano potpisuje izlazne transakcije&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reconciliation job&lt;/td&gt;
&lt;td&gt;Poredi blockchain stanje i interni ledger&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Scanner ne treba da ima privatne ključeve. Za pretragu blokova, događaja i stanja dovoljni su javni podaci. Signer treba da bude zaseban proces ili servis sa minimalnom API površinom.&lt;/p&gt;

&lt;p&gt;Osnovne tabele mogu izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asset_registry
    network
    contract_address
    symbol
    decimals
    deposits_enabled
    withdrawals_enabled

deposit_address
    network
    address
    customer_id
    derivation_reference
    activation_status

onchain_transfer
    network
    tx_id
    event_index
    block_number
    block_hash
    contract_address
    from_address
    to_address
    raw_amount
    status

ledger_entry
    account_id
    asset_id
    raw_amount
    source_type
    source_id

scanner_cursor
    network
    last_solidified_block
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iznose treba čuvati kao cele brojeve u najmanjoj jedinici tokena. Nemojte konvertovati blockchain iznose u &lt;code&gt;float&lt;/code&gt; ili JavaScript &lt;code&gt;number&lt;/code&gt; ako mogu preći bezbedni celobrojni opseg.&lt;/p&gt;

&lt;p&gt;Ako transfer nosi vrednost &lt;code&gt;"1250000"&lt;/code&gt;, a dozvoljeni asset ima šest decimala, ledger treba da sačuva &lt;code&gt;"1250000"&lt;/code&gt;. Prikaz &lt;code&gt;1.25&lt;/code&gt; je posao prezentacionog sloja.&lt;/p&gt;

&lt;p&gt;Metapodatke poput simbola i broja decimala možete inicijalno pročitati sa contracta, ali produkcioni asset registry treba da ih kontroliše kao verzionisanu konfiguraciju. Nemojte dozvoliti da odgovor indexera samostalno redefiniše način na koji se novac prikazuje i knjiži.&lt;/p&gt;

&lt;h2&gt;
  
  
  TronGrid za početak, sopstveni scanner za veću kontrolu
&lt;/h2&gt;

&lt;p&gt;TRON integracija obično počinje jednim od dva pristupa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hosted servis kao što je TronGrid&lt;/li&gt;
&lt;li&gt;sopstveni FullNode, SolidityNode i indexer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TronGrid nudi standardne node API-je i dodatne indeksirane endpointove za istoriju naloga, TRC-20 transfere i contract događaje. Za istoriju dolaznih TRC-20 transfera postoji endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /v1/accounts/{address}/transactions/trc20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endpoint podržava filtere kao što su &lt;code&gt;only_confirmed&lt;/code&gt;, &lt;code&gt;only_to&lt;/code&gt;, &lt;code&gt;contract_address&lt;/code&gt;, vremenski opseg, sortiranje i paginacija preko &lt;code&gt;fingerprint&lt;/code&gt; vrednosti.&lt;/p&gt;

&lt;p&gt;Minimalni test sa Shasta ili Mainnet konfiguracijom može izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--get&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TRON_API&lt;/span&gt;&lt;span class="s2"&gt;/v1/accounts/&lt;/span&gt;&lt;span class="nv"&gt;$ADDRESS&lt;/span&gt;&lt;span class="s2"&gt;/transactions/trc20"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"TRON-PRO-API-KEY: &lt;/span&gt;&lt;span class="nv"&gt;$TRON_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s2"&gt;"only_confirmed=true"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s2"&gt;"only_to=true"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s2"&gt;"contract_address=&lt;/span&gt;&lt;span class="nv"&gt;$TOKEN_CONTRACT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s2"&gt;"limit=200"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;TRON_API&lt;/code&gt; treba eksplicitno vezati za okruženje:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mainnet: https://api.trongrid.io
Shasta: https://api.shasta.trongrid.io
Nile: https://nile.trongrid.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Produkcioni kod mora da implementira paginaciju. Ako odgovor sadrži &lt;code&gt;meta.fingerprint&lt;/code&gt;, sledeći zahtev treba poslati sa istim filterima i dodatim &lt;code&gt;fingerprint&lt;/code&gt; parametrom. Promena ostalih filtera tokom paginacije može proizvesti rupe ili duplikate.&lt;/p&gt;

&lt;p&gt;TronGrid je praktičan za prototip i umeren saobraćaj, ali uvodi zavisnost od rate limita, plana usluge i kašnjenja indexera. Za kritičan ledger indeksirani rezultat može biti kandidat za uplatu, dok se konačna verifikacija radi nad solidified podacima.&lt;/p&gt;

&lt;p&gt;Kod većeg obima alternativni model je skeniranje svakog novog solidified bloka:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;pročitaj poslednji solidified block number&lt;/li&gt;
&lt;li&gt;preuzmi sve blokove od lokalnog kursora do tog broja&lt;/li&gt;
&lt;li&gt;proveri execution receipt za smart contract transakcije&lt;/li&gt;
&lt;li&gt;dekodiraj relevantne &lt;code&gt;Transfer&lt;/code&gt; događaje&lt;/li&gt;
&lt;li&gt;upiši rezultate i novi kursor u kontrolisanim transakcijama&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;TRON dokumentacija za exchange i custodial integracije preporučuje upravo oslanjanje na solidified visinu, a ne na trenutni chain head.&lt;/p&gt;

&lt;p&gt;Hosted API i sopstveni node nisu međusobno isključivi. Čest kompromis je sopstveni node za verifikaciju, emitovanje transakcija i reconciliation, uz hosted indexer za pretrage koje nisu deo kritičnog puta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalnost, idempotencija i stanje uplate
&lt;/h2&gt;

&lt;p&gt;Payment state machine ne treba da bude samo &lt;code&gt;pending&lt;/code&gt; i &lt;code&gt;paid&lt;/code&gt;. Korisniji model je:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;created
observed
solidified
credited
sweeping
swept
rejected
manual_review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;observed&lt;/code&gt; znači da je transfer primećen blizu chain heada ili u indexeru. To još nije dozvola za knjiženje raspoloživog salda.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;solidified&lt;/code&gt; znači da je uplata pronađena u finalizovanom delu lanca.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;credited&lt;/code&gt; znači da je interni ledger uspešno promenjen.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;credited&lt;/code&gt; i &lt;code&gt;solidified&lt;/code&gt; nisu isto stanje. Blockchain može biti potpuno ispravan, a vaš database transaction može pasti. Zato ledger unos mora imati jedinstveni ključ povezan sa on-chain događajem.&lt;/p&gt;

&lt;p&gt;Primer zaštite na nivou baze:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="k"&gt;index&lt;/span&gt; &lt;span class="n"&gt;uq_onchain_transfer&lt;/span&gt;
&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;onchain_transfer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_index&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ledger unos treba da ima sličnu zaštitu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="k"&gt;index&lt;/span&gt; &lt;span class="n"&gt;uq_ledger_source&lt;/span&gt;
&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;ledger_entry&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ako worker obradi isti događaj više puta, drugi pokušaj treba da završi kao bezopasan conflict, a ne kao drugo knjiženje.&lt;/p&gt;

&lt;p&gt;Webhook prema ostatku aplikacije šaljite kroz transactional outbox. U suprotnom možete uspešno knjižiti uplatu, pasti pre slanja događaja i ostaviti order servis u pogrešnom stanju.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko košta transakcija na TRON-u
&lt;/h2&gt;

&lt;p&gt;TRON nema jedan univerzalni gas fee. Trošak se sastoji od mrežnih resursa i eventualnih direktnih protokolskih naknada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bandwidth
&lt;/h3&gt;

&lt;p&gt;Bandwidth pokriva bajtove koje transakcija zauzima na mreži. Prema parametrima proverеним 19. septembra 2026, nalog ima do 600 besplatnih Bandwidth jedinica u kliznom periodu od 24 sata. Dodatni Bandwidth može se dobiti stakingom TRX-a.&lt;/p&gt;

&lt;p&gt;Ako raspoloživi Bandwidth nije dovoljan, mreža može spaliti TRX po trenutno važećoj ceni. Dokumentacija u trenutku provere navodi 1.000 sun po nepokrivenom bajtu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Energy
&lt;/h3&gt;

&lt;p&gt;Energy pokriva izvršavanje TVM instrukcija. Contract pozivi, uključujući TRC-20 transfere, troše Energy. Za Energy ne postoji besplatna kvota.&lt;/p&gt;

&lt;p&gt;Energy se može obezbediti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stakingom TRX-a&lt;/li&gt;
&lt;li&gt;delegiranjem resursa sa drugog naloga&lt;/li&gt;
&lt;li&gt;spaljivanjem TRX-a za nepokriveni deo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;U trenutku provere, aktuelna dokumentacija navodi cenu od 100 sun po jedinici Energy-ja. Ova vrednost je chain parameter i može biti promenjena kroz governance.&lt;/p&gt;

&lt;p&gt;Jedan TRX sadrži 1.000.000 sun, pa se približan obračun može predstaviti ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;burn_sun =
    uncovered_bandwidth * bandwidth_price
    + uncovered_energy * energy_price
    + direct_protocol_fees

burn_trx = burn_sun / 1_000_000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ovo nije unapred garantovana cena. Contract stanje i Dynamic Energy Model mogu promeniti Energy potreban za isti poziv. Popularni contracti mogu imati dodatni Energy faktor koji se menja tokom vremena.&lt;/p&gt;

&lt;p&gt;Zato produkcioni servis treba da proceni Energy neposredno pre slanja transakcije i da tada postavi &lt;code&gt;fee_limit&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Šta zapravo radi &lt;code&gt;fee_limit&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;fee_limit&lt;/code&gt; je izražen u sun i ograničava caller-side Energy budžet jedne smart contract transakcije. On nije fiksna naknada koja se automatski naplaćuje u celosti.&lt;/p&gt;

&lt;p&gt;Ako postavite &lt;code&gt;fee_limit&lt;/code&gt; na 100 TRX, to ne znači da će transakcija koštati 100 TRX. To znači da transakcija ne sme koristiti veći caller-side Energy budžet od tog limita. Naplaćuje se stvarno potrošen nepokriveni Energy, osim kod određenih failure scenarija koji mogu iscrpeti raspoloživi budžet.&lt;/p&gt;

&lt;p&gt;Prenizak limit proizvodi &lt;code&gt;OUT_OF_ENERGY&lt;/code&gt;, čak i kada nalog ima TRX. Previsok limit povećava izloženost skupom failure pathu. Razumna strategija je:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;simulirati ili proceniti poziv&lt;/li&gt;
&lt;li&gt;pročitati aktuelni &lt;code&gt;getEnergyFee&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;uzeti u obzir trenutni ili maksimalni dynamic Energy faktor&lt;/li&gt;
&lt;li&gt;dodati kontrolisanu rezervu&lt;/li&gt;
&lt;li&gt;odbiti transakciju ako procena prelazi poslovni limit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Chain parametre treba čitati preko &lt;code&gt;wallet/getchainparameters&lt;/code&gt;, a ne trajno upisati u kod.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aktivacija adrese
&lt;/h3&gt;

&lt;p&gt;Lokalno generisana adresa ne postoji kao aktivan on-chain nalog dok ne bude aktivirana.&lt;/p&gt;

&lt;p&gt;Standardna aktivacija trenutno nosi direktnu naknadu od 1 TRX. Ako pošiljalac nema dovoljno Bandwidth resursa, može se spaliti još 0,1 TRX za Bandwidth shortfall.&lt;/p&gt;

&lt;p&gt;To je važno kod modela sa posebnom deposit adresom za svakog korisnika. Generisanje adrese je praktično besplatno, ali njena aktivacija, kasniji sweep i upravljanje ključem nisu.&lt;/p&gt;

&lt;p&gt;Veliki broj jednokratnih adresa poboljšava atribuciju uplata, ali povećava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;broj ključeva koje morate bezbedno derivirati i oporaviti&lt;/li&gt;
&lt;li&gt;broj naloga koje treba aktivirati&lt;/li&gt;
&lt;li&gt;broj sweep transakcija&lt;/li&gt;
&lt;li&gt;potrebu za delegiranjem Bandwidth i Energy resursa&lt;/li&gt;
&lt;li&gt;reconciliation površinu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zajednička adresa smanjuje operativni trošak, ali komplikuje atribuciju. Oslanjanje isključivo na memo nije idealno jer standardni TRC-20 &lt;code&gt;transfer&lt;/code&gt; nema poslovno polje za identifikator fakture, a walleti ne nude uvek dosledan način za slanje transaction memo podataka.&lt;/p&gt;

&lt;h2&gt;
  
  
  Slanje i sweepovanje tokena
&lt;/h2&gt;

&lt;p&gt;Nakon što je uplata knjižena, tokeni obično ne ostaju trajno na deposit adresi. Sweeper ih periodično prebacuje u treasury ili hot wallet.&lt;/p&gt;

&lt;p&gt;Za svaki sweep potrebno je:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;proveriti da je adresa aktivna&lt;/li&gt;
&lt;li&gt;proveriti stvarni &lt;code&gt;balanceOf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;proceniti Energy&lt;/li&gt;
&lt;li&gt;obezbediti Energy, Bandwidth ili dovoljan TRX saldo&lt;/li&gt;
&lt;li&gt;napraviti unsigned transakciju&lt;/li&gt;
&lt;li&gt;poslati je izolovanom signer-u&lt;/li&gt;
&lt;li&gt;emitovati potpisanu transakciju&lt;/li&gt;
&lt;li&gt;pratiti receipt do solidifikacije&lt;/li&gt;
&lt;li&gt;povezati rezultat sa internim sweep nalogom&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ako svaka deposit adresa sama šalje TRC-20 tokene, svaka mora moći da potpiše contract transakciju i pokrije resurse. Treasury nalog može delegirati Energy i Bandwidth deposit adresama, čime se smanjuje potreba da se TRX šalje na svaku pojedinačnu adresu.&lt;/p&gt;

&lt;p&gt;To ipak uvodi sopstveni resource scheduler. Potrebno je pratiti koliko je resursa delegirano, koliko je raspoloživo i kada ih treba povući ili preraspodeliti.&lt;/p&gt;

&lt;p&gt;Za nizak obim često je jednostavnije spaliti kontrolisanu količinu TRX-a. Za visok i predvidiv obim staking i delegiranje mogu smanjiti operativni burn, ali vezuju kapital. Aktuelni Stake 2.0 model ima period čekanja pre povlačenja unstakeovanog TRX-a, trenutno 14 dana, pri čemu i taj parametar treba čitati sa mreže.&lt;/p&gt;

&lt;h2&gt;
  
  
  TronWeb i granice SDK-a
&lt;/h2&gt;

&lt;p&gt;Za JavaScript i TypeScript TronWeb je prirodan SDK. Može da se poveže sa Mainnetom, Shasta ili Nile mrežom preko &lt;code&gt;fullHost&lt;/code&gt; konfiguracije i podržava API key zaglavlje za TronGrid.&lt;/p&gt;

&lt;p&gt;Tipična konfiguracija izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TronWeb&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tronweb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tronWeb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TronWeb&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;fullHost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TRON_FULL_HOST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TRON-PRO-API-KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TRON_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ovaj instance nema private key i pogodan je za čitanje stanja, validaciju adresa i pripremu nepotpisanih operacija.&lt;/p&gt;

&lt;p&gt;Nemojte automatski dodavati private key u svaki TronWeb instance samo zato što SDK to podržava. Scanner, REST kontroleri i javni web procesi ne treba da mogu da potpisuju transakcije.&lt;/p&gt;

&lt;p&gt;Za prototip na Shasta testnetu izolovani testni ključ je prihvatljiv. U produkciji potpisivanje treba izdvojiti u HSM, hardware wallet, offline signer ili strogo kontrolisan servis. Dokumentacija eksplicitno upozorava da se metode koje koriste private key ne izvršavaju u browseru ili korisničkoj aplikaciji.&lt;/p&gt;

&lt;p&gt;TRON takođe nudi JSON-RPC kompatibilnost za deo Ethereum alata. Ona je korisna za postojeći Web3.js, ethers ili viem kod, ali ne pokriva nužno sve native node operacije. Kada su potrebni account resources, solidified state ili TRON-specifični API-ji, native HTTP API, gRPC ili TronWeb obično daju jasniji model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testiranje koje vredi uraditi pre Mainneta
&lt;/h2&gt;

&lt;p&gt;Shasta je preporučeni testnet za standardne integracije i završnu proveru pre produkcije. Nile se više koristi za funkcionalnosti i parametre koji se tek približavaju Mainnetu. Testnet TRX i testni TRC-20 tokeni mogu se dobiti kroz zvanične faucet tokove.&lt;/p&gt;

&lt;p&gt;Happy-path transfer nije dovoljan test. Korisniji skup scenarija uključuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;isti događaj preuzet više puta&lt;/li&gt;
&lt;li&gt;više &lt;code&gt;Transfer&lt;/code&gt; događaja u jednoj transakciji&lt;/li&gt;
&lt;li&gt;isti simbol sa pogrešne contract adrese&lt;/li&gt;
&lt;li&gt;uplatu na Mainnet adresu dok servis radi u Shasta okruženju&lt;/li&gt;
&lt;li&gt;iznos veći od JavaScript &lt;code&gt;Number.MAX_SAFE_INTEGER&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;transfer ispod poslovnog minimuma&lt;/li&gt;
&lt;li&gt;transfer koji je primećen, ali još nije solidified&lt;/li&gt;
&lt;li&gt;contract transakciju koja je završila revertom&lt;/li&gt;
&lt;li&gt;restart scannera između upisa transfera i pomeranja kursora&lt;/li&gt;
&lt;li&gt;TronGrid timeout nakon uspešnog odgovora mreže&lt;/li&gt;
&lt;li&gt;neuspešan sweep zbog preniskog &lt;code&gt;fee_limit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;promenu Energy procene između simulacije i izvršenja&lt;/li&gt;
&lt;li&gt;ponovni broadcast iste potpisane transakcije&lt;/li&gt;
&lt;li&gt;nedostupan signer&lt;/li&gt;
&lt;li&gt;neslaganje između ukupnog on-chain balansa i internog ledgera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Posebno testirajte oporavak. Ako scanner izgubi lokalni kursor, mora postojati način da ponovo pročita opseg solidified blokova bez dvostrukog knjiženja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-off koji se najčešće previdi
&lt;/h2&gt;

&lt;p&gt;TRON smanjuje vreme potrebno da developer dođe do prve token transakcije, ali ne uklanja složenost custody sistema.&lt;/p&gt;

&lt;p&gt;Prednosti su praktične:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solidity i poznat ABI model&lt;/li&gt;
&lt;li&gt;brz block cadence&lt;/li&gt;
&lt;li&gt;standardizovan TRC-20 interfejs&lt;/li&gt;
&lt;li&gt;hosted API i indexer za brz početak&lt;/li&gt;
&lt;li&gt;staking i delegiranje kao alternativa stalnom spaljivanju TRX-a&lt;/li&gt;
&lt;li&gt;solidified API površina pogodna za finansijski ledger&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ograničenja su podjednako konkretna:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Energy trošak smart contract poziva nije fiksan&lt;/li&gt;
&lt;li&gt;adrese zahtevaju aktivaciju i resource planiranje&lt;/li&gt;
&lt;li&gt;Ethereum tooling nije potpuna zamena za native TRON API&lt;/li&gt;
&lt;li&gt;hosted indexer zahteva paginaciju, rate-limit strategiju i verifikaciju&lt;/li&gt;
&lt;li&gt;veliki broj deposit adresa povećava custody i sweep složenost&lt;/li&gt;
&lt;li&gt;brzo uključenje u blok nije isto što i finalno knjiženje&lt;/li&gt;
&lt;li&gt;upravljanje ključevima ostaje najveći operativni rizik&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za non-custodial aplikaciju deo ovog problema preuzima korisnički wallet. Korisnik potpisuje sopstvene transakcije, dok backend prati događaje i poslovno stanje.&lt;/p&gt;

&lt;p&gt;Za custodial payment servis nema takvog prečaca. TRON deo integracije može biti relativno kompaktan, ali kvalitet sistema zavisi od dosadnih detalja: celobrojnih iznosa, finalnosti, idempotentnog ledgera, izolovanog signer-a i redovnog reconciliation procesa.&lt;/p&gt;

&lt;p&gt;To je ujedno i dobar način da se tehnologija proceni. Mali Shasta prototip sa jednom dozvoljenom TRC-20 adresom, solidified scannerom i idempotentnim ledgerom otkriva mnogo više od jednostavnog poziva &lt;code&gt;transfer&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/api" rel="noopener noreferrer"&gt;TRON API reference and integration paths&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/tron-protocol-transaction" rel="noopener noreferrer"&gt;Transactions and solidification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/encoding" rel="noopener noreferrer"&gt;Encoding addresses and data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/trc20-protocol-interface" rel="noopener noreferrer"&gt;TRC-20 protocol interface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/exchangewallet-integrate-with-the-tron-network" rel="noopener noreferrer"&gt;Exchange wallet integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/reference/get-trc20-transaction-info-by-account-address" rel="noopener noreferrer"&gt;Get TRC-20 transaction info by account address&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/resource-model" rel="noopener noreferrer"&gt;TRON resource model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/set-feelimit" rel="noopener noreferrer"&gt;FeeLimit and Energy cost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/network-parameters" rel="noopener noreferrer"&gt;TRON network parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/account" rel="noopener noreferrer"&gt;Accounts and keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tronweb.network/docu/docs/references/provider-configuration" rel="noopener noreferrer"&gt;TronWeb provider configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tronweb.network/docu/docs/API%20List/trx/sendTransaction" rel="noopener noreferrer"&gt;TronWeb sendTransaction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.tron.network/docs/getting-testnet-tokens-on-tron" rel="noopener noreferrer"&gt;Getting testnet tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>cryptocurrency</category>
      <category>webmonetization</category>
    </item>
    <item>
      <title>Ripple, XRP i XRPL: detaljna arhitektura za developere</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Fri, 18 Sep 2026 22:49:36 +0000</pubDate>
      <link>https://dev.to/kriptomuza/ripple-xrp-i-xrpl-detaljna-arhitektura-za-developere-4mc7</link>
      <guid>https://dev.to/kriptomuza/ripple-xrp-i-xrpl-detaljna-arhitektura-za-developere-4mc7</guid>
      <description>&lt;p&gt;Termin „Ripple” često se koristi kao zajedničko ime za kompaniju, mrežu i kriptovalutu. Za developera je to loš početni model, jer su u pitanju tri odvojene stvari:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ripple&lt;/strong&gt; je privatna tehnološka kompanija koja razvija infrastrukturu i proizvode za digitalna plaćanja.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XRP Ledger&lt;/strong&gt;, skraćeno XRPL, jeste javna, open-source Layer 1 mreža.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XRP&lt;/strong&gt; je nativni digitalni asset te mreže.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ripple koristi XRPL i XRP u delu svojih proizvoda, poseduje XRP i doprinosi razvoju ekosistema, ali XRPL nije Ripple-ov privatni blockchain. Aplikacija može koristiti XRP Ledger bez poslovnog odnosa sa kompanijom Ripple.&lt;/p&gt;

&lt;p&gt;Za developera je zato preciznije pitanje: šta XRPL pruža kao platforma, kako izgleda integracija i za koje probleme je njegov model bolji od generičkog smart contract blockchaina?&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta je XRP Ledger
&lt;/h2&gt;

&lt;p&gt;XRP Ledger je distribuirani state machine optimizovan za prenos i razmenu vrednosti. Pokrenut je 2012. godine, a njegov nativni asset je XRP. Ukupno 100 milijardi XRP kreirano je na početku mreže. Protokol ne rudari nove jedinice, dok se XRP potrošen na transakcione troškove trajno uništava.&lt;/p&gt;

&lt;p&gt;Za razliku od platformi kod kojih gotovo svaka poslovna funkcija zahteva poseban smart contract, XRPL u sam protokol ugrađuje finansijske primitive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;direktna XRP plaćanja&lt;/li&gt;
&lt;li&gt;izdavanje fungibilnih tokena&lt;/li&gt;
&lt;li&gt;trust lines&lt;/li&gt;
&lt;li&gt;cross-currency plaćanja&lt;/li&gt;
&lt;li&gt;central limit order book DEX&lt;/li&gt;
&lt;li&gt;automated market makere&lt;/li&gt;
&lt;li&gt;escrow&lt;/li&gt;
&lt;li&gt;payment channels&lt;/li&gt;
&lt;li&gt;checks&lt;/li&gt;
&lt;li&gt;NFT objekte&lt;/li&gt;
&lt;li&gt;multi-signing&lt;/li&gt;
&lt;li&gt;kontrole kao što su autorizacija, freeze i clawback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To je važna arhitektonska razlika. XRPL nije zamišljen kao globalni računar opšte namene, već kao finansijski ledger sa unapred definisanim tipovima transakcija i objekata.&lt;/p&gt;

&lt;p&gt;Ako aplikaciji trebaju plaćanja, tokenizovana potraživanja, razmena asseta ili settlement, takav model može ukloniti veliki deo smart contract koda. Ako joj treba proizvoljna izvršna logika, petlje, kompleksno stanje i composability sa Solidity protokolima, osnovni XRPL verovatno nije dovoljan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako XRPL čuva stanje
&lt;/h2&gt;

&lt;p&gt;XRPL koristi account-based model, ali njegov nalog nije samo stanje sa nativnim balansom.&lt;/p&gt;

&lt;p&gt;Osnovni zapis naloga je &lt;code&gt;AccountRoot&lt;/code&gt;. On sadrži:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;klasičnu adresu naloga&lt;/li&gt;
&lt;li&gt;XRP balans&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Sequence&lt;/code&gt; broj&lt;/li&gt;
&lt;li&gt;konfiguracione flagove&lt;/li&gt;
&lt;li&gt;broj objekata koji utiču na rezervu&lt;/li&gt;
&lt;li&gt;pokazivače ka prethodnoj transakciji&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dodatne funkcije predstavljene su posebnim ledger objektima. Trust line je &lt;code&gt;RippleState&lt;/code&gt;, otvorena ponuda na DEX-u je &lt;code&gt;Offer&lt;/code&gt;, escrow je &lt;code&gt;Escrow&lt;/code&gt;, a konfiguracija za multi-signing čuva se kao &lt;code&gt;SignerList&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Svaka validirana verzija ledgera sadrži aktuelno stanje, skup transakcija koje su dovele do tog stanja i kriptografske reference ka prethodnoj verziji. Node zato može proveravati trenutno stanje bez rekonstrukcije čitave istorije od genesis bloka.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adrese i aktivacija naloga
&lt;/h3&gt;

&lt;p&gt;Klasična XRPL adresa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;obično počinje slovom &lt;code&gt;r&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;izvedena je iz javnog ključa&lt;/li&gt;
&lt;li&gt;sadrži checksum&lt;/li&gt;
&lt;li&gt;razlikuje velika i mala slova&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generisanje ključa i adrese ne kreira automatski nalog u ledgeru. Adresa postaje aktivan nalog tek kada primi dovoljno XRP da ispuni minimalnu rezervu.&lt;/p&gt;

&lt;p&gt;Ne postoji posebna &lt;code&gt;CreateAccount&lt;/code&gt; transakcija. Običan &lt;code&gt;Payment&lt;/code&gt; koji pošalje dovoljno XRP na novu adresu kreira njen &lt;code&gt;AccountRoot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pored klasičnih adresa postoje X-address formati. Oni kombinuju klasičnu adresu i destination tag u jedan string. Sam protokol i dalje nativno koristi klasičnu adresu i poseban &lt;code&gt;DestinationTag&lt;/code&gt;, dok SDK može obaviti konverziju.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uloga XRP-a u protokolu
&lt;/h2&gt;

&lt;p&gt;XRP nije ERC-20-stil token dodat naknadno. On je deo osnovnog računovodstvenog modela XRPL-a i ima nekoliko tehničkih funkcija.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prenos vrednosti
&lt;/h3&gt;

&lt;p&gt;XRP se može direktno poslati između naloga bez izdavaoca, trust linea ili smart contracta. Iznos se u API-jima najčešće predstavlja u jedinici &lt;code&gt;drop&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 XRP je 1.000.000 drops&lt;/li&gt;
&lt;li&gt;0,1 XRP je 100.000 drops&lt;/li&gt;
&lt;li&gt;0,00001 XRP je 10 drops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zbog toga XRP vrednosti u transakcijama ne treba predstavljati JavaScript &lt;code&gt;number&lt;/code&gt; tipom i ručno množiti. SDK funkcije kao što je &lt;code&gt;xrpl.xrpToDrops()&lt;/code&gt; smanjuju rizik od grešaka sa decimalama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zaštita od spama
&lt;/h3&gt;

&lt;p&gt;Svaka standardna transakcija uništava malu količinu XRP-a. Minimalni trošak standardne transakcije trenutno je 10 drops, odnosno 0,00001 XRP, ali server može zahtevati više kada je pod opterećenjem.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Fee&lt;/code&gt; nije nagrada validatoru. XRP naveden u ovom polju trajno se uklanja iz opticaja.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rezerva za stanje
&lt;/h3&gt;

&lt;p&gt;XRPL traži da nalog drži određenu XRP rezervu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;osnovna rezerva naloga trenutno je 1 XRP&lt;/li&gt;
&lt;li&gt;dodatna owner rezerva trenutno je 0,2 XRP po ledger objektu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trust lines, ponude, escrow objekti i slični zapisi mogu povećati potrebnu rezervu. Rezerva nije isto što i transakcioni trošak. Ona uglavnom ostaje u balansu, ali se ne može slobodno poslati dok odgovarajući objekat postoji.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bridge asset
&lt;/h3&gt;

&lt;p&gt;XRP može povezati dva asseta na ugrađenom DEX-u. Ako ne postoji dovoljno likvidnosti za direktnu razmenu između dva tokena, XRPL može razmotriti putanju token A, XRP, token B.&lt;/p&gt;

&lt;p&gt;Ova funkcija nije garancija dobrog kursa. Ona samo omogućava protokolu da koristi raspoložive order bookove i AMM likvidnost u okviru jedne atomske transakcije.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako radi XRPL konsenzus
&lt;/h2&gt;

&lt;p&gt;XRPL ne koristi proof of work i nema rudare. Ne koristi ni klasični proof of stake u kojem količina zaključanog tokena direktno određuje pravo na proizvodnju blokova.&lt;/p&gt;

&lt;p&gt;Serveri izvršavaju transakcije, održavaju ledger i prate validatore. Svaki server bira skup validatora kojima veruje da neće koordinisano kršiti protokol. Taj skup se naziva Unique Node List, odnosno UNL.&lt;/p&gt;

&lt;p&gt;Proces, pojednostavljeno, izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Server prima kandidat transakcije.&lt;/li&gt;
&lt;li&gt;Validatori predlažu skup transakcija za narednu verziju ledgera.&lt;/li&gt;
&lt;li&gt;Predlozi se porede u više rundi.&lt;/li&gt;
&lt;li&gt;Validatori prilagođavaju predlog prema transakcijama koje imaju dovoljan nivo podrške.&lt;/li&gt;
&lt;li&gt;Transakcije se izvršavaju determinističkim redosledom.&lt;/li&gt;
&lt;li&gt;Validatori objavljuju validacije rezultujućeg ledgera.&lt;/li&gt;
&lt;li&gt;Kada server dobije potreban nivo podrške svojih trusted validatora, ledger smatra validiranim.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ledger se tipično zatvara i validira u periodu od nekoliko sekundi. Dokumentacija kao uobičajen interval navodi približno tri do pet sekundi.&lt;/p&gt;

&lt;p&gt;Prema bezbednosnom modelu protokola, konsenzus može normalno napredovati dok je manje od 20 procenata trusted validatora neispravno. Potvrđivanje nevalidnog rezultata zahtevalo bi koordinaciju više od 80 procenata validatora kojima konkretan server veruje.&lt;/p&gt;

&lt;p&gt;To otkriva i glavni trade-off. Bezbednost ne zavisi od anonimne hash snage ili ukupno uloženog kapitala, već od kvalitetnog, raznovrsnog i dovoljno preklopljenog izbora validatora. Operater node-a može definisati svoj UNL, ali time preuzima odgovornost da njegov izbor ostane kompatibilan sa ostatkom mreže.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konsenzus nije isto što i izvršavanje transakcije
&lt;/h3&gt;

&lt;p&gt;Odgovor servera nakon &lt;code&gt;submit&lt;/code&gt; poziva nije konačna potvrda.&lt;/p&gt;

&lt;p&gt;Server prvo može privremeno izvršiti transakciju nad otvorenim ledgerom. Redosled i stanje tokom konsenzusa mogu se promeniti, pa početni rezultat može biti drugačiji od rezultata u validiranom ledgeru.&lt;/p&gt;

&lt;p&gt;Aplikacija sme da tretira ishod kao konačan tek kada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transakcija postoji u validiranom ledgeru&lt;/li&gt;
&lt;li&gt;odgovor ima &lt;code&gt;validated: true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;meta.TransactionResult&lt;/code&gt; ima očekivanu vrednost, najčešće &lt;code&gt;tesSUCCESS&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za transakcije koje nisu prošle, konačan neuspeh može se utvrditi nakon što prođe njihov &lt;code&gt;LastLedgerSequence&lt;/code&gt; i pouzdan server potvrdi da transakcija nije uključena ni u jedan odgovarajući ledger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomija transakcije
&lt;/h2&gt;

&lt;p&gt;Tipična XRPL transakcija sadrži:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"TransactionType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Payment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rSenderAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rDestinationAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"DeliverMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1250000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Fee"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Sequence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"LastLedgerSequence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;98765432&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Značenje ključnih polja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;TransactionType&lt;/code&gt; određuje protokolsku operaciju.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Account&lt;/code&gt; je nalog koji autorizuje i plaća transakciju.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Destination&lt;/code&gt; je primalac kod &lt;code&gt;Payment&lt;/code&gt; transakcije.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DeliverMax&lt;/code&gt; je maksimalan iznos koji treba dostaviti, ovde izražen u drops.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Fee&lt;/code&gt; je maksimalni XRP iznos koji će biti uništen.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Sequence&lt;/code&gt; sprečava replay i određuje redosled transakcija jednog naloga.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LastLedgerSequence&lt;/code&gt; definiše poslednji ledger u kojem transakcija sme biti uključena.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;U API verziji 1 tradicionalno se koristi polje &lt;code&gt;Amount&lt;/code&gt;. API verzija 2 za &lt;code&gt;Payment&lt;/code&gt; preferira naziv &lt;code&gt;DeliverMax&lt;/code&gt;, koji jasnije opisuje semantiku polja, naročito kod partial payment transakcija.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sequence i konkurentnost
&lt;/h3&gt;

&lt;p&gt;Nalog ima trenutni &lt;code&gt;Sequence&lt;/code&gt;. Transakcija uspeva samo ako koristi odgovarajuću vrednost. Nakon procesiranja, sequence naloga se povećava.&lt;/p&gt;

&lt;p&gt;To je jednostavno kada jedan proces šalje transakcije sekvencijalno. Postaje složenije kada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;više worker procesa koristi isti nalog&lt;/li&gt;
&lt;li&gt;payout sistem šalje stotine naloga paralelno&lt;/li&gt;
&lt;li&gt;dođe do timeouta posle slanja, ali pre čuvanja rezultata&lt;/li&gt;
&lt;li&gt;jedna transakcija ostane u queue-u&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tipična rešenja su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jedan centralni sequence allocator&lt;/li&gt;
&lt;li&gt;red za slanje po nalogu&lt;/li&gt;
&lt;li&gt;više operativnih naloga&lt;/li&gt;
&lt;li&gt;XRPL Tickets za unapred rezervisane brojeve transakcija&lt;/li&gt;
&lt;li&gt;pažljivo čuvanje potpisanog blob-a, hash-a i &lt;code&gt;LastLedgerSequence&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nije dovoljno ponovo napraviti „istu” poslovnu transakciju posle timeouta. Prvo se proverava originalni hash, jer je moguće da je original već validiran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plaćanja nisu samo transfer balansa
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Payment&lt;/code&gt; je jedna od najvažnijih XRPL transakcija, ali može predstavljati nekoliko različitih operacija:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;direktan XRP transfer&lt;/li&gt;
&lt;li&gt;direktan transfer tokena&lt;/li&gt;
&lt;li&gt;izdavanje tokena&lt;/li&gt;
&lt;li&gt;cross-currency plaćanje&lt;/li&gt;
&lt;li&gt;konverziju asseta kroz DEX&lt;/li&gt;
&lt;li&gt;partial payment&lt;/li&gt;
&lt;li&gt;kreiranje novog naloga XRP uplatom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kod cross-currency plaćanja pošiljalac može definisati koliko jednog asseta želi da potroši, a koliko drugog asseta primalac treba da dobije. Protokol zatim može atomski koristiti putanje kroz trust lines, order bookove i AMM poolove.&lt;/p&gt;

&lt;p&gt;Ako puna razmena nije moguća pod zadatim uslovima, cela transakcija može pasti. Ako je uključen &lt;code&gt;tfPartialPayment&lt;/code&gt;, ona može uspeti sa manjim isporučenim iznosom.&lt;/p&gt;

&lt;p&gt;Zbog toga backend nikada ne treba da kreditira korisnika na osnovu &lt;code&gt;DeliverMax&lt;/code&gt; ili starog &lt;code&gt;Amount&lt;/code&gt; polja. Stvarno dostavljeni iznos čita se iz &lt;code&gt;meta.delivered_amount&lt;/code&gt; ili se računa iz promena balansa u metadata objektu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tokeni: trust lines i MPT
&lt;/h2&gt;

&lt;p&gt;XRPL ima dva modela fungibilnih tokena.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trust line tokeni
&lt;/h3&gt;

&lt;p&gt;Originalni model koristi &lt;code&gt;RippleState&lt;/code&gt; objekte, poznate kao trust lines. Asset je identifikovan kombinacijom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;currency koda&lt;/li&gt;
&lt;li&gt;adrese izdavaoca&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;USD&lt;/code&gt; koji izdaje jedan nalog nije isti asset kao &lt;code&gt;USD&lt;/code&gt; koji izdaje drugi nalog.&lt;/p&gt;

&lt;p&gt;Holder pre primanja tokena uglavnom kreira trust line ka izdavaocu. Trust line izražava spremnost naloga da drži određeni asset i postavlja maksimalni limit.&lt;/p&gt;

&lt;p&gt;Izdavalac može konfigurisati funkcije kao što su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;obavezna autorizacija holdera&lt;/li&gt;
&lt;li&gt;transfer fee&lt;/li&gt;
&lt;li&gt;global freeze&lt;/li&gt;
&lt;li&gt;individual freeze&lt;/li&gt;
&lt;li&gt;clawback, ako je prethodno omogućen&lt;/li&gt;
&lt;li&gt;zabrana freeze funkcije njenim trajnim isključivanjem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trust line model je moćan, ali ima istorijske osobine koje nisu uvek intuitivne. Stanje je bidirekciono, balans zavisi od perspektive strane, a rippling može omogućiti tok obaveza kroz više naloga. Za klasičan stablecoin proizvod obično se pažljivo konfiguriše &lt;code&gt;No Ripple&lt;/code&gt; i razdvajaju issuing, operational i standby nalozi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Purpose Tokens
&lt;/h3&gt;

&lt;p&gt;Multi-Purpose Tokens, odnosno MPT, predstavljaju noviji model fungibilnih tokena. Svako izdanje ima poseban identifikator i eksplicitnije odvojene uloge izdavaoca i holdera.&lt;/p&gt;

&lt;p&gt;MPT model podržava osobine kao što su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;maksimalna ponuda&lt;/li&gt;
&lt;li&gt;transfer fee&lt;/li&gt;
&lt;li&gt;holder autorizacija&lt;/li&gt;
&lt;li&gt;zabrana transfera&lt;/li&gt;
&lt;li&gt;freeze&lt;/li&gt;
&lt;li&gt;clawback&lt;/li&gt;
&lt;li&gt;on-chain metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MPT funkcije uvode se kroz amendment sistem. Podršku treba proveriti na konkretnoj mreži i u verziji servera i SDK-a koju aplikacija koristi. Neke dodatne funkcije, kao što je šira integracija MPT-a sa DEX-om, razvijaju se odvojeno kroz novije amendmente.&lt;/p&gt;

&lt;p&gt;Za novi token projekat izbor nije samo „stari ili novi standard”. Potrebno je proveriti da li svi potrebni walleti, custody sistemi, berze i analytics servisi podržavaju izabrani model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ugrađeni DEX i AMM
&lt;/h2&gt;

&lt;p&gt;XRPL DEX kombinuje central limit order book model i automated market makere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Offer kao limit nalog
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;OfferCreate&lt;/code&gt; opisuje koliko jednog asseta nalog nudi i koliko drugog želi zauzvrat. Ako postoji odgovarajuća kontra-ponuda, razmena se izvršava odmah. Neispunjeni deo može ostati kao &lt;code&gt;Offer&lt;/code&gt; objekat u ledgeru.&lt;/p&gt;

&lt;p&gt;Pošto je ponuda ledger objekat, ona može povećati owner rezervu naloga.&lt;/p&gt;

&lt;p&gt;Matching počinje od najboljeg kursa. Transakcija može biti potpuno ili delimično izvršena, u zavisnosti od flagova i raspoložive likvidnosti.&lt;/p&gt;

&lt;h3&gt;
  
  
  AMM poolovi
&lt;/h3&gt;

&lt;p&gt;XRPL AMM drži par asseta i koristi constant-product-stil model. Liquidity provideri dobijaju LP tokene koji predstavljaju njihov udeo u poolu.&lt;/p&gt;

&lt;p&gt;Kada transakcija traži razmenu, protokol može koristiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;samo order book&lt;/li&gt;
&lt;li&gt;samo AMM&lt;/li&gt;
&lt;li&gt;kombinaciju order book ponuda i AMM likvidnosti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Izbor zavisi od dostupnog kursa i pravila same transakcije. AMM ima sopstveni trading fee koji određuju liquidity provideri, dok mrežni &lt;code&gt;Fee&lt;/code&gt; ostaje zaseban trošak protokola.&lt;/p&gt;

&lt;p&gt;Ugrađen DEX smanjuje količinu aplikativnog koda, ali ne uklanja tržišne rizike:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;slippage&lt;/li&gt;
&lt;li&gt;nedovoljnu likvidnost&lt;/li&gt;
&lt;li&gt;manipulaciju tankim tržištem&lt;/li&gt;
&lt;li&gt;issuer rizik tokena&lt;/li&gt;
&lt;li&gt;impermanent loss za liquidity providere&lt;/li&gt;
&lt;li&gt;nepredvidiv krajnji kurs ako transakcija nema stroge granice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend zato treba da računa quote neposredno pre slanja i postavi &lt;code&gt;SendMax&lt;/code&gt;, &lt;code&gt;DeliverMin&lt;/code&gt; ili quality ograničenja u skladu sa poslovnim pravilima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan use-case: payment backend sa zajedničkim nalogom
&lt;/h2&gt;

&lt;p&gt;Zamislimo SaaS platformu koja svojim korisnicima omogućava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XRP depozite&lt;/li&gt;
&lt;li&gt;depozite jednog podržanog stablecoina&lt;/li&gt;
&lt;li&gt;interno knjiženje balansa&lt;/li&gt;
&lt;li&gt;povlačenje na spoljne XRPL adrese&lt;/li&gt;
&lt;li&gt;opcionu konverziju između XRP-a i stablecoina&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Najjednostavniji model nije jedan XRPL nalog po korisniku. Svaki nalog zahteva rezervu i povećava operativni teret.&lt;/p&gt;

&lt;p&gt;Platforma može koristiti jedan operational nalog za depozite, dok svakom korisniku dodeljuje jedinstven &lt;code&gt;DestinationTag&lt;/code&gt;. Tag je 32-bitni broj koji nema samostalno on-chain značenje. Backend ga mapira na korisnika, fakturu ili nalog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow depozita
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Korisnik dobija adresu i destination tag.&lt;/li&gt;
&lt;li&gt;Platforma prati transakcije koje utiču na operational nalog.&lt;/li&gt;
&lt;li&gt;Za svaku pristiglu transakciju proverava da li je rezultat validiran.&lt;/li&gt;
&lt;li&gt;Proverava da je &lt;code&gt;meta.TransactionResult&lt;/code&gt; jednak &lt;code&gt;tesSUCCESS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Proverava &lt;code&gt;Destination&lt;/code&gt; i &lt;code&gt;DestinationTag&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stvarni primljeni iznos čita iz &lt;code&gt;delivered_amount&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Proverava currency i issuer, ne samo ticker.&lt;/li&gt;
&lt;li&gt;Upisuje ledger index i transaction hash.&lt;/li&gt;
&lt;li&gt;Tek tada kreditira interni balans korisnika.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Operational nalog može uključiti &lt;code&gt;RequireDest&lt;/code&gt; opciju kako bi mreža odbila uplate bez destination taga. To ne rešava pogrešan tag, pa su i dalje potrebni reconciliation i support procesi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow povlačenja
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Korisnik šalje destination adresu, tag i traženi iznos.&lt;/li&gt;
&lt;li&gt;Backend validira format adrese i proverava poslovna ograničenja.&lt;/li&gt;
&lt;li&gt;Interna baza rezerviše iznos za payout.&lt;/li&gt;
&lt;li&gt;Signing servis konstruiše transakciju.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;autofill&lt;/code&gt; pribavlja &lt;code&gt;Sequence&lt;/code&gt;, &lt;code&gt;Fee&lt;/code&gt; i &lt;code&gt;LastLedgerSequence&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Transakcija se potpisuje u izolovanom signing okruženju.&lt;/li&gt;
&lt;li&gt;Potpisani blob i hash čuvaju se pre slanja.&lt;/li&gt;
&lt;li&gt;Blob se šalje jednom ili više trusted servera.&lt;/li&gt;
&lt;li&gt;Sistem čeka validirani rezultat.&lt;/li&gt;
&lt;li&gt;Interno knjiženje postaje konačno tek nakon verifikacije.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Za direktan XRP payout nije potreban DEX. Za cross-currency payout treba eksplicitno ograničiti maksimalnu potrošnju i proveriti raspoloživu likvidnost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimalna integracija pomoću xrpl.js
&lt;/h2&gt;

&lt;p&gt;Zvanični JavaScript i TypeScript SDK instalira se kao paket &lt;code&gt;xrpl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;xrpl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sledeći primer kreira dva Testnet naloga, šalje 1,25 test XRP i čeka validirani rezultat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;xrpl&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xrpl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;xrpl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wss://s.altnet.rippletest.net:51233&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sender&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fundWallet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;receiver&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fundWallet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;TransactionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Payment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;Destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;DeliverMax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;xrpl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;xrpToDrops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.25&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prepared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;autofill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prepared&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submitAndWait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tx_blob&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TransactionResult&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tesSUCCESS&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Payment failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;signed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ledgerIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ledger_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;client.autofill()&lt;/code&gt; popunjava polja kao što su &lt;code&gt;Fee&lt;/code&gt;, &lt;code&gt;Sequence&lt;/code&gt; i &lt;code&gt;LastLedgerSequence&lt;/code&gt;. Potpis se obavlja lokalno pomoću &lt;code&gt;Wallet.sign()&lt;/code&gt;, a mreži se šalje binarni potpisani blob.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;client.fundWallet()&lt;/code&gt; pripada razvojnom Testnet workflow-u. Ne treba ga koristiti kao deo produkcione arhitekture, a Testnet i Mainnet ne treba da dele iste ključeve.&lt;/p&gt;

&lt;p&gt;Za produkciju je važnije razumeti workflow nego skratiti ga na jedan SDK poziv. Sistem bi između &lt;code&gt;sign()&lt;/code&gt; i &lt;code&gt;submitAndWait()&lt;/code&gt; trebalo da trajno sačuva najmanje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hash transakcije&lt;/li&gt;
&lt;li&gt;potpisani blob&lt;/li&gt;
&lt;li&gt;source nalog&lt;/li&gt;
&lt;li&gt;sequence ili ticket&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LastLedgerSequence&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;interni payment ID&lt;/li&gt;
&lt;li&gt;očekivani asset i iznos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tako proces nakon restarta može proveriti postojeću transakciju umesto da naslepo kreira novu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Direktni API pristup
&lt;/h2&gt;

&lt;p&gt;SDK nije obavezan. &lt;code&gt;xrpld&lt;/code&gt; i Clio nude JSON-RPC i WebSocket API-je.&lt;/p&gt;

&lt;p&gt;JSON-RPC je pogodan za:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;account_info&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;account_tx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fee&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;server_info&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;book_offers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;podnošenje transakcija&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WebSocket je pogodniji za:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;praćenje novih ledgera&lt;/li&gt;
&lt;li&gt;subscription na naloge&lt;/li&gt;
&lt;li&gt;praćenje validiranih transakcija&lt;/li&gt;
&lt;li&gt;održavanje payment listenera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trenutno postoje API verzije 1 i 2. Aplikacija treba eksplicitno da kontroliše verziju, jer se nazivi i semantika pojedinih polja razlikuju.&lt;/p&gt;

&lt;p&gt;Javni serveri su praktični za razvoj i povremene upite. Zvanična dokumentacija upozorava da Ripple-ovi javni serveri nisu namenjeni kontinuiranom poslovnom opterećenju i da mogu postati nedostupni. Produkcioni sistem obično koristi sopstveni &lt;code&gt;xrpld&lt;/code&gt;, pouzdanog infrastrukturnog provajdera ili kombinaciju više izvora.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;xrpld&lt;/code&gt; i Clio nisu ista komponenta
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;xrpld&lt;/code&gt; je core server koji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;učestvuje u peer-to-peer mreži&lt;/li&gt;
&lt;li&gt;obrađuje i prosleđuje transakcije&lt;/li&gt;
&lt;li&gt;prati konsenzus&lt;/li&gt;
&lt;li&gt;može raditi kao validator&lt;/li&gt;
&lt;li&gt;pruža javne i administrativne API-je&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clio je API server optimizovan za čitanje validiranih istorijskih podataka. Ne povezuje se direktno na P2P mrežu, već podatke dobija od &lt;code&gt;xrpld&lt;/code&gt; servera i čuva ih u Cassandra ili ScyllaDB infrastrukturi.&lt;/p&gt;

&lt;p&gt;Tipična veća instalacija koristi &lt;code&gt;xrpld&lt;/code&gt; za mrežnu konekciju i submission, a Clio klaster za skaliranje read-heavy API saobraćaja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko košta korišćenje XRPL-a
&lt;/h2&gt;

&lt;p&gt;Trošak ima tri odvojene kategorije.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stavka&lt;/th&gt;
&lt;th&gt;Trenutni protokolski iznos&lt;/th&gt;
&lt;th&gt;Napomena&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Standardna transakcija&lt;/td&gt;
&lt;td&gt;10 drops&lt;/td&gt;
&lt;td&gt;Može porasti usled opterećenja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Osnovna rezerva naloga&lt;/td&gt;
&lt;td&gt;1 XRP&lt;/td&gt;
&lt;td&gt;Nije obična naknada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owner rezerva&lt;/td&gt;
&lt;td&gt;0,2 XRP po objektu&lt;/td&gt;
&lt;td&gt;Zavisi od tipa i broja objekata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AccountDelete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;200.000 drops&lt;/td&gt;
&lt;td&gt;Poseban transakcioni trošak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AMMCreate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;200.000 drops&lt;/td&gt;
&lt;td&gt;Poseban transakcioni trošak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-signed transakcija&lt;/td&gt;
&lt;td&gt;Osnovni fee puta broj potpisa plus jedan&lt;/td&gt;
&lt;td&gt;Skalira se brojem potpisa&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ove vrednosti mogu se menjati glasanjem validatora. Produkcioni kod ne treba da ih hardkodira, već da koristi &lt;code&gt;fee&lt;/code&gt;, &lt;code&gt;server_state&lt;/code&gt;, &lt;code&gt;server_info&lt;/code&gt; ili SDK &lt;code&gt;autofill()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Fiat vrednost troška zavisi od tržišne cene XRP-a. Rezerva takođe predstavlja kapital koji aplikacija mora držati, posebno ako otvara veliki broj naloga, trust lines ili ponuda.&lt;/p&gt;

&lt;p&gt;Pored protokola postoje infrastrukturni troškovi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hosted RPC provajder&lt;/li&gt;
&lt;li&gt;sopstveni &lt;code&gt;xrpld&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Clio i baza za istorijske upite&lt;/li&gt;
&lt;li&gt;signing servis ili HSM&lt;/li&gt;
&lt;li&gt;monitoring i alerting&lt;/li&gt;
&lt;li&gt;reconciliation baza&lt;/li&gt;
&lt;li&gt;compliance i custody sistemi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SDK i core protokol su open source, ali pouzdana produkciona integracija nije „besplatna” samo zato što je mrežni fee mali.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upravljanje ključevima
&lt;/h2&gt;

&lt;p&gt;XRPL podržava &lt;code&gt;secp256k1&lt;/code&gt; i &lt;code&gt;Ed25519&lt;/code&gt; ključeve. Master ključ je intrinzično povezan sa nalogom i ne može se zameniti, ali može biti deaktiviran. Nalog može postaviti rotirajući regular key i signer listu za multi-signing.&lt;/p&gt;

&lt;p&gt;Razuman produkcioni model razdvaja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;issuing nalog&lt;/strong&gt;, koji je što više offline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;operational nalog&lt;/strong&gt;, koji obavlja redovne transfere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;standby nalog&lt;/strong&gt;, koji se koristi pri incidentu&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;signing servis&lt;/strong&gt;, koji nema direktan pristup poslovnoj bazi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;watch-only servise&lt;/strong&gt;, koji nemaju privatne ključeve&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Master key se čuva offline, a redovne transakcije potpisuje regular key ili multi-signing konfiguracija. Kompromitovani regular key može se zameniti bez migracije svih ledger objekata i poslovnih odnosa na novu adresu.&lt;/p&gt;

&lt;p&gt;Seed ne treba slati javnom serveru radi potpisivanja. Transakcija se konstruiše, potpisuje lokalno ili u namenskom custody sistemu, a mreži se šalje samo potpisani blob.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amendments i verzionisanje protokola
&lt;/h2&gt;

&lt;p&gt;XRPL uvodi promene transakcionih pravila kroz amendment sistem.&lt;/p&gt;

&lt;p&gt;Nova funkcija se implementira u &lt;code&gt;xrpld&lt;/code&gt;, nakon čega validatori mogu glasati za njenu aktivaciju. Amendment mora održati podršku veću od 80 procenata trusted validatora tokom dve nedelje da bi postao aktivan. Nakon aktivacije postaje deo pravila mreže.&lt;/p&gt;

&lt;p&gt;Ovaj mehanizam ima praktične posledice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Devnet može imati funkcije koje Mainnet nema.&lt;/li&gt;
&lt;li&gt;Dokumentacija može opisivati funkciju pre njene Mainnet aktivacije.&lt;/li&gt;
&lt;li&gt;Stara verzija servera može postati amendment-blocked.&lt;/li&gt;
&lt;li&gt;SDK tipovi mogu podržavati polje koje konkretna mreža još ne prihvata.&lt;/li&gt;
&lt;li&gt;Status amendmenta treba proveriti pri planiranju release-a.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Posebno treba biti oprezan sa novijim funkcijama kao što su MPT proširenja, permissioned tržišta, token escrow, lending i dodatne compliance mogućnosti.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gde se uklapa EVM sidechain
&lt;/h2&gt;

&lt;p&gt;Osnovni XRPL nema EVM i ne izvršava Solidity ugovore. XRPL EVM Sidechain je zaseban, Ethereum-kompatibilan Layer 1 izgrađen na Cosmos SDK-u, sa XRP-om kao gas assetom.&lt;/p&gt;

&lt;p&gt;To omogućava korišćenje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solidity ugovora&lt;/li&gt;
&lt;li&gt;Ethereum development alata&lt;/li&gt;
&lt;li&gt;ERC-20 modela&lt;/li&gt;
&lt;li&gt;EVM wallet infrastrukture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ipak, EVM sidechain nije „Solidity direktno na XRPL Mainnetu”. To je odvojena mreža sa sopstvenim validatorima, stanjem i operativnim rizicima. Prebacivanje asseta između mreža uvodi bridge i cross-chain pretpostavke koje ne postoje kod nativnih XRPL transakcija.&lt;/p&gt;

&lt;p&gt;Praktično pravilo je jednostavno:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ako problem može da se izrazi pomoću nativnih XRPL transakcija, ta implementacija ima manje pokretnih delova.&lt;/li&gt;
&lt;li&gt;Ako je potrebna proizvoljna izvršna logika, EVM okruženje pruža veću fleksibilnost uz veću površinu rizika.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Najčešće integracione greške
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Kreditiranje na osnovu &lt;code&gt;Amount&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Kod partial payment transakcije deklarisani maksimum nije isto što i stvarno primljeni iznos. Koristi se &lt;code&gt;meta.delivered_amount&lt;/code&gt; ili metadata balance diff.&lt;/p&gt;

&lt;h3&gt;
  
  
  Provera ticker simbola bez izdavaoca
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;USD&lt;/code&gt; jednog izdavaoca i &lt;code&gt;USD&lt;/code&gt; drugog izdavaoca predstavljaju različite assete. Backend mora proveriti i &lt;code&gt;currency&lt;/code&gt; i &lt;code&gt;issuer&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tretiranje &lt;code&gt;submit&lt;/code&gt; odgovora kao finalnog
&lt;/h3&gt;

&lt;p&gt;Početni rezultat može biti privremen. Poslovna akcija se izvršava tek nad validiranim rezultatom.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ponovno slanje posle timeouta
&lt;/h3&gt;

&lt;p&gt;Timeout ne znači da transakcija nije prihvaćena. Prvo se proveravaju hash i &lt;code&gt;LastLedgerSequence&lt;/code&gt;, pa se tek onda odlučuje o zameni.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jedna adresa po korisniku
&lt;/h3&gt;

&lt;p&gt;To povećava kapital zaključan u rezervama i komplikuje upravljanje ključevima. Za custody aplikacije shared address plus destination tags često je efikasniji model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Korišćenje javnog endpointa kao produkcionog SLA-a
&lt;/h3&gt;

&lt;p&gt;Javni server je koristan za testiranje, ali ne treba da bude jedina kritična zavisnost payment sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Držanje issuing ključa online
&lt;/h3&gt;

&lt;p&gt;Kompromitovan issuing nalog može ugroziti ceo token. Izdavanje, svakodnevna distribucija i emergency operacije treba razdvojiti.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kada XRPL ima smisla
&lt;/h2&gt;

&lt;p&gt;XRPL je posebno zanimljiv kada aplikaciji treba:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;direktan settlement digitalnih asseta&lt;/li&gt;
&lt;li&gt;veliki broj relativno jednostavnih plaćanja&lt;/li&gt;
&lt;li&gt;stablecoin ili token sa issuer kontrolama&lt;/li&gt;
&lt;li&gt;atomska konverzija i plaćanje&lt;/li&gt;
&lt;li&gt;ugrađen order book i AMM&lt;/li&gt;
&lt;li&gt;escrow bez deploymenta posebnog contracta&lt;/li&gt;
&lt;li&gt;multi-currency payment routing&lt;/li&gt;
&lt;li&gt;jednostavniji audit trail od kompleksnog contract sistema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manje je prirodan izbor kada je primarni zahtev:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proizvoljna on-chain poslovna logika&lt;/li&gt;
&lt;li&gt;permissionless deployment novih contract protokola&lt;/li&gt;
&lt;li&gt;privatnost transakcija kao podrazumevana osobina&lt;/li&gt;
&lt;li&gt;oslanjanje na postojeći Ethereum DeFi ekosistem&lt;/li&gt;
&lt;li&gt;potpuno uklanjanje issuer ili bridge rizika&lt;/li&gt;
&lt;li&gt;izvršavanje velikog broja paralelnih transakcija iz jednog naloga bez sequence koordinacije&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Najveća prednost XRPL-a nije samo nizak transakcioni trošak. Prednost je to što veliki deo finansijske logike postoji kao deo protokola i prolazi kroz isti konsenzus, umesto da svaki tim ponovo implementira plaćanja, escrow, order book ili token kontrole u sopstvenom smart contractu.&lt;/p&gt;

&lt;p&gt;Isti izbor je ujedno i ograničenje. Dobija se specijalizovan, relativno kompaktan model, ali ne i neograničena programabilnost. Zato XRPL najbolje funkcioniše kada se poslovni problem uklapa u njegove postojeće primitive, a off-chain sistem preuzima identitet, quoting, autorizaciju, računovodstvo i operativnu kontrolu.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/introduction/what-is-xrp" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: What Is XRP?&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ripple.com/faq/" rel="noopener noreferrer"&gt;Ripple: Frequently Asked Questions&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/consensus-protocol" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Consensus Protocol&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://xrpl.org/docs/concepts/accounts" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Accounts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/transactions/source-and-destination-tags" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Source and Destination Tags&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/transactions/transaction-cost" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Transaction Cost&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/accounts/reserves" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Reserves&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/tokens/fungible-tokens/paths" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Paths&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://xrpl.org/docs/concepts/transactions/reliable-transaction-submission" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Reliable Transaction Submission&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xrpl.org/docs/references/protocol/transactions/types/payment" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Payment Transaction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xrpl.org/docs/concepts/payment-types/robustly-monitoring-for-payments" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Robustly Monitoring for Payments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xrpl.org/docs/concepts/tokens/fungible-tokens/trust-line-tokens" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Trust Line Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xrpl.org/docs/concepts/tokens/fungible-tokens/multi-purpose-tokens" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Multi-Purpose Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/tokens/decentralized-exchange" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Decentralized Exchange&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/tokens/decentralized-exchange/automated-market-makers" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Automated Market Makers&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/tutorials/public-servers" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Public Servers&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/references/http-websocket-apis" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: HTTP and WebSocket APIs&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://xrpl.org/docs/concepts/networks-and-servers/the-clio-server" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: The Clio Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/accounts/cryptographic-keys" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Cryptographic Keys&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://xrpl.org/docs/concepts/networks-and-servers/amendments" rel="noopener noreferrer"&gt;XRP Ledger dokumentacija: Amendments&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.xrplevm.org/" rel="noopener noreferrer"&gt;XRPL EVM Sidechain dokumentacija&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>cryptocurrency</category>
      <category>xrp</category>
    </item>
    <item>
      <title>TON Coin za developere: kako mreža zaista funkcioniše</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Fri, 18 Sep 2026 22:14:24 +0000</pubDate>
      <link>https://dev.to/kriptomuza/ton-coin-za-developere-kako-mreza-zaista-funkcionise-2p91</link>
      <guid>https://dev.to/kriptomuza/ton-coin-za-developere-kako-mreza-zaista-funkcionise-2p91</guid>
      <description>&lt;p&gt;TON se često predstavlja kroz brzinu transakcija, Telegram integraciju i niske naknade. To jesu važne karakteristike, ali developeru ne objašnjavaju kako da napravi pouzdanu aplikaciju.&lt;/p&gt;

&lt;p&gt;Pravo pitanje nije koliko transakcija mreža teoretski može da obradi, već kako se na TON-u modeluju stanje, izvršavanje i komunikacija između smart contracta.&lt;/p&gt;

&lt;p&gt;Ako dolazite iz Ethereum ekosistema, najveća greška je da TON posmatrate kao EVM blockchain sa drugačijim adresama i jeftinijim gasom. TON nije EVM kompatibilna mreža, smart contracti ne koriste Solidity ABI, a složena operacija preko više contracta nije jedna velika sinhrona transakcija.&lt;/p&gt;

&lt;p&gt;TON je distribuirani sistem u kojem nalozi razmenjuju asinhrone poruke. Ta odluka utiče na gotovo sve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;način projektovanja smart contracta&lt;/li&gt;
&lt;li&gt;obradu grešaka i povratnih poruka&lt;/li&gt;
&lt;li&gt;praćenje uplata&lt;/li&gt;
&lt;li&gt;strukturu tokena&lt;/li&gt;
&lt;li&gt;testiranje&lt;/li&gt;
&lt;li&gt;backend arhitekturu&lt;/li&gt;
&lt;li&gt;korisničko iskustvo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tek kada se prihvati ovaj model, cells, Bag of Cells, traceovi, jetton walleti i bounce poruke prestaju da deluju kao nepovezane specifičnosti mreže.&lt;/p&gt;

&lt;h2&gt;
  
  
  TON, TON Coin i Gram nisu ista stvar
&lt;/h2&gt;

&lt;p&gt;Pre tehničkih detalja treba razjasniti terminologiju.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TON&lt;/strong&gt;, odnosno The Open Network, naziv je blockchain mreže.&lt;/p&gt;

&lt;p&gt;Izvorna valuta mreže dugo je bila poznata kao &lt;strong&gt;Toncoin&lt;/strong&gt;, &lt;strong&gt;TON Coin&lt;/strong&gt; ili jednostavno &lt;strong&gt;TON&lt;/strong&gt;. Aktuelni naziv valute je &lt;strong&gt;Gram&lt;/strong&gt;, sa oznakom &lt;strong&gt;GRAM&lt;/strong&gt;. Promena se odnosi na naziv, ticker i vizuelni identitet valute, ne na novu mrežu ili novi token koji bi korisnici morali da zamene.&lt;/p&gt;

&lt;p&gt;Zbog kompatibilnosti, veliki deo postojećeg koda i dalje koristi stare tehničke nazive. U SDK-ovima ćete zato sretati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;toNano&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nanoTON&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AssetType.ton&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;pakete sa prefiksom &lt;code&gt;@ton&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;polja, metode i komentare koji pominju TON kao valutu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To ne znači da koristite zastareli blockchain. Tehnički identifikatori ne menjaju se nužno istom brzin om kao naziv prikazan u walletu.&lt;/p&gt;

&lt;p&gt;U nastavku teksta izraz TON Coin povremeno koristim kao prepoznatljiv naziv teme, dok se Gram odnosi na aktuelni naziv izvorne valute. U kodu treba pratiti konkretan SDK i njegove stvarne nazive, a ne ručno preimenovati metode koje još uvek koriste &lt;code&gt;ton&lt;/code&gt; ili &lt;code&gt;nanoTon&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jedan GRAM deli se na milijardu najmanjih jedinica. Iznosi se zato čuvaju kao celi brojevi, ne kao floating-point vrednosti.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;GramAmount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bigint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;oneGram&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GramAmount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000_000n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;halfGram&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GramAmount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="nx"&gt;_000_000n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;U JavaScriptu i TypeScriptu za blockchain iznose treba koristiti &lt;code&gt;bigint&lt;/code&gt; ili decimalne stringove. Izraz poput &lt;code&gt;0.1 + 0.2&lt;/code&gt; nije prihvatljiva osnova za finansijsku evidenciju.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta je TON iz ugla developera
&lt;/h2&gt;

&lt;p&gt;TON je Layer 1 blockchain projektovan za horizontalno skaliranje. Smart contracti čuvaju stanje i izvršavaju kod u TON Virtual Machine okruženju, ali međusobno ne komuniciraju kao objekti unutar jednog procesa.&lt;/p&gt;

&lt;p&gt;Oni razmenjuju poruke.&lt;/p&gt;

&lt;p&gt;TON arhitektura može se posmatrati kroz tri nivoa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;masterchain&lt;/li&gt;
&lt;li&gt;workchain&lt;/li&gt;
&lt;li&gt;shardchain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Masterchain&lt;/strong&gt; čuva globalnu konfiguraciju mreže, informacije potrebne za rad validatora, sistemske contracte i reference na poslednja prihvaćena stanja shardchainova.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workchain&lt;/strong&gt; predstavlja blockchain sa sopstvenim pravilima, formatima naloga i adresnim prostorom. Većina korisničkih naloga i aplikacionih contracta nalazi se u basechainu, čiji je &lt;code&gt;workchain_id&lt;/code&gt; jednak &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Masterchain koristi &lt;code&gt;workchain_id&lt;/code&gt; jednak &lt;code&gt;-1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shardchainovi&lt;/strong&gt; su delovi workchaina koji se obrađuju paralelno. Workchain može biti podeljen na više shardova kada opterećenje poraste, a shardovi se mogu ponovo spojiti kada dodatni kapacitet nije potreban.&lt;/p&gt;

&lt;p&gt;Iz ugla aplikacije, račun ili smart contract pripada određenom workchainu i shardu. Kako se topologija shardova menja, contract ne dobija novu adresu niti aplikacija treba ručno da ga migrira.&lt;/p&gt;

&lt;p&gt;Ovakva arhitektura omogućava mreži da raspodeli stanje i izvršavanje. Istovremeno, ona nameće pravilo da komunikacija između naloga mora biti asinhrona.&lt;/p&gt;

&lt;p&gt;Contract A ne može pretpostaviti da će contract B završiti posao pre nego što se nastavi izvršavanje contracta A. Contract A može poslati poruku i završiti svoju transakciju. Contract B tu poruku obrađuje u posebnoj transakciji.&lt;/p&gt;

&lt;p&gt;To je bliže actor modelu i distribuiranim servisima nego klasičnom pozivu funkcije.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zašto je actor model važniji od brzine mreže
&lt;/h2&gt;

&lt;p&gt;Zamislimo escrow aplikaciju.&lt;/p&gt;

&lt;p&gt;Korisnik šalje sredstva escrow contractu. Escrow zatim treba da obavesti marketplace contract, koji proverava narudžbinu i šalje potvrdu. Nakon toga escrow oslobađa sredstva prodavcu.&lt;/p&gt;

&lt;p&gt;Na sinhronom sistemu developer bi mogao da zamisli jednu operaciju:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;escrow.deposit()
marketplace.confirm()
escrow.release()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na TON-u se ovaj proces sastoji od više transakcija:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wallet šalje internu poruku escrow contractu.&lt;/li&gt;
&lt;li&gt;Escrow obrađuje poruku i menja svoje lokalno stanje.&lt;/li&gt;
&lt;li&gt;Escrow šalje poruku marketplace contractu.&lt;/li&gt;
&lt;li&gt;Marketplace obrađuje poruku.&lt;/li&gt;
&lt;li&gt;Marketplace šalje potvrdu escrow contractu.&lt;/li&gt;
&lt;li&gt;Escrow obrađuje potvrdu i šalje sredstva prodavcu.&lt;/li&gt;
&lt;li&gt;Wallet prodavca prima transfer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sve ove transakcije zajedno čine širi tok koji se često posmatra kao &lt;strong&gt;trace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Drugi korisnici i contracti mogu izvršavati sopstvene transakcije između pojedinih koraka. Zato escrow ne sme da pretpostavi da je njegovo stanje ostalo nepromenjeno dok je čekao odgovor.&lt;/p&gt;

&lt;p&gt;Pouzdana implementacija bi čuvala nešto poput:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;order_id
buyer
seller
amount
status
created_at
confirmation_deadline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Status bi mogao prolaziti kroz stanja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;created
funded
confirmation_pending
release_pending
released
refund_pending
refunded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Svaka primljena poruka mora proveriti da li je zahtev dozvoljen u trenutnom stanju.&lt;/p&gt;

&lt;p&gt;Ovo je osnovni obrazac TON programiranja: smart contract je state machine, a poruke su događaji koji pokreću prelaze između stanja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nalog i smart contract su deo istog modela
&lt;/h2&gt;

&lt;p&gt;Na TON-u svaki nalog ima adresu, balans i status. Aktivan nalog može imati kod i persistentne podatke, što ga čini smart contractom.&lt;/p&gt;

&lt;p&gt;Tokom životnog ciklusa nalog može biti u jednom od četiri stanja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nonexist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uninit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;active&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;frozen&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;nonexist&lt;/code&gt; znači da nalog ne postoji u aktivnom stanju blockchaina. Nema balans, kod ni persistentne podatke.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;uninit&lt;/code&gt; znači da adresa ima balans, ali smart contract još nije postavljen. Na takvu adresu moguće je unapred poslati sredstva.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;active&lt;/code&gt; znači da su kod i početni podaci postavljeni i da contract može da obrađuje poruke.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;frozen&lt;/code&gt; nastaje kada nalog ne može da izmiri naknade za čuvanje persistentnog stanja. Za ponovno aktiviranje potrebni su odgovarajući podaci i plaćanje duga, dok dovoljno veliki neizmireni dug može dovesti do uklanjanja naloga.&lt;/p&gt;

&lt;p&gt;Ovaj model omogućava zanimljiv deployment workflow. Adresa contracta može se izračunati pre nego što je contract deployovan, jer se izvodi iz njegovog početnog stanja.&lt;/p&gt;

&lt;h2&gt;
  
  
  StateInit i determinističke adrese
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;StateInit&lt;/code&gt; opisuje početno stanje smart contracta. U praksi obuhvata njegov kod i početne podatke, uz dodatna protocol-level polja koja format podržava.&lt;/p&gt;

&lt;p&gt;Adresa contracta izvodi se iz hash vrednosti njegovog početnog stanja i workchain identifikatora. To znači da developer može:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;izračunati adresu pre deploymenta&lt;/li&gt;
&lt;li&gt;prikazati je korisniku&lt;/li&gt;
&lt;li&gt;poslati sredstva na nju&lt;/li&gt;
&lt;li&gt;kasnije poslati deployment poruku sa odgovarajućim &lt;code&gt;StateInit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;proveriti da li se očekivani kod nalazi na očekivanoj adresi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Promena samo jednog bita početnog koda ili podataka proizvodi drugačiju adresu.&lt;/p&gt;

&lt;p&gt;Ovo je korisno kod factory contracta, jetton walleta, NFT itema i drugih obrazaca gde se veliki broj naloga kreira deterministički.&lt;/p&gt;

&lt;p&gt;Istovremeno, prefunding adrese nosi rizik. Ako aplikacija pogrešno izračuna &lt;code&gt;StateInit&lt;/code&gt;, sredstva mogu završiti na adresi koja nikada neće biti aktivirana očekivanim kodom.&lt;/p&gt;

&lt;p&gt;Zato logiku za računanje adrese ne treba kopirati na više mesta. Treba je staviti u isti wrapper koji se koristi za deployment, testiranje i slanje poruka.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wallet na TON-u je smart contract
&lt;/h2&gt;

&lt;p&gt;Wallet adresa nije isto što i javni ključ.&lt;/p&gt;

&lt;p&gt;Wallet je smart contract koji proverava vlasništvo nad ključem, sprovodi replay zaštitu i šalje interne poruke drugim nalozima. Standardni wallet contract obično čuva:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;javni ključ vlasnika&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seqno&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wallet_id&lt;/code&gt; ili &lt;code&gt;subwallet_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;podatke specifične za verziju walleta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Privatni ključ ostaje van blockchaina.&lt;/p&gt;

&lt;p&gt;Korisnik ili wallet aplikacija formiraju zahtev, potpisuju ga i šalju kao eksternu poruku wallet contractu. Contract proverava potpis i pravila zahteva, a zatim generiše interne poruke.&lt;/p&gt;

&lt;p&gt;Wallet ne čuva sopstveni balans kao običnu promenljivu. Balans je deo protocol-level stanja naloga i validatori ga ažuriraju kada sredstva stignu, budu poslata ili potrošena na naknade.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;seqno&lt;/code&gt; je brojač koji sprečava ponovno izvršavanje iste potpisane poruke. Wallet prihvata očekivanu vrednost i nakon uspešne obrade povećava brojač.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;valid_until&lt;/code&gt; ograničava trajanje zahteva. Potpisana poruka koja nije uključena u mrežu pre isteka ne bi trebalo da ostane zauvek validna.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wallet_id&lt;/code&gt; razdvaja različite wallet instance koje mogu koristiti isti javni ključ. Zbog toga isti mnemonic ili public key ne moraju proizvesti istu adresu za svaku verziju wallet contracta, mrežu ili subwallet konfiguraciju.&lt;/p&gt;

&lt;p&gt;Backend koji generiše wallet adrese mora zato eksplicitno znati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;verziju wallet contracta&lt;/li&gt;
&lt;li&gt;mrežu&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wallet_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;workchain&lt;/li&gt;
&lt;li&gt;javni ključ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretpostavka da je adresa samo hash javnog ključa dovodi do pogrešnih adresa i potencijalnog gubitka sredstava.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eksterne i interne poruke
&lt;/h2&gt;

&lt;p&gt;TON koristi tri osnovne kategorije poruka:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incoming external messages&lt;/li&gt;
&lt;li&gt;internal messages&lt;/li&gt;
&lt;li&gt;outgoing external messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Incoming external message&lt;/strong&gt; dolazi izvan blockchaina. Tipičan primer je zahtev koji wallet aplikacija šalje wallet contractu.&lt;/p&gt;

&lt;p&gt;Takva poruka ne može da donese Gram iz spoljnog sveta. Contract koji je prihvati može trošak izvršavanja platiti iz sopstvenog balansa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal message&lt;/strong&gt; šalje jedan blockchain nalog drugom. Ona može sadržati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adresu primaoca&lt;/li&gt;
&lt;li&gt;prenetu vrednost&lt;/li&gt;
&lt;li&gt;telo poruke&lt;/li&gt;
&lt;li&gt;opcioni &lt;code&gt;StateInit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;bounce podešavanje&lt;/li&gt;
&lt;li&gt;parametre relevantne za prosleđivanje&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Outgoing external message&lt;/strong&gt; izlazi iz blockchain okruženja i može služiti kao događaj namenjen spoljnim servisima i indexerima.&lt;/p&gt;

&lt;p&gt;Za većinu dApp tokova najvažnije su eksterne poruke ka walletima i interne poruke između contracta.&lt;/p&gt;

&lt;p&gt;Eksterna poruka obično pokreće wallet, a wallet zatim šalje internu poruku dApp contractu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Poruka nije transakcija
&lt;/h2&gt;

&lt;p&gt;Ova razlika je važna za praćenje uplata.&lt;/p&gt;

&lt;p&gt;Poruka predstavlja zahtev ili nameru. Transakcija je rezultat obrade poruke na određenom nalogu.&lt;/p&gt;

&lt;p&gt;Ako korisnik potpiše zahtev u walletu, to još uvek ne znači da je poslovna operacija završena. Čak ni pojavljivanje prve wallet transakcije ne znači da je svaki contract u traceu uspešno izvršio svoj deo posla.&lt;/p&gt;

&lt;p&gt;Na primer, wallet transakcija može uspešno poslati tri interne poruke. Jedna od njih može biti obrađena, druga odbijena, a treća vraćena kroz bounce.&lt;/p&gt;

&lt;p&gt;TON Connect može vratiti BoC potpisane eksterne poruke, ali taj odgovor nije dokaz da je primalac uspešno obradio transfer. Rezultat treba pronaći i proveriti on-chain.&lt;/p&gt;

&lt;p&gt;Pouzdan statusni model na backendu može izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;created
awaiting_signature
submitted
observed
processing
confirmed
failed
expired
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;submitted&lt;/code&gt; znači da je zahtev potpisan ili prosleđen.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;observed&lt;/code&gt; znači da je odgovarajuća transakcija pronađena na mreži.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;confirmed&lt;/code&gt; treba koristiti tek kada su provereni relevantni primaoci, iznosi, payload, statusi transakcija i očekivani ishod tracea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faze TON transakcije
&lt;/h2&gt;

&lt;p&gt;Obična TON transakcija ne sastoji se samo od pokretanja contract koda. Obrada prolazi kroz više faza.&lt;/p&gt;

&lt;p&gt;Relevantne faze su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;storage&lt;/li&gt;
&lt;li&gt;credit&lt;/li&gt;
&lt;li&gt;compute&lt;/li&gt;
&lt;li&gt;action&lt;/li&gt;
&lt;li&gt;bounce&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tačan redosled zavisi od karakteristika poruke, uključujući bounce podešavanje.&lt;/p&gt;

&lt;p&gt;U &lt;strong&gt;storage fazi&lt;/strong&gt; obračunavaju se troškovi čuvanja stanja naloga.&lt;/p&gt;

&lt;p&gt;U &lt;strong&gt;credit fazi&lt;/strong&gt; vrednost dolazne interne poruke pripisuje se nalogu.&lt;/p&gt;

&lt;p&gt;U &lt;strong&gt;compute fazi&lt;/strong&gt; TVM izvršava contract kod.&lt;/p&gt;

&lt;p&gt;U &lt;strong&gt;action fazi&lt;/strong&gt; mreža obrađuje akcije koje je contract pripremio tokom izvršavanja. To mogu biti slanje poruke, rezervisanje sredstava, promena koda ili rad sa bibliotekama.&lt;/p&gt;

&lt;p&gt;U &lt;strong&gt;bounce fazi&lt;/strong&gt; može se formirati povratna poruka kada obrada ne uspe pod uslovima koji dozvoljavaju bounce.&lt;/p&gt;

&lt;p&gt;Compute faza i action faza nisu ista stvar.&lt;/p&gt;

&lt;p&gt;Contract može uspešno završiti računanje i pripremiti izlazne poruke, ali neka izlazna akcija ipak može biti neuspešna. Zato test koji proverava samo TVM exit code ne mora dokazivati da je poslovni tok uspeo.&lt;/p&gt;

&lt;p&gt;Za svaku važnu operaciju treba proveriti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da li je transakcija aborted&lt;/li&gt;
&lt;li&gt;compute exit code&lt;/li&gt;
&lt;li&gt;action result code&lt;/li&gt;
&lt;li&gt;broj kreiranih poruka&lt;/li&gt;
&lt;li&gt;primaoce poruka&lt;/li&gt;
&lt;li&gt;prenete iznose&lt;/li&gt;
&lt;li&gt;bounce poruke&lt;/li&gt;
&lt;li&gt;završno stanje contracta&lt;/li&gt;
&lt;li&gt;nastavak tracea&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Šta su send modes
&lt;/h2&gt;

&lt;p&gt;Kada contract šalje internu poruku, send mode određuje kako se vrednost i greške tretiraju.&lt;/p&gt;

&lt;p&gt;Različiti modovi i zastavice mogu uticati na to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da li se naknade plaćaju odvojeno&lt;/li&gt;
&lt;li&gt;da li poruka prenosi preostalu vrednost primljene poruke&lt;/li&gt;
&lt;li&gt;da li se šalje preostali balans contracta&lt;/li&gt;
&lt;li&gt;da li se pojedine greške ignorišu&lt;/li&gt;
&lt;li&gt;da li neuspeh akcije treba da izazove bounce&lt;/li&gt;
&lt;li&gt;da li se nalog uklanja ako balans postane nula&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Send mode nije detalj koji treba nasumično kopirati iz primera.&lt;/p&gt;

&lt;p&gt;Posebno su opasni modovi koji ignorišu greške. Oni mogu biti opravdani u određenom protokolarnom toku, ali mogu i proizvesti situaciju u kojoj početna transakcija izgleda uspešno, dok očekivana izlazna poruka nije poslata.&lt;/p&gt;

&lt;p&gt;Svaki send mode treba posmatrati kao deo poslovne semantike contracta, a ne samo optimizaciju naknade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bounce nije globalni rollback
&lt;/h2&gt;

&lt;p&gt;Bounce poruka obaveštava pošiljaoca da primalac nije obradio poruku kako je očekivano. Ona može vratiti deo preostale vrednosti i podatke koji omogućavaju povezivanje sa prvobitnim zahtevom.&lt;/p&gt;

&lt;p&gt;To nije globalni rollback kompletnog tracea.&lt;/p&gt;

&lt;p&gt;Ako je contract A promenio svoje stanje i poslao poruku contractu B, neuspeh contracta B ne mora automatski vratiti contract A u prethodno stanje.&lt;/p&gt;

&lt;p&gt;Contract A zato treba eksplicitno da podrži kompenzacioni tok.&lt;/p&gt;

&lt;p&gt;Primer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Contract A primi zahtev za isplatu.&lt;/li&gt;
&lt;li&gt;Contract A označi zahtev kao &lt;code&gt;pending&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Contract A pošalje sredstva contractu B.&lt;/li&gt;
&lt;li&gt;Ako obrada uspe, A kasnije dobija potvrdu ili se ishod verifikuje kroz očekivani tok.&lt;/li&gt;
&lt;li&gt;Ako poruka bude vraćena, A obrađuje bounce i vraća zahtev u &lt;code&gt;available&lt;/code&gt; ili &lt;code&gt;failed&lt;/code&gt; stanje.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Loš obrazac je smanjiti korisnički balans, poslati poruku i ne implementirati bounce handler. U slučaju neuspeha sredstva se možda vrate contractu, ali interna evidencija korisnika ostaje pogrešna.&lt;/p&gt;

&lt;p&gt;Za povezivanje zahteva i odgovora često se koristi &lt;code&gt;query_id&lt;/code&gt;. On treba da bude dovoljno jedinstven u domenu contracta i vezan za zapis operacije koja je u toku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cells su osnovni format podataka
&lt;/h2&gt;

&lt;p&gt;TON ne čuva persistentno stanje kao proizvoljan niz bajtova niti koristi klasičan ABI model identičan EVM-u.&lt;/p&gt;

&lt;p&gt;Osnovna jedinica podataka je &lt;strong&gt;cell&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Jedna cell može sadržati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;najviše 1023 bita podataka&lt;/li&gt;
&lt;li&gt;najviše četiri reference na druge cells&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reference formiraju usmereni aciklični graf. Ciklične reference nisu dozvoljene.&lt;/p&gt;

&lt;p&gt;Cells se koriste za:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;smart contract kod&lt;/li&gt;
&lt;li&gt;persistentne podatke&lt;/li&gt;
&lt;li&gt;tela poruka&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StateInit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;transakcije&lt;/li&gt;
&lt;li&gt;blokove&lt;/li&gt;
&lt;li&gt;Merkle dokaze&lt;/li&gt;
&lt;li&gt;dictionaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ograničenje od 1023 bita ne znači da poruka ili contract mogu imati samo toliko podataka. Veće strukture se dele kroz reference ka drugim cells.&lt;/p&gt;

&lt;p&gt;Ipak, raspored podataka utiče na cenu. Više cells i referenci može povećati storage i forwarding naknade.&lt;/p&gt;

&lt;p&gt;Developer zato mora razmišljati o binarnom layoutu, ne samo o logičkoj strukturi objekta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Builder, Cell i Slice
&lt;/h2&gt;

&lt;p&gt;Pri radu sa cells često se koriste tri mentalna modela.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Builder&lt;/code&gt; služi za kreiranje cell strukture. U njega se upisuju bitovi, brojevi, adrese, token iznosi i reference.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Cell&lt;/code&gt; predstavlja završenu strukturu.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Slice&lt;/code&gt; predstavlja cursor za čitanje sadržaja cella.&lt;/p&gt;

&lt;p&gt;Jednostavan komentar ili identifikator fakture može se napraviti pomoću &lt;code&gt;@ton/core&lt;/code&gt; paketa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;beginCell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Cell&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ton/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createInvoicePayload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invoiceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Cell&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;beginCell&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;storeUint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;storeStringTail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`invoice:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;invoiceId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endCell&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nulti 32-bitni prefiks koristi se kao konvencija za tekstualni komentar. Primalac zatim ostatak sadržaja može čitati kao UTF-8 string.&lt;/p&gt;

&lt;p&gt;Za contract protokol je obično bolji strukturirani binarni payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;beginCell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Cell&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ton/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createPaymentPayload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;queryId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bigint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;invoiceNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bigint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Cell&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;beginCell&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;storeUint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x70617901&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;storeUint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;queryId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;storeUint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invoiceNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endCell&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ovde je &lt;code&gt;0x70617901&lt;/code&gt; aplikacioni opcode. Vrednost opkoda treba dokumentovati i držati stabilnom nakon objave protokola.&lt;/p&gt;

&lt;p&gt;Contract mora čitati polja istim redosledom i istom širinom:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;opcode kao 32-bitni unsigned integer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;queryId&lt;/code&gt; kao 64-bitni unsigned integer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;invoiceNumber&lt;/code&gt; kao 64-bitni unsigned integer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ako serializer piše &lt;code&gt;uint64&lt;/code&gt;, a parser očekuje &lt;code&gt;uint32&lt;/code&gt;, protokol je pokvaren čak i kada se obe strane kompajliraju bez greške.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bag of Cells i BoC
&lt;/h2&gt;

&lt;p&gt;Stablo cells se pri prenosu ili čuvanju serijalizuje kao &lt;strong&gt;Bag of Cells&lt;/strong&gt;, odnosno BoC.&lt;/p&gt;

&lt;p&gt;BoC se često pojavljuje kao:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;base64 string u API odgovoru&lt;/li&gt;
&lt;li&gt;binarni deployment artifact&lt;/li&gt;
&lt;li&gt;rezultat koji vraća TON Connect&lt;/li&gt;
&lt;li&gt;serijalizovano telo poruke&lt;/li&gt;
&lt;li&gt;ulaz za emulaciju transakcije&lt;/li&gt;
&lt;li&gt;dokaz stanja ili transakcije&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BoC može sadržati više root cells. Interno može eliminisati duplikate, jer se cells sa istim hashom mogu deliti između više grana grafa.&lt;/p&gt;

&lt;p&gt;Kada TON Connect vrati &lt;code&gt;result.boc&lt;/code&gt;, ne vraća JSON opis uspešnog transfera. Vraća serijalizovanu eksternu poruku koju treba povezati sa stvarnim on-chain transakcijama.&lt;/p&gt;

&lt;p&gt;Backend ili indexer zato mora znati kako da:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;izračuna hash poruke&lt;/li&gt;
&lt;li&gt;pronađe transakciju koja ju je obradila&lt;/li&gt;
&lt;li&gt;prati izlazne interne poruke&lt;/li&gt;
&lt;li&gt;dekodira njihova tela&lt;/li&gt;
&lt;li&gt;proveri kompletan ishod&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TL-B je deo javnog interfejsa
&lt;/h2&gt;

&lt;p&gt;TL-B je jezik šema koji TON koristi za opis binarnih struktura.&lt;/p&gt;

&lt;p&gt;Njime su opisani:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;blokovi&lt;/li&gt;
&lt;li&gt;transakcije&lt;/li&gt;
&lt;li&gt;poruke&lt;/li&gt;
&lt;li&gt;adrese&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StateInit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;currency collections&lt;/li&gt;
&lt;li&gt;standardni token interfejsi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;U Solidity svetu ABI često daje gotov opis funkcija i tipova. Na TON-u je TL-B šema bliža preciznom wire protocolu.&lt;/p&gt;

&lt;p&gt;Jetton transfer, na primer, nije poziv metode u klasičnom smislu. To je cell čiji sadržaj prati standardizovani TL-B raspored.&lt;/p&gt;

&lt;p&gt;Zato dokumentacija smart contracta treba da sadrži najmanje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opcode svake poruke&lt;/li&gt;
&lt;li&gt;raspored polja&lt;/li&gt;
&lt;li&gt;bit width brojeva&lt;/li&gt;
&lt;li&gt;da li se podatak čuva inline ili u referenci&lt;/li&gt;
&lt;li&gt;semantiku &lt;code&gt;query_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;očekivanu vrednost poruke&lt;/li&gt;
&lt;li&gt;bounce ponašanje&lt;/li&gt;
&lt;li&gt;moguće exit kodove&lt;/li&gt;
&lt;li&gt;očekivane izlazne poruke&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Binarna šema je API contracta. Njena promena bez plana kompatibilnosti jednaka je breaking promeni HTTP API-ja.&lt;/p&gt;

&lt;h2&gt;
  
  
  TON Virtual Machine
&lt;/h2&gt;

&lt;p&gt;TON Virtual Machine je stack-based virtuelna mašina koja izvršava smart contract kod i ima ugrađene operacije za rad sa cells, slices, builders, dictionaries i kriptografskim funkcijama.&lt;/p&gt;

&lt;p&gt;Persistentno stanje contracta ulazi u izvršavanje kao cell. Nakon uspešnog izvršavanja nova vrednost persistentnog stanja može biti sačuvana.&lt;/p&gt;

&lt;p&gt;Contract tokom compute faze formira listu akcija. U action fazi mreža izvršava te akcije.&lt;/p&gt;

&lt;p&gt;Među protocol-level akcijama nalaze se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;slanje poruke&lt;/li&gt;
&lt;li&gt;rezervisanje sredstava&lt;/li&gt;
&lt;li&gt;promena koda&lt;/li&gt;
&lt;li&gt;rad sa bibliotekama&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jedna transakcija može pripremiti najviše 255 akcija.&lt;/p&gt;

&lt;p&gt;Get metode se izvršavaju drugačije. One se pokreću lokalno preko nodea ili providera, ne menjaju blockchain stanje i korisnik ne šalje on-chain transakciju samo da bi pročitao rezultat.&lt;/p&gt;

&lt;p&gt;To ih čini pogodnim za:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;čitanje konfiguracije contracta&lt;/li&gt;
&lt;li&gt;prikaz stanja u frontendu&lt;/li&gt;
&lt;li&gt;dobijanje token podataka&lt;/li&gt;
&lt;li&gt;računanje determinističke adrese&lt;/li&gt;
&lt;li&gt;proveru vlasništva&lt;/li&gt;
&lt;li&gt;dobijanje &lt;code&gt;seqno&lt;/code&gt; vrednosti walleta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drugi smart contract ne može jednostavno sinhrono pozvati get metodu drugog contracta. On-chain komunikacija i dalje se odvija porukama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jezici i razvojni alati
&lt;/h2&gt;

&lt;p&gt;Zvanični jezik za nove TON smart contracte je &lt;strong&gt;Tolk&lt;/strong&gt;. FunC ostaje važan zbog velikog broja postojećih contracta i biblioteka, ali se tretira kao legacy put za održavanje starijeg koda.&lt;/p&gt;

&lt;p&gt;U ekosistemu se koristi i Tact, posebno za projekte kojima odgovara viši nivo apstrakcije. Izbor jezika treba zasnovati na:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zrelosti toolchaina&lt;/li&gt;
&lt;li&gt;dostupnosti biblioteka&lt;/li&gt;
&lt;li&gt;iskustvu tima&lt;/li&gt;
&lt;li&gt;potrebi za kontrolom nad serijalizacijom&lt;/li&gt;
&lt;li&gt;zahtevima audita&lt;/li&gt;
&lt;li&gt;kompatibilnosti sa postojećim contractima&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za TypeScript orijentisan razvoj često se koristi Blueprint. Osnovni workflow uključuje generisanje projekta, build, lokalno testiranje, deployment skripte i wrappere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create ton@latest
&lt;span class="nb"&gt;cd &lt;/span&gt;example-project
npm &lt;span class="nb"&gt;install

&lt;/span&gt;npx blueprint build
npx blueprint &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tačan interaktivni izbor templatea i jezika zavisi od verzije alata. Komande, nazive templatea i konfiguraciju ne treba prepisivati iz starog blog posta bez poređenja sa dokumentacijom instalirane verzije.&lt;/p&gt;

&lt;p&gt;Wrapper je posebno važan deo TON projekta. On na jednom mestu treba da sadrži:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;izračunavanje adrese&lt;/li&gt;
&lt;li&gt;kreiranje &lt;code&gt;StateInit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;serijalizaciju poruka&lt;/li&gt;
&lt;li&gt;parsiranje get metoda&lt;/li&gt;
&lt;li&gt;deployment logiku&lt;/li&gt;
&lt;li&gt;TypeScript tipove&lt;/li&gt;
&lt;li&gt;helper metode za testove i skripte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dobar wrapper sprečava da frontend, backend i deployment skripta svako na svoj način formiraju isti cell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako treba testirati TON contract
&lt;/h2&gt;

&lt;p&gt;Unit test koji pozove handler i proveri jednu promenljivu nije dovoljan.&lt;/p&gt;

&lt;p&gt;TON contract treba testirati kroz poruke i njihove posledice. Sandbox test treba da proveri kompletan skup transakcija koje su nastale tokom tracea.&lt;/p&gt;

&lt;p&gt;Koristan test proverava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pošiljaoca ulazne poruke&lt;/li&gt;
&lt;li&gt;primaoca&lt;/li&gt;
&lt;li&gt;bounce flag&lt;/li&gt;
&lt;li&gt;vrednost poruke&lt;/li&gt;
&lt;li&gt;opcode&lt;/li&gt;
&lt;li&gt;exit code&lt;/li&gt;
&lt;li&gt;action status&lt;/li&gt;
&lt;li&gt;izlazne poruke&lt;/li&gt;
&lt;li&gt;njihove vrednosti i payload&lt;/li&gt;
&lt;li&gt;završno persistentno stanje&lt;/li&gt;
&lt;li&gt;promenu balansa&lt;/li&gt;
&lt;li&gt;vraćene excess poruke&lt;/li&gt;
&lt;li&gt;bounce obradu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obavezni negativni testovi uključuju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;poruku od neovlašćenog pošiljaoca&lt;/li&gt;
&lt;li&gt;duplirani &lt;code&gt;query_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;nepoznat opcode&lt;/li&gt;
&lt;li&gt;premalo priložene vrednosti&lt;/li&gt;
&lt;li&gt;malformed cell&lt;/li&gt;
&lt;li&gt;pogrešnu adresu&lt;/li&gt;
&lt;li&gt;pogrešan workchain&lt;/li&gt;
&lt;li&gt;bounce očekivane izlazne poruke&lt;/li&gt;
&lt;li&gt;paralelne operacije nad istim stanjem&lt;/li&gt;
&lt;li&gt;pokušaj ponavljanja eksterne poruke&lt;/li&gt;
&lt;li&gt;ekstremne granične vrednosti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za debugging treba posmatrati ceo trace. Ako prva transakcija prođe, a poslednja ne promeni očekivano stanje, problem se često nalazi u poruci između njih, nedovoljnoj vrednosti ili action fazi.&lt;/p&gt;

&lt;h2&gt;
  
  
  TON Connect povezuje aplikaciju i wallet
&lt;/h2&gt;

&lt;p&gt;TON Connect je standardni protokol za povezivanje dApp-a sa TON walletima.&lt;/p&gt;

&lt;p&gt;On aplikaciji omogućava da:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dobije adresu izabranog walleta&lt;/li&gt;
&lt;li&gt;zatraži dokaz kontrole nad adresom&lt;/li&gt;
&lt;li&gt;zatraži potpis&lt;/li&gt;
&lt;li&gt;pošalje zahtev za transakciju&lt;/li&gt;
&lt;li&gt;obnovi postojeću sesiju&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aplikacija pritom ne dobija privatni ključ korisnika.&lt;/p&gt;

&lt;p&gt;TON Connect koristi dApp, wallet i bridge. Bridge prenosi end-to-end šifrovane poruke i ne treba da ima pristup njihovom otvorenom sadržaju.&lt;/p&gt;

&lt;p&gt;Za React aplikacije koristi se &lt;code&gt;@tonconnect/ui-react&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @tonconnect/ui-react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplikacija mora imati javno dostupan manifest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example App"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iconUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/icon-180.png"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Manifest treba da bude dostupan preko HTTPS-a, bez autentifikacije, CORS blokade ili proxy challenge stranice. Wallet ga koristi da korisniku prikaže identitet aplikacije.&lt;/p&gt;

&lt;p&gt;Provider se zatim postavlja oko React aplikacije:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;TonConnectButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;TonConnectUIProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tonconnect/ui-react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Providers&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TonConnectUIProvider&lt;/span&gt;
            &lt;span class="na"&gt;manifestUrl&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/tonconnect-manifest.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
            &lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TonConnectButton&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;TonConnectUIProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kod Next.js App Router aplikacije provider mora biti u client komponenti, jer SDK koristi browser funkcionalnosti poput lokalnog storagea i modala.&lt;/p&gt;

&lt;h2&gt;
  
  
  Slanje transakcije preko TON Connecta
&lt;/h2&gt;

&lt;p&gt;TON Connect &lt;code&gt;sendTransaction&lt;/code&gt; prima zahtev sa rokom važenja i jednom ili više poruka.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;beginCell&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toNano&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ton/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;useTonConnectUI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;useTonWallet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tonconnect/ui-react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PaymentButton&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;invoiceId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;invoiceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTonWallet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tonConnectUi&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useTonConnectUI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;beginCell&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;storeUint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;storeStringTail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`invoice:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;invoiceId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endCell&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tonConnectUi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendTransaction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;validUntil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-239&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;toNano&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.05&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                    &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBoc&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;boc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pay&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            Potvrdi plaćanje
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;network&lt;/code&gt; vrednost &lt;code&gt;-239&lt;/code&gt; označava mainnet, dok se za testnet koristi &lt;code&gt;-3&lt;/code&gt;.[14]&lt;/p&gt;

&lt;p&gt;Iznos se šalje kao decimalni string najmanjih jedinica. Payload je base64 kodiran BoC.&lt;/p&gt;

&lt;p&gt;Ovaj kod inicira wallet tok, ali ne treba da aktivira proizvod odmah nakon što &lt;code&gt;sendTransaction&lt;/code&gt; vrati rezultat. Vraćeni BoC treba sačuvati kao podatak za praćenje, a uplatu potvrditi nakon provere blockchaina.&lt;/p&gt;

&lt;p&gt;Takođe, više poruka u jednom wallet zahtevu nisu jedna atomska operacija na svim primaocima. Wallet može potpisati i poslati paket, ali svaki primalac obrađuje svoju poruku nezavisno. Jedna može uspeti, a druga pasti.&lt;/p&gt;

&lt;h2&gt;
  
  
  ton_proof za autentifikaciju
&lt;/h2&gt;

&lt;p&gt;Povezana wallet adresa sama po sebi nije dovoljna za backend login.&lt;/p&gt;

&lt;p&gt;Frontend može backendu poslati bilo koju adresu kao string. Backend mora dobiti kriptografski dokaz da korisnik kontroliše odgovarajući wallet.&lt;/p&gt;

&lt;p&gt;TON Connect za to koristi &lt;code&gt;ton_proof&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tipičan tok izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Backend generiše jednokratni nonce.&lt;/li&gt;
&lt;li&gt;Nonce se vezuje za sesiju, domen i rok važenja.&lt;/li&gt;
&lt;li&gt;Frontend zahteva &lt;code&gt;ton_proof&lt;/code&gt; prilikom povezivanja walleta.&lt;/li&gt;
&lt;li&gt;Wallet potpisuje strukturiranu poruku.&lt;/li&gt;
&lt;li&gt;Frontend šalje proof backendu.&lt;/li&gt;
&lt;li&gt;Backend proverava payload, domen, timestamp, adresu, &lt;code&gt;StateInit&lt;/code&gt;, javni ključ i Ed25519 potpis.&lt;/li&gt;
&lt;li&gt;Nonce se označava kao iskorišćen.&lt;/li&gt;
&lt;li&gt;Backend izdaje sopstvenu aplikacionu sesiju.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Potpis je vezan za wallet adresu, domen aplikacije, vreme i payload. Time se smanjuje rizik da proof napravljen za jednu aplikaciju bude iskorišćen na drugom domenu.&lt;/p&gt;

&lt;p&gt;Javni ključ iz odgovora ne treba slepo prihvatiti. Backend treba da proveri njegovu vezu sa wallet adresom i &lt;code&gt;StateInit&lt;/code&gt;, ili da koristi odgovarajući on-chain metod kada je potrebno.&lt;/p&gt;

&lt;p&gt;Nonce mora biti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kriptografski nasumičan&lt;/li&gt;
&lt;li&gt;kratkog roka&lt;/li&gt;
&lt;li&gt;vezan za konkretnu sesiju&lt;/li&gt;
&lt;li&gt;neupotrebljiv nakon prve uspešne provere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;ton_proof&lt;/code&gt; potvrđuje kontrolu nad walletom. Ne potvrđuje da korisnik poseduje određeni token, da je izvršio uplatu ili da je konkretna transakcija uspešna. To su odvojene provere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan payment workflow
&lt;/h2&gt;

&lt;p&gt;Zamislimo Telegram Mini App koji prodaje digitalnu uslugu.&lt;/p&gt;

&lt;p&gt;Korisnik bira paket i plaća izvorном valutom mreže. Pouzdan sistem treba da razdvoji kreiranje narudžbine, potpisivanje i blockchain potvrdu.&lt;/p&gt;

&lt;p&gt;Backend prvo kreira invoice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"invoiceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inv_8d712"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_184"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"asset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GRAM"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amountNano"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"50000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recipient"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UQ..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expiresAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1760000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vreme u primeru je samo Unix vrednost u podacima, ne hardkodovana poslovna konstanta.&lt;/p&gt;

&lt;p&gt;Backend zatim vraća frontendu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adresu primaoca&lt;/li&gt;
&lt;li&gt;tačan iznos u najmanjim jedinicama&lt;/li&gt;
&lt;li&gt;payload sa invoice identifikatorom&lt;/li&gt;
&lt;li&gt;dozvoljenu mrežu&lt;/li&gt;
&lt;li&gt;rok važenja zahteva&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frontend ne bi trebalo sam da odlučuje koliko treba platiti i kome. U suprotnom korisnik ili izmenjeni klijent mogu promeniti parametre pre otvaranja walleta.&lt;/p&gt;

&lt;p&gt;Nakon potpisa backend prati mrežu i proverava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da li je primalac tačan&lt;/li&gt;
&lt;li&gt;da li je asset tačan&lt;/li&gt;
&lt;li&gt;da li je iznos dovoljan&lt;/li&gt;
&lt;li&gt;da li payload sadrži očekivani invoice ID&lt;/li&gt;
&lt;li&gt;da li invoice postoji&lt;/li&gt;
&lt;li&gt;da li je invoice još validan&lt;/li&gt;
&lt;li&gt;da li uplata već nije obrađena&lt;/li&gt;
&lt;li&gt;da li je relevantna transakcija uspešna&lt;/li&gt;
&lt;li&gt;da li postoji neočekivani bounce&lt;/li&gt;
&lt;li&gt;da li je trace dostigao očekivano završno stanje&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tek tada se invoice označava kao plaćen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Idempotency nije opcioni detalj
&lt;/h2&gt;

&lt;p&gt;Blockchain event može biti obrađen više puta.&lt;/p&gt;

&lt;p&gt;Razlozi uključuju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;restart workera&lt;/li&gt;
&lt;li&gt;ponovni API zahtev&lt;/li&gt;
&lt;li&gt;preklapanje pollinga i streama&lt;/li&gt;
&lt;li&gt;retry nakon timeouta&lt;/li&gt;
&lt;li&gt;ponovno indeksiranje&lt;/li&gt;
&lt;li&gt;ručni reconciliation&lt;/li&gt;
&lt;li&gt;duplirani webhook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend zato mora imati stabilan identitet uplate.&lt;/p&gt;

&lt;p&gt;To može biti kombinacija:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;account_address
transaction_lt
transaction_hash
message_hash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ili jedinstveni aplikacioni identifikator povezan sa verifikovanom transakcijom.&lt;/p&gt;

&lt;p&gt;Baza treba da ima unique constraint koji sprečava dvostruko kreditiranje.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;payments_chain_identity_unique&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;payments&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;account_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;transaction_lt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;transaction_hash&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Business handler zatim treba da bude idempotentan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;begin transaction

insert payment if not exists

if payment already processed:
    return previous result

mark invoice as paid
grant purchased entitlement
mark payment as processed

commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bez ovoga, savršeno validna blockchain integracija može napraviti duplu internu uplatu zbog običnog backend retryja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako čitati TON blockchain
&lt;/h2&gt;

&lt;p&gt;DApp obično ne komunicira direktno sa validatorima iz browsera. Koriste se API provideri, liteserveri i indeksirani data servisi.&lt;/p&gt;

&lt;p&gt;TON Center API v3 predstavlja indeksirani sloj koji omogućava pretragu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transakcija&lt;/li&gt;
&lt;li&gt;poruka&lt;/li&gt;
&lt;li&gt;traceova&lt;/li&gt;
&lt;li&gt;akcija&lt;/li&gt;
&lt;li&gt;jetton transfera&lt;/li&gt;
&lt;li&gt;NFT podataka&lt;/li&gt;
&lt;li&gt;istorijskih događaja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postoje endpointi za pronalaženje transakcija na osnovu message hasha i za čitanje dekodiranih akcija.&lt;/p&gt;

&lt;p&gt;Indexirani API je praktičan, ali uvodi poverenje u provider. Provider može kasniti, pogrešno dekodirati podatke ili biti nedostupan.&lt;/p&gt;

&lt;p&gt;Za kritičnije sisteme mogu se koristiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sopstveni full node&lt;/li&gt;
&lt;li&gt;liteserver&lt;/li&gt;
&lt;li&gt;archive infrastruktura&lt;/li&gt;
&lt;li&gt;sopstveni indexer&lt;/li&gt;
&lt;li&gt;provera Merkle dokaza&lt;/li&gt;
&lt;li&gt;kombinacija više nezavisnih providera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full node i archive node nisu ista stvar. Full node može čuvati aktuelno stanje i novije blokove uz pruning, dok je archive infrastruktura potrebna kada servis mora pouzdano da pretražuje kompletnu istoriju.&lt;/p&gt;

&lt;p&gt;Razuman produkcioni kompromis često izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Primarni indexed API za brzo čitanje.&lt;/li&gt;
&lt;li&gt;Drugi provider za proveru kritičnih podataka.&lt;/li&gt;
&lt;li&gt;Lokalna baza sa sopstvenim cursorom.&lt;/li&gt;
&lt;li&gt;Periodični reconciliation starijih transakcija.&lt;/li&gt;
&lt;li&gt;Alert kada indexer lag pređe dozvoljeni prag.&lt;/li&gt;
&lt;li&gt;Mogućnost ponovne obrade određenog raspona blokova.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Jettoni nisu centralizovani ERC-20 mapping
&lt;/h2&gt;

&lt;p&gt;Fungibilni tokeni na TON-u nazivaju se &lt;strong&gt;jettons&lt;/strong&gt;. Standardni interfejs opisan je kroz TEP-74.&lt;/p&gt;

&lt;p&gt;Kod tipičnog ERC-20 contracta jedan contract čuva mapping svih adresa i balansa.&lt;/p&gt;

&lt;p&gt;Kod jettona se koriste:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jetton master contract&lt;/li&gt;
&lt;li&gt;pojedinačni jetton wallet contracti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Master contract čuva opšte podatke o tokenu, kao što su ukupna ponuda, metadata i kod wallet contracta.&lt;/p&gt;

&lt;p&gt;Svaki vlasnik ima sopstveni jetton wallet contract za konkretan jetton.&lt;/p&gt;

&lt;p&gt;Ako token ima tri vlasnika, u jednostavnom modelu postoje jedan master i tri jetton wallet contracta.&lt;/p&gt;

&lt;p&gt;Jetton transfer zato nije samo promena dva polja u jednom centralnom mappingu. Tipičan tok uključuje:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Korisnikov običan wallet šalje poruku njegovom jetton walletu.&lt;/li&gt;
&lt;li&gt;Pošiljaočev jetton wallet smanjuje balans.&lt;/li&gt;
&lt;li&gt;On šalje internu transfer poruku jetton walletu primaoca.&lt;/li&gt;
&lt;li&gt;Primaočev jetton wallet povećava balans.&lt;/li&gt;
&lt;li&gt;Po potrebi se šalje &lt;code&gt;transfer_notification&lt;/code&gt; krajnjem primaocu.&lt;/li&gt;
&lt;li&gt;Višak izvorne valute vraća se kroz &lt;code&gt;excesses&lt;/code&gt; poruku.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ako primaočev jetton wallet još ne postoji, može biti deterministički deployovan tokom transfera.&lt;/p&gt;

&lt;p&gt;Ovaj model raspoređuje stanje i izvršavanje između više contracta, što se uklapa u sharding arhitekturu TON-a. Cena je složenija integracija.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bezbedna obrada jetton uplata
&lt;/h2&gt;

&lt;p&gt;Naziv, simbol i slika jettona nisu dokaz identiteta.&lt;/p&gt;

&lt;p&gt;Napadač može napraviti token sa istim nazivom i logotipom kao poznati stablecoin. Aplikacija koja proverava samo metadata podatke može prihvatiti bezvredni lažni token.&lt;/p&gt;

&lt;p&gt;Pouzdana integracija održava allowlist jetton master adresa.&lt;/p&gt;

&lt;p&gt;Kada servis primi &lt;code&gt;transfer_notification&lt;/code&gt;, treba proveriti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opcode &lt;code&gt;0x7362d09c&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;adresu contracta koji je poslao poruku&lt;/li&gt;
&lt;li&gt;vezu između tog jetton walleta i odobrenog mastera&lt;/li&gt;
&lt;li&gt;vlasnika očekivanog jetton walleta&lt;/li&gt;
&lt;li&gt;iznos u osnovnim jedinicama&lt;/li&gt;
&lt;li&gt;&lt;code&gt;query_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;originalnog pošiljaoca&lt;/li&gt;
&lt;li&gt;&lt;code&gt;forward_payload&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;bounce indikatore&lt;/li&gt;
&lt;li&gt;neočekivane izlazne poruke&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Odnos mastera i walleta proverava se korišćenjem standardnog &lt;code&gt;get_wallet_address()&lt;/code&gt; metoda na pouzdanom jetton master contractu. Dobijena adresa mora odgovarati jetton walletu koji je poslao notifikaciju.&lt;/p&gt;

&lt;p&gt;TEP-74 definiše standardne poruke, uključujući:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;transfer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal_transfer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transfer_notification&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;excesses&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;burn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;burn_notification&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;transfer_notification&lt;/code&gt; se šalje samo ako je &lt;code&gt;forward_ton_amount&lt;/code&gt; veći od nule. Servisi koji zavise od notifikacije moraju to uzeti u obzir pri formiranju transfera.&lt;/p&gt;

&lt;p&gt;Jetton iznosi takođe nisu nužno u devet decimala. Broj decimala zavisi od konkretnog tokena. Backend mora čuvati integer količinu i zasebno metadata informaciju potrebnu za prikaz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko košta TON transakcija
&lt;/h2&gt;

&lt;p&gt;TON nema jednu fiksnu naknadu za svaku transakciju.&lt;/p&gt;

&lt;p&gt;Ukupan trošak može uključiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;storage fee&lt;/li&gt;
&lt;li&gt;compute fee&lt;/li&gt;
&lt;li&gt;import fee&lt;/li&gt;
&lt;li&gt;action fee&lt;/li&gt;
&lt;li&gt;forward fee&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Storage fee&lt;/strong&gt; zavisi od količine persistentnih podataka i vremena tokom kojeg se čuvaju.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compute fee&lt;/strong&gt; zavisi od potrošenog TVM gasa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import fee&lt;/strong&gt; odnosi se na obradu ulazne eksterne poruke.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action i forward fee&lt;/strong&gt; zavise od izlaznih akcija, veličine poruka, broja cells i njihovog prosleđivanja.&lt;/p&gt;

&lt;p&gt;Zbog toga jednostavan transfer, deployment contracta i jetton transfer nemaju isti trošak.&lt;/p&gt;

&lt;p&gt;Jetton transfer može uključiti više contracta i poruka:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wallet
sender jetton wallet
receiver jetton wallet
recipient
response destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Svaki dodatni korak može imati sopstveni compute i forwarding trošak.&lt;/p&gt;

&lt;p&gt;Naknada zavisi i od konfiguracionih parametara mreže. Vrednosti se mogu menjati, pa ih ne treba trajno hardkodovati u poslovnu logiku.&lt;/p&gt;

&lt;p&gt;Praktičan pristup je:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Izgraditi tačnu poruku.&lt;/li&gt;
&lt;li&gt;Emulirati ili proceniti transakciju preko pouzdanog providera.&lt;/li&gt;
&lt;li&gt;Dodati razumnu rezervu.&lt;/li&gt;
&lt;li&gt;Nakon izvršenja pročitati stvarno potrošene naknade.&lt;/li&gt;
&lt;li&gt;Pratiti odstupanje procene od realnog troška.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Za aplikaciju je često važniji &lt;strong&gt;maksimalni dozvoljeni trošak operacije&lt;/strong&gt; nego prosečna naknada.&lt;/p&gt;

&lt;p&gt;Ako ugovor mora da pošalje četiri izlazne poruke, treba dokazati da priložena vrednost pokriva najgori podržani slučaj, ne samo srećnu putanju iz jednog testa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage nije besplatan posle deploymenta
&lt;/h2&gt;

&lt;p&gt;Smart contract nije datoteka koja se jednom uploaduje i zatim zauvek ostaje bez troška.&lt;/p&gt;

&lt;p&gt;Persistentni kod i podaci imaju storage cenu. Ako contract čuva sve veći dictionary korisnika, narudžbina ili istorijskih događaja, trošak može rasti tokom vremena.&lt;/p&gt;

&lt;p&gt;Zato nije dobro automatski čuvati svaki događaj on-chain.&lt;/p&gt;

&lt;p&gt;Primeri podataka koji često ne moraju biti u persistentnom contract stanju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kompletna istorija promena&lt;/li&gt;
&lt;li&gt;analitički podaci&lt;/li&gt;
&lt;li&gt;pretraživi tekst&lt;/li&gt;
&lt;li&gt;korisnički profili&lt;/li&gt;
&lt;li&gt;logovi&lt;/li&gt;
&lt;li&gt;podaci koji se mogu rekonstruisati iz transakcija&lt;/li&gt;
&lt;li&gt;privatne informacije&lt;/li&gt;
&lt;li&gt;veliki metadata dokumenti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On-chain treba čuvati minimalno stanje potrebno za verifikaciju i sprovođenje pravila.&lt;/p&gt;

&lt;p&gt;Umesto kompletne liste dokumenata, contract može čuvati Merkle root. Umesto istorije svih statusa, može čuvati samo trenutno stanje i emitovati događaje za indexer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konsenzus, finalnost i šta aplikacija zapravo čeka
&lt;/h2&gt;

&lt;p&gt;TON koristi Proof-of-Stake. Validatori učestvuju u predlaganju i potvrđivanju blokova, dok masterchain daje zajednički pogled na stanje shardchainova.&lt;/p&gt;

&lt;p&gt;Dokumentacija opisuje finalnost koja se u uobičajenim uslovima postiže ispod jedne sekunde. To treba posmatrati kao karakteristiku protokola, ne kao garantovani application-level SLA.&lt;/p&gt;

&lt;p&gt;Korisnik može ipak čekati duže zbog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wallet UI-ja&lt;/li&gt;
&lt;li&gt;slanja preko bridgea&lt;/li&gt;
&lt;li&gt;API pollinga&lt;/li&gt;
&lt;li&gt;indexer laga&lt;/li&gt;
&lt;li&gt;obrade tracea sa više poruka&lt;/li&gt;
&lt;li&gt;backend queuea&lt;/li&gt;
&lt;li&gt;baze podataka&lt;/li&gt;
&lt;li&gt;retry politike&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako frontend proverava status jednom u deset sekundi, mrežna finalnost ispod sekunde neće proizvesti brz korisnički doživljaj.&lt;/p&gt;

&lt;p&gt;Produkcioni sistem treba da meri najmanje:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wallet_signed_at
submitted_at
first_seen_at
included_at
business_confirmed_at
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tako se može utvrditi da li usporenje dolazi iz walleta, providera, indexera ili sopstvenog backenda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bezbednost eksternih poruka
&lt;/h2&gt;

&lt;p&gt;Incoming external message ne donosi sredstva contractu. Contract ima ograničen gas credit da proveri zahtev pre nego što prihvati plaćanje daljeg izvršavanja iz sopstvenog balansa.&lt;/p&gt;

&lt;p&gt;Ako contract prerano izvrši &lt;code&gt;ACCEPT&lt;/code&gt;, napadač može ponavljati nevalidne zahteve i trošiti njegov balans.&lt;/p&gt;

&lt;p&gt;Pre prihvatanja eksterne poruke obično treba proveriti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;potpis&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seqno&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;valid_until&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wallet_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;očekivani format&lt;/li&gt;
&lt;li&gt;domen ili kontekst potpisa&lt;/li&gt;
&lt;li&gt;dozvoljenu operaciju&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nakon uspešne provere contract može prihvatiti poruku i promeniti stanje.&lt;/p&gt;

&lt;p&gt;Nedostatak replay zaštite je posebno opasan. Validno potpisan zahtev ne sme moći da se izvrši više puta.&lt;/p&gt;

&lt;p&gt;Za većinu dApp contracta jednostavniji i sigurniji model je da primaju interne poruke iz standardnog walleta, umesto da samostalno implementiraju složenu obradu eksternih potpisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adrese, bounceable format i validacija
&lt;/h2&gt;

&lt;p&gt;TON adresa može biti prikazana u raw ili user-friendly formatu.&lt;/p&gt;

&lt;p&gt;Raw oblik izgleda kao workchain i 256-bitni identifikator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0:b4c1b2ede12aa76f4a44353944258bcc8f99e9c7c474711a152c78b43218e296
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;User-friendly format uključuje dodatne zastavice i checksum. Može označiti da li je adresa bounceable i da li pripada test mreži.&lt;/p&gt;

&lt;p&gt;Različiti tekstualni oblici mogu predstavljati isti underlying nalog.&lt;/p&gt;

&lt;p&gt;Backend zato ne treba da poredi adrese običnim poređenjem originalnih stringova. Potrebno ih je parsirati i normalizovati pomoću proverene biblioteke.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Address&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ton/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storedAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sameAccount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treba proveriti i workchain. Aplikacija koja očekuje basechain nalog ne bi trebalo da prihvati proizvoljnu adresu bez provere.&lt;/p&gt;

&lt;p&gt;Bounceable adresa je prikladna kada se očekuje aktivan contract i kada pošiljalac želi povratnu poruku u slučaju neuspeha.&lt;/p&gt;

&lt;p&gt;Non-bounceable format je često prikladniji za prvi transfer ka još nedeployovanoj wallet adresi. To nije univerzalno pravilo za svaki protokol, već deo odluke o očekivanom stanju primaoca.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zašto kompletan backend i dalje ostaje potreban
&lt;/h2&gt;

&lt;p&gt;TON ne uklanja potrebu za klasičnim backendom.&lt;/p&gt;

&lt;p&gt;Blockchain dobro rešava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;javno proverljivo vlasništvo&lt;/li&gt;
&lt;li&gt;prenos vrednosti&lt;/li&gt;
&lt;li&gt;zajedničko stanje između nepouzdanih strana&lt;/li&gt;
&lt;li&gt;pravila koja ne zavise od jednog servera&lt;/li&gt;
&lt;li&gt;transparentnu evidenciju izvršenja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Klasičan backend je obično bolji za:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pretragu&lt;/li&gt;
&lt;li&gt;analitiku&lt;/li&gt;
&lt;li&gt;privatne podatke&lt;/li&gt;
&lt;li&gt;email i push obaveštenja&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;preporuke&lt;/li&gt;
&lt;li&gt;moderaciju&lt;/li&gt;
&lt;li&gt;korisničku podršku&lt;/li&gt;
&lt;li&gt;kompleksne izveštaje&lt;/li&gt;
&lt;li&gt;brzo keširanje&lt;/li&gt;
&lt;li&gt;poslovne integracije&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Najzdravija arhitektura nije „sve on-chain“, već jasna podela odgovornosti.&lt;/p&gt;

&lt;p&gt;Smart contract treba da bude mali, determinističan i proverljiv. Backend treba da indeksira događaje, održava aplikacione projekcije, prati neuspešne tokove i pruža korisniku razumljiv interfejs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Predložena arhitektura produkcione aplikacije
&lt;/h2&gt;

&lt;p&gt;Za ozbiljniji TON proizvod razumno je odvojiti nekoliko komponenti.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend ili Mini App&lt;/strong&gt; prikazuje korisnički interfejs i koristi TON Connect za wallet sesiju.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application backend&lt;/strong&gt; upravlja korisnicima, invoiceima, dozvolama i poslovnom logikom koja ne mora biti on-chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transaction builder&lt;/strong&gt; formira očekivane poruke i payload. Za finansijske operacije često je sigurnije da backend napravi parametre nego da ih frontend slobodno sastavlja.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockchain listener&lt;/strong&gt; prati naloge, transakcije, poruke i traceove.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decoder&lt;/strong&gt; parsira standardne i aplikacione TL-B poruke.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reconciliation worker&lt;/strong&gt; ponovo proverava nepotvrđene i ranije obrađene transakcije.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database&lt;/strong&gt; čuva raw blockchain identitete, dekodirane događaje i aplikacione projekcije.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart contract wrapper&lt;/strong&gt; obezbeđuje isti binarni format u testovima, skriptama i aplikacionom kodu.&lt;/p&gt;

&lt;p&gt;Tok može izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    U[Korisnik] --&amp;gt; F[Frontend ili Mini App]
    F --&amp;gt; TC[TON Connect]
    TC --&amp;gt; W[Wallet]
    W --&amp;gt; N[TON mreža]
    F --&amp;gt; B[Application backend]
    B --&amp;gt; D[(Baza)]
    N --&amp;gt; I[Indexer ili liteserver]
    I --&amp;gt; L[Blockchain listener]
    L --&amp;gt; V[Validator poslovnih pravila]
    V --&amp;gt; D
    D --&amp;gt; R[Reconciliation worker]
    R --&amp;gt; I&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Ključna tačka je da wallet odgovor i blockchain potvrda ulaze u sistem različitim putem. Frontend inicira nameru, dok listener potvrđuje izvršenje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gde TON ima praktičnog smisla
&lt;/h2&gt;

&lt;p&gt;TON je posebno zanimljiv kada aplikacija ima prirodnu vezu sa Telegram okruženjem ili zahteva veliki broj relativno nezavisnih on-chain interakcija.&lt;/p&gt;

&lt;p&gt;Primeri uključuju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;plaćanja u Telegram Mini Apps aplikacijama&lt;/li&gt;
&lt;li&gt;digitalnu robu&lt;/li&gt;
&lt;li&gt;pretplate&lt;/li&gt;
&lt;li&gt;nagrade i loyalty programe&lt;/li&gt;
&lt;li&gt;igre sa digitalnim vlasništvom&lt;/li&gt;
&lt;li&gt;marketplace tokove&lt;/li&gt;
&lt;li&gt;escrow contracte&lt;/li&gt;
&lt;li&gt;NFT kolekcije&lt;/li&gt;
&lt;li&gt;community tokene&lt;/li&gt;
&lt;li&gt;mikroplaćanja&lt;/li&gt;
&lt;li&gt;DeFi protokole&lt;/li&gt;
&lt;li&gt;servise sa mnogo pojedinačnih korisničkih stanja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To ne znači da svaki Telegram bot treba blockchain.&lt;/p&gt;

&lt;p&gt;Ako proizvod ima jednog operatera, nema potrebu za javno proverljivim vlasništvom i sve transakcije se mogu pouzdano voditi u običnoj bazi, blockchain može dodati više složenosti nego vrednosti.&lt;/p&gt;

&lt;p&gt;TON ima smisla kada su javno vlasništvo, prenosiva sredstva, interoperabilnost i izvršavanje bez centralnog posrednika stvarni deo proizvoda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Glavni trade-offi
&lt;/h2&gt;

&lt;p&gt;TON-ov sharding i message-driven model omogućavaju horizontalno skaliranje, ali prenose deo složenosti na aplikacionu arhitekturu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Asinhronost otežava višekoračne operacije.&lt;/strong&gt; Potrebni su statusi, &lt;code&gt;query_id&lt;/code&gt;, bounce handleri i kompenzacione akcije.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Binarna serijalizacija traži disciplinu.&lt;/strong&gt; Cell koji je pogrešno pročitan za jedan bit može potpuno promeniti značenje poruke.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jetton model povećava broj contracta.&lt;/strong&gt; Distribuirano stanje olakšava skaliranje, ali transfer više nije promena jednog centralnog mappinga.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indexer postaje važan deo proizvoda.&lt;/strong&gt; Korisnik ne želi da ručno pregleda block explorer kako bi saznao zašto uplata nije prepoznata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider ubrzava razvoj, ali uvodi poverenje.&lt;/strong&gt; Sopstveni node smanjuje zavisnost, ali povećava operativni trošak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brza finalnost ne rešava spor backend.&lt;/strong&gt; Observability i event processing ostaju odgovornost aplikacije.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Niske naknade nisu isto što i neograničeno besplatno stanje.&lt;/strong&gt; Storage, broj poruka i veličina payload-a i dalje imaju cenu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telegram distribucija može postati platformska zavisnost.&lt;/strong&gt; Blockchain domen i poslovnu logiku treba odvojiti od konkretnog Mini App interfejsa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako bih procenjivao TON za novi projekat
&lt;/h2&gt;

&lt;p&gt;Pre izbora mreže postavio bih nekoliko praktičnih pitanja.&lt;/p&gt;

&lt;p&gt;Da li proizvod dobija konkretnu vrednost iz TON wallet i Telegram ekosistema?&lt;/p&gt;

&lt;p&gt;Da li se poslovni proces može modelovati kao asinhrona state machine?&lt;/p&gt;

&lt;p&gt;Da li tim razume da jedan korisnički zahtev može proizvesti više blockchain transakcija?&lt;/p&gt;

&lt;p&gt;Da li postoji plan za bounce, retry, timeout i reconciliation?&lt;/p&gt;

&lt;p&gt;Da li se svi finansijski iznosi čuvaju u najmanjim jedinicama?&lt;/p&gt;

&lt;p&gt;Da li smart contract može ostati dovoljno mali da bude temeljno testiran i auditovan?&lt;/p&gt;

&lt;p&gt;Da li postoji jasan razlog zbog kojeg određeni podatak mora biti on-chain?&lt;/p&gt;

&lt;p&gt;Da li tim može da održava indexer ili pouzdano upravlja eksternim providerom?&lt;/p&gt;

&lt;p&gt;Da li je korisničko iskustvo prihvatljivo kada wallet ili provider privremeno nisu dostupni?&lt;/p&gt;

&lt;p&gt;Ako su odgovori pozitivni, TON može biti dobar izbor za aplikacije koje zahtevaju veliki broj brzih transfera, distribuirano vlasništvo i prirodnu integraciju sa walletima.&lt;/p&gt;

&lt;p&gt;Ako aplikacija zahteva velike sinhrone operacije preko mnogo contracta, intenzivno privatno računanje ili čuvanje velike količine podataka, klasičan backend ili drugačiji blockchain model mogu biti jednostavniji.&lt;/p&gt;

&lt;p&gt;Najvažnije je ne birati TON samo na osnovu jedne brojke o brzini ili prosečnoj naknadi.&lt;/p&gt;

&lt;p&gt;Njegova prava tehnička vrednost nalazi se u arhitekturi: nalozi kao nezavisni akteri, komunikacija porukama, determinističke adrese, cell-based podaci i mogućnost raspodele izvršavanja kroz shardove.&lt;/p&gt;

&lt;p&gt;Ista arhitektura koja donosi skalabilnost zahteva od developera da ozbiljno razmišlja o parcijalnom uspehu, redosledu događaja i lokalnoj konzistentnosti.&lt;/p&gt;

&lt;p&gt;TON zato nije težak zato što ima mnogo neobičnih termina. Težak je onda kada se pokušava programirati kao sistem koji nije.&lt;/p&gt;

&lt;p&gt;Kada se contract posmatra kao state machine, poruka kao događaj, trace kao distribuirani workflow, a backend kao verifikator i projekcija blockchain stanja, TON postaje znatno razumljiviji.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Izvori
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://ton.org/media/" rel="noopener noreferrer"&gt;TON Media Assets: razlika između TON mreže i Gram tokena&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/v3/guidelines/dapps/transactions/foundations-of-blockchain" rel="noopener noreferrer"&gt;TON dokumentacija: arhitektura, workchainovi, shardovi, nalozi i poruke&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/standard/wallets/how-it-works" rel="noopener noreferrer"&gt;TON dokumentacija: kako rade wallet contracti&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/blockchain-basics/standard/wallets/interact" rel="noopener noreferrer"&gt;TON dokumentacija: programska interakcija sa walletima&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/applications/ton-connect/how-to/send-transaction" rel="noopener noreferrer"&gt;TON Connect: slanje transakcija i provera rezultata&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/foundations/serialization/cells" rel="noopener noreferrer"&gt;TON dokumentacija: struktura cells&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/contracts/standard/wallets/interact" rel="noopener noreferrer"&gt;TON dokumentacija: format komentara u transfer porukama&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/foundations/serialization/boc" rel="noopener noreferrer"&gt;TON dokumentacija: Bag of Cells format&lt;/a&gt; ([docs.ton.org]&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/tvm/registers" rel="noopener noreferrer"&gt;TON dokumentacija: TVM registri i persistentno stanje&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/foundations/actions/overview" rel="noopener noreferrer"&gt;TON dokumentacija: akcije smart contracta&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/v3/documentation/smart-contracts/func/libraries" rel="noopener noreferrer"&gt;TON dokumentacija: Tolk i status FunC jezika&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/guidelines/smat-contracts-guidelines" rel="noopener noreferrer"&gt;TON dokumentacija: debugging i analiza kompletnog tracea&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.ton.org/applications/ton-connect/core-concepts" rel="noopener noreferrer"&gt;TON Connect: arhitektura, bridge, sesije i bezbednosni model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/develop/dapps/ton-connect/react" rel="noopener noreferrer"&gt;TON Connect vodič za React i Next.js&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ton-blockchain/ton-connect/blob/main/spec/connect.md" rel="noopener noreferrer"&gt;TON Connect specifikacija za povezivanje i ton_proof&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/ecosystem/api/toncenter/v3/overview" rel="noopener noreferrer"&gt;TON Center API v3 pregled&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/nodes/overview" rel="noopener noreferrer"&gt;TON dokumentacija: full, archive, validator i liteserver nodeovi&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ton-blockchain/TEPs/blob/master/text/0074-jettons-standard.md" rel="noopener noreferrer"&gt;TEP-74: standard za fungibilne Jetton tokene&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/payments/jettons" rel="noopener noreferrer"&gt;TON dokumentacija: bezbedna obrada jetton uplata&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ton-blockchain/docs/blob/main/content/foundations/limits.mdx" rel="noopener noreferrer"&gt;TON dokumentacija: mrežna ograničenja i parametri naknada&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ton-blockchain/ton/blob/master/doc/ton.tex" rel="noopener noreferrer"&gt;TON tehnička specifikacija: Proof-of-Stake i uloga masterchaina&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ton.org/v3/guidelines/smart-contracts/security/common-vulnerabilities/" rel="noopener noreferrer"&gt;TON dokumentacija: bezbednosne greške i preporučene provere&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>bitcoin</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Solana za developere: arhitektura bez EVM pretpostavki</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Fri, 18 Sep 2026 16:53:33 +0000</pubDate>
      <link>https://dev.to/kriptomuza/solana-za-developere-arhitektura-bez-evm-pretpostavki-16h3</link>
      <guid>https://dev.to/kriptomuza/solana-za-developere-arhitektura-bez-evm-pretpostavki-16h3</guid>
      <description>&lt;p&gt;Ako Solani pristupite kao „bržem Ethereumu“, prve prototipe ćete verovatno napraviti brzo, ali ćete ubrzo početi da se borite protiv same platforme.&lt;/p&gt;

&lt;p&gt;Solana nije EVM sa kraćim vremenom bloka. Njen programski model više podseća na operativni sistem u kojem se izvršni kod, podaci, dozvole i resursi eksplicitno navode pre izvršavanja. Program ne poseduje skriveni globalni storage. Klijent unapred opisuje koje naloge transakcija čita, koje menja i ko mora da je potpiše.&lt;/p&gt;

&lt;p&gt;To je razlog zbog kog Solana može paralelno da obrađuje transakcije koje ne menjaju isto stanje. Istovremeno, to je izvor većine grešaka developera koji dolaze iz EVM sveta.&lt;/p&gt;

&lt;p&gt;Ovaj članak objašnjava šta je Solana iz perspektive aplikacionog developera, kako rade nalozi i programi, gde se pojavljuje paralelizacija, kako izgleda realna integracija i koliko operacije zapravo koštaju. Fokus nije na maksimalnom teorijskom TPS-u, već na odlukama koje utiču na dizajn aplikacije.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta je Solana u praktičnom smislu
&lt;/h2&gt;

&lt;p&gt;Za aplikacionog developera, Solana se može posmatrati kao distribuirano izvršno okruženje sa nekoliko osnovnih primitiva:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nalozi koji čuvaju SOL, podatke ili izvršni kod&lt;/li&gt;
&lt;li&gt;programi koji obrađuju instrukcije&lt;/li&gt;
&lt;li&gt;transakcije koje grupišu jednu ili više instrukcija&lt;/li&gt;
&lt;li&gt;digitalni potpisi koji autorizuju promene&lt;/li&gt;
&lt;li&gt;Program Derived Addresses, odnosno determinističke adrese bez privatnog ključa&lt;/li&gt;
&lt;li&gt;Cross-Program Invocations za pozivanje drugih programa&lt;/li&gt;
&lt;li&gt;JSON-RPC i WebSocket interfejsi za komunikaciju sa mrežom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Programi se kompajliraju u Solana Bytecode Format, odnosno sBPF, i izvršavaju se u sandbox okruženju. Programski kod je stateless u smislu da se promenljivo stanje ne čuva unutar izvršnog programa. Stanje se nalazi u odvojenim nalozima koji se prosleđuju instrukciji.[1]&lt;/p&gt;

&lt;p&gt;Ovo razdvajanje je osnova cele arhitekture.&lt;/p&gt;

&lt;p&gt;Na EVM-u je prirodno razmišljati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contract.state.balance[user]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na Solani je bliži mentalni model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;program + instruction data + explicit account list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Program dobija naloge nad kojima treba da radi. Runtime proverava da li su označeni kao writable, da li su potrebni potpisnici prisutni i da li program ima pravo da menja njihove podatke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof of History nije zamena za konsenzus
&lt;/h2&gt;

&lt;p&gt;Proof of History često se opisuje kao Solanin konsenzusni mehanizam, ali je to pojednostavljenje koje nije naročito korisno developerima.&lt;/p&gt;

&lt;p&gt;Proof of History je sekvencijalni kriptografski zapis koji mreži daje proverljiv redosled događaja i meru proteklog vremena. Konsenzus se i dalje oslanja na proof-of-stake glasanje validatora i Tower BFT pravila. Proof of History pomaže mreži da smanji deo komunikacije potreban za usaglašavanje oko vremena i redosleda događaja.[2]&lt;/p&gt;

&lt;p&gt;Za većinu aplikacija nije potrebno implementaciono razumevanje Tower BFT-a. Važnije posledice su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mreža je organizovana u slotove&lt;/li&gt;
&lt;li&gt;validator koji je lider proizvodi blok za svoj slot&lt;/li&gt;
&lt;li&gt;transakcija uključuje recent blockhash&lt;/li&gt;
&lt;li&gt;blockhash ograničava životni vek transakcije&lt;/li&gt;
&lt;li&gt;različiti nivoi potvrde predstavljaju različit nivo sigurnosti da stanje neće biti odbačeno&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drugim rečima, recent blockhash nije samo polje koje SDK zahteva. On je deo mehanizma za ograničavanje validnosti transakcije i zaštitu od ponovnog izvršavanja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nalog je osnovna jedinica stanja
&lt;/h2&gt;

&lt;p&gt;Na Solani se praktično sve predstavlja nalogom. Svaki nalog ima istu osnovnu strukturu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adresu od 32 bajta&lt;/li&gt;
&lt;li&gt;balans izražen u lamportima&lt;/li&gt;
&lt;li&gt;niz bajtova sa podacima&lt;/li&gt;
&lt;li&gt;adresu programa koji je vlasnik naloga&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;executable&lt;/code&gt; zastavicu&lt;/li&gt;
&lt;li&gt;istorijsko polje &lt;code&gt;rent_epoch&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jedan SOL sadrži milijardu lamporta. Lamport je najmanja obračunska jedinica u kojoj RPC i programi predstavljaju SOL iznose.&lt;/p&gt;

&lt;p&gt;Bitna razlika između vlasnika naloga i autoriteta korisnika često izaziva zabunu. Polje &lt;code&gt;owner&lt;/code&gt; nije nužno wallet korisnika. Ono označava program koji sme da menja podatke naloga ili da umanjuje njegov SOL balans.&lt;/p&gt;

&lt;p&gt;Na primer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;običan wallet nalog najčešće poseduje System Program&lt;/li&gt;
&lt;li&gt;token nalog poseduje odgovarajući Token Program&lt;/li&gt;
&lt;li&gt;nalog sa stanjem vaše aplikacije poseduje vaš program&lt;/li&gt;
&lt;li&gt;executable nalog sadrži program koji runtime može da izvrši&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bilo koji program može dodati lamporte writable nalogu, ali samo program koji poseduje nalog može oduzeti lamporte ili menjati njegove podatke, uz dodatne runtime provere.[3]&lt;/p&gt;

&lt;p&gt;Ovaj model ima praktičnu posledicu: aplikacija ne bi trebalo da „traži podatke unutar ugovora“. Ona treba da zna adresu naloga u kojem se podaci nalaze.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nalozi nisu objekti u klasičnom smislu
&lt;/h2&gt;

&lt;p&gt;Pretpostavimo da pravite marketplace i želite stanje porudžbine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Pubkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Pubkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na Solani ovaj objekat neće živeti u mapi unutar programa. Svaka porudžbina može biti poseban data account.&lt;/p&gt;

&lt;p&gt;To donosi nekoliko prednosti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;porudžbine mogu da se čitaju direktno preko RPC-a&lt;/li&gt;
&lt;li&gt;različite porudžbine mogu da se menjaju paralelno&lt;/li&gt;
&lt;li&gt;nalog može imati determinističku adresu&lt;/li&gt;
&lt;li&gt;trošak prostora može se pripisati korisniku koji kreira stanje&lt;/li&gt;
&lt;li&gt;nalog se može zatvoriti, a njegov skladišni depozit vratiti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ali postoje i troškovi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;morate projektovati adresiranje stanja&lt;/li&gt;
&lt;li&gt;morate znati koliko bajtova alocirate&lt;/li&gt;
&lt;li&gt;migracija strukture podataka zahteva planiranje&lt;/li&gt;
&lt;li&gt;svaki nalog povećava listu naloga u transakciji&lt;/li&gt;
&lt;li&gt;indeksiranje većeg broja naloga postaje zaseban infrastrukturni problem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solana zato nagrađuje pažljivo modelovanje podataka. „Jedan veliki nalog za sve“ često stvara contention, dok „poseban nalog za svaki sitan događaj“ može nepotrebno povećati trošak skladišta i složenost indeksiranja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zašto eksplicitni nalozi omogućavaju paralelizaciju
&lt;/h2&gt;

&lt;p&gt;Svaka instrukcija navodi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;program koji se poziva&lt;/li&gt;
&lt;li&gt;listu naloga&lt;/li&gt;
&lt;li&gt;da li je svaki nalog writable&lt;/li&gt;
&lt;li&gt;da li nalog mora biti signer&lt;/li&gt;
&lt;li&gt;niz bajtova sa argumentima instrukcije&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Runtime iz liste naloga može da vidi koje transakcije imaju konflikt.&lt;/p&gt;

&lt;p&gt;Ako transakcija A piše u nalog &lt;code&gt;order_1&lt;/code&gt;, a transakcija B piše u &lt;code&gt;order_2&lt;/code&gt;, nema nužnog konflikta. One mogu biti kandidati za paralelno izvršavanje.&lt;/p&gt;

&lt;p&gt;Ako obe pišu u globalni nalog &lt;code&gt;marketplace_state&lt;/code&gt;, moraju se serijalizovati oko tog writable naloga.&lt;/p&gt;

&lt;p&gt;Važna nijansa je da se instrukcije unutar jedne transakcije izvršavaju redom. Paralelizacija se odnosi na raspoređivanje transakcija koje nemaju konfliktne write lockove. Sve instrukcije unutar jedne transakcije čine atomsku celinu: ili sve uspeju, ili se sve promene vraćaju.[4]&lt;/p&gt;

&lt;p&gt;Zbog toga je izbor naloga istovremeno:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model podataka&lt;/li&gt;
&lt;li&gt;sigurnosni model&lt;/li&gt;
&lt;li&gt;concurrency model&lt;/li&gt;
&lt;li&gt;deo troškovnog modela&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Globalni brojač kao skriveni bottleneck
&lt;/h3&gt;

&lt;p&gt;Čest prvi program izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;global_state.total_orders += 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ako svaka kupovina mora da menja isti &lt;code&gt;global_state&lt;/code&gt;, sve kupovine konkurišu za isti writable nalog. Mreža može imati slobodne resurse, ali vaša aplikacija je sama uvela serijalizaciju.&lt;/p&gt;

&lt;p&gt;Bolji dizajn može koristiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jedan PDA po porudžbini&lt;/li&gt;
&lt;li&gt;particionisane agregate&lt;/li&gt;
&lt;li&gt;periodično off-chain sabiranje&lt;/li&gt;
&lt;li&gt;više shard naloga izabranih deterministički&lt;/li&gt;
&lt;li&gt;događaje i indeksiranje umesto globalnog brojača&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ne postoji univerzalno rešenje. Bitno je da se writable account set tretira kao deo performansnog dizajna, a ne kao detalj SDK-a.&lt;/p&gt;

&lt;h2&gt;
  
  
  Program Derived Addresses kao zamena za internu mapu
&lt;/h2&gt;

&lt;p&gt;Program Derived Address, odnosno PDA, deterministički se izvodi iz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adrese programa&lt;/li&gt;
&lt;li&gt;jednog ili više seed vrednosti&lt;/li&gt;
&lt;li&gt;bump vrednosti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PDA se namerno nalazi van Ed25519 krive, pa za njega ne postoji privatni ključ. Samo program iz čijeg je ID-a PDA izveden može da „potpiše“ operaciju u njegovo ime, koristeći &lt;code&gt;invoke_signed&lt;/code&gt; tokom Cross-Program Invocation poziva.[5]&lt;/p&gt;

&lt;p&gt;Za marketplace porudžbinu adresa može konceptualno da se izvede iz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;["order", merchant_address, order_id]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prednosti su praktične:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backend ne mora da čuva novu adresu u posebnoj tabeli&lt;/li&gt;
&lt;li&gt;frontend može samostalno da izračuna adresu&lt;/li&gt;
&lt;li&gt;program može proveriti da je prosleđen očekivani nalog&lt;/li&gt;
&lt;li&gt;jedan skup seed vrednosti mapira se na jednu kanonsku adresu&lt;/li&gt;
&lt;li&gt;PDA može biti autoritet token vault naloga&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PDA nije nalog sam po sebi. Derivacija daje adresu, ali nalog na toj adresi i dalje mora biti kreiran i finansiran.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seed vrednosti su deo javnog API-ja
&lt;/h3&gt;

&lt;p&gt;Kada odaberete seed šemu, ona postaje deo protokola vaše aplikacije. Promena sa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;["order", order_id]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;na:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;["order", merchant, order_id]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;menja sve izvedene adrese.&lt;/p&gt;

&lt;p&gt;Zato seed šemu treba tretirati približno kao baznu šemu ili javni endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;koristite stabilne prefikse&lt;/li&gt;
&lt;li&gt;izbegavajte neograničene korisničke stringove&lt;/li&gt;
&lt;li&gt;uključite tenant ili authority kada je potrebno&lt;/li&gt;
&lt;li&gt;dokumentujte kodiranje numeričkih vrednosti&lt;/li&gt;
&lt;li&gt;razmotrite verzionisanje seed šeme&lt;/li&gt;
&lt;li&gt;koristite kanonski bump&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pojedinačni seed ima ograničenje od 32 bajta, a ukupan broj seed elemenata takođe je ograničen.[5]&lt;/p&gt;

&lt;h2&gt;
  
  
  Transakcija je atomski paket instrukcija
&lt;/h2&gt;

&lt;p&gt;Solana transakcija sadrži:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jednu ili više instrukcija&lt;/li&gt;
&lt;li&gt;listu adresa naloga&lt;/li&gt;
&lt;li&gt;recent blockhash ili durable nonce&lt;/li&gt;
&lt;li&gt;fee payer&lt;/li&gt;
&lt;li&gt;potpise potrebnih signera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Legacy i v0 transakcije imaju maksimalnu veličinu od 1.232 bajta. Svaki Ed25519 potpis zauzima 64 bajta, a svaka puna adresa 32 bajta, pa limit može postati relevantan mnogo pre compute limita.[6]&lt;/p&gt;

&lt;p&gt;V0 format podržava Address Lookup Tables. Umesto da svaku adresu stavite direktno u poruku, neke adrese se mogu referencirati indeksom iz on-chain tabele. To pomaže transakcijama koje komuniciraju sa većim brojem naloga i programa.&lt;/p&gt;

&lt;p&gt;Aktuelna dokumentacija opisuje i v1 format sa većom porukom i drugačijim načinom definisanja resursnih limita. Ipak, format transakcije treba tretirati kao pregovaranu mogućnost između klijenta, walleta, RPC provajdera i validatora, a ne samo kao lokalni izbor biblioteke. RPC pozivi kao što su &lt;code&gt;getTransaction&lt;/code&gt; i &lt;code&gt;getBlock&lt;/code&gt; treba da navedu &lt;code&gt;maxSupportedTransactionVersion&lt;/code&gt; koji aplikacija zaista ume da parsira.[7]&lt;/p&gt;

&lt;h3&gt;
  
  
  Atomskost je jedan od najkorisnijih primitiva
&lt;/h3&gt;

&lt;p&gt;U jednu transakciju možete staviti više instrukcija, na primer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;kreiranje token naloga primaoca&lt;/li&gt;
&lt;li&gt;transfer tokena&lt;/li&gt;
&lt;li&gt;beleženje receipt naloga&lt;/li&gt;
&lt;li&gt;promenu statusa porudžbine&lt;/li&gt;
&lt;li&gt;emitovanje događaja iz programa&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ako treća instrukcija ne uspe, promene prethodnih instrukcija se vraćaju. Naknada za transakciju se ipak naplaćuje.&lt;/p&gt;

&lt;p&gt;Ova atomskost omogućava settlement workflowe koji bi u klasičnom backendu zahtevali distribuiranu transakciju, outbox tabelu ili kompenzacione operacije. Ne uklanja potrebu za off-chain bazom, ali može ukloniti određene klase parcijalno završenih finansijskih operacija.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan use-case: kripto plaćanja i reconciliation
&lt;/h2&gt;

&lt;p&gt;Dobar prvi Solana projekat nije DEX, lending protokol ili novi token. Realističniji use-case je servis koji prima kripto plaćanja i uparuje ih sa internim porudžbinama.&lt;/p&gt;

&lt;p&gt;Takav sistem može da prihvata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SOL&lt;/li&gt;
&lt;li&gt;postojeći SPL token&lt;/li&gt;
&lt;li&gt;stablecoin izdat preko originalnog Token Programa&lt;/li&gt;
&lt;li&gt;token koji koristi Token Extensions Program&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za jednostavno plaćanje custom on-chain program često nije potreban. Standardni System Program i Token Program već implementiraju transfer.&lt;/p&gt;

&lt;p&gt;Tipična arhitektura izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A[Checkout API] --&amp;gt; B[Orders baza]
    A --&amp;gt; C[Wallet ili payment UI]
    C --&amp;gt; D[Potpisana Solana transakcija]
    D --&amp;gt; E[RPC node]
    E --&amp;gt; F[Solana cluster]
    F --&amp;gt; G[Indexer ili reconciliation worker]
    G --&amp;gt; B
    B --&amp;gt; H[Fulfillment servis]&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Korak 1: Backend kreira nameru plaćanja
&lt;/h3&gt;

&lt;p&gt;U SQL bazi kreira se porudžbina sa najmanje sledećim poljima:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;order_id
expected_mint
expected_amount_base_units
recipient_address
reference
status
expires_at
transaction_signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iznos treba čuvati u osnovnim celobrojnim jedinicama tokena. Nemojte koristiti &lt;code&gt;float&lt;/code&gt; ili &lt;code&gt;double&lt;/code&gt; za finansijske vrednosti.&lt;/p&gt;

&lt;h3&gt;
  
  
  Korak 2: Klijent konstruiše transfer
&lt;/h3&gt;

&lt;p&gt;Klijent kreira instrukciju za System Program ili odgovarajući Token Program. Transakcija dobija fee payer, recent blockhash i potrebne potpise.&lt;/p&gt;

&lt;p&gt;Solana dokumentacija trenutno preporučuje &lt;code&gt;@solana/kit&lt;/code&gt; kao TypeScript SDK. Kit koristi kompozicioni model sa pluginovima za signer, RPC i slanje transakcija.[8]&lt;/p&gt;

&lt;p&gt;Minimalan lokalni SOL transfer može izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;generateKeyPairSigner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;lamports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@solana/kit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;rpcAirdrop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;solanaRpc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@solana/kit-plugin-rpc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;airdropPayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@solana/kit-plugin-signer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getTransferSolInstruction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@solana-program/system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sender&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateKeyPairSigner&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateKeyPairSigner&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LAMPORTS_PER_SOL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000_000n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;solanaRpc&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;rpcUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:8899&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;rpcSubscriptionsUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ws://localhost:8900&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rpcAirdrop&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;airdropPayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lamports&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LAMPORTS_PER_SOL&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transfer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getTransferSolInstruction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;lamports&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000_000n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendTransaction&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Primer koristi lokalni validator i testni airdrop. Generisani keypair u memoriji prikladan je za test, ali nije model za produkciono čuvanje ključeva.&lt;/p&gt;

&lt;p&gt;Backend koji kontroliše sredstva ne bi trebalo da drži nekriptovane keypair fajlove unutar repozitorijuma, container image-a ili običnih environment promenljivih. Produkcioni signer treba izolovati pomoću KMS-a, HSM-a, custody servisa ili drugog kontrolisanog signing sloja.&lt;/p&gt;

&lt;p&gt;RPC endpointu se šalje već potpisana transakcija. RPC provajderu nikada nije potreban privatni ključ korisnika.[9]&lt;/p&gt;

&lt;h3&gt;
  
  
  Korak 3: Ne verujte samo uspehu wallet interfejsa
&lt;/h3&gt;

&lt;p&gt;Dobijena signature vrednost znači da imate identifikator transakcije. Ne znači automatski da je transakcija:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uključena u blok&lt;/li&gt;
&lt;li&gt;uspešno izvršena&lt;/li&gt;
&lt;li&gt;potvrđena na zahtevanom nivou&lt;/li&gt;
&lt;li&gt;poslala očekivani token&lt;/li&gt;
&lt;li&gt;poslala očekivani iznos&lt;/li&gt;
&lt;li&gt;poslata očekivanom primaocu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;sendTransaction&lt;/code&gt; prosleđuje transakciju mreži, ali uspešan RPC odgovor nije dokaz konačnog izvršenja. Reconciliation servis mora proveriti status i sadržaj transakcije.[10]&lt;/p&gt;

&lt;p&gt;Za plaćanje treba proveriti najmanje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da je &lt;code&gt;err&lt;/code&gt; jednak &lt;code&gt;null&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;da je dostignut potreban commitment&lt;/li&gt;
&lt;li&gt;da instrukcija koristi očekivani program&lt;/li&gt;
&lt;li&gt;da je mint adresa tačna&lt;/li&gt;
&lt;li&gt;da su source i destination token nalozi očekivani&lt;/li&gt;
&lt;li&gt;da je transferisan tačan broj osnovnih jedinica&lt;/li&gt;
&lt;li&gt;da signature nije već korišćen za drugu porudžbinu&lt;/li&gt;
&lt;li&gt;da transakcija nije nastala pre kreiranja ili posle isteka porudžbine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Najvažnije pravilo je da se ne veruje objektu koji frontend pošalje backendu. Backend treba da pročita transakciju sa mreže i sam verifikuje njen sadržaj.&lt;/p&gt;

&lt;h3&gt;
  
  
  Korak 4: Napravite idempotentan reconciliation
&lt;/h3&gt;

&lt;p&gt;RPC timeout ne znači da transakcija nije stigla do mreže. Ako backend odmah napravi novu transakciju sa novim blockhashom, može se dogoditi da obe transakcije budu izvršene.&lt;/p&gt;

&lt;p&gt;Dok je originalni blockhash validan, treba ponovo slati iste potpisane bajtove i pratiti istu signature vrednost. Kada blockhash istekne, proverite istoriju i poslovno stanje pre pravljenja nove transakcije.[9]&lt;/p&gt;

&lt;p&gt;U bazi postavite jedinstvena ograničenja nad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transaction_signature
order_id
reference
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worker može bezbedno da se pokreće više puta ako stanje menja upitom poput:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'paid'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;transaction_signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On-chain finalnost ne daje automatski idempotentnost vašem HTTP API-ju. To je i dalje odgovornost aplikacije.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kada je potreban sopstveni program
&lt;/h2&gt;

&lt;p&gt;Custom program ima smisla kada postoje pravila koja moraju biti izvršena atomski i nezavisno od vašeg backenda.&lt;/p&gt;

&lt;p&gt;Primeri uključuju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;escrow između kupca i prodavca&lt;/li&gt;
&lt;li&gt;podelu jedne uplate na više primalaca&lt;/li&gt;
&lt;li&gt;uslovno oslobađanje sredstava&lt;/li&gt;
&lt;li&gt;on-chain autorizaciju refundiranja&lt;/li&gt;
&lt;li&gt;vault kontrolisan PDA autoritetom&lt;/li&gt;
&lt;li&gt;isporuku digitalnog asseta zajedno sa uplatom&lt;/li&gt;
&lt;li&gt;settlement između više tokena&lt;/li&gt;
&lt;li&gt;transparentna pravila koja ne bi trebalo da zavise od jednog servera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako backend samo proverava da li je stablecoin stigao na adresu trgovca, custom program može biti nepotreban rizik. Standardni token transfer je jednostavniji, jeftiniji za održavanje i ima manje prostora za sigurnosne greške.&lt;/p&gt;

&lt;p&gt;Ako plaćanje i promena stanja moraju biti jedna atomska operacija, program postaje opravdan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kratak Anchor primer: uplata i on-chain receipt
&lt;/h2&gt;

&lt;p&gt;Anchor je framework za pisanje Solana programa u Rustu. On generiše deo boilerplate koda za deserijalizaciju instrukcija, validaciju naloga, diskriminatore i IDL.[11]&lt;/p&gt;

&lt;p&gt;Sledeći primer prenosi SOL preko System Programa i kreira jedan receipt PDA po porudžbini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anchor_lang&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;prelude&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anchor_lang&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;system_program&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;declare_id!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"11111111111111111111111111111111"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nd"&gt;#[program]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;checkout&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pay&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;require!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;CheckoutError&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InvalidAmount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;transfer_accounts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;system_program&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Transfer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.payer&lt;/span&gt;&lt;span class="nf"&gt;.to_account_info&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.merchant&lt;/span&gt;&lt;span class="nf"&gt;.to_account_info&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;transfer_context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;CpiContext&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.system_program&lt;/span&gt;&lt;span class="nf"&gt;.to_account_info&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;transfer_accounts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nn"&gt;system_program&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transfer_context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;receipt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.receipt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="py"&gt;.order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="py"&gt;.payer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.payer&lt;/span&gt;&lt;span class="nf"&gt;.key&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="py"&gt;.merchant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.merchant&lt;/span&gt;&lt;span class="nf"&gt;.key&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="py"&gt;.amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="py"&gt;.created_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Clock&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="py"&gt;.unix_timestamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="py"&gt;.bump&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.bumps.receipt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Accounts)]&lt;/span&gt;
&lt;span class="nd"&gt;#[instruction(order_id:&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="nd"&gt;u8&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="nd"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Pay&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[account(mut)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nd"&gt;#[account(mut)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SystemAccount&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nd"&gt;#[account(&lt;/span&gt;
        &lt;span class="nd"&gt;init,&lt;/span&gt;
        &lt;span class="nd"&gt;payer&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;payer,&lt;/span&gt;
        &lt;span class="nd"&gt;space&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="nd"&gt;PaymentReceipt::INIT_SPACE,&lt;/span&gt;
        &lt;span class="nd"&gt;seeds&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;
            &lt;span class="s"&gt;b"receipt"&lt;/span&gt;&lt;span class="nd"&gt;,&lt;/span&gt;
            &lt;span class="nd"&gt;merchant&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;key()&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref(),&lt;/span&gt;
            &lt;span class="nd"&gt;order_id&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref(),&lt;/span&gt;
        &lt;span class="nd"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;bump&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PaymentReceipt&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;system_program&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Program&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[account]&lt;/span&gt;
&lt;span class="nd"&gt;#[derive(InitSpace)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;PaymentReceipt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Pubkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;merchant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Pubkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;bump&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[error_code]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;CheckoutError&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[msg(&lt;/span&gt;&lt;span class="s"&gt;"Iznos mora biti veći od nule"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;InvalidAmount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transfer i kreiranje receipt naloga nalaze se u istoj transakciji. Ako transfer ne uspe, receipt se ne kreira. Ako kreiranje ili serijalizacija receipt naloga ne uspe, transfer se vraća.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PaymentReceipt::INIT_SPACE&lt;/code&gt; izračunava potreban prostor za polja, dok dodatnih osam bajtova pokriva Anchor diskriminator naloga.[12]&lt;/p&gt;

&lt;p&gt;Primer ipak nije kompletan produkcioni checkout. Klijent trenutno može proslediti bilo koji &lt;code&gt;merchant&lt;/code&gt; nalog. U produkciji bi merchant trebalo povezati sa verifikovanim configuration nalogom, na primer pomoću:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;address&lt;/code&gt; ograničenja&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;has_one&lt;/code&gt; ograničenja&lt;/li&gt;
&lt;li&gt;PDA konfiguracije trgovca&lt;/li&gt;
&lt;li&gt;proverene marketplace authority vrednosti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Program mora proveravati poslovna pravila, a ne samo tipove podataka.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anchor ograničenja nisu dekoracija
&lt;/h2&gt;

&lt;p&gt;Kod Anchor programa, najveći deo sigurnosnog modela često se nalazi u &lt;code&gt;#[derive(Accounts)]&lt;/code&gt; strukturi, a ne u handler funkciji.&lt;/p&gt;

&lt;p&gt;Relevantna ograničenja uključuju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Signer&amp;lt;'info&amp;gt;&lt;/code&gt; za obavezan potpis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[account(mut)]&lt;/code&gt; za naloge koji se menjaju&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;seeds&lt;/code&gt; i &lt;code&gt;bump&lt;/code&gt; za PDA validaciju&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;has_one&lt;/code&gt; za relacije između naloga&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;owner&lt;/code&gt; za proveru vlasničkog programa&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;address&lt;/code&gt; za očekivanu fiksnu adresu&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;close&lt;/code&gt; za zatvaranje naloga&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;realloc&lt;/code&gt; za promenu alociranog prostora&lt;/li&gt;
&lt;li&gt;token i associated-token ograničenja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nemojte koristiti &lt;code&gt;UncheckedAccount&lt;/code&gt; samo da biste „naterali kod da se kompajlira“. Time odgovornost za sve validacije prelazi na handler, a jedna propuštena owner ili address provera može otvoriti ozbiljnu ranjivost.&lt;/p&gt;

&lt;p&gt;Aktuelni Anchor takođe podrazumevano sprečava određene duplikate mutable naloga. Ako dva parametra smeju da budu ista adresa, to treba dozvoliti eksplicitno i obrazložiti.[13]&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-Program Invocation i kompozabilnost
&lt;/h2&gt;

&lt;p&gt;Cross-Program Invocation, odnosno CPI, omogućava jednom programu da pozove instrukciju drugog programa.&lt;/p&gt;

&lt;p&gt;Marketplace program može, na primer, pozvati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System Program radi SOL transfera&lt;/li&gt;
&lt;li&gt;Token Program radi token transfera&lt;/li&gt;
&lt;li&gt;Associated Token Account Program radi kreiranja token naloga&lt;/li&gt;
&lt;li&gt;drugi poslovni program radi isporuke asseta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postoje dva osnovna mehanizma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;invoke&lt;/code&gt; kada su potrebni potpisi već prisutni u originalnoj transakciji&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;invoke_signed&lt;/code&gt; kada vaš program potpisuje u ime PDA adrese&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Callee program ne može povećati privilegije koje nije dobio od caller programa. Nalog koji je read-only u parent instrukciji ne može postati writable u CPI pozivu. Isto važi za signer privilegije, osim validnog PDA potpisivanja kroz runtime.[14]&lt;/p&gt;

&lt;p&gt;CPI troši compute budget iste transakcije. Duboki lanci poziva povećavaju compute potrošnju, otežavaju debugging i približavaju program limitima instruction stacka.&lt;/p&gt;

&lt;p&gt;Kompozabilnost zato nije besplatna apstrakcija. Svaki dodatni program uvodi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dodatne naloge u poruci&lt;/li&gt;
&lt;li&gt;dodatnu compute potrošnju&lt;/li&gt;
&lt;li&gt;potencijalni write contention&lt;/li&gt;
&lt;li&gt;još jednu verzionisanu zavisnost&lt;/li&gt;
&lt;li&gt;još jednu površinu za greške&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SPL Token i Token Extensions nisu isto
&lt;/h2&gt;

&lt;p&gt;Originalni Token Program pokriva standardne operacije:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kreiranje mint naloga&lt;/li&gt;
&lt;li&gt;kreiranje token naloga&lt;/li&gt;
&lt;li&gt;mintovanje&lt;/li&gt;
&lt;li&gt;transfer&lt;/li&gt;
&lt;li&gt;burn&lt;/li&gt;
&lt;li&gt;delegate autorizaciju&lt;/li&gt;
&lt;li&gt;freeze i thaw&lt;/li&gt;
&lt;li&gt;promenu authority adresa&lt;/li&gt;
&lt;li&gt;zatvaranje token naloga&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Token Extensions Program, često nazivan Token-2022, podržava dodatne funkcije kroz ekstenzije, kao što su transfer fees, transfer hooks, metadata pointer, permanent delegate, non-transferable tokeni, confidential transfer mogućnosti i druge kontrole.[15]&lt;/p&gt;

&lt;p&gt;Ključna projektantska odluka je da se većina mint ekstenzija bira prilikom kreiranja tokena. Ne mogu se sve naknadno dodati. Neke ekstenzije su međusobno nekompatibilne.&lt;/p&gt;

&lt;p&gt;To znači da izdavanje tokena nije samo poziv &lt;code&gt;createMint&lt;/code&gt;. Pre izdavanja treba analizirati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;koje wallet aplikacije podržavaju izabrane ekstenzije&lt;/li&gt;
&lt;li&gt;koje berze i custody sistemi umeju da ih obrade&lt;/li&gt;
&lt;li&gt;da li transfer hook može blokirati integracije&lt;/li&gt;
&lt;li&gt;ko kontroliše privileged authorities&lt;/li&gt;
&lt;li&gt;može li se authority opozvati&lt;/li&gt;
&lt;li&gt;šta se događa ako custom hook program ne radi&lt;/li&gt;
&lt;li&gt;koliko dodatnog prostora zahtevaju mint i token nalozi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za aplikaciju koja samo prihvata postojeći stablecoin, sigurnije je integrisati njegov postojeći mint i program nego izdavati novi token bez jasne potrebe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko Solana integracija košta
&lt;/h2&gt;

&lt;p&gt;Trošak nije jedna brojka. Sastoji se od najmanje četiri kategorije:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;transakcione naknade&lt;/li&gt;
&lt;li&gt;optional priority fees&lt;/li&gt;
&lt;li&gt;skladišni depoziti za naloge&lt;/li&gt;
&lt;li&gt;RPC i indekserska infrastruktura&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Osnovna naknada
&lt;/h3&gt;

&lt;p&gt;Aktuelna osnovna naknada iznosi 5.000 lamporta po potpisu. Transakcija sa više signera plaća osnovnu naknadu za svaki potpis.&lt;/p&gt;

&lt;p&gt;Naknada se plaća i kada izvršavanje transakcije ne uspe.[16]&lt;/p&gt;

&lt;p&gt;Zato retry logika koja stalno šalje nove, unapred osuđene transakcije nije samo tehnički problem. Ona nepotrebno troši sredstva fee payer naloga.&lt;/p&gt;

&lt;h3&gt;
  
  
  Priority fee
&lt;/h3&gt;

&lt;p&gt;Za legacy i v0 transakcije, priority fee se zasniva na:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;compute unit price × requested compute unit limit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cena se izražava u micro-lamportima po compute unit jedinici, a konačan rezultat konvertuje u lamporte.&lt;/p&gt;

&lt;p&gt;Važna posledica je da se naknada računa prema traženom compute limitu, ne prema stvarnoj potrošnji. Ako zatražite mnogo više compute units nego što transakcija koristi, plaćate prioritet i za neiskorišćeni deo limita.[16]&lt;/p&gt;

&lt;p&gt;Praktičan workflow je:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;konstruišite transakciju&lt;/li&gt;
&lt;li&gt;simulirajte je&lt;/li&gt;
&lt;li&gt;očitajte &lt;code&gt;unitsConsumed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;dodajte razumnu sigurnosnu marginu&lt;/li&gt;
&lt;li&gt;postavite compute unit limit&lt;/li&gt;
&lt;li&gt;izaberite priority fee prema trenutnim uslovima&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dokumentacija kao polaznu tačku navodi marginu od oko 10 procenata iznad simulirane potrošnje, ali produkcioni sistem treba da meri sopstvene transakcije i greške.[17]&lt;/p&gt;

&lt;h3&gt;
  
  
  Compute limiti
&lt;/h3&gt;

&lt;p&gt;Za legacy i v0 format, podrazumevani limit za non-builtin instrukciju je 200.000 compute units, dok transakcija može zahtevati najviše 1.400.000 compute units.&lt;/p&gt;

&lt;p&gt;Compute Units nisu isto što i vreme procesora u milisekundama. Oni su deterministička runtime mera operacija kao što su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;instrukcije virtuelne mašine&lt;/li&gt;
&lt;li&gt;memorijske operacije&lt;/li&gt;
&lt;li&gt;kriptografske funkcije&lt;/li&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;CPI pozivi&lt;/li&gt;
&lt;li&gt;serijalizacija podataka&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Optimizacija programa zato uključuje smanjenje compute potrošnje, ali i izbor manjeg broja naloga, izbegavanje nepotrebnih CPI poziva i ograničavanje količine podataka koja se učitava.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skladišni depozit
&lt;/h3&gt;

&lt;p&gt;Nalog koji čuva podatke mora imati minimalan broj lamporta proporcionalan veličini naloga. Ovaj iznos nije klasična periodična hosting pretplata. Predstavlja minimalni balance koji ostaje zaključan dok nalog postoji.&lt;/p&gt;

&lt;p&gt;Kada se nalog pravilno zatvori, lamporti se mogu vratiti na odabrani destination nalog.&lt;/p&gt;

&lt;p&gt;Nemojte hardkodovati približan rent-exempt iznos iz bloga ili starog primera. Pre kreiranja naloga pozovite RPC metodu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;getMinimumBalanceForRentExemption
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ulaz je veličina podataka u bajtovima, a rezultat je potreban broj lamporta.[18]&lt;/p&gt;

&lt;p&gt;Ako aplikacija pravi nalog po svakoj porudžbini, treba definisati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ko finansira kreiranje&lt;/li&gt;
&lt;li&gt;kada se nalog zatvara&lt;/li&gt;
&lt;li&gt;kome se depozit vraća&lt;/li&gt;
&lt;li&gt;da li je podatak zaista potreban zauvek&lt;/li&gt;
&lt;li&gt;da li bi događaj i off-chain indexer bili bolji izbor&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  RPC trošak
&lt;/h3&gt;

&lt;p&gt;Javni Solana RPC endpointi korisni su za razvoj, ali nisu odgovarajuća produkciona garancija.&lt;/p&gt;

&lt;p&gt;Komercijalni RPC provajderi naplaćuju prema različitim modelima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;broj zahteva&lt;/li&gt;
&lt;li&gt;ponderisana cena RPC metode&lt;/li&gt;
&lt;li&gt;response bytes&lt;/li&gt;
&lt;li&gt;bandwidth ili egress&lt;/li&gt;
&lt;li&gt;broj WebSocket konekcija&lt;/li&gt;
&lt;li&gt;arhivska istorija&lt;/li&gt;
&lt;li&gt;dedicated kapacitet&lt;/li&gt;
&lt;li&gt;dodatni transaction delivery servis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zbog promenljivih ponuda nema smisla navoditi jednu „cenu Solane po mesecu“. Potrebno je meriti konkretan workload, posebno &lt;code&gt;getProgramAccounts&lt;/code&gt;, istorijske transakcije, block upite i WebSocket subscriptions.[9]&lt;/p&gt;

&lt;h2&gt;
  
  
  RPC je deo sistema, ne samo URL u konfiguraciji
&lt;/h2&gt;

&lt;p&gt;U prototipu RPC često izgleda kao jedna konstanta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RPC_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SOLANA_RPC_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;U produkciji RPC sloj utiče na:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;svežinu podataka&lt;/li&gt;
&lt;li&gt;uspešnost slanja transakcija&lt;/li&gt;
&lt;li&gt;potvrđivanje&lt;/li&gt;
&lt;li&gt;dostupnost istorije&lt;/li&gt;
&lt;li&gt;latenciju korisničkog interfejsa&lt;/li&gt;
&lt;li&gt;reconnect ponašanje WebSocket klijenta&lt;/li&gt;
&lt;li&gt;tačnost reconciliation workera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pouzdan setup treba da ima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request timeout&lt;/li&gt;
&lt;li&gt;ograničene retry pokušaje&lt;/li&gt;
&lt;li&gt;exponential backoff sa jitterom&lt;/li&gt;
&lt;li&gt;proveru slot freshness vrednosti&lt;/li&gt;
&lt;li&gt;najmanje jedan nezavisni fallback za kritične putanje&lt;/li&gt;
&lt;li&gt;odvojene metrike za read i write zahteve&lt;/li&gt;
&lt;li&gt;HTTP reconciliation nakon WebSocket reconnecta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WebSocket obaveštenje nije durable message queue. Ako veza pukne, događaji mogu biti propušteni. Nakon reconnecta treba ponovo pročitati trenutno stanje preko HTTP RPC-a.[9]&lt;/p&gt;

&lt;h3&gt;
  
  
  Nemojte nasumično mešati RPC endpointove
&lt;/h3&gt;

&lt;p&gt;Jedan endpoint može vratiti blockhash iz novijeg slota, dok drugi kasni i ne prepoznaje taj blockhash tokom simulacije ili slanja.&lt;/p&gt;

&lt;p&gt;Operacije koje pripadaju istom transaction lifecycle-u poželjno je držati na jednom zdravom endpointu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;getLatestBlockhash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simulateTransaction&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sendTransaction&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getSignatureStatuses&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fallback treba uključiti kada postoje jasni signali da je endpoint spor, nedostupan ili zastareo, a ne round-robin rotacijom svakog poziva.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commitment nivoi i korisničko iskustvo
&lt;/h2&gt;

&lt;p&gt;Solana RPC koristi tri uobičajena commitment nivoa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;processed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;confirmed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;finalized&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;processed&lt;/code&gt; znači da je određeni čvor obradio blok, ali blok još može pripadati fork-u koji neće opstati.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;confirmed&lt;/code&gt; znači da je blok dobio glasove supervećine stake-a.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;finalized&lt;/code&gt; predstavlja dublje potvrđeno stanje koje je ukorenjeno u ledgeru.&lt;/p&gt;

&lt;p&gt;Za većinu interaktivnih aplikacija &lt;code&gt;confirmed&lt;/code&gt; daje praktičan balans između latencije i sigurnosti. Finansijski workflow može prikazati korisniku međustanje, ali fulfillment ili povlačenje sredstava odložiti do strožeg nivoa koji odgovara poslovnom riziku.[19]&lt;/p&gt;

&lt;p&gt;Bitno je da frontend ne koristi termine kao što su „završeno“ i „potvrđeno“ bez jasno definisane semantike.&lt;/p&gt;

&lt;p&gt;Dobar statusni model može biti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;created
awaiting_signature
submitted
processed
confirmed
finalized
failed
expired
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Simulacija je deo normalnog workflowa
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;simulateTransaction&lt;/code&gt; izvršava transakciju nad stanjem dostupnim RPC čvoru, ali je ne šalje mreži.&lt;/p&gt;

&lt;p&gt;Rezultat simulacije može sadržati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runtime grešku&lt;/li&gt;
&lt;li&gt;program logs&lt;/li&gt;
&lt;li&gt;inner instructions&lt;/li&gt;
&lt;li&gt;potrošene compute units&lt;/li&gt;
&lt;li&gt;povratne podatke&lt;/li&gt;
&lt;li&gt;pre i post balanse&lt;/li&gt;
&lt;li&gt;učitane adrese&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simulacija je korisna za:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hvatanje grešaka pre wallet potpisa&lt;/li&gt;
&lt;li&gt;procenu compute limita&lt;/li&gt;
&lt;li&gt;prikaz razumljivije poruke korisniku&lt;/li&gt;
&lt;li&gt;proveru da li su nalozi pravilno prosleđeni&lt;/li&gt;
&lt;li&gt;debugging CPI lanca&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ali simulacija nije garancija izvršenja. Stanje se može promeniti između simulacije i slanja, blockhash može isteći, writable nalog može postati zauzet, a transakcija može izgubiti prioritet.[20]&lt;/p&gt;

&lt;h2&gt;
  
  
  Testiranje bez čekanja na Devnet
&lt;/h2&gt;

&lt;p&gt;Devnet je koristan za integraciono testiranje, ali nije dobar inner development loop.&lt;/p&gt;

&lt;p&gt;Anchor dokumentacija podržava više testnih pristupa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LiteSVM za in-process Solana VM&lt;/li&gt;
&lt;li&gt;Mollusk za fokusirano testiranje instrukcija&lt;/li&gt;
&lt;li&gt;lokalni validator za RPC i validator ponašanje&lt;/li&gt;
&lt;li&gt;Devnet za testiranje spoljne integracije&lt;/li&gt;
&lt;li&gt;fuzzing za sistematsko traženje rubnih slučajeva&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LiteSVM je prikladan za brzo testiranje programa i client koda. Lokalni validator je i dalje koristan kada su potrebne RPC metode ili ponašanje bliže pravom validatoru.[21]&lt;/p&gt;

&lt;p&gt;Praktična test piramida može izgledati ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rust unit testovi za čistu poslovnu logiku&lt;/li&gt;
&lt;li&gt;LiteSVM ili Mollusk testovi za instrukcije&lt;/li&gt;
&lt;li&gt;lokalni validator za RPC workflow&lt;/li&gt;
&lt;li&gt;mali broj Devnet end-to-end testova&lt;/li&gt;
&lt;li&gt;Mainnet smoke test sa strogo ograničenim iznosima&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Testirajte negativne putanje
&lt;/h3&gt;

&lt;p&gt;On-chain test suite ne bi trebalo da potvrđuje samo happy path.&lt;/p&gt;

&lt;p&gt;Obavezni slučajevi uključuju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pogrešan signer&lt;/li&gt;
&lt;li&gt;pogrešan owner naloga&lt;/li&gt;
&lt;li&gt;pogrešan PDA&lt;/li&gt;
&lt;li&gt;pogrešan bump&lt;/li&gt;
&lt;li&gt;isti mutable nalog prosleđen na dva mesta&lt;/li&gt;
&lt;li&gt;neautorizovan merchant&lt;/li&gt;
&lt;li&gt;duplirana porudžbina&lt;/li&gt;
&lt;li&gt;pogrešan mint&lt;/li&gt;
&lt;li&gt;nedovoljan balance&lt;/li&gt;
&lt;li&gt;prekoračen compute limit&lt;/li&gt;
&lt;li&gt;overflow i underflow&lt;/li&gt;
&lt;li&gt;zatvoren ili pogrešno inicijalizovan nalog&lt;/li&gt;
&lt;li&gt;zamena legitimnog programa lažnim executable nalogom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na Solani napadač kontroliše transakciju i izbor naloga koje šalje vašem programu. Program mora pretpostaviti da je svaki nalog neprijateljski dok sve relevantne osobine nisu proverene.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-off: brzina mreže ne uklanja složenost aplikacije
&lt;/h2&gt;

&lt;p&gt;Solana može biti veoma dobar izbor za aplikacije koje imaju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;veliki broj nezavisnih promena stanja&lt;/li&gt;
&lt;li&gt;interaktivna plaćanja&lt;/li&gt;
&lt;li&gt;on-chain tržišta&lt;/li&gt;
&lt;li&gt;igre sa čestim korisničkim akcijama&lt;/li&gt;
&lt;li&gt;programe koji komponuju više protokola&lt;/li&gt;
&lt;li&gt;tokene sa specifičnim pravilima&lt;/li&gt;
&lt;li&gt;potrebu za atomskim settlementom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Međutim, nije besplatna zamena za bazu podataka.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prednosti
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;eksplicitno stanje omogućava paralelno izvršavanje&lt;/li&gt;
&lt;li&gt;više instrukcija može se izvršiti atomski&lt;/li&gt;
&lt;li&gt;PDA uklanja upravljanje privatnim ključevima za programske autoritete&lt;/li&gt;
&lt;li&gt;standardni programi pružaju zajedničke primitive&lt;/li&gt;
&lt;li&gt;naknade su deterministički izražene u lamportima&lt;/li&gt;
&lt;li&gt;nalog je direktno adresabilna jedinica podataka&lt;/li&gt;
&lt;li&gt;Rust i Anchor daju relativno strogo razvojno okruženje&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Nedostaci
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;account model zahteva drugačiji način razmišljanja&lt;/li&gt;
&lt;li&gt;transaction size može biti ograničenje&lt;/li&gt;
&lt;li&gt;writable account contention može poništiti paralelizaciju&lt;/li&gt;
&lt;li&gt;RPC infrastruktura postaje kritična komponenta&lt;/li&gt;
&lt;li&gt;on-chain skladištenje traži depozit&lt;/li&gt;
&lt;li&gt;programi imaju stroge compute i memorijske limite&lt;/li&gt;
&lt;li&gt;parsing transakcija i token operacija nije trivijalan&lt;/li&gt;
&lt;li&gt;wallet, RPC i transaction-version kompatibilnost moraju se pratiti&lt;/li&gt;
&lt;li&gt;upgrade authority uvodi operativni i governance rizik&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Upgrade authority je deo threat modela
&lt;/h2&gt;

&lt;p&gt;Program postavljen preko upgradeable loadera može imati upgrade authority. Ko kontroliše taj ključ, može postaviti novu verziju programa.&lt;/p&gt;

&lt;p&gt;Zato „program je na blockchainu“ ne znači automatski da je nepromenljiv.&lt;/p&gt;

&lt;p&gt;Produkcioni tim mora odlučiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da li program treba da ostane upgradeable&lt;/li&gt;
&lt;li&gt;da li authority pripada jednom ključu ili multisig sistemu&lt;/li&gt;
&lt;li&gt;postoji li timelock ili javni proces promene&lt;/li&gt;
&lt;li&gt;kako se verifikuje novi build&lt;/li&gt;
&lt;li&gt;kako se korisnici obaveštavaju o upgrade-u&lt;/li&gt;
&lt;li&gt;kada authority treba trajno opozvati&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Opozivanje upgrade authority vrednosti program čini immutable, ali tada se greške više ne mogu ispraviti redeployem na istoj adresi. To je sigurnosni trade-off, ne checkbox za decentralizaciju.[1]&lt;/p&gt;

&lt;h2&gt;
  
  
  Razuman razvojni workflow
&lt;/h2&gt;

&lt;p&gt;Za prvi ozbiljan Solana projekat workflow može izgledati ovako.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prvo modelujte naloge
&lt;/h3&gt;

&lt;p&gt;Pre pisanja programa odgovorite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;koji podatak mora biti on-chain&lt;/li&gt;
&lt;li&gt;koji program poseduje svaki nalog&lt;/li&gt;
&lt;li&gt;ko finansira njegovo kreiranje&lt;/li&gt;
&lt;li&gt;ko sme da ga menja&lt;/li&gt;
&lt;li&gt;kako se izvodi njegova adresa&lt;/li&gt;
&lt;li&gt;može li se zatvoriti&lt;/li&gt;
&lt;li&gt;koji workflowi pišu u isti nalog&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Prototipujte bez custom programa
&lt;/h3&gt;

&lt;p&gt;Ako use-case može da koristi System Program ili Token Program, prvo napravite tu verziju.&lt;/p&gt;

&lt;p&gt;To pomaže da odvojeno rešite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wallet povezivanje&lt;/li&gt;
&lt;li&gt;transakcije&lt;/li&gt;
&lt;li&gt;RPC&lt;/li&gt;
&lt;li&gt;potvrđivanje&lt;/li&gt;
&lt;li&gt;reconciliation&lt;/li&gt;
&lt;li&gt;finansijsku preciznost&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Uvedite program samo za atomsku logiku
&lt;/h3&gt;

&lt;p&gt;Program treba da rešava pravilo koje nije bezbedno ostaviti backendu, kao što su escrow, split ili programski vault.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Simulirajte svaku klasu transakcije
&lt;/h3&gt;

&lt;p&gt;Sakupljajte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compute units&lt;/li&gt;
&lt;li&gt;veličinu poruke&lt;/li&gt;
&lt;li&gt;broj naloga&lt;/li&gt;
&lt;li&gt;broj signera&lt;/li&gt;
&lt;li&gt;učestalost neuspeha&lt;/li&gt;
&lt;li&gt;tip runtime greške&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Testirajte konfliktno opterećenje
&lt;/h3&gt;

&lt;p&gt;Ne merite samo koliko jedna transakcija traje. Pošaljite konkurentne transakcije koje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;menjaju različite PDA naloge&lt;/li&gt;
&lt;li&gt;menjaju isti globalni nalog&lt;/li&gt;
&lt;li&gt;koriste isti vault&lt;/li&gt;
&lt;li&gt;pozivaju isti program sa različitim writable setovima&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tako ćete otkriti da li vaš model stanja omogućava paralelizaciju koju očekujete.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Projektujte retry i idempotency pre Mainneta
&lt;/h3&gt;

&lt;p&gt;Za svaku write operaciju definišite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stabilan application-level identifikator&lt;/li&gt;
&lt;li&gt;mapiranje na signature&lt;/li&gt;
&lt;li&gt;ponašanje pre blockhash isteka&lt;/li&gt;
&lt;li&gt;ponašanje posle isteka&lt;/li&gt;
&lt;li&gt;proveru da li je operacija već izvršena&lt;/li&gt;
&lt;li&gt;maksimalan broj retry pokušaja&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Odvojite chain state od projection baze
&lt;/h3&gt;

&lt;p&gt;Blockchain je izvor istine za on-chain stanje, ali nije nužno najbolji query engine za proizvod.&lt;/p&gt;

&lt;p&gt;Produkcione aplikacije često održavaju SQL ili analitičku projekciju za:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pretragu&lt;/li&gt;
&lt;li&gt;filtriranje&lt;/li&gt;
&lt;li&gt;agregate&lt;/li&gt;
&lt;li&gt;istoriju korisnika&lt;/li&gt;
&lt;li&gt;notifikacije&lt;/li&gt;
&lt;li&gt;dashboarde&lt;/li&gt;
&lt;li&gt;poslovne izveštaje&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indexer mora biti sposoban za replay i reconciliation. Ako WebSocket worker propusti događaj, stanje mora moći da se obnovi iz RPC istorije ili drugog pouzdanog izvora.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kada Solana verovatno nije pravi izbor
&lt;/h2&gt;

&lt;p&gt;Solana možda nije opravdana ako:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;svi korisnici veruju jednom backendu&lt;/li&gt;
&lt;li&gt;nema potrebe za digitalnim vlasništvom ili settlementom&lt;/li&gt;
&lt;li&gt;podaci moraju ostati privatni&lt;/li&gt;
&lt;li&gt;promene stanja su retke i jednostavne&lt;/li&gt;
&lt;li&gt;aplikacija nema način da bezbedno upravlja ključevima&lt;/li&gt;
&lt;li&gt;tim ne može da održava RPC, indeksiranje i monitoring&lt;/li&gt;
&lt;li&gt;zahtev se može rešiti običnim payment processorom i SQL bazom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blockchain uvodi distribuiranu verifikaciju i mogućnost kompozicije, ali takođe uvodi ključeve, naknade, javno stanje, nepromenljivu istoriju i drugačiji operativni model.&lt;/p&gt;

&lt;p&gt;Dobra Solana aplikacija ne stavlja sve on-chain. Ona bira najmanju količinu stanja koja mora biti javno proverljiva ili atomski menjana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zaključak
&lt;/h2&gt;

&lt;p&gt;Solanina najvažnija osobina za developera nije reklamirani TPS. To je eksplicitni account model.&lt;/p&gt;

&lt;p&gt;Kada transakcija unapred navodi naloge koje čita i menja, runtime dobija dovoljno informacija da raspoređuje nezavisne transakcije paralelno. Cena tog dizajna je da developer mora da projektuje stanje, adrese, write lockove i authority relacije mnogo pažljivije nego u sistemu sa implicitnim globalnim storageom.&lt;/p&gt;

&lt;p&gt;Najpraktičniji početak nije pisanje velikog DeFi protokola. Bolje je napraviti mali payment ili escrow workflow i proći ceo životni ciklus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;konstruisanje instrukcije&lt;/li&gt;
&lt;li&gt;određivanje naloga&lt;/li&gt;
&lt;li&gt;simulacija&lt;/li&gt;
&lt;li&gt;potpisivanje&lt;/li&gt;
&lt;li&gt;slanje&lt;/li&gt;
&lt;li&gt;potvrđivanje&lt;/li&gt;
&lt;li&gt;on-chain verifikacija&lt;/li&gt;
&lt;li&gt;idempotentno knjiženje&lt;/li&gt;
&lt;li&gt;oporavak od RPC greške&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tek tada account model prestaje da deluje neobično i počinje da pokazuje zašto je koristan.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/core" rel="noopener noreferrer"&gt;Solana Core Concepts&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/solana-whitepaper.pdf" rel="noopener noreferrer"&gt;Solana Whitepaper&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/core/accounts" rel="noopener noreferrer"&gt;Solana Accounts&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/core/instructions" rel="noopener noreferrer"&gt;Solana Instructions&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/core/pda" rel="noopener noreferrer"&gt;Program Derived Addresses&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/core/transactions" rel="noopener noreferrer"&gt;Solana Transactions&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/developers/cookbook/transactions/versions" rel="noopener noreferrer"&gt;Versioned Transactions&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/frontend/client" rel="noopener noreferrer"&gt;Solana Kit Client&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/rpc/providers" rel="noopener noreferrer"&gt;Choosing an RPC Provider&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/rpc/http/sendtransaction" rel="noopener noreferrer"&gt;sendTransaction RPC Method&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anchor-lang.com/docs" rel="noopener noreferrer"&gt;Anchor Framework Documentation&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anchor-lang.com/docs/references/space" rel="noopener noreferrer"&gt;Anchor Account Space&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anchor-lang.com/docs/references/account-constraints" rel="noopener noreferrer"&gt;Anchor Account Constraints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/core/cpi" rel="noopener noreferrer"&gt;Solana Cross-Program Invocation&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/tokens/extensions" rel="noopener noreferrer"&gt;Solana Token Extensions&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/core/fees/fee-structure" rel="noopener noreferrer"&gt;Solana Fee Structure&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/core/fees/compute-budget" rel="noopener noreferrer"&gt;Solana Compute Budget&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/rpc/http/getminimumbalanceforrentexemption" rel="noopener noreferrer"&gt;getMinimumBalanceForRentExemption&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/developers/cookbook/transactions/confirmation" rel="noopener noreferrer"&gt;Transaction Confirmation and Expiration&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://solana.com/docs/rpc/http/simulatetransaction" rel="noopener noreferrer"&gt;simulateTransaction RPC Method&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anchor-lang.com/docs/testing/litesvm" rel="noopener noreferrer"&gt;Anchor Testing and LiteSVM&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Litecoin za developere: pouzdana infrastruktura plaćanja</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Fri, 18 Sep 2026 16:30:48 +0000</pubDate>
      <link>https://dev.to/kriptomuza/litecoin-za-developere-pouzdana-infrastruktura-placanja-38m4</link>
      <guid>https://dev.to/kriptomuza/litecoin-za-developere-pouzdana-infrastruktura-placanja-38m4</guid>
      <description>&lt;p&gt;Litecoin je decentralizovana mreža za prenos digitalne vrednosti, nastala iz Bitcoinovog koda, ali sa kraćim ciljanim intervalom između blokova, Scrypt proof-of-work algoritmom i maksimalnom ponudom od 84 miliona LTC. Prosečan ciljani interval bloka je približno dva i po minuta, dok se nagrada rudarima prepolovljava na svakih 840.000 blokova.&lt;/p&gt;

&lt;p&gt;To su osnove koje većina developera već zna. Zanimljivije pitanje je zašto bi neko danas integrisao Litecoin kada postoje Bitcoin, Lightning, stablecoini, Ethereum L2 mreže i brojni payment provideri.&lt;/p&gt;

&lt;p&gt;Odgovor nije da je Litecoin objektivno najbolji blockchain. Nije. Njegova vrednost je u užem skupu karakteristika: jednostavan UTXO model, relativno predvidivo procesiranje transakcija, niske mrežne naknade, široka podrška novčanika i menjačnica, opcioni MWEB sloj i infrastruktura veoma slična Bitcoin Core ekosistemu.&lt;/p&gt;

&lt;p&gt;Za developera koji želi da prihvata kripto plaćanja bez pokretanja smart contract platforme, Litecoin je i dalje razumna, prilično konzervativna opcija.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta Litecoin zapravo nudi aplikaciji
&lt;/h2&gt;

&lt;p&gt;Litecoin nije baza podataka sa proizvoljnim poslovnim pravilima. Nema smisla koristiti ga za skladištenje korisničkih profila, složene tokene, on-chain aukcije ili opštu programabilnost kakvu nude Ethereum i slične platforme.&lt;/p&gt;

&lt;p&gt;Njegova primarna funkcija je mnogo uža:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;korisnik kontroliše izlaze transakcija privatnim ključevima&lt;/li&gt;
&lt;li&gt;transakcije troše postojeće UTXO izlaze&lt;/li&gt;
&lt;li&gt;rudari ih uključuju u blokove&lt;/li&gt;
&lt;li&gt;mreža prihvata lanac sa najvećom akumuliranom količinom rada&lt;/li&gt;
&lt;li&gt;aplikacija prati transakciju i procenjuje kada je dovoljno potvrđena&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ta ograničenost je istovremeno i prednost. Manje pokretnih delova znači manju površinu za greške. Kod klasičnog Litecoin plaćanja nema dozvola tokena, proxy ugovora, upgrade ključeva, issuer blockliste niti zavisnosti od stanja nekog DeFi protokola.&lt;/p&gt;

&lt;p&gt;Ako kupac pošalje LTC na validnu adresu, glavna pitanja za backend su:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Da li je transakcija viđena?&lt;/li&gt;
&lt;li&gt;Da li plaća očekivani iznos?&lt;/li&gt;
&lt;li&gt;Da li je uključena u blok?&lt;/li&gt;
&lt;li&gt;Koliko potvrda ima?&lt;/li&gt;
&lt;li&gt;Da li je došlo do reorganizacije lanca?&lt;/li&gt;
&lt;li&gt;Da li su sredstva bezbedno prebačena iz operativnog novčanika?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To je dovoljno mali problem da ga tim može razumeti od početka do kraja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zašto je Litecoin i dalje relevantan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Predvidiv i poznat tehnički model
&lt;/h3&gt;

&lt;p&gt;Litecoin Core je izveden iz Bitcoin Core koda, pa su arhitektura čvora, RPC model, wallet koncepti, UTXO skup, mempool i način obrade blokova poznati svakome ko je ranije radio sa Bitcoin infrastrukturom.&lt;/p&gt;

&lt;p&gt;To smanjuje cenu učenja. Znanje o sledećim konceptima uglavnom je prenosivo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raw transakcije&lt;/li&gt;
&lt;li&gt;ulazi i izlazi&lt;/li&gt;
&lt;li&gt;change adrese&lt;/li&gt;
&lt;li&gt;fee rate&lt;/li&gt;
&lt;li&gt;potvrde i reorganizacije&lt;/li&gt;
&lt;li&gt;watch-only novčanici&lt;/li&gt;
&lt;li&gt;descriptor modeli&lt;/li&gt;
&lt;li&gt;JSON-RPC&lt;/li&gt;
&lt;li&gt;ZeroMQ obaveštenja&lt;/li&gt;
&lt;li&gt;cold i hot wallet razdvajanje&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ipak, prenosivost ne znači binarnu kompatibilnost. Litecoin ima sopstvene mrežne parametre, prefikse adresa, genesis blok, portove, proof-of-work algoritam i dodatnu MWEB logiku. Bitcoin biblioteka ne sme automatski biti proglašena Litecoin bibliotekom samo zato što obe obrađuju slične transakcije.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kraći interval između blokova
&lt;/h3&gt;

&lt;p&gt;Ciljani interval od približno dva i po minuta često čini potvrđivanje praktičnijim za klasične online kupovine nego čekanje Bitcoin bloka. To ne znači da će svaki Litecoin blok stići za tačno dva i po minuta. Rudarenje je probabilistički proces, pa pojedinačni interval može biti mnogo kraći ili duži.&lt;/p&gt;

&lt;p&gt;Takođe, četiri Litecoin potvrde nisu matematički univerzalni ekvivalent jednoj Bitcoin potvrdi. Bezbednost zavisi od ekonomije rudarenja, hash rate distribucije, vrednosti transakcije, mogućnosti napadača i politike primaoca. Vreme bloka je samo jedan parametar.&lt;/p&gt;

&lt;p&gt;Za digitalni proizvod male vrednosti možda je prihvatljivo reagovati već na mempool transakciju, uz jasno razumevanje rizika. Za isplatu robe visoke vrednosti može biti potrebno više potvrda i dodatna provera transakcije.&lt;/p&gt;

&lt;h3&gt;
  
  
  Naknade pogodne za jednostavna plaćanja
&lt;/h3&gt;

&lt;p&gt;Litecoin naknada nije procenat poslatog iznosa. Ona prvenstveno zavisi od veličine transakcije i trenutnog fee rate-a. Transakcija sa mnogo ulaza može biti skuplja od transakcije sa jednim ulazom, čak i kada šalje manji iznos.&lt;/p&gt;

&lt;p&gt;U normalnim uslovima mrežne naknade često omogućavaju male transfere koji ne bi bili praktični na skupljem osnovnom sloju. Ipak, aplikacija ne treba da hardkoduje pretpostavku da je Litecoin transfer uvek jeftin. Fee treba proceniti neposredno pre kreiranja transakcije, pomoću sopstvenog čvora ili proverene infrastrukture.&lt;/p&gt;

&lt;p&gt;Ukupan trošak integracije obuhvata više od blockchain naknade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server i skladište za čvor&lt;/li&gt;
&lt;li&gt;monitoring i backup&lt;/li&gt;
&lt;li&gt;razvoj i održavanje payment servisa&lt;/li&gt;
&lt;li&gt;bezbedno upravljanje ključevima&lt;/li&gt;
&lt;li&gt;kursnu razliku pri konverziji&lt;/li&gt;
&lt;li&gt;naknadu provajdera ili berze&lt;/li&gt;
&lt;li&gt;računovodstvo i regulatorne obaveze&lt;/li&gt;
&lt;li&gt;trošak pogrešnih, duplih ili ručno obrađenih uplata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sama mreža može biti jeftina, a operativni sistem oko nje skup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proof-of-work bez nove bezbednosne paradigme
&lt;/h3&gt;

&lt;p&gt;Litecoin koristi Scrypt proof-of-work. Dugo postojanje mreže i specijalizovana rudarska infrastruktura daju mu zreliji bezbednosni profil od malih proof-of-work lanaca.&lt;/p&gt;

&lt;p&gt;Važan deo ekonomije rudarenja je merged mining sa Dogecoin mrežom. Rudari mogu koristiti isti Scrypt rad za zaštitu obe mreže, što menja ekonomsku računicu i omogućava deljenje rudarske infrastrukture.&lt;/p&gt;

&lt;p&gt;Ipak, Litecoin nema istu ekonomsku težinu ni ukupnu rudarsku dominaciju kao Bitcoin. Za veoma velike transfere to treba tretirati kao realan trade-off, a ne kao detalj koji rešava veći broj potvrda.&lt;/p&gt;

&lt;h2&gt;
  
  
  MWEB je najzanimljiviji deo Litecoina
&lt;/h2&gt;

&lt;p&gt;MimbleWimble Extension Blocks, odnosno MWEB, uveden je kao opcioni prošireni deo Litecoin protokola. Extension block se vezuje za osnovni lanac, dok se sredstva mogu premestiti u njega i vratiti iz njega putem peg-in i peg-out procesa.&lt;/p&gt;

&lt;p&gt;Cilj MWEB-a je bolja zamenljivost novca i manja količina javno vidljivih finansijskih podataka. U MWEB delu transakcije iznosi nisu javno izloženi kao kod standardnih UTXO izlaza, dok MimbleWimble konstrukcije, agregacija i cut-through smanjuju direktnu vezu između pojedinačnih ulaza i izlaza.&lt;/p&gt;

&lt;p&gt;To nije isto što i tvrdnja da je korisnik potpuno anoniman.&lt;/p&gt;

&lt;p&gt;Posmatrač i dalje može koristiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mrežne metapodatke&lt;/li&gt;
&lt;li&gt;tajming transakcija&lt;/li&gt;
&lt;li&gt;informacije sa menjačnica&lt;/li&gt;
&lt;li&gt;KYC evidenciju&lt;/li&gt;
&lt;li&gt;obrasce ulaska u MWEB i izlaska iz njega&lt;/li&gt;
&lt;li&gt;podatke kompromitovanog novčanika&lt;/li&gt;
&lt;li&gt;ponašanje korisnika na drugim servisima&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MWEB zato treba opisivati kao alat za poverljivost i zamenljivost, ne kao garanciju anonimnosti.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zašto je MWEB relevantan developerima
&lt;/h3&gt;

&lt;p&gt;Na potpuno javnom blockchainu trgovac može videti više podataka nego što mu je potrebno. Plaćanje otkriva ulaze transakcije, iznose i potencijalne veze sa drugim adresama. Isto važi i u suprotnom smeru: kupac može analizirati adresu trgovca i povezane tokove.&lt;/p&gt;

&lt;p&gt;Za poslovnu aplikaciju to može biti problem privatnosti. Javni promet dobavljača, stanje operativnog novčanika ili obrasci isplate zaposlenima ne treba nužno da budu dostupni konkurenciji.&lt;/p&gt;

&lt;p&gt;MWEB nudi zanimljiv kompromis: osnovni Litecoin ostaje kompatibilan sa klasičnim UTXO alatima, dok korisnici koji žele veću poverljivost mogu koristiti opcioni sloj.&lt;/p&gt;

&lt;p&gt;Cena tog kompromisa je integraciona fragmentacija. Ne podržavaju svi novčanici, procesori plaćanja, berze i blockchain exploreri MWEB. Neke platforme mogu podržavati LTC, ali ne i MWEB depozite ili isplate. Sistem zato mora eksplicitno razlikovati standardni Litecoin transfer od MWEB toka.&lt;/p&gt;

&lt;p&gt;Ne treba prikazati MWEB adresu korisniku dok nije provereno da njegov novčanik i odabrani izlazni servis zaista podržavaju takav transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan use-case: naplata digitalne usluge
&lt;/h2&gt;

&lt;p&gt;Zamislimo SaaS proizvod koji prodaje jednokratne kredite, API pakete ili pristup datoteci. Korisnik ne mora da otvara nalog kod kartičnog procesora niti da deli podatke kartice sa trgovcem. Aplikacija želi da prihvati LTC, ali ne želi da prepusti kompletan payment state trećoj strani.&lt;/p&gt;

&lt;p&gt;Minimalna arhitektura izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A[Korisnik] --&amp;gt;|Šalje LTC| B[Jedinstvena adresa fakture]
    B --&amp;gt; C[Litecoin mreža]
    C --&amp;gt; D[Litecoin Core čvor]
    D --&amp;gt;|RPC ili ZMQ| E[Payment watcher]
    E --&amp;gt; F[(Baza faktura)]
    E --&amp;gt; G[Order servis]
    G --&amp;gt; H[Digitalni proizvod]
    E --&amp;gt; I[Wallet sweep proces]
    I --&amp;gt; J[Cold wallet]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Najvažniji deo nije generisanje adrese. Najvažniji deo je model stanja fakture.&lt;/p&gt;

&lt;p&gt;Razuman skup stanja može biti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;created&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;awaiting_payment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seen_in_mempool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;underpaid&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;paid_unconfirmed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;paid_confirmed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;expired&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;overpaid&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;refunded&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reorged&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;manual_review&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nazivi nisu protokolski standard. Oni pripadaju aplikaciji. Poenta je da uplata nije jedan boolean.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kreiranje fakture
&lt;/h3&gt;

&lt;p&gt;Korisnik bira Litecoin kao način plaćanja. Backend zatim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uzima aktuelnu LTC cenu od izabranog izvora.&lt;/li&gt;
&lt;li&gt;Izračunava iznos koristeći definisana pravila zaokruživanja.&lt;/li&gt;
&lt;li&gt;Kreira kratkotrajnu ponudu sa vremenom isteka.&lt;/li&gt;
&lt;li&gt;Generiše novu adresu samo za tu fakturu.&lt;/li&gt;
&lt;li&gt;Čuva adresu, očekivani iznos, kurs, rok i mrežu.&lt;/li&gt;
&lt;li&gt;Vraća korisniku adresu i iznos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jedinstvena adresa po fakturi pojednostavljuje povezivanje transakcije sa narudžbinom i smanjuje nepotrebno povezivanje korisnika. Ponovna upotreba adresa otežava računovodstvo i pogoršava privatnost.&lt;/p&gt;

&lt;p&gt;Ako wallet pod nazivom &lt;code&gt;merchant&lt;/code&gt; postoji i učitan je, Litecoin Core CLI može generisati novu bech32 adresu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;litecoin-cli &lt;span class="nt"&gt;-rpcwallet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;merchant &lt;span class="se"&gt;\&lt;/span&gt;
    getnewaddress &lt;span class="s2"&gt;"invoice:8f2c1a"&lt;/span&gt; &lt;span class="s2"&gt;"bech32"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Labela je pomoćni podatak novčanika, ne deo blockchain konsenzusa. Interni ID ne treba da sadrži e-mail, ime kupca ili drugi lični podatak.&lt;/p&gt;

&lt;p&gt;Za proveru stanja čvora može se koristiti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;litecoin-cli getblockchaininfo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Produkcioni servis ne bi trebalo da izvršava CLI proces za svaki zahtev. Uobičajeno je da komunicira sa lokalnim JSON-RPC interfejsom, uz autentifikaciju, ograničene mrežne dozvole i izolovan servisni nalog.&lt;/p&gt;

&lt;p&gt;RPC port nikada ne treba javno izložiti internetu. Reverse proxy bez pravilno projektovane autentifikacije nije dovoljna zaštita za interfejs koji može upravljati novčanikom.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detekcija transakcije
&lt;/h3&gt;

&lt;p&gt;Postoje tri osnovna pristupa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;periodično RPC skeniranje&lt;/li&gt;
&lt;li&gt;obrada novih blokova i mempoola&lt;/li&gt;
&lt;li&gt;ZeroMQ obaveštenja uz naknadnu RPC verifikaciju&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Polling je najjednostavniji, ali povećava latenciju i broj RPC poziva. ZMQ je efikasniji za događaje, ali obaveštenje nije trajni message queue. Ako servis nije bio povezan, događaj može biti propušten. Zato ZMQ ne sme biti jedini izvor istine.&lt;/p&gt;

&lt;p&gt;Robustan obrazac je:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ZMQ signal javlja da postoji nova transakcija ili blok.&lt;/li&gt;
&lt;li&gt;Worker učitava detalje preko RPC-a.&lt;/li&gt;
&lt;li&gt;Rezultat upisuje idempotentno.&lt;/li&gt;
&lt;li&gt;Periodični reconciliation posao skenira blokove od poslednje obrađene visine.&lt;/li&gt;
&lt;li&gt;Sistem ponovo računa broj potvrda i proverava reorganizacije.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Baza treba da čuva najmanje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;txid&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;identitet izlaza, tipično &lt;code&gt;txid&lt;/code&gt; i &lt;code&gt;vout&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;adresu fakture&lt;/li&gt;
&lt;li&gt;primljeni iznos u najmanjim jedinicama&lt;/li&gt;
&lt;li&gt;visinu bloka, ako je potvrđena&lt;/li&gt;
&lt;li&gt;hash bloka&lt;/li&gt;
&lt;li&gt;trenutno poznat broj potvrda&lt;/li&gt;
&lt;li&gt;vreme prvog opažanja&lt;/li&gt;
&lt;li&gt;status obrade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Čuvanje samo &lt;code&gt;txid&lt;/code&gt; nije uvek dovoljno. Jedna transakcija može imati više izlaza, uključujući više izlaza ka adresama koje kontroliše ista aplikacija.&lt;/p&gt;

&lt;h3&gt;
  
  
  Novac se ne obrađuje kao floating-point vrednost
&lt;/h3&gt;

&lt;p&gt;Litecoin ima osam decimalnih mesta. Iznose unutar aplikacije treba čuvati kao celobrojni broj najmanjih jedinica, koristeći &lt;code&gt;BIGINT&lt;/code&gt;, &lt;code&gt;bigint&lt;/code&gt; ili odgovarajući decimalni tip baze.&lt;/p&gt;

&lt;p&gt;Kratka TypeScript funkcija za konverziju decimalnog stringa može izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;toAtomicUnits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;bigint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(\.\d{1,8})?&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid LTC amount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;whole&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fraction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;paddedFraction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fraction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;whole&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="nx"&gt;_000_000n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paddedFraction&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Važno je da ulaz bude string. Ako se vrednost prethodno pretvori u JavaScript &lt;code&gt;number&lt;/code&gt;, preciznost je možda već izgubljena.&lt;/p&gt;

&lt;p&gt;Isti princip važi za poređenje primljenog i očekivanog iznosa. Ne treba koristiti toleranciju tipa &lt;code&gt;Math.abs(a - b) &amp;lt; epsilon&lt;/code&gt; za finansijsko stanje.&lt;/p&gt;

&lt;h3&gt;
  
  
  Potvrde nisu monotoni brojač
&lt;/h3&gt;

&lt;p&gt;Aplikacije često pretpostave da potvrđena transakcija može samo dobijati nove potvrde. U praksi reorganizacija lanca može ukloniti blok iz aktivnog lanca.&lt;/p&gt;

&lt;p&gt;Zato je korisno sačuvati i hash bloka u kojem je uplata pronađena. Kada stigne novi vrh lanca, payment servis proverava da li je taj blok i dalje deo aktivnog lanca. Ako nije, faktura privremeno prelazi u stanje &lt;code&gt;reorged&lt;/code&gt; ili ponovo u &lt;code&gt;paid_unconfirmed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Poslovna odluka zavisi od proizvoda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jeftin digitalni sadržaj može se isporučiti uz mali broj potvrda&lt;/li&gt;
&lt;li&gt;fizička roba može čekati duže&lt;/li&gt;
&lt;li&gt;velika isplata može zahtevati dodatnu ručnu proveru&lt;/li&gt;
&lt;li&gt;nepovratna radnja ne treba da zavisi samo od mempool prisustva&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Broj potvrda ne treba kopirati iz tuđe integracije. To je parametar rizika konkretne aplikacije.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delimične i višestruke uplate
&lt;/h3&gt;

&lt;p&gt;Korisnik može poslati manje od očekivanog iznosa, platiti iz dve transakcije ili izvršiti uplatu nakon isteka kursa.&lt;/p&gt;

&lt;p&gt;Sistem mora unapred definisati politiku:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Da li sabira više UTXO izlaza na istoj adresi?&lt;/li&gt;
&lt;li&gt;Koliko dugo čeka ostatak?&lt;/li&gt;
&lt;li&gt;Ko snosi blockchain naknadu refundacije?&lt;/li&gt;
&lt;li&gt;Da li se mala razlika prihvata?&lt;/li&gt;
&lt;li&gt;Po kom kursu se obrađuje zakašnjela uplata?&lt;/li&gt;
&lt;li&gt;Kako se tretira preplata?&lt;/li&gt;
&lt;li&gt;Da li refundacija zahteva novu adresu korisnika?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automatska refundacija na jednu od ulaznih adresa nije bezbedna pretpostavka. Ulaz može pripadati custodial servisu ili berzi, a ne krajnjem korisniku. Refund adresu treba prikupiti i validirati kroz eksplicitan proces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sopstveni čvor ili tuđi API
&lt;/h2&gt;

&lt;p&gt;Najvažnija infrastrukturna odluka nije izbor SDK-a, već izbor izvora istine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sopstveni Litecoin Core čvor
&lt;/h3&gt;

&lt;p&gt;Prednosti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nezavisna validacija blokova i transakcija&lt;/li&gt;
&lt;li&gt;nema curenja svih korisničkih adresa ka jednom API provajderu&lt;/li&gt;
&lt;li&gt;potpuna kontrola RPC i wallet politike&lt;/li&gt;
&lt;li&gt;jednostavnije praćenje reorganizacija&lt;/li&gt;
&lt;li&gt;nema vendor-specific modela potvrda&lt;/li&gt;
&lt;li&gt;pristup mempoolu i sirovim transakcijama&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nedostaci:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sinhronizacija zahteva vreme, disk i mrežni saobraćaj&lt;/li&gt;
&lt;li&gt;čvor mora biti ažuriran i nadziran&lt;/li&gt;
&lt;li&gt;wallet backup i enkripcija ostaju vaša odgovornost&lt;/li&gt;
&lt;li&gt;RPC interfejs zahteva pažljivu mrežnu izolaciju&lt;/li&gt;
&lt;li&gt;incidenti MWEB validacije ili konsenzusne izmene mogu zahtevati hitnu nadogradnju&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aktuelne Litecoin Core objave treba pratiti direktno u zvaničnom repozitorijumu. Najnovije izdanje u trenutku provere je &lt;code&gt;v0.21.5.8&lt;/code&gt;, maintenance verzija sa izmenama vezanim za MWEB validaciju, relay, rudarenje i upravljanje resursima. Napomene uz izdanje posebno preporučuju nadogradnju rudarima, poolovima, berzama i MWEB operatorima.&lt;/p&gt;

&lt;p&gt;Verziju ne treba hardkodovati u trajnu dokumentaciju za deployment. Pipeline bi trebalo da proverava potpis, checksum i zvanično izdanje koje tim eksplicitno odobri.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hosted blockchain API
&lt;/h3&gt;

&lt;p&gt;Prednosti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;brži početak razvoja&lt;/li&gt;
&lt;li&gt;nema inicijalne sinhronizacije&lt;/li&gt;
&lt;li&gt;manje sistemske administracije&lt;/li&gt;
&lt;li&gt;često postoji indeksiranje adresa i webhook podrška&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nedostaci:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;provider vidi koje adrese pratite&lt;/li&gt;
&lt;li&gt;rezultat zavisi od njegovog čvora i indeksiranja&lt;/li&gt;
&lt;li&gt;webhook može kasniti ili biti dupliran&lt;/li&gt;
&lt;li&gt;limiti i cenovni model mogu se promeniti&lt;/li&gt;
&lt;li&gt;podrška za MWEB može biti ograničena&lt;/li&gt;
&lt;li&gt;aplikacija postaje zavisna od nestandardnog API-ja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dobar kompromis za prototip je provider uz sopstvenu bazu i apstrakcioni sloj. Za ozbiljan payment sistem ima smisla dodati sopstveni čvor kao primarni ili nezavisni verifikacioni izvor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upravljanje ključevima je teži problem od RPC-a
&lt;/h2&gt;

&lt;p&gt;Kod za pozivanje &lt;code&gt;getnewaddress&lt;/code&gt; je trivijalan. Bezbedno čuvanje privatnih ključeva nije.&lt;/p&gt;

&lt;p&gt;Payment arhitektura obično razdvaja tri uloge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;watcher&lt;/strong&gt; prati adrese i transakcije, bez mogućnosti trošenja&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;hot wallet&lt;/strong&gt; potpisuje ograničene operativne transfere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cold wallet&lt;/strong&gt; čuva većinu sredstava van aplikacionog servera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako web aplikacija ima neograničen pristup wallet RPC-u, SQL injection ili remote code execution incident lako postaje finansijski incident.&lt;/p&gt;

&lt;p&gt;Bolji model je:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Frontend nikada ne komunicira direktno sa čvorom.&lt;/li&gt;
&lt;li&gt;Payment servis ima samo potrebne RPC dozvole.&lt;/li&gt;
&lt;li&gt;Watch-only komponenta prati uplate.&lt;/li&gt;
&lt;li&gt;Poseban signer odobrava isplate.&lt;/li&gt;
&lt;li&gt;Automatski sweep ima dnevne i pojedinačne limite.&lt;/li&gt;
&lt;li&gt;Veći transferi zahtevaju dodatno odobrenje.&lt;/li&gt;
&lt;li&gt;Backup seed-a i descriptor podataka testira se restauracijom.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Enkripcija wallet fajla štiti podatke u mirovanju, ali ne štiti otključan proces koji je napadač već preuzeo. HSM ili eksterni signer može smanjiti rizik, ali uvodi novu složenost i mora zaista podržavati Litecoin parametre.&lt;/p&gt;

&lt;h2&gt;
  
  
  UTXO upravljanje se ne sme ostaviti za kasnije
&lt;/h2&gt;

&lt;p&gt;Kada servis primi hiljade malih uplata, njegov saldo nije jedna brojka. To je skup velikog broja nepotrošenih izlaza.&lt;/p&gt;

&lt;p&gt;Kasnija isplata može zahtevati mnogo ulaza, što povećava veličinu transakcije i naknadu. To može dovesti do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;skupog sweep-a&lt;/li&gt;
&lt;li&gt;sporijeg konstruisanja transakcija&lt;/li&gt;
&lt;li&gt;većeg curenja podataka kroz povezivanje ulaza&lt;/li&gt;
&lt;li&gt;problema sa minimalnim ekonomskim iznosima&lt;/li&gt;
&lt;li&gt;otežanog računovodstva&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Servis treba da ima eksplicitnu coin selection i consolidation politiku. Konsolidacija je obično povoljnija kada je mempool miran, ali spajanje mnogo UTXO izlaza javno pokazuje da verovatno pripadaju istom entitetu.&lt;/p&gt;

&lt;p&gt;MWEB može poboljšati privatnost određenih tokova, ali ne uklanja potrebu za operativnim planiranjem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Litecoin naspram drugih opcija
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opcija&lt;/th&gt;
&lt;th&gt;Gde je jaka&lt;/th&gt;
&lt;th&gt;Gde je slabija&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Litecoin&lt;/td&gt;
&lt;td&gt;Jednostavna on-chain plaćanja, niske naknade, UTXO model, MWEB opcija&lt;/td&gt;
&lt;td&gt;Manji ekosistem, volatilnost LTC-a, neujednačena MWEB podrška&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitcoin osnovni sloj&lt;/td&gt;
&lt;td&gt;Najveća ekonomska i rudarska bezbednost, zrela infrastruktura&lt;/td&gt;
&lt;td&gt;Duži ciljani interval blokova i potencijalno skuplje male uplate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lightning Network&lt;/td&gt;
&lt;td&gt;Brza mikroplaćanja i mali marginalni trošak&lt;/td&gt;
&lt;td&gt;Likvidnost kanala, routing, invoice lifecycle i složenije operacije&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stablecoini&lt;/td&gt;
&lt;td&gt;Stabilnija obračunska vrednost i jednostavnije formiranje cena&lt;/td&gt;
&lt;td&gt;Rizik izdavaoca, mrežni token za gas, više lanaca i moguća blokada sredstava&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ethereum i L2 mreže&lt;/td&gt;
&lt;td&gt;Smart contract programabilnost i veliki aplikacioni ekosistem&lt;/td&gt;
&lt;td&gt;Veća površina za greške, bridge rizici i složenija integracija&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy coin mreže&lt;/td&gt;
&lt;td&gt;Privatnost ugrađena kao centralna karakteristika&lt;/td&gt;
&lt;td&gt;Slabija podrška servisa i veći regulatorni i integracioni otpor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  U odnosu na Bitcoin
&lt;/h3&gt;

&lt;p&gt;Litecoin nudi kraće očekivano vreme do prvog bloka i često niže naknade, ali Bitcoin ima veću ekonomsku težinu, širu institucionalnu infrastrukturu i snažniji bezbednosni budžet.&lt;/p&gt;

&lt;p&gt;Ako je prioritet maksimalna otpornost za veoma velike iznose, Bitcoin je obično prirodniji izbor. Ako je prioritet jednostavna on-chain naplata manjih iznosa, Litecoin može pružiti prijatniji korisnički tok.&lt;/p&gt;

&lt;h3&gt;
  
  
  U odnosu na Lightning
&lt;/h3&gt;

&lt;p&gt;Lightning je bolji kandidat kada aplikacija zahteva gotovo trenutna, česta i veoma mala plaćanja. Međutim, Lightning integracija uvodi upravljanje kanalima, ulaznom i izlaznom likvidnošću, istekom faktura, routing neuspesima i rezervnim tokovima.&lt;/p&gt;

&lt;p&gt;Litecoin on-chain integracija je sporija, ali konceptualno jednostavnija. Adresa može dugo primati uplate, a sredstva se mogu pratiti standardnim UTXO alatima.&lt;/p&gt;

&lt;h3&gt;
  
  
  U odnosu na stablecoine
&lt;/h3&gt;

&lt;p&gt;Stablecoin je često bolji payment asset za trgovca koji ne želi volatilnost. Faktura od 20 EUR mnogo je lakša za računovodstvo ako primljena imovina pokušava da prati fiat vrednost.&lt;/p&gt;

&lt;p&gt;Ali stablecoin uvodi druge zavisnosti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;centralnog izdavaoca&lt;/li&gt;
&lt;li&gt;konkretan smart contract&lt;/li&gt;
&lt;li&gt;mrežu na kojoj se token nalazi&lt;/li&gt;
&lt;li&gt;gas token za slanje&lt;/li&gt;
&lt;li&gt;rizik pogrešno izabrane mreže&lt;/li&gt;
&lt;li&gt;mogućnost zamrzavanja adrese&lt;/li&gt;
&lt;li&gt;bridge ili wrapped-asset rizik&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Litecoin nema stabilnu cenu, ali nema ni token contract ni centralnog izdavaoca koji može promeniti pravila samog LTC sredstva.&lt;/p&gt;

&lt;h3&gt;
  
  
  U odnosu na smart contract platforme
&lt;/h3&gt;

&lt;p&gt;Ako aplikacija zahteva escrow sa složenim uslovima, programabilne tokene ili kompozabilnost sa drugim protokolima, Litecoin nije prirodan izbor.&lt;/p&gt;

&lt;p&gt;Njegov scripting sistem je namerno ograničeniji. To smanjuje mogućnosti, ali i broj načina na koje aplikacija može izgubiti sredstva zbog greške u ugovoru.&lt;/p&gt;

&lt;p&gt;Ne treba birati smart contract platformu za problem koji zahteva samo: „Korisnik je uplatio tačan iznos na adresu.“&lt;/p&gt;

&lt;h2&gt;
  
  
  Najveće mane Litecoina
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Volatilnost
&lt;/h3&gt;

&lt;p&gt;LTC nije stabilna obračunska jedinica. Cena može značajno da se promeni između kreiranja fakture, potvrde transakcije i konverzije.&lt;/p&gt;

&lt;p&gt;Aplikacija zato mora definisati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;izvor kursa&lt;/li&gt;
&lt;li&gt;period važenja ponude&lt;/li&gt;
&lt;li&gt;način zaokruživanja&lt;/li&gt;
&lt;li&gt;politiku zakašnjelih uplata&lt;/li&gt;
&lt;li&gt;trenutak konverzije&lt;/li&gt;
&lt;li&gt;ko snosi rizik promene cene&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ovo nije detalj korisničkog interfejsa. To je deo finansijskog modela proizvoda.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slabija programabilnost
&lt;/h3&gt;

&lt;p&gt;Litecoin nije general-purpose izvršno okruženje. Developer dobija robustan transfer vrednosti, ali ne i bogat smart contract runtime.&lt;/p&gt;

&lt;p&gt;Za mnoge payment sisteme to je prednost. Za protokole koji zahtevaju kompleksno stanje, oracle podatke ili on-chain governance predstavlja čvrsto ograničenje.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fragmentacija oko MWEB-a
&lt;/h3&gt;

&lt;p&gt;MWEB je tehnički zanimljiv, ali podrška nije univerzalna. Integracija koja pretpostavlja da svaki LTC wallet može poslati na svaki tip adrese verovatno će napraviti loše korisničko iskustvo.&lt;/p&gt;

&lt;p&gt;Aplikacija mora jasno označiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;koju vrstu adrese prikazuje&lt;/li&gt;
&lt;li&gt;da li podržava standardni LTC, MWEB ili oba&lt;/li&gt;
&lt;li&gt;da li servis sa kojeg korisnik šalje podržava tu opciju&lt;/li&gt;
&lt;li&gt;kako izgleda fallback tok&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Manji developerski ekosistem
&lt;/h3&gt;

&lt;p&gt;Većina blockchain SDK-ova prvo cilja Bitcoin ili Ethereum. Litecoin podrška ponekad postoji samo kao konfiguraciona opcija, fork ili community dodatak.&lt;/p&gt;

&lt;p&gt;To zahteva dodatnu proveru:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da li biblioteka pravilno validira Litecoin adrese&lt;/li&gt;
&lt;li&gt;da li koristi odgovarajuće mrežne parametre&lt;/li&gt;
&lt;li&gt;da li podržava SegWit i potrebne tipove skripti&lt;/li&gt;
&lt;li&gt;da li je testirana na Litecoin testnetu&lt;/li&gt;
&lt;li&gt;da li razume MWEB, ako je to potrebno&lt;/li&gt;
&lt;li&gt;da li je aktivno održavana&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bolje je koristiti Litecoin Core kao izvor istine nego verovati biblioteci samo zato što u dokumentaciji ima &lt;code&gt;litecoin: true&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Produkcioni checklist
&lt;/h2&gt;

&lt;p&gt;Pre prihvatanja stvarnog novca, tim bi trebalo da proveri sledeće:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Svaka faktura dobija novu adresu.&lt;/li&gt;
&lt;li&gt;Iznosi se čuvaju kao celobrojne najmanje jedinice.&lt;/li&gt;
&lt;li&gt;RPC nije javno dostupan.&lt;/li&gt;
&lt;li&gt;Kredencijali nisu u repozitorijumu.&lt;/li&gt;
&lt;li&gt;Privatni ključevi nisu dostupni frontend ili opštem API procesu.&lt;/li&gt;
&lt;li&gt;Webhook i ZMQ događaji obrađuju se idempotentno.&lt;/li&gt;
&lt;li&gt;Postoji periodični reconciliation sa lancem.&lt;/li&gt;
&lt;li&gt;Reorganizacije mogu vratiti status fakture unazad.&lt;/li&gt;
&lt;li&gt;Postoje pravila za delimičnu, višestruku i zakašnjelu uplatu.&lt;/li&gt;
&lt;li&gt;Refundacija ne ide automatski na proizvoljnu ulaznu adresu.&lt;/li&gt;
&lt;li&gt;Potvrde zavise od vrednosti i rizika transakcije.&lt;/li&gt;
&lt;li&gt;Wallet backup je testiran stvarnom restauracijom.&lt;/li&gt;
&lt;li&gt;Čvor ima monitoring za visinu lanca, peerove, disk i verziju.&lt;/li&gt;
&lt;li&gt;UTXO konsolidacija je planirana.&lt;/li&gt;
&lt;li&gt;MWEB se nudi samo tamo gde je kompletan tok podržan.&lt;/li&gt;
&lt;li&gt;Testnet testovi obuhvataju restart, duplikate i propuštene događaje.&lt;/li&gt;
&lt;li&gt;Računovodstvo čuva kurs, vreme i identitet izvora cene.&lt;/li&gt;
&lt;li&gt;Nadogradnje Litecoin Core-a prolaze kontrolisan deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kada Litecoin ima smisla
&lt;/h2&gt;

&lt;p&gt;Litecoin je dobar kandidat kada aplikaciji treba:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jednostavan kripto payment rail&lt;/li&gt;
&lt;li&gt;direktna on-chain naplata&lt;/li&gt;
&lt;li&gt;relativno kratko čekanje do prvog bloka&lt;/li&gt;
&lt;li&gt;niska tipična mrežna naknada&lt;/li&gt;
&lt;li&gt;sopstvena validacija bez zavisnosti od hosted API-ja&lt;/li&gt;
&lt;li&gt;UTXO infrastruktura slična Bitcoinovoj&lt;/li&gt;
&lt;li&gt;opciona poverljivost kroz MWEB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nije dobar izbor kada proizvod prvenstveno zahteva:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stabilnu fiat vrednost&lt;/li&gt;
&lt;li&gt;kompleksne smart contract funkcije&lt;/li&gt;
&lt;li&gt;trenutnu apsolutnu konačnost&lt;/li&gt;
&lt;li&gt;univerzalnu podršku za poverljive transfere&lt;/li&gt;
&lt;li&gt;chargeback mehanizam&lt;/li&gt;
&lt;li&gt;potpuno pasivno održavanje infrastrukture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Najkorisniji način razmišljanja o Litecoinu nije „brži Bitcoin“ niti „stara kriptovaluta koja je još tu“. Za developera je to specijalizovan payment protokol sa poznatim UTXO modelom, dovoljno zrelom infrastrukturom i nekoliko zanimljivih kompromisa.&lt;/p&gt;

&lt;p&gt;Njegova najveća prednost je što ne pokušava da bude sve. Njegova najveća mana je što današnje aplikacije često traže više od samog transfera vrednosti.&lt;/p&gt;

&lt;p&gt;Ako se problem zaista svodi na primanje, potvrđivanje i slanje digitalnog novca, Litecoin ostaje tehnologija koju je relativno lako razumeti. Produkciona integracija ipak zahteva disciplinu oko ključeva, potvrda, reorganizacija, računovodstva i operativnog rizika. Upravo tu se završava demo, a počinje finansijski softver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://litecoin.org/" rel="noopener noreferrer"&gt;Litecoin, zvanična stranica projekta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/litecoin-project/litecoin" rel="noopener noreferrer"&gt;Litecoin Core, zvanični izvorni kod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/litecoin-project/lips/blob/master/lip-0002.mediawiki" rel="noopener noreferrer"&gt;LIP-0002: Extension Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/litecoin-project/litecoin/blob/master/doc/JSON-RPC-interface.md" rel="noopener noreferrer"&gt;Litecoin Core JSON-RPC interfejs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/litecoin-project/litecoin/releases" rel="noopener noreferrer"&gt;Litecoin Core izdanja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>bitcoin</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Ethereum iz ugla developera: EVM, gas i pametni ugovori</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Fri, 18 Sep 2026 01:38:55 +0000</pubDate>
      <link>https://dev.to/kriptomuza/ethereum-iz-ugla-developera-evm-gas-i-pametni-ugovori-4lib</link>
      <guid>https://dev.to/kriptomuza/ethereum-iz-ugla-developera-evm-gas-i-pametni-ugovori-4lib</guid>
      <description>&lt;p&gt;Ethereum se često opisuje kao kriptovaluta, blockchain ili platforma za pametne ugovore. Sve tri tvrdnje su delimično tačne, ali developeru ne daju dovoljno precizan mentalni model.&lt;/p&gt;

&lt;p&gt;Najkorisnije je posmatrati Ethereum kao javnu, distribuiranu state mašinu.&lt;/p&gt;

&lt;p&gt;Postoji globalno stanje koje obuhvata naloge, njihove balanse, izvršni kod pametnih ugovora i podatke koje ti ugovori čuvaju. Transakcije predstavljaju ulaze u sistem. Ethereum Virtual Machine, odnosno EVM, deterministički izvršava te ulaze i proizvodi novo stanje. Hiljade nezavisnih računara zatim proveravaju da je prelazak iz starog u novo stanje urađen prema istim pravilima.&lt;/p&gt;

&lt;p&gt;Rezultat nije naročito brz niti jeftin računar. Rezultat je računar čije stanje ne kontroliše jedan administrator, cloud nalog, kompanija ili baza podataka.&lt;/p&gt;

&lt;p&gt;Upravo to je osnovna vrednost Ethereuma za developera.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta je Ethereum, precizno
&lt;/h2&gt;

&lt;p&gt;Ethereum je decentralizovana mreža računara koji održavaju zajedničko stanje i izvršavaju programabilna pravila. Njegova nativna valuta je ether, sa oznakom ETH, ali ETH nije ceo sistem. ETH se koristi za plaćanje izvršavanja, zaštitu mreže kroz staking i prenos vrednosti između naloga.&lt;/p&gt;

&lt;p&gt;Na običnom backendu funkcija može da promeni red u PostgreSQL tabeli:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP zahtev -&amp;gt; aplikacija -&amp;gt; baza -&amp;gt; novo stanje
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na Ethereumu sličan tok izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;potpisana transakcija -&amp;gt; mreža -&amp;gt; EVM -&amp;gt; blok -&amp;gt; novo zajedničko stanje
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ključna razlika je u tome ko ima pravo da prihvati promenu.&lt;/p&gt;

&lt;p&gt;U klasičnoj aplikaciji poslednju reč ima operator infrastrukture. Može promeniti bazu, vratiti backup, izmeniti autorizaciju ili ugasiti servis. Na Ethereumu pravila tranzicije stanja izvršava mreža nezavisnih čvorova. Operator jednog čvora ne može samostalno promeniti rezultat.&lt;/p&gt;

&lt;p&gt;Ethereum zato ima smisla kada više strana treba da koristi isti sistem, ali nijedna strana ne bi trebalo da ima neograničenu administrativnu kontrolu nad njim.&lt;/p&gt;

&lt;p&gt;To može biti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;razmena tokenizovane vrednosti&lt;/li&gt;
&lt;li&gt;escrow između strana koje se međusobno ne poznaju&lt;/li&gt;
&lt;li&gt;upravljanje zajedničkim treasuryjem&lt;/li&gt;
&lt;li&gt;tržište digitalne imovine&lt;/li&gt;
&lt;li&gt;sistem glasanja i izvršavanja odluka&lt;/li&gt;
&lt;li&gt;registar vlasništva ili dozvola&lt;/li&gt;
&lt;li&gt;dokaz da je određeni podatak postojao u određenom obliku&lt;/li&gt;
&lt;li&gt;interoperabilni identitet i reputacija&lt;/li&gt;
&lt;li&gt;finansijski protokol koji drugi ugovori mogu direktno koristiti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako aplikacija ima jednog vlasnika, jednu bazu i korisnike koji tom vlasniku veruju, blockchain često samo povećava složenost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ethereum nije distribuirani web server
&lt;/h2&gt;

&lt;p&gt;Pametni ugovor nije zamena za REST API, Kubernetes cluster ili serverless funkciju.&lt;/p&gt;

&lt;p&gt;EVM ima nekoliko važnih ograničenja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;izvršavanje se plaća&lt;/li&gt;
&lt;li&gt;svi čvorovi moraju dobiti isti rezultat&lt;/li&gt;
&lt;li&gt;ugovor ne može samostalno poslati HTTP zahtev&lt;/li&gt;
&lt;li&gt;persistent storage je skup&lt;/li&gt;
&lt;li&gt;javni podaci su vidljivi svima&lt;/li&gt;
&lt;li&gt;potvrda promene nije trenutna&lt;/li&gt;
&lt;li&gt;jednom objavljen kod nije jednostavno zameniti&lt;/li&gt;
&lt;li&gt;greška može imati direktne finansijske posledice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ethereum zato obično predstavlja samo jedan deo sistema.&lt;/p&gt;

&lt;p&gt;Realna aplikacija često sadrži:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    U[Browser ili mobilna aplikacija]
    W[Wallet]
    R[Ethereum JSON-RPC]
    C[Pametni ugovor]
    I[Indexer]
    D[Klasična baza]
    S[Objektni ili decentralizovani storage]

    U --&amp;gt; W
    W --&amp;gt; R
    R --&amp;gt; C
    C --&amp;gt; I
    I --&amp;gt; D
    U --&amp;gt; D
    U --&amp;gt; S&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Frontend koristi wallet za autorizaciju i potpisivanje. RPC endpoint povezuje aplikaciju sa Ethereum čvorom. Pametni ugovor čuva minimalno kritično stanje. Indexer obrađuje događaje i gradi bazu pogodnu za pretragu. Veliki fajlovi i nekritični podaci ostaju van lanca.&lt;/p&gt;

&lt;p&gt;To je hibridna arhitektura, a ne pokušaj da se cela aplikacija smesti u blockchain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Globalno stanje i Ethereum nalozi
&lt;/h2&gt;

&lt;p&gt;Ethereum poznaje dve osnovne vrste naloga:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Externally Owned Account, skraćeno EOA&lt;/li&gt;
&lt;li&gt;contract account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EOA je tradicionalno kontrolisan privatnim ključem. Contract account je kontrolisan kodom koji se nalazi na njegovoj adresi.&lt;/p&gt;

&lt;p&gt;Svaki nalog ima adresu i može posedovati ETH ili tokene. Međutim, samo nalog koji može autorizovati transakciju pokreće promenu globalnog stanja. Pametni ugovor se izvršava kada primi poziv u okviru već pokrenute transakcije.&lt;/p&gt;

&lt;p&gt;Stanje naloga uključuje elemente kao što su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nonce&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ETH balans&lt;/li&gt;
&lt;li&gt;hash izvršnog koda&lt;/li&gt;
&lt;li&gt;root persistent storagea&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;nonce&lt;/code&gt; sprečava ponovno izvršavanje iste potpisane transakcije i određuje redosled transakcija jednog pošiljaoca.&lt;/p&gt;

&lt;p&gt;Važno je razlikovati nalog od walleta. Nalog je deo Ethereum stanja. Wallet je softver ili hardverski uređaj koji upravlja ključevima i komunicira sa aplikacijama.&lt;/p&gt;

&lt;p&gt;Savremeni Ethereum dodatno zamagljuje staru granicu između EOA i contract account modela. Transakcije tipa 4, uvedene kroz EIP-7702, omogućavaju EOA adresi da delegira izvršavanje postojećem kodu pametnog ugovora. To otvara prostor za batching, sponzorisanje naknada, recovery mehanizme i naprednije kontrole naloga.&lt;/p&gt;

&lt;p&gt;Praktična posledica za autora ugovora je da ne treba pretpostavljati da je nalog bez trajno postavljenog koda nužno jednostavan korisnički nalog. Posebno je opasno zasnivati autorizaciju na pretpostavkama o &lt;code&gt;tx.origin&lt;/code&gt;. Autorizacija treba da bude eksplicitna i dizajnirana tako da pozivalac može biti pametni ugovor. [2][3]&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako izgleda Ethereum transakcija
&lt;/h2&gt;

&lt;p&gt;Transakcija je kriptografski autorizovana instrukcija za promenu stanja.&lt;/p&gt;

&lt;p&gt;Tipična transakcija sadrži:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chainId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nonce&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;adresu primaoca&lt;/li&gt;
&lt;li&gt;količinu ETH koja se šalje&lt;/li&gt;
&lt;li&gt;ulazne podatke&lt;/li&gt;
&lt;li&gt;gas limit&lt;/li&gt;
&lt;li&gt;parametre naknade&lt;/li&gt;
&lt;li&gt;kriptografski potpis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako polje primaoca nije postavljeno, transakcija može predstavljati kreiranje novog ugovora. Ako je primalac EOA, najčešće se radi o prenosu ETH. Ako je primalac contract account, &lt;code&gt;input&lt;/code&gt; određuje funkciju koja se poziva i njene argumente.&lt;/p&gt;

&lt;p&gt;Ethereum koristi više tipova transakcija.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tip&lt;/th&gt;
&lt;th&gt;Namena&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Legacy transakcija sa jednim &lt;code&gt;gasPrice&lt;/code&gt; poljem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Transakcija sa access listom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Standardna EIP-1559 transakcija&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Blob transakcija za rollup data availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Transakcija sa EIP-7702 authorization listom&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Za većinu aplikativnih transakcija wallet ili SDK formira odgovarajući tip. Developer ipak treba da razume polja, jer greške sa &lt;code&gt;nonce&lt;/code&gt;, &lt;code&gt;chainId&lt;/code&gt;, gas limitom ili parametrima naknade mogu dovesti do zaglavljenih, preplaćenih ili odbijenih transakcija.&lt;/p&gt;

&lt;p&gt;Životni ciklus transakcije izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aplikacija konstruiše zahtev za transakciju.&lt;/li&gt;
&lt;li&gt;Wallet prikazuje korisniku šta potpisuje.&lt;/li&gt;
&lt;li&gt;Privatni ključ potpisuje serijalizovane podatke.&lt;/li&gt;
&lt;li&gt;Potpisana transakcija šalje se Ethereum čvoru.&lt;/li&gt;
&lt;li&gt;Čvor proverava potpis, nonce, balans i osnovnu validnost.&lt;/li&gt;
&lt;li&gt;Transakcija ulazi u lokalni mempool i propagira se mrežom.&lt;/li&gt;
&lt;li&gt;Validator je uključuje u execution payload bloka.&lt;/li&gt;
&lt;li&gt;Ostali čvorovi ponovo izvršavaju transakciju.&lt;/li&gt;
&lt;li&gt;Receipt postaje dostupan nakon uključivanja u blok.&lt;/li&gt;
&lt;li&gt;Blok kasnije dobija status &lt;code&gt;safe&lt;/code&gt;, a zatim &lt;code&gt;finalized&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Slanje transakcije zato nije isto što i uspešno izvršavanje.&lt;/p&gt;

&lt;p&gt;Dobijeni transaction hash znači da je zahtev prihvaćen za propagaciju, ne da je operacija završena. Aplikacija mora sačekati receipt i proveriti njegov status. Za operacije veće vrednosti može biti potrebno čekati dodatne potvrde ili finalizaciju. [3][5]&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta se događa unutar Ethereum čvora
&lt;/h2&gt;

&lt;p&gt;Ethereum čvor nije jedan monolitni proces. Njegova arhitektura sastoji se od najmanje dve povezane komponente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;execution client&lt;/li&gt;
&lt;li&gt;consensus client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Execution client održava EVM stanje, prima transakcije, upravlja mempoolom i izvršava execution payload. Consensus client implementira proof-of-stake pravila, prati validatore, attestations, fork choice i finalizaciju.&lt;/p&gt;

&lt;p&gt;Operator validatora obično pokreće i validator client koji upravlja validacionim ključevima i obavlja dužnosti predlaganja ili potvrđivanja blokova.&lt;/p&gt;

&lt;p&gt;Tok bloka može se pojednostaviti ovako:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    participant User
    participant EL as Execution client
    participant CL as Consensus client
    participant Validators
    participant Nodes

    User-&amp;gt;&amp;gt;EL: Potpisana transakcija
    EL-&amp;gt;&amp;gt;EL: Validacija i mempool
    CL-&amp;gt;&amp;gt;EL: Zahtev za execution payload
    EL--&amp;gt;&amp;gt;CL: Transakcije i novo state stanje
    CL-&amp;gt;&amp;gt;Validators: Predlog beacon bloka
    Validators-&amp;gt;&amp;gt;Validators: Ponovno izvršavanje i attestations
    Validators-&amp;gt;&amp;gt;Nodes: Propagacija prihvaćenog bloka&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Ethereum vreme deli na slotove. Jedan slot traje 12 sekundi, a 32 slota čine jednu epohu. U svakom slotu bira se validator koji može predložiti blok, ali slot može ostati prazan ako izabrani validator ne obavi svoju dužnost.&lt;/p&gt;

&lt;p&gt;Finalnost se utvrđuje glasanjem validatora o checkpointima na granicama epoha. Kada potrebna supervećina staked ETH podrži odgovarajuće checkpoint veze, stariji checkpoint postaje finalizovan.&lt;/p&gt;

&lt;p&gt;Za frontend je često dovoljno prikazati transakciju nakon prvog uključenja u blok, uz jasno stanje poput &lt;code&gt;pending&lt;/code&gt;, &lt;code&gt;confirmed&lt;/code&gt; ili &lt;code&gt;finalized&lt;/code&gt;. Backend koji poravnava račune, pušta sredstva ili pokreće nepovratnu eksternu operaciju treba da ima strožu politiku. [4][5]&lt;/p&gt;

&lt;h2&gt;
  
  
  EVM: deterministički runtime za pametne ugovore
&lt;/h2&gt;

&lt;p&gt;Ethereum Virtual Machine izvršava bytecode pametnih ugovora.&lt;/p&gt;

&lt;p&gt;EVM je stack mašina sa maksimalnom dubinom stacka od 1024 elementa. Osnovna reč je široka 256 bita, što odgovara kriptografskim operacijama i formatima koje Ethereum često koristi.&lt;/p&gt;

&lt;p&gt;Tokom izvršavanja ugovor koristi nekoliko različitih prostora za podatke:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prostor&lt;/th&gt;
&lt;th&gt;Trajanje&lt;/th&gt;
&lt;th&gt;Može se menjati&lt;/th&gt;
&lt;th&gt;Tipična namena&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stack&lt;/td&gt;
&lt;td&gt;Jedan execution frame&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;td&gt;Operandi EVM instrukcija&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Jedan poziv&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;td&gt;Privremeni nizovi i strukture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calldata&lt;/td&gt;
&lt;td&gt;Jedan poziv&lt;/td&gt;
&lt;td&gt;Ne&lt;/td&gt;
&lt;td&gt;Argumenti funkcije&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Trajno&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;td&gt;Stanje ugovora&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transient storage&lt;/td&gt;
&lt;td&gt;Jedna transakcija&lt;/td&gt;
&lt;td&gt;Da&lt;/td&gt;
&lt;td&gt;Deljenje privremenog stanja između internih poziva&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs&lt;/td&gt;
&lt;td&gt;Trajno u receipt podacima&lt;/td&gt;
&lt;td&gt;Ne iz ugovora&lt;/td&gt;
&lt;td&gt;Događaji za offchain potrošače&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Persistent storage je najskuplji jer promenu moraju obraditi i održavati čvorovi mreže. Zbog toga se na lancu ne čuvaju slike, dokumenti, kompletni JSON objekti ili veliki aplikativni zapisi ako za to ne postoji izuzetno dobar razlog.&lt;/p&gt;

&lt;p&gt;Češći obrazac je:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;podatak ostaje van lanca&lt;/li&gt;
&lt;li&gt;na lancu se čuva njegov hash&lt;/li&gt;
&lt;li&gt;ugovor čuva vlasništvo, status ili dozvolu&lt;/li&gt;
&lt;li&gt;event beleži istoriju promene&lt;/li&gt;
&lt;li&gt;indexer pravi model pogodan za frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EVM je deterministička. Ako dva ispravna čvora izvrše istu transakciju nad istim prethodnim stanjem, moraju dobiti isti rezultat. Zbog toga ugovor ne može direktno čitati vreme sa interneta, cenu sa berze ili rezultat sportskog meča.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;block.timestamp&lt;/code&gt; dolazi iz samog bloka i može se koristiti samo kao približna vremenska referenca u granicama protokola. Podaci iz spoljnog sveta zahtevaju oracle ili drugi eksplicitni mehanizam za unos podataka. [6][7]&lt;/p&gt;

&lt;h2&gt;
  
  
  Pametni ugovor je javni program sa trajnim stanjem
&lt;/h2&gt;

&lt;p&gt;Pametni ugovor je program postavljen na Ethereum adresu. Korisnici i drugi ugovori pozivaju njegove funkcije slanjem ABI kodiranih podataka.&lt;/p&gt;

&lt;p&gt;Najpopularniji jezik je Solidity. Kompajler prevodi Solidity u:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EVM bytecode&lt;/li&gt;
&lt;li&gt;deployment bytecode&lt;/li&gt;
&lt;li&gt;ABI&lt;/li&gt;
&lt;li&gt;metadata podatke&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ABI opisuje funkcije, argumente, povratne vrednosti, događaje i greške. JavaScript biblioteka ne poziva Solidity funkciju direktno. Ona koristi ABI da napravi binarni &lt;code&gt;calldata&lt;/code&gt;, šalje ga čvoru i dekodira rezultat.&lt;/p&gt;

&lt;p&gt;Prva četiri bajta poziva funkcije predstavljaju selector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;keccak256("transfer(address,uint256)")[0:4]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ostatak &lt;code&gt;calldata&lt;/code&gt; sadrži ABI kodirane argumente.&lt;/p&gt;

&lt;p&gt;Ovaj detalj postaje važan kada se analiziraju revertovi, proxy ugovori, multisig transakcije ili sirovi podaci iz block explorera.&lt;/p&gt;

&lt;p&gt;Ugovori su međusobno kompozabilni. Jedan ugovor može pozvati drugi u istoj transakciji. Ako bilo koji poziv u lancu izvršavanja revertuje, promene se uglavnom vraćaju do odgovarajuće granice poziva.&lt;/p&gt;

&lt;p&gt;To omogućava atomske operacije: više koraka može uspeti zajedno ili se cela operacija poništava.&lt;/p&gt;

&lt;p&gt;Atomsko izvršavanje je jedna od najvažnijih osobina Ethereuma. Na klasičnom backendu isti rezultat često zahteva distribuirane transakcije, zaključavanje, compensating actions i koordinaciju između različitih servisa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gas: cena ograničenog izvršavanja
&lt;/h2&gt;

&lt;p&gt;Gas je obračunska jedinica za količinu EVM rada.&lt;/p&gt;

&lt;p&gt;Svaka instrukcija ima gas cenu. Čitanje memorije, hashiranje, pozivanje drugog ugovora i menjanje storagea ne koštaju isto. Transakcija navodi maksimalnu količinu gasa koju sme da potroši.&lt;/p&gt;

&lt;p&gt;Stvarni trošak približno se računa kao:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trošak u ETH = gasUsed × effectiveGasPrice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kod standardne EIP-1559 transakcije cena po jedinici gasa sastoji se od:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;base fee&lt;/li&gt;
&lt;li&gt;priority fee&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Base fee određuje protokol na osnovu prethodnih blokova i spaljuje se. Priority fee predstavlja napojnicu validatoru. Pošiljalac postavlja i &lt;code&gt;maxFeePerGas&lt;/code&gt;, čime ograničava koliko je spreman da plati.&lt;/p&gt;

&lt;p&gt;Gas limit nije isto što i konačan trošak. To je gornja granica potrošnje. Neiskorišćen gas se ne naplaćuje kao izvršen gas.&lt;/p&gt;

&lt;p&gt;Ako transakcija revertuje, već potrošen gas ostaje potrošen. Mreža je ipak morala da izvrši instrukcije kako bi ustanovila da operacija nije validna.&lt;/p&gt;

&lt;h3&gt;
  
  
  Koliko korišćenje Ethereuma košta
&lt;/h3&gt;

&lt;p&gt;Ne postoji jedna tačna cena.&lt;/p&gt;

&lt;p&gt;Trošak zavisi od:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mreže na kojoj se izvršava&lt;/li&gt;
&lt;li&gt;trenutne potražnje za block spaceom&lt;/li&gt;
&lt;li&gt;broja izvršenih EVM instrukcija&lt;/li&gt;
&lt;li&gt;količine promenjenog storagea&lt;/li&gt;
&lt;li&gt;veličine &lt;code&gt;calldata&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;drugih ugovora koji se pozivaju&lt;/li&gt;
&lt;li&gt;L1 data troška ako se koristi rollup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pre slanja transakcije aplikacija treba da koristi procenu gasa, najčešće preko &lt;code&gt;eth_estimateGas&lt;/code&gt;, i aktuelne podatke o naknadama. Procena nije garancija, jer se stanje može promeniti između simulacije i uključivanja u blok.&lt;/p&gt;

&lt;p&gt;Trošak produkcionog sistema ne obuhvata samo gas. U budžet ulaze:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;razvoj i testiranje ugovora&lt;/li&gt;
&lt;li&gt;security review ili audit&lt;/li&gt;
&lt;li&gt;RPC infrastruktura&lt;/li&gt;
&lt;li&gt;indexer i baza&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;upravljanje ključevima&lt;/li&gt;
&lt;li&gt;multisig operacije&lt;/li&gt;
&lt;li&gt;incident response&lt;/li&gt;
&lt;li&gt;trošak nadogradnje i migracije&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za većinu aplikacija sa velikim brojem korisničkih transakcija direktno korišćenje Ethereum Mainneta nije ekonomski optimalno. Mainnet se češće koristi kao settlement i security sloj, dok se izvršavanje pomera na L2 mreže. [8]&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2 nije odvojena tema
&lt;/h2&gt;

&lt;p&gt;Ethereum scaling strategija zasniva se prvenstveno na rollup mrežama.&lt;/p&gt;

&lt;p&gt;Rollup izvršava transakcije izvan Ethereum L1, grupiše rezultate i objavljuje podatke ili kriptografske dokaze na L1. Time se trošak deli između većeg broja korisnika.&lt;/p&gt;

&lt;p&gt;Dve glavne porodice su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;optimistic rollups&lt;/li&gt;
&lt;li&gt;zero-knowledge rollups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Optimistic rollup pretpostavlja da je objavljeni rezultat ispravan dok ga neko ne ospori u dozvoljenom periodu. ZK rollup objavljuje validity proof kojim dokazuje ispravnost tranzicije stanja.&lt;/p&gt;

&lt;p&gt;Oba pristupa donose dodatne komponente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sequencer&lt;/li&gt;
&lt;li&gt;bridge ugovore&lt;/li&gt;
&lt;li&gt;batch objavljivanje&lt;/li&gt;
&lt;li&gt;poseban model finalnosti&lt;/li&gt;
&lt;li&gt;različite mehanizme izlaska&lt;/li&gt;
&lt;li&gt;dodatni rizik implementacije i upravljanja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blob transakcije uvedene kroz EIP-4844 omogućile su rollup mrežama da jeftinije objavljuju privremene podatke na Ethereum. Kasniji PeerDAS mehanizam omogućava čvorovima da uzorkuju delove blob podataka umesto da svaki čvor preuzima svaki blob u celosti. Kapacitet blobova može se prilagođavati kroz posebne promene parametara bez čekanja kompletnog velikog upgradea. [9][10]&lt;/p&gt;

&lt;p&gt;Za aplikativnog developera odluka zato nije samo „Ethereum ili nešto drugo“. Realniji izbor je:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ethereum L1&lt;/li&gt;
&lt;li&gt;general-purpose Ethereum L2&lt;/li&gt;
&lt;li&gt;application-specific rollup&lt;/li&gt;
&lt;li&gt;centralizovani backend&lt;/li&gt;
&lt;li&gt;kombinacija navedenih sistema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L2 može smanjiti naknade, ali ne uklanja potrebu da razumete bridge rizik, dostupnost sequencera, finalnost i razliku između L2 potvrde i L1 settlementa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan use-case: registar softverskih artefakata
&lt;/h2&gt;

&lt;p&gt;Zamislimo nekoliko kompanija koje zajednički koriste softverske pakete. Svaka kompanija objavljuje build artefakte, ali nijedna ne želi da druga strana bude jedini administrator registra.&lt;/p&gt;

&lt;p&gt;Cilj nije da se ZIP, container image ili SBOM smeste na Ethereum. To bi bilo skupo i nepraktično.&lt;/p&gt;

&lt;p&gt;Na lancu se mogu čuvati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identitet publishera&lt;/li&gt;
&lt;li&gt;hash artefakta&lt;/li&gt;
&lt;li&gt;hash metapodataka&lt;/li&gt;
&lt;li&gt;identifikator izdanja&lt;/li&gt;
&lt;li&gt;vreme objavljivanja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sam artefakt može ostati u object storageu, container registryju ili content-addressed mreži. Potrošač pre deploymenta računa hash preuzetog fajla i poredi ga sa hashom koji je publisher zabeležio na lancu.&lt;/p&gt;

&lt;p&gt;Minimalni ugovor može izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract ReleaseRegistry {
    struct Release {
        bytes32 artifactDigest;
        bytes32 metadataDigest;
        uint64 publishedAt;
    }

    mapping(bytes32 =&amp;gt; Release) private releases;

    error EmptyDigest();
    error AlreadyPublished(bytes32 key);

    event ReleasePublished(
        bytes32 indexed key,
        address indexed publisher,
        bytes32 indexed releaseId,
        bytes32 artifactDigest,
        bytes32 metadataDigest
    );

    function keyFor(
        address publisher,
        bytes32 releaseId
    ) public pure returns (bytes32) {
        return keccak256(abi.encode(publisher, releaseId));
    }

    function publish(
        bytes32 releaseId,
        bytes32 artifactDigest,
        bytes32 metadataDigest
    ) external returns (bytes32 key) {
        if (
            artifactDigest == bytes32(0) ||
            metadataDigest == bytes32(0)
        ) {
            revert EmptyDigest();
        }

        key = keyFor(msg.sender, releaseId);

        if (releases[key].publishedAt != 0) {
            revert AlreadyPublished(key);
        }

        releases[key] = Release({
            artifactDigest: artifactDigest,
            metadataDigest: metadataDigest,
            publishedAt: uint64(block.timestamp)
        });

        emit ReleasePublished(
            key,
            msg.sender,
            releaseId,
            artifactDigest,
            metadataDigest
        );
    }

    function get(
        address publisher,
        bytes32 releaseId
    )
        external
        view
        returns (
            bytes32 artifactDigest,
            bytes32 metadataDigest,
            uint64 publishedAt
        )
    {
        Release memory release = releases[
            keyFor(publisher, releaseId)
        ];

        return (
            release.artifactDigest,
            release.metadataDigest,
            release.publishedAt
        );
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ovaj ugovor namerno ne pokušava da rešava sve.&lt;/p&gt;

&lt;p&gt;Nema globalnog administratora, upgrade mehanizma, liste odobrenih publishera ni revocation modela. Namespace svakog izdanja vezan je za adresu publishera, tako da dve organizacije mogu koristiti isti &lt;code&gt;releaseId&lt;/code&gt; bez konflikta.&lt;/p&gt;

&lt;p&gt;U produkcionom sistemu trebalo bi definisati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kako se publisher adrese registruju&lt;/li&gt;
&lt;li&gt;da li publisher koristi multisig&lt;/li&gt;
&lt;li&gt;kako se rotiraju kompromitovani ključevi&lt;/li&gt;
&lt;li&gt;može li se izdanje opozvati&lt;/li&gt;
&lt;li&gt;ko može objaviti revocation&lt;/li&gt;
&lt;li&gt;koji hash algoritam i canonical format se koriste&lt;/li&gt;
&lt;li&gt;šta tačno znači &lt;code&gt;metadataDigest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;šta se dešava ako storage sa artefaktom postane nedostupan&lt;/li&gt;
&lt;li&gt;da li L2 pruža dovoljan nivo sigurnosti za konkretan slučaj&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blockchain potvrđuje da je određena adresa objavila određeni digest. Ne potvrđuje da je softver bezbedan, da publisher ima dobru reputaciju ili da je privatni ključ korišćen od strane prave osobe.&lt;/p&gt;

&lt;p&gt;To je važna granica sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integracija iz JavaScript aplikacije
&lt;/h2&gt;

&lt;p&gt;Ethereum execution client izlaže JSON-RPC interfejs. Biblioteke poput ethers.js obavijaju RPC metode i koriste ABI za kodiranje poziva.&lt;/p&gt;

&lt;p&gt;Za čitanje ugovora dovoljan je provider. Za promenu stanja potreban je signer.&lt;/p&gt;

&lt;p&gt;Skraćena browser integracija može izgledati ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;BrowserProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;toUtf8Bytes&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ethers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registryAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registryAbi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function publish(bytes32,bytes32,bytes32) returns (bytes32)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function get(address,bytes32) view returns &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;(bytes32,bytes32,uint64)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BrowserProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ethereum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSigner&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;registryAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;registryAbi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;signer&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input[type=file]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;artifactBytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;releaseId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@example/api@2.4.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;artifactDigest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;artifactBytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Ovaj string mora biti napravljen determinističkom&lt;/span&gt;
&lt;span class="c1"&gt;// canonical JSON procedurom.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canonicalMetadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{"commit":"8fd5...","platform":"linux-amd64"}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadataDigest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;keccak256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;toUtf8Bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canonicalMetadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;releaseId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;artifactDigest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;metadataDigest&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;transactionHash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;blockNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blockNumber&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Korišćenje običnog &lt;code&gt;JSON.stringify&lt;/code&gt; nije dovoljno ako različiti sistemi mogu proizvesti drugačiji redosled ključeva ili različitu reprezentaciju istih podataka. Pre hashiranja treba definisati canonical format i tretirati ga kao deo protokola.&lt;/p&gt;

&lt;p&gt;Za backend čitanje koristi se &lt;code&gt;JsonRpcProvider&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JsonRpcProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ethers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JsonRpcProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RPC_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REGISTRY_ADDRESS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function get(address,bytes32) view returns &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;(bytes32,bytes32,uint64)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nx"&gt;provider&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;releaseId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@example/api@2.4.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;artifactDigest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;metadataDigest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;publishedAt&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PUBLISHER_ADDRESS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;releaseId&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;artifactDigest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;metadataDigest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;publishedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publishedAt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;view&lt;/code&gt; poziv se obično izvršava preko &lt;code&gt;eth_call&lt;/code&gt;. On ne menja stanje i korisnik ne šalje transakciju, pa nema onchain gas naknade. RPC provider i dalje može imati infrastrukturna ograničenja ili sopstveni model naplate.&lt;/p&gt;

&lt;p&gt;State-changing poziv kreira transakciju, zahteva potpis i troši gas. [11][12]&lt;/p&gt;

&lt;h2&gt;
  
  
  Zašto frontend ne treba da koristi blockchain kao bazu
&lt;/h2&gt;

&lt;p&gt;Moguće je pozivati getter funkcije za svaki ekran, ali to retko predstavlja dobru produkcionu arhitekturu.&lt;/p&gt;

&lt;p&gt;JSON-RPC je pogodan za:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proveru aktuelnog stanja&lt;/li&gt;
&lt;li&gt;simulaciju poziva&lt;/li&gt;
&lt;li&gt;dobijanje receipt podataka&lt;/li&gt;
&lt;li&gt;slanje potpisanih transakcija&lt;/li&gt;
&lt;li&gt;čitanje manjeg broja ugovora i logova&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nije idealan za složene upite poput:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sva izdanja publishera sortirana po datumu&lt;/li&gt;
&lt;li&gt;pretraga po delu naziva&lt;/li&gt;
&lt;li&gt;statistika aktivnosti u poslednjih 90 dana&lt;/li&gt;
&lt;li&gt;spajanje podataka iz više ugovora&lt;/li&gt;
&lt;li&gt;full-text search&lt;/li&gt;
&lt;li&gt;filtriranje po offchain metapodacima&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za to se koriste events i indexer.&lt;/p&gt;

&lt;p&gt;Ugovor emituje &lt;code&gt;ReleasePublished&lt;/code&gt;. Indexer prati blokove, dekodira događaj pomoću ABI-ja i upisuje rezultat u PostgreSQL ili drugi query-friendly sistem.&lt;/p&gt;

&lt;p&gt;Indexer mora da obrađuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;privremene chain reorganizacije&lt;/li&gt;
&lt;li&gt;ponovno procesiranje blokova&lt;/li&gt;
&lt;li&gt;idempotentne upise&lt;/li&gt;
&lt;li&gt;pomeranje &lt;code&gt;safe&lt;/code&gt; i &lt;code&gt;finalized&lt;/code&gt; heada&lt;/li&gt;
&lt;li&gt;promene adrese ugovora&lt;/li&gt;
&lt;li&gt;ABI verzije&lt;/li&gt;
&lt;li&gt;nestanak ili ograničenje RPC providera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Baza indexera predstavlja izvedeni prikaz blockchain stanja. Ako se ošteti, može se ponovo izgraditi iz logova, pod uslovom da postoji pristup potrebnoj istoriji.&lt;/p&gt;

&lt;h2&gt;
  
  
  Razvojni workflow koji liči na ozbiljan softver
&lt;/h2&gt;

&lt;p&gt;Pametan ugovor ne bi trebalo prvo pisati u browser editoru, a zatim odmah objaviti na Mainnetu.&lt;/p&gt;

&lt;p&gt;Razumniji tok je:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Definisati trust model.&lt;/li&gt;
&lt;li&gt;Odvojiti onchain od offchain odgovornosti.&lt;/li&gt;
&lt;li&gt;Formalizovati invariants.&lt;/li&gt;
&lt;li&gt;Implementirati najmanji potreban ugovor.&lt;/li&gt;
&lt;li&gt;Pisati unit i fuzz testove.&lt;/li&gt;
&lt;li&gt;Testirati neuspešne i zlonamerne pozive.&lt;/li&gt;
&lt;li&gt;Pokrenuti sistem na lokalnoj development mreži.&lt;/li&gt;
&lt;li&gt;Deployovati na Sepolia testnet.&lt;/li&gt;
&lt;li&gt;Integrisati frontend, backend i indexer.&lt;/li&gt;
&lt;li&gt;Simulirati migraciju i incident response.&lt;/li&gt;
&lt;li&gt;Verifikovati source code ugovora.&lt;/li&gt;
&lt;li&gt;Sprovesti nezavisan security review.&lt;/li&gt;
&lt;li&gt;Tek zatim razmatrati produkcionu mrežu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sepolia je preporučeni javni testnet za razvoj ugovora i aplikacija. Hoodi je namenjen prvenstveno protokolskom razvoju i testiranju validatora. Testnet ETH nema istu ekonomsku vrednost kao Mainnet ETH i ne treba koristiti iste naloge i privatne ključeve u oba okruženja. [13]&lt;/p&gt;

&lt;p&gt;Unit testovi treba da provere očekivano ponašanje. Fuzz testovi treba da pokušaju da pronađu ulaze koji krše invariants.&lt;/p&gt;

&lt;p&gt;Za prethodni registar neki od invariants mogu biti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;objavljen digest se ne može prepisati&lt;/li&gt;
&lt;li&gt;jedan publisher ne može menjati namespace drugog publishera&lt;/li&gt;
&lt;li&gt;prazan digest se nikada ne upisuje&lt;/li&gt;
&lt;li&gt;emitovani event odgovara upisanom stanju&lt;/li&gt;
&lt;li&gt;funkcija &lt;code&gt;keyFor&lt;/code&gt; uvek vraća isti rezultat za iste ulaze&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Testiranje samo happy patha nije dovoljno. Napadač bira ulaze, redosled poziva i ugovore koji učestvuju u transakciji.&lt;/p&gt;

&lt;h2&gt;
  
  
  Najčešće greške klasičnih developera
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pretpostavka da je &lt;code&gt;private&lt;/code&gt; podatak tajan
&lt;/h3&gt;

&lt;p&gt;Solidity oznaka &lt;code&gt;private&lt;/code&gt; ograničava pristup iz drugih ugovora na nivou jezika. Podatak u storageu i dalje je vidljiv svakome ko čita blockchain.&lt;/p&gt;

&lt;p&gt;Lozinke, API ključevi, privatni dokumenti i nešifrovani lični podaci ne pripadaju javnom blockchainu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Korišćenje &lt;code&gt;tx.origin&lt;/code&gt; za autorizaciju
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;tx.origin&lt;/code&gt; predstavlja originalni EOA na početku lanca poziva, ne neposrednog pozivaoca. Autorizacija zasnovana na njemu može biti ranjiva i nije kompatibilna sa savremenim modelima pametnih naloga.&lt;/p&gt;

&lt;p&gt;Koristite eksplicitne role, &lt;code&gt;msg.sender&lt;/code&gt;, potpise ili dobro definisan authorization sloj.&lt;/p&gt;

&lt;h3&gt;
  
  
  Neproveravanje povratne vrednosti low-level poziva
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;call&lt;/code&gt;, &lt;code&gt;delegatecall&lt;/code&gt; i &lt;code&gt;staticcall&lt;/code&gt; imaju specifično ponašanje. Low-level &lt;code&gt;call&lt;/code&gt; vraća status koji aplikacija mora proveriti. Pogrešna upotreba &lt;code&gt;delegatecall&lt;/code&gt; može omogućiti izvršavanje stranog koda u storage kontekstu pozivaoca.&lt;/p&gt;

&lt;h3&gt;
  
  
  External call pre izmene lokalnog stanja
&lt;/h3&gt;

&lt;p&gt;Ako ugovor šalje kontrolu drugom ugovoru pre ažuriranja sopstvenog stanja, druga strana može pokušati reentrant poziv.&lt;/p&gt;

&lt;p&gt;Checks-effects-interactions obrazac, pull payments i odgovarajući guard mehanizmi smanjuju rizik, ali ne zamenjuju razumevanje celog call grapha.&lt;/p&gt;

&lt;h3&gt;
  
  
  Neograničene petlje nad rastućim storageom
&lt;/h3&gt;

&lt;p&gt;Petlja koja prolazi kroz sve korisnike možda radi u testu sa deset naloga, ali može postati neizvršiva kada lista poraste. Gas limit bloka predstavlja hardversko i protokolsko ograničenje.&lt;/p&gt;

&lt;p&gt;Iteraciju je često bolje pomeriti u indexer ili podeliti u više ograničenih transakcija.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slepo kopiranje token ili proxy implementacija
&lt;/h3&gt;

&lt;p&gt;Standardi poput ERC-20 opisuju interfejs i očekivano ponašanje, ali ne rešavaju automatski autorizaciju, supply politiku, upgrade administraciju ili ekonomsku sigurnost.&lt;/p&gt;

&lt;p&gt;Za standardne komponente prednost imaju proverene biblioteke iz objavljenih paketa. Kopiranje delova biblioteke u sopstveni projekat otežava praćenje verzija i bezbednosnih ispravki.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mešanje uključenja u blok i finalnosti
&lt;/h3&gt;

&lt;p&gt;Receipt potvrđuje da je transakcija uključena u određeni blok. Ne znači da je blok već finalizovan.&lt;/p&gt;

&lt;p&gt;Sistem treba da definiše koliko potvrda čeka i koje operacije zahteva da blok bude &lt;code&gt;safe&lt;/code&gt; ili &lt;code&gt;finalized&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upgradeable ugovor bez plana upravljanja
&lt;/h3&gt;

&lt;p&gt;Proxy omogućava promenu implementacije, ali uvodi privilegovani upgrade ključ, storage layout rizik i mogućnost da administrator promeni pravila sistema.&lt;/p&gt;

&lt;p&gt;„Upgradeable“ nije isto što i „bezbednije“. To je drugačiji trust model koji mora biti vidljiv korisnicima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operativna bezbednost je deo aplikacije
&lt;/h2&gt;

&lt;p&gt;Sigurnost pametnog ugovora ne završava se kada Solidity kod prođe audit.&lt;/p&gt;

&lt;p&gt;Produkcioni sistem mora zaštititi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployer ključ&lt;/li&gt;
&lt;li&gt;upgrade administratora&lt;/li&gt;
&lt;li&gt;treasury&lt;/li&gt;
&lt;li&gt;oracle naloge&lt;/li&gt;
&lt;li&gt;relayer ključeve&lt;/li&gt;
&lt;li&gt;RPC credentials&lt;/li&gt;
&lt;li&gt;CI/CD pipeline&lt;/li&gt;
&lt;li&gt;package registry&lt;/li&gt;
&lt;li&gt;DNS i frontend&lt;/li&gt;
&lt;li&gt;indexer infrastrukturu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Privilegovane operacije ne bi trebalo držati iza jednog browser walleta zaposlenog. Multisig, hardverski walleti, jasno odvojene role i timelock mehanizmi omogućavaju kontrolisaniji operativni model.&lt;/p&gt;

&lt;p&gt;Događaje koji menjaju kritične parametre treba pratiti offchain. Monitoring može upozoriti na:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;promenu administratora&lt;/li&gt;
&lt;li&gt;upgrade implementacije&lt;/li&gt;
&lt;li&gt;neuobičajeno veliki transfer&lt;/li&gt;
&lt;li&gt;pauziranje protokola&lt;/li&gt;
&lt;li&gt;dodelu privilegovane role&lt;/li&gt;
&lt;li&gt;promenu oracle izvora&lt;/li&gt;
&lt;li&gt;neočekivanu učestalost poziva&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jednostavniji ugovor obično ima manju površinu napada. Modularnost je korisna, ali svaki dodatni proxy, bridge, oracle ili governance sloj uvodi nove failure modeove. [14]&lt;/p&gt;

&lt;h2&gt;
  
  
  Kada Ethereum ima smisla
&lt;/h2&gt;

&lt;p&gt;Ethereum je dobar kandidat kada su istovremeno važni:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zajedničko stanje između nezavisnih strana&lt;/li&gt;
&lt;li&gt;javna proverljivost&lt;/li&gt;
&lt;li&gt;programabilna pravila&lt;/li&gt;
&lt;li&gt;otpornost na jednostranu administrativnu izmenu&lt;/li&gt;
&lt;li&gt;digitalna imovina ili prava koja ugovor direktno kontroliše&lt;/li&gt;
&lt;li&gt;interoperabilnost sa postojećim ugovorima i tokenima&lt;/li&gt;
&lt;li&gt;mogućnost da korisnik sam čuva i autorizuje svoju imovinu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Naročito je koristan kada aplikacija ne bi trebalo da bude samo proizvod jedne kompanije, već protokol koji mogu koristiti drugi proizvodi.&lt;/p&gt;

&lt;p&gt;Pametni ugovor tada liči na javni backend čija pravila, stanje i istoriju mogu proveriti svi učesnici.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kada ga ne treba koristiti
&lt;/h2&gt;

&lt;p&gt;Ethereum verovatno nije odgovarajući izbor ako:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aplikacija zahteva privatne podatke u osnovnom modelu&lt;/li&gt;
&lt;li&gt;jedan operator već ima legitimno puno ovlašćenje&lt;/li&gt;
&lt;li&gt;transakcije moraju biti besplatne i trenutno potvrđene&lt;/li&gt;
&lt;li&gt;podaci se često menjaju i nemaju dugoročnu vrednost&lt;/li&gt;
&lt;li&gt;potreban je intenzivan CPU ili storage workload&lt;/li&gt;
&lt;li&gt;poslovna pravila moraju često i nepredvidivo da se menjaju&lt;/li&gt;
&lt;li&gt;korisnici ne mogu upravljati ključevima niti koristiti posredovani wallet&lt;/li&gt;
&lt;li&gt;nema realne potrebe za nezavisnom proverom stanja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blockchain ne uklanja poverenje. On ga preraspoređuje.&lt;/p&gt;

&lt;p&gt;Umesto poverenja u jednog administratora, sistem može zahtevati poverenje u kod ugovora, governance, oracle, wallet, bridge, sequencer, frontend i upravljanje ključevima. Dobar dizajn jasno opisuje svaku od tih pretpostavki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta developer zapravo dobija
&lt;/h2&gt;

&lt;p&gt;Ethereum nije privlačan zato što predstavlja neobičan način čuvanja podataka. Njegova vrednost je u kombinaciji nekoliko osobina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;izvršavanje je determinističko&lt;/li&gt;
&lt;li&gt;stanje je javno proverljivo&lt;/li&gt;
&lt;li&gt;transakcije su kriptografski autorizovane&lt;/li&gt;
&lt;li&gt;pravila su programabilna&lt;/li&gt;
&lt;li&gt;ugovori su međusobno kompozabilni&lt;/li&gt;
&lt;li&gt;digitalna imovina može biti deo samog execution modela&lt;/li&gt;
&lt;li&gt;više koraka može se izvršiti atomski&lt;/li&gt;
&lt;li&gt;aplikacija može biti dostupna nezavisno od jednog backend operatora&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cena tih osobina su složeniji razvoj, ograničen throughput, promenljive naknade, javnost podataka i mnogo veća odgovornost za bezbednost.&lt;/p&gt;

&lt;p&gt;Najbolji način da se razume Ethereum nije pravljenje još jednog tokena. Korisniji eksperiment je uzeti mali problem sa jasnom trust granicom, zapisati jedno kritično stanje u ugovor i izgraditi ostatak sistema kao normalnu aplikaciju.&lt;/p&gt;

&lt;p&gt;Tek tada postaje očigledno šta pripada blockchainu, a šta nikada nije trebalo stavljati na njega.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/intro-to-ethereum/" rel="noopener noreferrer"&gt;Technical introduction to Ethereum&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://ethereum.org/developers/docs/accounts/" rel="noopener noreferrer"&gt;Ethereum accounts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/transactions/" rel="noopener noreferrer"&gt;Ethereum transactions&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/nodes-and-clients/" rel="noopener noreferrer"&gt;Ethereum nodes and clients&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/consensus-mechanisms/pos/" rel="noopener noreferrer"&gt;Proof-of-stake consensus&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/evm/" rel="noopener noreferrer"&gt;Ethereum Virtual Machine&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/smart-contracts/" rel="noopener noreferrer"&gt;Introduction to smart contracts&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/gas/" rel="noopener noreferrer"&gt;Ethereum gas and fees&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/scaling/" rel="noopener noreferrer"&gt;Ethereum scaling&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/roadmap/fusaka/" rel="noopener noreferrer"&gt;Fusaka protocol upgrade&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/apis/json-rpc/" rel="noopener noreferrer"&gt;Ethereum JSON-RPC API&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.ethers.org/v6/getting-started/" rel="noopener noreferrer"&gt;ethers.js documentation&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/networks/" rel="noopener noreferrer"&gt;Ethereum networks and testnets&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ethereum.org/developers/docs/smart-contracts/security/" rel="noopener noreferrer"&gt;Smart contract security&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Bitcoin iz ugla developera: protokol, čvorovi i kod</title>
      <dc:creator>Dora Milen</dc:creator>
      <pubDate>Fri, 18 Sep 2026 00:41:39 +0000</pubDate>
      <link>https://dev.to/kriptomuza/bitcoin-iz-ugla-developera-protokol-cvorovi-i-kod-30l9</link>
      <guid>https://dev.to/kriptomuza/bitcoin-iz-ugla-developera-protokol-cvorovi-i-kod-30l9</guid>
      <description>&lt;p&gt;Bitcoin se često opisuje kao digitalni novac, kriptovaluta, investicija ili blockchain. Sve su to korisne prečice, ali nijedna ne objašnjava šta sistem zapravo radi.&lt;/p&gt;

&lt;p&gt;Iz ugla developera, Bitcoin je distribuirani protokol za održavanje zajedničkog skupa nepotrošenih izlaza transakcija. Učesnici ne moraju da veruju centralnom serveru, administratoru baze ili procesoru plaćanja. Umesto toga, svaki potpuno validirajući čvor može samostalno da proveri istoriju, pravila izdavanja i svaku promenu stanja.&lt;/p&gt;

&lt;p&gt;To ne znači da je Bitcoin bez poverenja u apsolutnom smislu. I dalje verujete sopstvenom softveru, operativnom sistemu, hardveru, načinu na koji ste dobili binarne fajlove i sopstvenoj implementaciji poslovne logike. Ključna razlika je u tome što protokol omogućava nezavisnu proveru umesto obaveznog oslanjanja na jednu instituciju.&lt;/p&gt;

&lt;p&gt;Za developera je zato Bitcoin zanimljiviji kao sistem nego kao tržišna cena. U njemu se ukrštaju distribuirani sistemi, kriptografija, mrežni protokoli, upravljanje ključevima, baze podataka, eventualna konzistentnost i neprijateljsko okruženje u kojem svaki ulaz mora da se tretira kao nepoverljiv.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta je Bitcoin, precizno
&lt;/h2&gt;

&lt;p&gt;Bitcoin obuhvata nekoliko povezanih pojmova:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bitcoin je protokol koji definiše validne transakcije i blokove.&lt;/li&gt;
&lt;li&gt;Bitcoin je peer-to-peer mreža čvorova koji razmenjuju transakcije i blokove.&lt;/li&gt;
&lt;li&gt;Bitcoin je javna istorija potvrđenih transakcija organizovanih u lanac blokova.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bitcoin&lt;/code&gt;, odnosno BTC, jeste obračunska jedinica tog sistema.&lt;/li&gt;
&lt;li&gt;Bitcoin Core je jedna implementacija protokola, ujedno najčešće korišćena za potpuno validirajuće čvorove.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ne postoji centralni Bitcoin server. Ne postoji jedna zvanična baza koju svi klijenti pozivaju. Ne postoji administratorski endpoint koji može da promeni stanje naloga.&lt;/p&gt;

&lt;p&gt;Čvorovi komuniciraju preko peer-to-peer mreže, ali svaki čvor lokalno odlučuje da li su primljeni podaci validni. Ako peer pošalje blok koji stvara nedozvoljenu količinu bitcoina ili troši nepostojeći izlaz, ispravan čvor ga odbacuje bez obzira na to koliko je rada uloženo u taj blok.&lt;/p&gt;

&lt;p&gt;Bitcoin se zbog toga može posmatrati kao deterministički validator okružen nedeterminističkom mrežom. Redosled prijema poruka, skup peerova i sadržaj lokalnog mempoola mogu da se razlikuju. Pravila validacije iste transakcije ili bloka moraju da daju isti rezultat na svim kompatibilnim čvorovima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bitcoin nema naloge ni stanje računa
&lt;/h2&gt;

&lt;p&gt;Jedna od prvih konceptualnih prepreka jeste to što Bitcoin ne koristi model naloga kakav postoji u banci ili većini poslovnih aplikacija.&lt;/p&gt;

&lt;p&gt;Ne postoji zapis poput:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alice.balance = 1.5 BTC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Umesto toga, Bitcoin koristi UTXO model. UTXO je skraćenica za &lt;em&gt;unspent transaction output&lt;/em&gt;, odnosno nepotrošeni izlaz transakcije.&lt;/p&gt;

&lt;p&gt;Svaka transakcija:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;troši jedan ili više prethodnih izlaza,&lt;/li&gt;
&lt;li&gt;kreira jedan ili više novih izlaza,&lt;/li&gt;
&lt;li&gt;implicitno plaća naknadu kao razliku između ukupnih ulaza i izlaza.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pojednostavljen prikaz izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ulazi:
  prethodni izlaz A: 80.000 sat
  prethodni izlaz B: 50.000 sat

Izlazi:
  primalac:           100.000 sat
  kusur:               28.500 sat

Naknada:
  1.500 sat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jedan bitcoin deli se na 100.000.000 satoshija. Konsenzus i Bitcoin Core interno rade sa celobrojnim iznosima najmanje jedinice, a ne sa decimalnim floating-point vrednostima. Finansijski kod koji BTC iznose čuva kao &lt;code&gt;float&lt;/code&gt; ili &lt;code&gt;double&lt;/code&gt; uvodi nepotreban rizik zaokruživanja.&lt;/p&gt;

&lt;p&gt;Formalno, za validnu običnu transakciju važi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zbir ulaza &amp;gt;= zbir izlaza
naknada = zbir ulaza - zbir izlaza
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Svaki ulaz referencira prethodnu transakciju pomoću njenog identifikatora i indeksa izlaza, često predstavljenih kao &lt;code&gt;txid:vout&lt;/code&gt;. Ulaz zatim pruža podatke potrebne da zadovolji uslov trošenja tog izlaza.&lt;/p&gt;

&lt;p&gt;Kada korisnički interfejs prikazuje balans novčanika, on zapravo sabira UTXO izlaze koje novčanik ume da potroši ili prati.&lt;/p&gt;

&lt;p&gt;To ima praktične posledice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jedna uplata ne menja numeričko polje na računu, već kreira novi UTXO.&lt;/li&gt;
&lt;li&gt;Za plaćanje većeg iznosa novčanik može da kombinuje više UTXO-a.&lt;/li&gt;
&lt;li&gt;Ako je izabrani UTXO veći od plaćanja, kreira se izlaz za kusur.&lt;/li&gt;
&lt;li&gt;Veći broj ulaza obično znači veću transakciju i višu naknadu.&lt;/li&gt;
&lt;li&gt;Dva korisnika sa istim balansom mogu imati veoma različite troškove sledećeg plaćanja.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UTXO selekcija zato nije trivijalan detalj novčanika. Ona utiče na naknade, privatnost, fragmentaciju sredstava i mogućnost budućeg trošenja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta se nalazi u transakciji
&lt;/h2&gt;

&lt;p&gt;Bitcoin transakcija sadrži verziju, ulaze, izlaze i polje za vremensko zaključavanje. Kod SegWit transakcija postoje i odvojeni witness podaci.&lt;/p&gt;

&lt;p&gt;Svaki ulaz tipično sadrži:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identifikator prethodne transakcije,&lt;/li&gt;
&lt;li&gt;indeks prethodnog izlaza,&lt;/li&gt;
&lt;li&gt;podatke za otključavanje ili odgovarajući witness,&lt;/li&gt;
&lt;li&gt;sequence vrednost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Svaki izlaz sadrži:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iznos u satoshijima,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scriptPubKey&lt;/code&gt;, odnosno program koji definiše uslov budućeg trošenja.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adresa nije deo protokola na isti način kao transakcioni izlaz. Ona je korisnički format za kodiranje informacija iz kojih novčanik konstruiše odgovarajući &lt;code&gt;scriptPubKey&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To znači da bitcoin nije bukvalno „poslat na adresu“. Transakcija kreira izlaz sa uslovom trošenja. Novčanik primaoca poseduje ili može da proizvede podatke potrebne za zadovoljenje tog uslova.&lt;/p&gt;

&lt;p&gt;Najčešći savremeni formati uključuju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SegWit izlaze sa adresama koje obično počinju sa &lt;code&gt;bc1q&lt;/code&gt; na glavnoj mreži,&lt;/li&gt;
&lt;li&gt;Taproot izlaze sa adresama koje obično počinju sa &lt;code&gt;bc1p&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;starije formate koji ostaju validni, ali nisu uvek najbolji izbor za nove integracije.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aplikacija ne bi trebalo da validira Bitcoin adresu samo regularnim izrazom. Potrebno je proveriti mrežu, checksum, verziju witness programa, dužinu i pravila konkretnog formata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script nije pametni ugovor opšte namene
&lt;/h2&gt;

&lt;p&gt;Uslovi trošenja izražavaju se pomoću Bitcoin Script jezika. To je ograničen, stack-based jezik projektovan tako da validacija bude deterministička i kontrolisana.&lt;/p&gt;

&lt;p&gt;Tipičan uslov u suštini kaže: „Pokaži validan digitalni potpis koji odgovara ovom javnom ključu.“&lt;/p&gt;

&lt;p&gt;Složeniji uslovi mogu zahtevati:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;potpise više ključeva,&lt;/li&gt;
&lt;li&gt;čekanje do određene visine bloka,&lt;/li&gt;
&lt;li&gt;čekanje određene količine vremena,&lt;/li&gt;
&lt;li&gt;otkrivanje preimage vrednosti za poznati hash,&lt;/li&gt;
&lt;li&gt;kombinaciju više pravila.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bitcoin Script nije zamišljen kao virtuelna mašina za pokretanje proizvoljnih aplikacija. Nema klasične neograničene petlje i namerno je restriktivan. Njegov primarni posao je autorizacija trošenja, ne hostovanje opšteg aplikativnog stanja.&lt;/p&gt;

&lt;p&gt;Taproot je unapredio način na koji se predstavljaju ključevi i složeni uslovi. Omogućava trošenje preko ključa, kao i otkrivanje samo izvršene grane skripte kada je potreban script path. Time složene politike mogu biti efikasnije i privatnije, pod uslovom da su pravilno projektovane.[1]&lt;/p&gt;

&lt;h2&gt;
  
  
  Privatni ključ nije lozinka koju možete resetovati
&lt;/h2&gt;

&lt;p&gt;Vlasništvo nad bitcoinom u praksi znači mogućnost stvaranja validnog potpisa za određeni izlaz.&lt;/p&gt;

&lt;p&gt;Privatni ključ je tajni broj iz dozvoljenog opsega krive &lt;code&gt;secp256k1&lt;/code&gt;. Iz njega se izvodi javni ključ. Potpis dokazuje da potpisnik poseduje privatni ključ, bez objavljivanja samog ključa.&lt;/p&gt;

&lt;p&gt;Bitcoin koristi ECDSA potpise za starije tipove izlaza i Schnorr potpise definisane za Taproot.&lt;/p&gt;

&lt;p&gt;Privatni ključ nije:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nalog na serveru,&lt;/li&gt;
&lt;li&gt;šifra koju servis može da promeni,&lt;/li&gt;
&lt;li&gt;podatak koji treba poslati API-ju treće strane,&lt;/li&gt;
&lt;li&gt;vrednost koju je bezbedno zapisati u log.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako se ključ izgubi bez rezervne kopije, ne postoji centralna procedura za oporavak. Ako ga neko kopira, originalni vlasnik ne dobija obaveštenje. Napadač može potpisati transakciju i sredstva poslati na sopstveni izlaz.&lt;/p&gt;

&lt;p&gt;Zbog toga ozbiljan novčanik obično ne upravlja gomilom nasumičnih, nepovezanih ključeva. Hijerarhijski deterministički novčanici izvode veliki broj ključeva iz početnog tajnog materijala. Descriptor novčanici dodatno eksplicitno opisuju koje skripte i ključeve novčanik prati.[2]&lt;/p&gt;

&lt;p&gt;Seed fraza je samo jedna moguća reprezentacija tajnog materijala. Ona nije bitcoin na papiru. Bitcoin ostaje zabeležen kroz UTXO skup, dok seed omogućava rekonstrukciju ključeva potrebnih za trošenje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako transakcija stiže do potvrde
&lt;/h2&gt;

&lt;p&gt;Životni ciklus jedne transakcije približno izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A[Novčanik bira UTXO-e] --&amp;gt; B[Formira izlaze i kusur]
    B --&amp;gt; C[Izračunava naknadu]
    C --&amp;gt; D[Potpisuje ulaze]
    D --&amp;gt; E[Šalje transakciju peerovima]
    E --&amp;gt; F[Čvorovi je validiraju]
    F --&amp;gt; G[Lokalni mempool]
    G --&amp;gt; H[Rudar je uključuje u blok]
    H --&amp;gt; I[Čvorovi proveravaju blok]
    I --&amp;gt; J[Potvrđena transakcija]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Novčanik najpre bira UTXO-e koje će potrošiti. Zatim formira izlaz za primaoca, eventualni izlaz za kusur i odgovarajuću naknadu. Nakon potpisivanja šalje serijalizovanu transakciju jednom ili više čvorova.&lt;/p&gt;

&lt;p&gt;Čvor proverava, između ostalog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;da li je format transakcije ispravan,&lt;/li&gt;
&lt;li&gt;da li referencirani izlazi postoje i nisu već potrošeni,&lt;/li&gt;
&lt;li&gt;da li potpisi i skripte prolaze validaciju,&lt;/li&gt;
&lt;li&gt;da li su iznosi u dozvoljenim granicama,&lt;/li&gt;
&lt;li&gt;da li je transakcija finalna prema pravilima zaključavanja,&lt;/li&gt;
&lt;li&gt;da li zadovoljava lokalnu relay politiku.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako je prihvati, čvor je obično smešta u svoj mempool i prosleđuje peerovima.&lt;/p&gt;

&lt;p&gt;Važno je da ne postoji jedan globalni mempool. Svaki čvor ima sopstveni pogled na nepotvrđene transakcije. Mempool može da se razlikuje zbog vremena prijema, konfiguracije, minimalne naknade, zamene transakcija i ograničenja memorije.&lt;/p&gt;

&lt;p&gt;Status „nalazi se u mempoolu“ zato nije konsenzusna činjenica. To je lokalno zapažanje jednog čvora.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta rudari zapravo rade
&lt;/h2&gt;

&lt;p&gt;Rudari biraju transakcije, konstruišu kandidata za blok i pokušavaju da pronađu validan proof of work.&lt;/p&gt;

&lt;p&gt;Blok sadrži zaglavlje i listu transakcija. Zaglavlje ima 80 bajtova i uključuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;verziju,&lt;/li&gt;
&lt;li&gt;hash prethodnog bloka,&lt;/li&gt;
&lt;li&gt;Merkle root transakcija,&lt;/li&gt;
&lt;li&gt;vremensku oznaku,&lt;/li&gt;
&lt;li&gt;kodirani cilj težine,&lt;/li&gt;
&lt;li&gt;nonce.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rudar menja nonce i druge promenljive u kandidatu, računa dvostruki SHA-256 hash zaglavlja i traži rezultat manji od trenutnog cilja.&lt;/p&gt;

&lt;p&gt;Proof of work ne dokazuje da je blok validan. On dokazuje da je uložen očekivani računarski rad. Čvor i dalje proverava sve transakcije i sva konsenzusna pravila.&lt;/p&gt;

&lt;p&gt;Ovo razdvaja dve uloge koje se često pogrešno spajaju:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rudari predlažu redosled validnih transakcija i ulažu rad.&lt;/li&gt;
&lt;li&gt;Čvorovi odlučuju da li predloženi blok poštuje pravila koja oni izvršavaju.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rudar ne može da natera ispravan čvor da prihvati nevalidnu transakciju. Može da bira koje validne transakcije će uključiti, može privremeno da ih cenzuriše u sopstvenim blokovima i može da pokuša reorganizaciju lanca, ali ne može jednostrano da promeni pravila validacije.&lt;/p&gt;

&lt;h2&gt;
  
  
  Odakle dolazi novi bitcoin
&lt;/h2&gt;

&lt;p&gt;Prva transakcija u svakom bloku je coinbase transakcija. Ona nema standardne ulaze i omogućava rudaru da potražuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trenutno dozvoljenu subvenciju bloka,&lt;/li&gt;
&lt;li&gt;zbir naknada svih drugih transakcija u bloku.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subvencija se periodično prepolovljava prema unapred definisanom rasporedu. Time se tempo izdavanja smanjuje, a ukupna količina konvergira ka granici nešto manjoj od 21 milion BTC.&lt;/p&gt;

&lt;p&gt;Čvorovi proveravaju da coinbase ne stvara više nego što je dozvoljeno. Rudar može potraživati manje, ali ne može naterati validirajuće čvorove da prihvate veću nagradu.&lt;/p&gt;

&lt;p&gt;Coinbase izlazi imaju dodatno pravilo zrelosti. Ne mogu se odmah potrošiti, što postaje vidljivo i pri radu na lokalnoj &lt;code&gt;regtest&lt;/code&gt; mreži.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kako mreža bira istoriju
&lt;/h2&gt;

&lt;p&gt;Fraza „najduži lanac“ je praktična, ali nije sasvim precizna. Čvor bira validan lanac sa najvećim kumulativnim dokazanim radom, odnosno najvećim chainwork-om.&lt;/p&gt;

&lt;p&gt;Ponekad dva rudara pronađu različite validne blokove približno istovremeno. Deo mreže prvo vidi jedan, a deo drugi blok. Kada se pojavi naredni blok, jedna grana obično dobija više kumulativnog rada i postaje aktivna.&lt;/p&gt;

&lt;p&gt;Tada može doći do reorganizacije. Transakcija iz napuštene grane može:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ponovo postati nepotvrđena,&lt;/li&gt;
&lt;li&gt;biti potvrđena u novoj grani,&lt;/li&gt;
&lt;li&gt;postati konfliktna ako druga transakcija troši iste ulaze.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bitcoin zato nema trenutnu apsolutnu finalnost. Svaki dodatni blok iznad transakcije povećava cenu reorganizacije, ali ne proizvodi matematički trenutak posle kojeg je reorganizacija nemoguća.&lt;/p&gt;

&lt;p&gt;Broj potrebnih potvrda treba vezati za rizik:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Digitalni sadržaj male vrednosti može tolerisati nepotvrđenu uplatu.&lt;/li&gt;
&lt;li&gt;Roba koja još nije poslata može čekati jednu ili nekoliko potvrda.&lt;/li&gt;
&lt;li&gt;Velika i nepovratna isporuka zahteva konzervativniju politiku.&lt;/li&gt;
&lt;li&gt;Sistem mora ostati korektan čak i ako se već viđena potvrda privremeno izgubi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fiksno pravilo „šest potvrda za sve“ lakše je implementirati, ali nije uvek dobro modelovanje poslovnog rizika.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konsenzusna pravila i relay politika nisu isto
&lt;/h2&gt;

&lt;p&gt;Bitcoin Core razlikuje pravila konsenzusa od lokalne politike prihvatanja i prosleđivanja nepotvrđenih transakcija.&lt;/p&gt;

&lt;p&gt;Konsenzusna pravila određuju da li transakcija sme da bude deo validnog bloka. Relay politika određuje da li će konkretan čvor nepotvrđenu transakciju prihvatiti u mempool i proslediti dalje.&lt;/p&gt;

&lt;p&gt;Transakcija može biti konsenzusno validna, ali nestandardna prema politici određenog čvora. Takva transakcija nije nužno zabranjena u bloku, ali može biti teško distribuirana kroz mrežu.&lt;/p&gt;

&lt;p&gt;Za aplikativnog developera ovo znači da „lokalni RPC je prihvatio transakciju“ i „transakcija će pouzdano stići do rudara“ nisu potpuno ista tvrdnja.&lt;/p&gt;

&lt;p&gt;Politike se mogu menjati između verzija softvera. Integracija koja zavisi od graničnog mempool ponašanja mora se testirati sa verzijom i konfiguracijom koja će zaista biti korišćena.&lt;/p&gt;

&lt;h2&gt;
  
  
  Koliko Bitcoin transakcija košta
&lt;/h2&gt;

&lt;p&gt;Bitcoin protokol nema fiksnu cenu transakcije i naknada nije procenat poslatog iznosa.&lt;/p&gt;

&lt;p&gt;Naknada zavisi od dve stvari:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;naknada = feerate × virtuelna veličina transakcije
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;feerate&lt;/code&gt; se obično izražava u satoshijima po virtuelnom bajtu, odnosno &lt;code&gt;sat/vB&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Virtuelna veličina zavisi od strukture transakcije:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;broja i tipa ulaza,&lt;/li&gt;
&lt;li&gt;broja i tipa izlaza,&lt;/li&gt;
&lt;li&gt;vrste skripti,&lt;/li&gt;
&lt;li&gt;količine witness podataka.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transakcija koja šalje malu vrednost može biti skuplja od transakcije velike vrednosti ako troši mnogo malih UTXO-a.&lt;/p&gt;

&lt;p&gt;Tržište naknada nastaje zato što je prostor u blokovima ograničen. Kada mnogo korisnika želi brzo potvrđivanje, rudari uglavnom biraju transakcije sa većim efektivnim feerate-om.&lt;/p&gt;

&lt;p&gt;Bitcoin Core nudi procenu naknade preko RPC metode &lt;code&gt;estimatesmartfee&lt;/code&gt;, ali rezultat je procena zasnovana na prethodnom ponašanju mreže, ne garancija vremena potvrde.[3]&lt;/p&gt;

&lt;p&gt;Ukupan trošak integracije može uključivati i:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mrežnu naknadu za povlačenje ili konsolidaciju UTXO-a,&lt;/li&gt;
&lt;li&gt;infrastrukturu i skladište za sopstveni čvor,&lt;/li&gt;
&lt;li&gt;bandwidth tokom početne sinhronizacije,&lt;/li&gt;
&lt;li&gt;održavanje rezervnih kopija i sistema za ključeve,&lt;/li&gt;
&lt;li&gt;naknade ili spread posredničkog servisa,&lt;/li&gt;
&lt;li&gt;računovodstvene i regulatorne troškove.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aktuelna Bitcoin Core dokumentacija navodi da potpuna početna sinhronizacija zahteva preuzimanje stotina gigabajta podataka. Pruning može znatno smanjiti trajno zauzeće diska, ali pruned čvor ne može kasnije da posluži sve stare blokove bez ponovnog preuzimanja.[4]&lt;/p&gt;

&lt;h2&gt;
  
  
  SegWit, težina i zašto veličina nije samo broj bajtova
&lt;/h2&gt;

&lt;p&gt;Segregated Witness odvaja podatke potpisa od osnovnog dela transakcije i uvodi obračun težine. Zbog toga se naknade u korisničkim interfejsima često računaju preko virtuelnih bajtova, a ne proste serijalizovane veličine.&lt;/p&gt;

&lt;p&gt;SegWit takođe razlikuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;txid&lt;/code&gt;, identifikator izračunat bez witness dela,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wtxid&lt;/code&gt;, identifikator koji uključuje witness podatke.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ovo je važno kada indeksirate transakcije, gradite explorer ili pratite objekte pre potvrde.&lt;/p&gt;

&lt;p&gt;SegWit je rešio praktične probleme sa klasičnom transakcionom malleability i omogućio efikasnije protokole višeg sloja. Nije samo novi format adrese.[5]&lt;/p&gt;

&lt;h2&gt;
  
  
  Replace-by-fee i ubrzavanje transakcija
&lt;/h2&gt;

&lt;p&gt;Pošiljalac može napraviti novu verziju nepotvrđene transakcije sa većom naknadom ako su ispunjeni odgovarajući uslovi politike. Ovaj mehanizam se obično naziva replace-by-fee ili RBF.&lt;/p&gt;

&lt;p&gt;Druga tehnika je child-pays-for-parent. Nova transakcija troši izlaz nepotvrđene roditeljske transakcije i dodaje dovoljno visoku naknadu da paket bude privlačan za uključivanje u blok.&lt;/p&gt;

&lt;p&gt;Za payment backend iz toga slede dva važna pravila:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nepotvrđena transakcija nije konačan objekat samo zato što imate njen &lt;code&gt;txid&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Poslovna logika mora da prati konflikte, zamene i potrošnju očekivanih izlaza.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ako proizvod prihvata zero-confirmation plaćanja, to je eksplicitno preuzimanje rizika radi boljeg korisničkog iskustva. Nije svojstvo protokola koje garantuje naplatu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full node, lagani klijent ili tuđi API
&lt;/h2&gt;

&lt;p&gt;Postoje tri uobičajena načina da aplikacija sazna šta se dešava na Bitcoin mreži.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sopstveni potpuno validirajući čvor
&lt;/h3&gt;

&lt;p&gt;Aplikacija komunicira sa Bitcoin Core čvorom preko lokalnog ili privatnog JSON-RPC interfejsa.&lt;/p&gt;

&lt;p&gt;Prednosti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;samostalna validacija konsenzusnih pravila,&lt;/li&gt;
&lt;li&gt;nema zavisnosti od tuđeg prikaza blockchaina,&lt;/li&gt;
&lt;li&gt;bolja kontrola privatnosti,&lt;/li&gt;
&lt;li&gt;direktan pristup mempoolu, blokovima i wallet funkcijama.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nedostaci:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;početna sinhronizacija,&lt;/li&gt;
&lt;li&gt;disk, bandwidth i operativno održavanje,&lt;/li&gt;
&lt;li&gt;potreba za praćenjem verzija i bezbednosnih objava,&lt;/li&gt;
&lt;li&gt;sopstveno rešavanje dostupnosti i indeksiranja.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lagani klijent
&lt;/h3&gt;

&lt;p&gt;Lagani klijent ne preuzima i ne validira sve podatke na isti način kao full node. Može koristiti zaglavlja blokova i kompaktne filtere kako bi pronašao potencijalno relevantne transakcije.&lt;/p&gt;

&lt;p&gt;To smanjuje zahteve uređaja, ali menja model poverenja, privatnosti i dostupnosti podataka. BIP 157 i BIP 158 definišu protokole i filtere koji omogućavaju da klijent preuzima filtere i lokalno odlučuje koje blokove treba detaljnije proveriti.[6]&lt;/p&gt;

&lt;h3&gt;
  
  
  Hosted API ili procesor plaćanja
&lt;/h3&gt;

&lt;p&gt;Treća strana može ponuditi webhookove, generisanje invoice-a, konverziju, custody i administrativni interfejs.&lt;/p&gt;

&lt;p&gt;To ubrzava razvoj, ali uvodi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;poverenje u podatke i dostupnost provajdera,&lt;/li&gt;
&lt;li&gt;custody rizik ako provajder drži ključeve,&lt;/li&gt;
&lt;li&gt;identifikaciju korisnika i operativna ograničenja,&lt;/li&gt;
&lt;li&gt;naknade i potencijalni vendor lock-in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nijedan pristup nije univerzalno najbolji. Čest kompromis je korišćenje sopstvenog čvora za verifikaciju i posebnog servisa za funkcije koje proizvod ne želi sam da održava.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimalan lokalni eksperiment sa Bitcoin Core
&lt;/h2&gt;

&lt;p&gt;Za razvoj ne treba koristiti pravi BTC. Bitcoin Core ima &lt;code&gt;regtest&lt;/code&gt;, privatni režim u kojem lokalno generišete blokove kada su vam potrebni.&lt;/p&gt;

&lt;p&gt;Sledeći primer pretpostavlja instalirane komande &lt;code&gt;bitcoind&lt;/code&gt; i &lt;code&gt;bitcoin-cli&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bitcoind &lt;span class="nt"&gt;-regtest&lt;/span&gt; &lt;span class="nt"&gt;-daemon&lt;/span&gt;

bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; createwallet payer
bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; createwallet merchant

&lt;span class="nv"&gt;MINER_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
    bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; &lt;span class="nt"&gt;-rpcwallet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;payer getnewaddress
&lt;span class="si"&gt;)&lt;/span&gt;

bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; generatetoaddress 101 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MINER_ADDRESS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;PAYMENT_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
    bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; &lt;span class="nt"&gt;-rpcwallet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;merchant getnewaddress
&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;TXID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
    bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; &lt;span class="nt"&gt;-rpcwallet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;payer &lt;span class="se"&gt;\&lt;/span&gt;
        sendtoaddress &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAYMENT_ADDRESS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 0.001
&lt;span class="si"&gt;)&lt;/span&gt;

bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; getrawmempool
bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; generatetoaddress 1 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MINER_ADDRESS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

bitcoin-cli &lt;span class="nt"&gt;-regtest&lt;/span&gt; &lt;span class="nt"&gt;-rpcwallet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;merchant gettransaction &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TXID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prvih 101 blokova nisu tu radi simulacije realnog protoka vremena. Potrebni su da bi coinbase izlaz postao potrošiv nakon propisane zrelosti.&lt;/p&gt;

&lt;p&gt;Ovaj eksperiment pokazuje nekoliko osnovnih stvari:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adrese generiše konkretan wallet,&lt;/li&gt;
&lt;li&gt;transakcija se prvo pojavljuje kao nepotvrđena,&lt;/li&gt;
&lt;li&gt;rudar, u ovom slučaju lokalna komanda, uključuje je u blok,&lt;/li&gt;
&lt;li&gt;wallet nakon novog bloka vidi potvrdu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;regtest&lt;/code&gt; nije simulacija ekonomskih uslova glavne mreže. Nema realno tržište naknada, distribuirane peerove ni konkurentne rudare. Namenjen je determinističkim integracionim testovima.&lt;/p&gt;

&lt;p&gt;Za javno testiranje postoje test mreže, ali testni novčići nemaju namenu produkcionog novca.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSON-RPC nije javni web API
&lt;/h2&gt;

&lt;p&gt;Bitcoin Core izlaže JSON-RPC namenjen pouzdanim klijentima u kontrolisanom okruženju. Ne treba ga direktno objaviti na internetu niti proslediti korisničkom frontendu.&lt;/p&gt;

&lt;p&gt;Tipična arhitektura izgleda ovako:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    U[Korisnički klijent] --&amp;gt; A[Aplikativni API]
    A --&amp;gt; D[(Baza invoice-a)]
    A --&amp;gt; Q[Red poslova]
    Q --&amp;gt; W[Bitcoin worker]
    W --&amp;gt; N[Bitcoin Core čvor]
    N --&amp;gt; P[Bitcoin P2P mreža]
    W --&amp;gt; D
    D --&amp;gt; A&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Aplikativni sloj treba da:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;autentifikuje poslovne zahteve,&lt;/li&gt;
&lt;li&gt;mapira invoice na očekivanu skriptu ili adresu,&lt;/li&gt;
&lt;li&gt;čuva iznose kao integer satoshije,&lt;/li&gt;
&lt;li&gt;prati potvrde i reorganizacije,&lt;/li&gt;
&lt;li&gt;primenjuje politiku isporuke,&lt;/li&gt;
&lt;li&gt;ograniči RPC privilegije,&lt;/li&gt;
&lt;li&gt;spreči da proizvoljni RPC poziv stigne do čvora.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bitcoin Core podržava RPC metode za blockchain, mrežu, mempool, novčanike, transakcije i procenu naknada.[7] Koje metode treba koristiti zavisi od toga da li aplikacija čuva privatne ključeve u Core wallet-u ili čvor koristi samo kao validator i izvor podataka.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realan use-case: backend za Bitcoin invoice
&lt;/h2&gt;

&lt;p&gt;Zamislimo SaaS proizvod koji prodaje godišnju licencu i želi da prihvati on-chain Bitcoin bez automatske konverzije unutar samog backenda.&lt;/p&gt;

&lt;p&gt;Dobar workflow bi mogao da izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Backend kreira invoice sa internim ID-em.&lt;/li&gt;
&lt;li&gt;Za invoice rezerviše novu adresu iz kontrolisanog wallet descriptora.&lt;/li&gt;
&lt;li&gt;Zaključava cenu na ograničeno vreme prema izabranom izvoru kursa.&lt;/li&gt;
&lt;li&gt;Iznos čuva kao integer broj satoshija.&lt;/li&gt;
&lt;li&gt;Prati transakcije koje kreiraju izlaz ka očekivanoj skripti.&lt;/li&gt;
&lt;li&gt;Beleži nepotvrđenu uplatu, ali još ne aktivira nepovratnu isporuku.&lt;/li&gt;
&lt;li&gt;Nakon definisanog broja potvrda menja invoice u &lt;code&gt;paid&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ako dođe do reorganizacije, ponovo izračunava status.&lt;/li&gt;
&lt;li&gt;Posebno obrađuje premalu, preveliku, zakasnelu i višestruku uplatu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Model stanja može biti jednostavan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pending
seen_unconfirmed
confirming
paid
expired
underpaid
overpaid
conflicted
refunded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Greška je modelovati status samo kao boolean &lt;code&gt;paid&lt;/code&gt;. Distribuirani sistem ima prelazna stanja, a blockchain reorganizacije znače da čak ni prelaz iz nepotvrđenog u potvrđeno nije nužno monotono jednosmeran.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jedinstvena adresa po invoice-u
&lt;/h3&gt;

&lt;p&gt;Ponovna upotreba iste adrese olakšava implementaciju, ali otežava povezivanje uplata sa narudžbinama i ozbiljno narušava privatnost.&lt;/p&gt;

&lt;p&gt;Jedinstvena adresa po invoice-u omogućava direktno mapiranje izlaza na poslovni objekat. Ipak, treba izbegavati generisanje adresa bez pouzdane evidencije derivacionog stanja.&lt;/p&gt;

&lt;p&gt;Watch-only wallet može da prati uplate bez posedovanja privatnih ključeva. Potpisivanje se zatim može obavljati na odvojenom uređaju ili sistemu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ne tražite transakciju samo po iznosu
&lt;/h3&gt;

&lt;p&gt;Mapiranje uplate preko „tačno 0,001234 BTC“ krhko je zato što:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dva korisnika mogu poslati isti iznos,&lt;/li&gt;
&lt;li&gt;korisnik može poslati pogrešan iznos,&lt;/li&gt;
&lt;li&gt;uplata može stići posle isteka invoice-a,&lt;/li&gt;
&lt;li&gt;jedna transakcija može platiti više izlaza,&lt;/li&gt;
&lt;li&gt;korisnik može napraviti više delimičnih uplata.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Primarni identitet očekivane uplate treba vezati za skriptu ili namensku adresu, a iznos i vreme koristiti kao dodatna poslovna pravila.&lt;/p&gt;

&lt;h3&gt;
  
  
  Webhook nije izvor istine
&lt;/h3&gt;

&lt;p&gt;Ako koristite webhook, tretirajte ga kao signal da proverite stanje, ne kao konačni autoritet.&lt;/p&gt;

&lt;p&gt;Webhook može biti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;poslat više puta,&lt;/li&gt;
&lt;li&gt;isporučen van redosleda,&lt;/li&gt;
&lt;li&gt;zakasneo,&lt;/li&gt;
&lt;li&gt;izgubljen,&lt;/li&gt;
&lt;li&gt;lažiran ako autentifikacija nije dobra.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Handler treba da bude idempotentan. Stvarno stanje treba ponovo izračunati iz pouzdanog izvora podataka i sačuvati zajedno sa visinom bloka i hashom bloka koji je poslužio za odluku.&lt;/p&gt;

&lt;h2&gt;
  
  
  PSBT i odvajanje potpisivanja
&lt;/h2&gt;

&lt;p&gt;Partially Signed Bitcoin Transaction, odnosno PSBT, standardizuje razmenu nepotpisanih ili delimično potpisanih transakcija između različitih komponenti.[8]&lt;/p&gt;

&lt;p&gt;Tipičan tok izgleda ovako:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Online sistem bira UTXO-e i konstruiše predlog transakcije.&lt;/li&gt;
&lt;li&gt;PSBT se prenosi uređaju ili servisu za potpisivanje.&lt;/li&gt;
&lt;li&gt;Potpisnik proverava destinacije, iznose i naknadu.&lt;/li&gt;
&lt;li&gt;Jedan ili više potpisnika dodaju potpise.&lt;/li&gt;
&lt;li&gt;Finalizovana transakcija vraća se online sistemu.&lt;/li&gt;
&lt;li&gt;Online sistem je objavljuje mreži.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PSBT je koristan kada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;privatni ključevi ne smeju biti na web serveru,&lt;/li&gt;
&lt;li&gt;postoji hardware wallet,&lt;/li&gt;
&lt;li&gt;potreban je multisig,&lt;/li&gt;
&lt;li&gt;različiti sistemi obavljaju coin selection, potpisivanje i broadcast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Format rešava interoperabilnost poruka. Ne rešava automatski autorizaciju. Potpisnik i dalje mora da zna da li je predložena destinacija legitimna i da li aplikacija pokušava da plati neočekivano visoku naknadu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custodial i non-custodial nisu marketinške etikete
&lt;/h2&gt;

&lt;p&gt;Ako platforma može samostalno da potpiše povlačenje korisnikovih sredstava, ona ima custody bez obzira na terminologiju interfejsa.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Ko kontroliše ključeve&lt;/th&gt;
&lt;th&gt;Glavna prednost&lt;/th&gt;
&lt;th&gt;Glavni rizik&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custodial&lt;/td&gt;
&lt;td&gt;Servis&lt;/td&gt;
&lt;td&gt;Jednostavan oporavak i UX&lt;/td&gt;
&lt;td&gt;Kompromitovanje ili blokada servisa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-custody&lt;/td&gt;
&lt;td&gt;Korisnik&lt;/td&gt;
&lt;td&gt;Direktna kontrola sredstava&lt;/td&gt;
&lt;td&gt;Gubitak ključa ili loš backup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multisig&lt;/td&gt;
&lt;td&gt;Više ključeva&lt;/td&gt;
&lt;td&gt;Podela ovlašćenja&lt;/td&gt;
&lt;td&gt;Složeniji oporavak i koordinacija&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watch-only&lt;/td&gt;
&lt;td&gt;Niko u online sistemu&lt;/td&gt;
&lt;td&gt;Bezbedno praćenje uplata&lt;/td&gt;
&lt;td&gt;Ne može samostalno da potpisuje&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Self-custody nije automatski bezbedniji. Loše napravljen self-custody wallet može biti opasniji od kvalitetno održavanog custodial servisa. Razlika je pre svega u tome ko može da napravi validan potpis i ko snosi posledice gubitka ključa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lightning kao sloj za česta i mala plaćanja
&lt;/h2&gt;

&lt;p&gt;On-chain Bitcoin daje globalno poravnanje, ali nije idealan za svaki checkout. Blokovi dolaze u prosečnim intervalima, prostor je ograničen, a naknade se menjaju.&lt;/p&gt;

&lt;p&gt;Lightning Network koristi kanale plaćanja čije se otvaranje i zatvaranje oslanja na Bitcoin transakcije. Unutar mreže se zatim mogu izvršavati česta plaćanja bez upisivanja svakog pojedinačnog plaćanja u blockchain.&lt;/p&gt;

&lt;p&gt;Prednosti mogu biti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;brzo korisničko iskustvo,&lt;/li&gt;
&lt;li&gt;niži trošak malih plaćanja,&lt;/li&gt;
&lt;li&gt;bolja pogodnost za mikrotransakcije.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trade-off uključuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;upravljanje likvidnošću kanala,&lt;/li&gt;
&lt;li&gt;dostupnost čvora ili poverenje u provajdera,&lt;/li&gt;
&lt;li&gt;složenije rutiranje,&lt;/li&gt;
&lt;li&gt;inbound i outbound kapacitet,&lt;/li&gt;
&lt;li&gt;backup i monitoring stanja.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lightning nije zamena za razumevanje osnovnog Bitcoin modela. On koristi Bitcoin transakcije i vremenska zaključavanja kao sigurnosni sloj.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bezbednosni problemi koje aplikacije često potcene
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ključevi u application database-u
&lt;/h3&gt;

&lt;p&gt;Šifrovanje privatnog ključa u istoj bazi, dok ključ za dešifrovanje stoji u environment varijabli iste aplikacije, štiti od nekih curenja backupa. Ne štiti od napadača koji izvršava kod u procesu aplikacije.&lt;/p&gt;

&lt;p&gt;Za veće iznose razmotrite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;odvojeni signer,&lt;/li&gt;
&lt;li&gt;hardware security module,&lt;/li&gt;
&lt;li&gt;hardware wallet,&lt;/li&gt;
&lt;li&gt;multisig sa organizaciono odvojenim ključevima,&lt;/li&gt;
&lt;li&gt;ograničene hot-wallet iznose,&lt;/li&gt;
&lt;li&gt;manuelnu kontrolu velikih povlačenja.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Slepo potpisivanje
&lt;/h3&gt;

&lt;p&gt;Signer koji samo primi serijalizovanu transakciju i potpiše je nije prava bezbednosna granica. Mora primenjivati politiku:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dozvoljene destinacije,&lt;/li&gt;
&lt;li&gt;maksimalan iznos,&lt;/li&gt;
&lt;li&gt;maksimalan feerate,&lt;/li&gt;
&lt;li&gt;očekivane izlaze za kusur,&lt;/li&gt;
&lt;li&gt;dnevne limite,&lt;/li&gt;
&lt;li&gt;potrebna dodatna odobrenja.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backup bez testa oporavka
&lt;/h3&gt;

&lt;p&gt;Backup nije pouzdan dok oporavak nije testiran.&lt;/p&gt;

&lt;p&gt;Test mora potvrditi da su sačuvani:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;seed ili ključevi,&lt;/li&gt;
&lt;li&gt;descriptor podaci,&lt;/li&gt;
&lt;li&gt;derivacione putanje,&lt;/li&gt;
&lt;li&gt;potrebne passphrase vrednosti,&lt;/li&gt;
&lt;li&gt;multisig konfiguracija,&lt;/li&gt;
&lt;li&gt;procedure i ovlašćena lica.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Adresa promenjena u clipboardu
&lt;/h3&gt;

&lt;p&gt;Malver može zameniti Bitcoin adresu nakon kopiranja. Interfejs treba da prikaže celu ili dovoljno karakterističnu adresu pre potvrde. Hardware signer treba da prikaže destinaciju na nezavisnom ekranu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logovanje tajnih podataka
&lt;/h3&gt;

&lt;p&gt;Request body, crash dump, analytics događaj ili tracing sistem mogu nenamerno sačuvati seed, privatni ključ, PSBT ili autentifikacione podatke za RPC.&lt;/p&gt;

&lt;p&gt;Osetljivi objekti moraju biti eksplicitno isključeni iz logova. Generičko „loguj ceo request u debug režimu“ nije prihvatljivo za wallet servis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privatnost nije podrazumevana
&lt;/h2&gt;

&lt;p&gt;Bitcoin blockchain je javan. Adrese nisu direktno imena, ali transakcioni graf omogućava povezivanje aktivnosti.&lt;/p&gt;

&lt;p&gt;Analiza može koristiti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ponovnu upotrebu adresa,&lt;/li&gt;
&lt;li&gt;zajedničko trošenje više ulaza,&lt;/li&gt;
&lt;li&gt;prepoznatljive izlaze za kusur,&lt;/li&gt;
&lt;li&gt;vremensko povezivanje,&lt;/li&gt;
&lt;li&gt;podatke koje otkrivaju berze i merchant sistemi,&lt;/li&gt;
&lt;li&gt;mrežne metapodatke.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zato pseudonimnost nije isto što i anonimnost.&lt;/p&gt;

&lt;p&gt;Aplikacija koja generiše posebnu adresu za svakog korisnika možda tehnički pojednostavljuje knjigovodstvo, ali istovremeno pravi dugoročnu mapu identiteta i aktivnosti. Te podatke treba tretirati kao osetljive.&lt;/p&gt;

&lt;p&gt;Sopstveni čvor poboljšava privatnost upita. Ako za svaku korisničku adresu pitate javni explorer, provajder može povezati IP adresu servera, vreme upita i skup adresa koje pripadaju istoj aplikaciji.&lt;/p&gt;

&lt;h2&gt;
  
  
  Najvažniji trade-offovi
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Odluka&lt;/th&gt;
&lt;th&gt;Dobitak&lt;/th&gt;
&lt;th&gt;Cena&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sopstveni full node&lt;/td&gt;
&lt;td&gt;Nezavisna validacija i privatnost&lt;/td&gt;
&lt;td&gt;Infrastruktura i održavanje&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosted procesor&lt;/td&gt;
&lt;td&gt;Brža integracija&lt;/td&gt;
&lt;td&gt;Poverenje, naknade i zavisnost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-chain naplata&lt;/td&gt;
&lt;td&gt;Jednostavan model poravnanja&lt;/td&gt;
&lt;td&gt;Čekanje i promenljive naknade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lightning&lt;/td&gt;
&lt;td&gt;Brza mala plaćanja&lt;/td&gt;
&lt;td&gt;Likvidnost i operativna složenost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-custody&lt;/td&gt;
&lt;td&gt;Kontrola ključeva&lt;/td&gt;
&lt;td&gt;Odgovornost za backup i sigurnost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custodial wallet&lt;/td&gt;
&lt;td&gt;Jednostavniji UX&lt;/td&gt;
&lt;td&gt;Rizik druge strane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero-confirmation isporuka&lt;/td&gt;
&lt;td&gt;Brži checkout&lt;/td&gt;
&lt;td&gt;Rizik konflikta ili zamene&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Više potvrda&lt;/td&gt;
&lt;td&gt;Veća sigurnost poravnanja&lt;/td&gt;
&lt;td&gt;Sporija isporuka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jedna adresa po invoice-u&lt;/td&gt;
&lt;td&gt;Lakše knjiženje i bolja privatnost&lt;/td&gt;
&lt;td&gt;Upravljanje derivacijom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Konsolidacija UTXO-a&lt;/td&gt;
&lt;td&gt;Jeftinije buduće trošenje&lt;/td&gt;
&lt;td&gt;Trenutna naknada i gubitak privatnosti&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Kada Bitcoin ima smisla u proizvodu
&lt;/h2&gt;

&lt;p&gt;Bitcoin je razuman izbor kada proizvodu treba jedna ili više sledećih osobina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;globalni prenos bez obaveznog kartičnog procesora,&lt;/li&gt;
&lt;li&gt;javno proverljivo poravnanje,&lt;/li&gt;
&lt;li&gt;rad sa korisnicima koji već poseduju BTC,&lt;/li&gt;
&lt;li&gt;programabilna politika potpisivanja,&lt;/li&gt;
&lt;li&gt;mogućnost sopstvene validacije,&lt;/li&gt;
&lt;li&gt;dugoročno držanje sredstava bez zavisnosti od poslovne baze jednog provajdera.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manje je pogodan kada proizvod zahteva:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trenutnu i nepovratnu finalnost bez dodatnog sloja,&lt;/li&gt;
&lt;li&gt;stabilnu obračunsku vrednost u fiat valuti,&lt;/li&gt;
&lt;li&gt;automatski povraćaj sredstava nalik chargeback-u,&lt;/li&gt;
&lt;li&gt;potpunu privatnost transakcija,&lt;/li&gt;
&lt;li&gt;jednostavan recovery za korisnika koji izgubi sve ključeve,&lt;/li&gt;
&lt;li&gt;zanemarljiv operativni teret.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dobra integracija ne pokušava da sakrije ove razlike. Ona poslovni workflow projektuje oko njih.&lt;/p&gt;

&lt;h2&gt;
  
  
  Šta developer zapravo može da nauči
&lt;/h2&gt;

&lt;p&gt;Najvredniji deo eksperimentisanja sa Bitcoinom nije slanje simbolične količine između dva wallet-a. Vrednost je u posmatranju sistema pod greškama i prelaznim stanjima.&lt;/p&gt;

&lt;p&gt;Koristan testni plan uključuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uplatu bez potvrde,&lt;/li&gt;
&lt;li&gt;uplatu sa jednom potvrdom,&lt;/li&gt;
&lt;li&gt;više delimičnih uplata,&lt;/li&gt;
&lt;li&gt;preveliku uplatu,&lt;/li&gt;
&lt;li&gt;uplatu posle isteka invoice-a,&lt;/li&gt;
&lt;li&gt;zamenu nepotvrđene transakcije,&lt;/li&gt;
&lt;li&gt;blok koji više nije deo aktivnog lanca,&lt;/li&gt;
&lt;li&gt;restart čvora dok worker obrađuje događaj,&lt;/li&gt;
&lt;li&gt;dupliran webhook ili događaj,&lt;/li&gt;
&lt;li&gt;privremeno nedostupan RPC,&lt;/li&gt;
&lt;li&gt;wallet koji nema privatne ključeve,&lt;/li&gt;
&lt;li&gt;povlačenje sa velikim brojem malih UTXO-a.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Takvi testovi brzo otkrivaju da blockchain integracija nije samo poziv funkcije &lt;code&gt;send()&lt;/code&gt;. To je obrada događaja iz distribuiranog sistema u kojem potvrde stižu vremenom, neki događaji se ponavljaju, a ranije opaženo stanje može kratkotrajno biti promenjeno.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zaključak
&lt;/h2&gt;

&lt;p&gt;Bitcoin radi tako što veliki broj nezavisnih čvorova proverava isti skup pravila, dok proof of work daje praktičan mehanizam za izbor redosleda validnih transakcija bez centralnog koordinatora.&lt;/p&gt;

&lt;p&gt;Njegov osnovni podatkovni model nije stanje računa, već skup nepotrošenih izlaza. Novčanik nije mesto na kojem se bitcoin fizički nalazi, već sistem za praćenje izlaza i upravljanje ključevima. Rudari ne određuju proizvoljno pravila, potvrda nije apsolutna finalnost, a naknada zavisi od prostora koji transakcija zauzima, ne od njene monetarne vrednosti.&lt;/p&gt;

&lt;p&gt;Za developera koji želi da ga integriše, najvažnija odluka nije izbor biblioteke. Važnije je odrediti model poverenja: ko validira blockchain, ko drži ključeve, koliko potvrda je potrebno, kako se obrađuje reorganizacija i šta se dešava kada infrastruktura zakaže.&lt;/p&gt;

&lt;p&gt;Kada su te odluke eksplicitne, Bitcoin prestaje da izgleda kao magična crna kutija. Postaje ono što jeste: relativno mali skup strogo definisanih pravila, okružen veoma složenim ekonomskim i distribuiranim sistemom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponzorstvo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ovaj članak je sponzorisan od strane &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt;. Na &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com&lt;/a&gt; možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Više informacija dostupno je na stranici &lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za otvaranje naloga možete koristiti &lt;a href="https://volet.onelink.me/jJs2?pid=User_invite&amp;amp;deep_link_value=dyPrtg1m" rel="noopener noreferrer"&gt;Volet.com pozivni link&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Izvori
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki" rel="noopener noreferrer"&gt;BIP 341: Taproot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bitcoin/bitcoin/blob/master/doc/wallets.md" rel="noopener noreferrer"&gt;Bitcoin Core: Wallets and descriptors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitcoincore.org/en/doc/30.0.0/rpc/util/estimatesmartfee/" rel="noopener noreferrer"&gt;Bitcoin Core RPC: estimatesmartfee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitcoincore.org/en/download/" rel="noopener noreferrer"&gt;Bitcoin Core: Download and node requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki" rel="noopener noreferrer"&gt;BIP 141: Segregated Witness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki" rel="noopener noreferrer"&gt;BIP 157: Client Side Block Filtering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitcoincore.org/en/doc/30.0.0/" rel="noopener noreferrer"&gt;Bitcoin Core RPC dokumentacija&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki" rel="noopener noreferrer"&gt;BIP 174: Partially Signed Bitcoin Transaction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.bitcoin.org/devguide/transactions.html" rel="noopener noreferrer"&gt;Bitcoin Developer Guide: Transactions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.bitcoin.org/devguide/block_chain.html" rel="noopener noreferrer"&gt;Bitcoin Developer Guide: Blockchain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitcoin.org/bitcoin.pdf" rel="noopener noreferrer"&gt;Bitcoin: A Peer-to-Peer Electronic Cash System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://volet.srbija.workers.dev/" rel="noopener noreferrer"&gt;Volet Srbija: funkcije, dostupnost i registracija&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>bitcoin</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>cryptocurrency</category>
    </item>
  </channel>
</rss>
