DEV Community

Cover image for TRON za backend developere: TRC-20 plaćanja u praksi
Dora Milen
Dora Milen

Posted on

TRON za backend developere: TRC-20 plaćanja u praksi

TRON je zanimljiviji kao infrastruktura nego kao ticker

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.

Za developera je važnija razlika između TRX-a i TRC-20 tokena nego tržišna cena TRX-a:

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

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.

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.

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.

Gde TRON ima smisla za backend tim

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:

SaaS platforma želi da izdaje fakture i automatski prepoznaje uplate podržanog TRC-20 tokena.

Sistem za takav slučaj mora da:

  1. dodeli adresu kupcu ili fakturi
  2. prepozna dolazni transfer
  3. proveri mrežu, token contract, primaoca i iznos
  4. sačeka solidifikaciju
  5. knjiži uplatu tačno jednom
  6. kasnije prebaci sredstva u treasury wallet
  7. uskladi interni ledger sa stanjem na mreži

Blockchain deo ovde nije najteži. Teži deo je dizajn pouzdanog platnog workflowa oko njega.

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.

Model naloga i adresa koji utiče na integraciju

TRON adrese se pojavljuju u dva oblika:

  • Base58Check format, obično dužine 34 karaktera i sa početnim slovom T
  • heksadecimalni format sa prefiksom 41

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

Kod ABI enkodiranja contract parametara postoji dodatna zamka: prefiks 41 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 CONTRACT_VALIDATE_ERROR grešaka.

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 T ne možete zaključiti kojoj mreži pripada.

Praktičan složeni ključ zato izgleda ovako:

network + address
Enter fullscreen mode Exit fullscreen mode

Za token je potreban još stroži identitet:

network + contract_address
Enter fullscreen mode Exit fullscreen mode

Simbol poput USDT, USD ili TOKEN 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.

TRC-20 nije samo poziv funkcije transfer

TRC-20 standard definiše funkcije kao što su balanceOf, transfer, transferFrom, approve i allowance, kao i događaje Transfer i Approval.

Na površini, slanje tokena izgleda jednostavno:

transfer(address recipient, uint256 amount)
Enter fullscreen mode Exit fullscreen mode

Za payment backend je, međutim, važnije kako se transfer otkriva nego kako se šalje.

Nije dovoljno pročitati ulazne parametre TriggerSmartContract transakcije i zaključiti da je izvršen transfer. Smart contract može:

  • emitovati više Transfer događaja
  • izvršiti transfer kroz drugi contract
  • pozvati transferFrom
  • završiti sa revertom
  • imati ulazne parametre koji ne odgovaraju konačnim promenama stanja

Pouzdan scanner zato posmatra uspešno izvršenu transakciju i dekodira Transfer(address,address,uint256) 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.

Jedna transakcija može emitovati više transfer događaja. txID zato nije nužno dovoljan kao jedinstveni identifikator jednog token transfera. Robusniji ključ je:

network + tx_id + event_index
Enter fullscreen mode Exit fullscreen mode

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.

Realna arhitektura za prijem TRC-20 uplata

Minimalna produkciona arhitektura ima nekoliko odvojenih odgovornosti.

Komponenta Odgovornost
Address service Dodeljuje i evidentira deposit adrese
Chain scanner Pronalazi potvrđene transfere
Deposit processor Validira pronađene transfere
Ledger Knjiži poslovnu promenu tačno jednom
Sweeper Prebacuje sredstva u treasury wallet
Signer Izolovano potpisuje izlazne transakcije
Reconciliation job Poredi blockchain stanje i interni ledger

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.

Osnovne tabele mogu izgledati ovako:

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
Enter fullscreen mode Exit fullscreen mode

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

Ako transfer nosi vrednost "1250000", a dozvoljeni asset ima šest decimala, ledger treba da sačuva "1250000". Prikaz 1.25 je posao prezentacionog sloja.

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.

TronGrid za početak, sopstveni scanner za veću kontrolu

TRON integracija obično počinje jednim od dva pristupa:

  • hosted servis kao što je TronGrid
  • sopstveni FullNode, SolidityNode i indexer

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:

GET /v1/accounts/{address}/transactions/trc20
Enter fullscreen mode Exit fullscreen mode

Endpoint podržava filtere kao što su only_confirmed, only_to, contract_address, vremenski opseg, sortiranje i paginacija preko fingerprint vrednosti.

Minimalni test sa Shasta ili Mainnet konfiguracijom može izgledati ovako:

curl --get \
  "$TRON_API/v1/accounts/$ADDRESS/transactions/trc20" \
  --header "TRON-PRO-API-KEY: $TRON_API_KEY" \
  --data-urlencode "only_confirmed=true" \
  --data-urlencode "only_to=true" \
  --data-urlencode "contract_address=$TOKEN_CONTRACT" \
  --data-urlencode "limit=200"
Enter fullscreen mode Exit fullscreen mode

TRON_API treba eksplicitno vezati za okruženje:

Mainnet: https://api.trongrid.io
Shasta: https://api.shasta.trongrid.io
Nile: https://nile.trongrid.io
Enter fullscreen mode Exit fullscreen mode

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

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.

Kod većeg obima alternativni model je skeniranje svakog novog solidified bloka:

  1. pročitaj poslednji solidified block number
  2. preuzmi sve blokove od lokalnog kursora do tog broja
  3. proveri execution receipt za smart contract transakcije
  4. dekodiraj relevantne Transfer događaje
  5. upiši rezultate i novi kursor u kontrolisanim transakcijama

TRON dokumentacija za exchange i custodial integracije preporučuje upravo oslanjanje na solidified visinu, a ne na trenutni chain head.

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.

Finalnost, idempotencija i stanje uplate

Payment state machine ne treba da bude samo pending i paid. Korisniji model je:

created
observed
solidified
credited
sweeping
swept
rejected
manual_review
Enter fullscreen mode Exit fullscreen mode

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

solidified znači da je uplata pronađena u finalizovanom delu lanca.

credited znači da je interni ledger uspešno promenjen.

credited i solidified 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.

Primer zaštite na nivou baze:

create unique index uq_onchain_transfer
on onchain_transfer (network, tx_id, event_index);
Enter fullscreen mode Exit fullscreen mode

Ledger unos treba da ima sličnu zaštitu:

create unique index uq_ledger_source
on ledger_entry (source_type, source_id);
Enter fullscreen mode Exit fullscreen mode

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.

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.

Koliko košta transakcija na TRON-u

TRON nema jedan univerzalni gas fee. Trošak se sastoji od mrežnih resursa i eventualnih direktnih protokolskih naknada.

Bandwidth

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.

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.

Energy

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

Energy se može obezbediti:

  • stakingom TRX-a
  • delegiranjem resursa sa drugog naloga
  • spaljivanjem TRX-a za nepokriveni deo

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.

Jedan TRX sadrži 1.000.000 sun, pa se približan obračun može predstaviti ovako:

burn_sun =
    uncovered_bandwidth * bandwidth_price
    + uncovered_energy * energy_price
    + direct_protocol_fees

burn_trx = burn_sun / 1_000_000
Enter fullscreen mode Exit fullscreen mode

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.

Zato produkcioni servis treba da proceni Energy neposredno pre slanja transakcije i da tada postavi fee_limit.

Šta zapravo radi fee_limit

fee_limit 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.

Ako postavite fee_limit 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.

Prenizak limit proizvodi OUT_OF_ENERGY, čak i kada nalog ima TRX. Previsok limit povećava izloženost skupom failure pathu. Razumna strategija je:

  1. simulirati ili proceniti poziv
  2. pročitati aktuelni getEnergyFee
  3. uzeti u obzir trenutni ili maksimalni dynamic Energy faktor
  4. dodati kontrolisanu rezervu
  5. odbiti transakciju ako procena prelazi poslovni limit

Chain parametre treba čitati preko wallet/getchainparameters, a ne trajno upisati u kod.

Aktivacija adrese

Lokalno generisana adresa ne postoji kao aktivan on-chain nalog dok ne bude aktivirana.

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.

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.

Veliki broj jednokratnih adresa poboljšava atribuciju uplata, ali povećava:

  • broj ključeva koje morate bezbedno derivirati i oporaviti
  • broj naloga koje treba aktivirati
  • broj sweep transakcija
  • potrebu za delegiranjem Bandwidth i Energy resursa
  • reconciliation površinu

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

Slanje i sweepovanje tokena

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.

Za svaki sweep potrebno je:

  1. proveriti da je adresa aktivna
  2. proveriti stvarni balanceOf
  3. proceniti Energy
  4. obezbediti Energy, Bandwidth ili dovoljan TRX saldo
  5. napraviti unsigned transakciju
  6. poslati je izolovanom signer-u
  7. emitovati potpisanu transakciju
  8. pratiti receipt do solidifikacije
  9. povezati rezultat sa internim sweep nalogom

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.

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.

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.

TronWeb i granice SDK-a

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

Tipična konfiguracija izgleda ovako:

import { TronWeb } from "tronweb";

const tronWeb = new TronWeb({
    fullHost: process.env.TRON_FULL_HOST,
    headers: {
        "TRON-PRO-API-KEY": process.env.TRON_API_KEY,
    },
});
Enter fullscreen mode Exit fullscreen mode

Ovaj instance nema private key i pogodan je za čitanje stanja, validaciju adresa i pripremu nepotpisanih operacija.

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.

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.

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.

Testiranje koje vredi uraditi pre Mainneta

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.

Happy-path transfer nije dovoljan test. Korisniji skup scenarija uključuje:

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

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

Trade-off koji se najčešće previdi

TRON smanjuje vreme potrebno da developer dođe do prve token transakcije, ali ne uklanja složenost custody sistema.

Prednosti su praktične:

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

Ograničenja su podjednako konkretna:

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

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

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.

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 transfer.


Sponzorstvo

Ovaj članak je sponzorisan od strane Volet.com. Na Volet.com možete kupiti, prodati, čuvati i razmenjivati podržane kriptovalute i fiat valute.

Više informacija dostupno je na stranici Volet Srbija.

Za otvaranje naloga možete koristiti Volet.com pozivni link.

Izvori

  1. TRON API reference and integration paths
  2. Transactions and solidification
  3. Encoding addresses and data
  4. TRC-20 protocol interface
  5. Exchange wallet integration
  6. Get TRC-20 transaction info by account address
  7. TRON resource model
  8. FeeLimit and Energy cost
  9. TRON network parameters
  10. Accounts and keys
  11. TronWeb provider configuration
  12. TronWeb sendTransaction
  13. Getting testnet tokens
  14. Volet Srbija

Top comments (0)