Barcha maqolalar
6 daq oʻqish

TON get-metodini SDKʼsiz chaqirish: run_get_method

TON kontraktining istalgan get-metodini run_get_method orqali SDKʼsiz chaqiring: seqno, get_jetton_data, get_sale_data, argumentlar, exit_code va stek tahlili.

run_get_methodTON get-metodTVM exit_codeSDKʼsiz TONTON uchun MCPget_jetton_data

Tranzaksiya joʻnatishdan oldin hamyonning seqno sini bilib olish uchun shunchaki explorer ochdingiz. Yoki sizga jettonning total_supply si kerak. Yoki marketpleysdagi NFT-listing maʼlumotlari. Va mana, siz yana npm i @ton/ton ni oʻrnatasiz, TonClient ni ishga tushirasiz, ishlaydigan liteserver endpointini qidirasiz, manzilni beginCell().storeAddress() ichiga qanday joylashni oʻrganasiz, keyin esa chiquvchi BOC ni qoʻlda parslaysiz. Oʻttiz qator kod — kontrakt allaqachon bepul beradigan bitta raqam uchun.

Muammo TONda emas. Muammo shundaki, siz bilan oddiy read-only chaqiruv oʻrtasida butun boshli SDK qatlami yotibdi — uni oʻrnatish, sozlash va navbatdagi yangilanishda buzib qoʻymaslik kerak. Agar siz TONga AI agentni (Claude, Cursor, ChatGPT/Codex) ulayotgan boʻlsangiz, bu qatlamni qoʻlda yozish umuman absurd: agent shunchaki metodni chaqirishi kerak.

Quyida — TON kontraktining istalgan get-metodini run_get_method orqali, SDK-klient kodining bitta qatorini ham yozmasdan qanday chaqirish haqida.

TON kontraktining get-metodi nima va nega uning uchun odatda SDK tortiladi

Get-metod — smart-kontraktning read-only funksiyasi. Hamyon seqno ni beradi, jetton master-kontrakti — get_jetton_data, NFT sotuv kontrakti — get_sale_data, STON.fi/DeDust hovuzi — get_pool_data. Kalit soʻz — read-only:

  • metod kontrakt holatida hech narsani oʻzgartirmaydi;
  • u imzo talab qilmaydi va foydalanuvchining gazini sarflamaydi;
  • u tranzaksiya joʻnatish orqali emas, liteserverda yoki TVM-emulyatorda (TON Virtual Machine) bajariladi.

Yaʼni get-metodni chaqirish — bu tranzaksiya emas. Bu yerda imzolashga ham, toʻlashga ham, blokda kutishga ham hech narsa yoʻq. Mohiyatan bu «jonli kontraktdan qiymatni oʻqi» degan funksiya.

Lekin uni «eski usulda» chaqirish uchun butun boshli jihozlar toʻplami kerak: SDK (ton, tonweb, tonutils), liteserverga oʻzingizning ADNL-klientingiz yoki toncenter kabi HTTP-oʻrama, kirish argumentlarini kataklarga qoʻlda yigʻish va chiquvchi BOC ni qoʻlda tahlil qilish. Bitta oʻqish uchun juda koʻp harakatlanuvchi qism. Va ularning har biri — nosozlik nuqtasi: global configdagi ommaviy liteserverlar umumiy va limitli, yuk ostida not ready yoki ADNL-taymaut bilan javob beradi; ommaviy HTTP-APIlar limitdan oshganda 429 Too Many Requests qaytaradi (kalitsiz — taxminan sekundiga bitta soʻrov).

run_get_method: istalgan kontraktning istalgan read-only metodi uchun bitta vosita

run_get_method — TONdagi istalgan kontraktning istalgan read-only get-metodini chaqiradigan MCP-vosita. Siz kontrakt manzilini, metod nomini va argumentlar roʻyxatini uzatasiz — vosita metodni on-chain, TVM orqali bajaradi va chiquvchi stekni qaytaradi.

Bunda sizga kerak emas:

  • SDK (ton/tonweb/tonutils) ni oʻrnatish va yangilash;
  • oʻz ADNL-klientingizni yozish;
  • argumentlarni kataklarga qoʻlda joylash va chiqishdagi BOC ni parslash.

run_get_method TONNode — TON uchun hosted MCP serverning oʻqish toʻplamiga kiradi. MCP (Model Context Protocol) — AI agentlar vositalarni chaqiradigan standart. Butun oʻqish toʻplami npx -y @tonnode/mcp orqali lokalda bepul (ommaviy config, kartasiz), yoki https://mcp.tonnode.io/mcp hosted-endpointi orqali Bearer-kalit bilan mavjud. Hoziroq, hech narsa sotib olmasdan sinab koʻrsangiz boʻladi.

Argumentlar va stek: kirishni qanday uzatish va TVM chiqishini qanday tahlil qilish

TVM stek bilan ishlaydi. Oʻxshatish: siz stolga kiruvchi qiymatlar yozilgan bir nechta «kartochka» qoʻyasiz, metod ularni oladi, ishlaydi va natija yozilgan «kartochka»larni qaytarib qoʻyadi.

Kirish TVM stekiga qiymat sifatida uzatiladi. Odatda bu:

  • int — butun sonlar (masalan, indeks, raw-birliklardagi summa, query id);
  • manzil-slice — katak kesimiga joylangan manzil;
  • cell — ixtiyoriy maʼlumotlar katagi.

Chiqish qiymatlarning chiquvchi steki koʻrinishida qaytadi: int, slice, cell, tuple. Agent uni pozitsiyalar boʻyicha tahlil qiladi — birinchi qiymat, ikkinchi, uchinchi. Masalan, get_jetton_data tartib bilan quyidagilarni qaytaradi: total_supply (int), mintable bayrogʻi, admin (slice-manzil), content (cell) va hamyon kodi (cell). Pozitsiya maʼnoni belgilaydi — bu kontraktning oʻz ABI-kelishuvi qismidir.

Koʻplab foydali metodlar (seqno, get_jetton_data) kirishni umuman talab qilmaydi — argumentlar steki boʻsh. Argumentlar metod biror narsani kalit boʻyicha qidirganda paydo boʻladi: masalan, egasining manzili boʻyicha jetton-hamyon manzilini hisoblashda.

Muhim nuans: run_get_method raw-birliklardagi xom stekni qaytaradi. Raqamlar decimals boʻyicha qayta hisoblanmasdan, kataklar esa oʻqiydigan satrlarga aylantirilmasdan keladi. Bu moslashuvchan, lekin nimani oʻqiyotganingizni tushunishni talab qiladi — bunga get_jetton_info haqidagi boʻlimda qaytamiz.

exit_code: metod ishlaganini qanday bilish mumkin

Har bir get-metod chaqiruvi exit_code — TVMning yakunlanish kodini qaytaradi. Chiquvchi stekni tahlil qilish faqat chaqiruv umuman muvaffaqiyatli boʻlgandagina maʼnoga ega. Get-metodlar uchun qoida kontrintuitiv, uni esda tutgan maʼqul:

  • exit_code 0 va 1 — muvaffaqiyat (ikkalasi ham normal yakunlanish hisoblanadi, shuning uchun bir raqamidan choʻchimang);
  • exit_code > 1 — xato, chiqishdagi stekka ishonib boʻlmaydi.

Tez-tez uchraydigan xato kodlari:

exit_code Nimani anglatadi
2 stack underflow — stekka metod kutganidan kamroq argument berilgan
4 integer overflow / nolga boʻlish
11 odatda — mavjud boʻlmagan metodni chaqirish (nomida xato)
13 out of gas

Amalda: 2 chiqdimi — barcha argumentlarni va aynan toʻgʻri tartibda uzatganingizni tekshiring. 11 chiqdimi — katta ehtimol bilan metod nomida xato qilgansiz yoki kontraktda bunday metod umuman yoʻq. 13 chiqdimi — metod ogʻir va gaz limitiga tiralgan.

Agent orqali misollar: seqno, get_jetton_data, get_sale_data

Eng yoqimlisi — run_get_method ni odam emas, agent chaqirganda. Siz vazifani soʻz bilan ifodalaysiz, agent manzilni, metod nomini va argumentlarni oʻzi tanlaydi, stekni oladi va maydonlarni tushuntiradi.

Joʻnatishdan oldingi seqno. seqno — hamyonning chiquvchi tranzaksiyasi raqami, u oʻtkazmani yigʻishdan oldin oʻqiladi: usiz xabar oʻtmaydi.

Agentga prompt: «Mening UQD… hamyonimda seqno ni chaqir va joriy raqamni ayt».

Agent run_get_method ni argumentsiz chaqiradi, chiquvchi stekda bitta int oladi va sizga raqamni beradi.

get_jetton_data — jetton masterining metamaʼlumotlari. Metod total_supply, mintable bayrogʻi, admin manzili va content ni qaytaradi.

Agentga prompt: «Shu USDT masterida get_jetton_data ni chaqir va maydonlarni yoyib ber».

Agent run_get_method ni master manzili va get_jetton_data nomi bilan chaqiradi, stekni oʻqiydi va pozitsiyalarni tushuntiradi. Bu yerda muhim nuans bor — u haqda quyida.

get_sale_data — NFT-listing maʼlumotlari. Bu alohida NFT-vosita emas, oʻsha run_get_method ning oʻzi: siz marketpleysdagi sotuv kontraktining oʻz get-metodini oʻqiysiz. get_sale_data narxni, sotuvchini va bitim holatini qaytaradi — NFT allaqachon sotilganmi yoki hali sotuvda turibdimi, buni tushunish qulay.

Agentga prompt: «Mana shu sotuv kontraktidan get_sale_data ni oʻqi va narxni GRAMda ayt».

Siz hech qanday klient yozmaysiz. Agent bitta vositani chaqiradi. Boshqa keng tarqalgan metodlar — get_wallet_data (jetton-hamyon maʼlumotlari), get_pool_data (STON.fi/DeDust hovuzlari) — xuddi shunday chaqiriladi: metod nomi, manzil, kerak boʻlsa argumentlar.

get_jetton_data yoki get_jetton_info: odam oʻqiy oladigan javob qachon kerak

Mana bu yerda asosiy tuzoq. run_get_method xom stekni qaytaradi: get_jetton_data sizga total_supply ni raw-birliklardagi ulkan butun son sifatida beradi, content ni esa — nomi va simvolini yana ajratib olish kerak boʻlgan katak sifatida. Hech qanday «USDT», «6 decimals» va chiroyli raqam yoʻq — bu quyi darajadagi TVM-chiqish. Agar sizga aynan master-kontraktga quyi darajali kirish yoki nostandart maydon kerak boʻlsa — bu sizning vositangiz.

Lekin vazifa jettonning nomi, simvoli va decimals ini tayyor koʻrinishda bilish boʻlsa — kataklarni tahlil qilib azoblanmang. Buning uchun alohida vosita — get_jetton_info bor: u nomni, simvolni, decimals ni va emissiyani allaqachon ajratilgan holda beradi.

Nega bu muhim: decimals raw-birliklarni real summalarga qayta hisoblash uchun kerak. TON tarmogʻidagi USDTda decimals = 6, koʻpchilik jettonlarda esa — 9. Xom get_jetton_data dan total_supply ni olib, uni 10^decimals ga boʻlmasangiz, realidan million yoki milliard marta farq qiladigan raqamni olasiz. Bu tuzoq haqida batafsil — TON jettonlarida decimals tahlilida.

Qoida oddiy:

  • kontraktning xom maydonlari kerakmi (emissiya, admin, content, ixtiyoriy maxsus metod) → run_get_method + get_jetton_data;
  • jetton haqida tayyor, odam oʻqiy oladigan javob kerakmi (nomi, simvoli, decimals) → get_jetton_info.

get_jetton_data dan olingan raw-raqamlarni get_jetton_info ning tayyor javobi bilan chalkashtirmang.

Ikki foydali tayanch: parse_address va get_account_state

Metodni chaqirishdan oldin manzilni tartibga keltirib olish va kontrakt umuman tirikligiga ishonch hosil qilish maʼqul:

  • parse_address — manzilni EQ/UQ/raw formatlari orasida normallashtiradi, oflayn, tarmoqqa murojaat qilmasdan. TONda formatlar bir nechta va har bir metod ham ularning istalganini qabul qilavermaydi; foydalanuvchining EQ… manzilini argumentlarga qoʻyishdan oldin kerakli koʻrinishga keltirish qulay.
  • get_account_state — kontraktning statusi, bayroqlari va oxirgi tranzaksiyasini tekshiradi. Agar akkaunt deploy qilinmagan (uninit) yoki muzlatilgan boʻlsa, istalgan get-metod, tabiiyki, xato bilan tugaydi — tushunarsiz exit_code ni tutib olgandan koʻra holatni oldindan tekshirish arzonroq.

Klient kodining bitta qatorini ham yozmasdan qanday ulash va chaqirish

Ikki yoʻl bor. Birinchisi — lokalda bepul, ommaviy config boʻyicha butun oʻqish toʻplami, kartasiz:

{
  "mcpServers": {
    "ton": {
      "command": "npx",
      "args": ["-y", "@tonnode/mcp"]
    }
  }
}

@tonnode/mcp paketi — open source (MIT), npm va GitHubʼda (tonnode/mcp) joylashgan, TONning native ADNL-protokoli boʻyicha, HTTP-qatlamlarsiz ishlaydi. Bepul yoʻl haqida alohida tahlil bor — TON uchun MCP bepul.

Ikkinchisi — kafolatlangan oʻtkazuvchanlik va oʻz kalitingiz bilan hosted-endpoint:

{
  "mcpServers": {
    "ton": {
      "type": "http",
      "url": "https://mcp.tonnode.io/mcp",
      "headers": { "Authorization": "Bearer tn_live_…" }
    }
  }
}

Barcha tariflarda 16 ta vositaning hammasi mavjud — siz faqat oʻtkazuvchanlik uchun toʻlaysiz. Bepul Hobby kaliti (60 soʻrov/min) tizimga kirgandan soʻng darhol, kartasiz beriladi.

Ulangandan soʻng butun oʻqish toʻplami — jumladan run_get_method, get_jetton_info, parse_address, get_account_state — agentga oddiy vositalar sifatida mavjud boʻladi. Chaqiruv chatdagi oddiy ibora kabi koʻrinadi: «shu DeDust hovuzida get_pool_data ni chaqir», «mana shu hamyonning seqno sini oʻqi» — agent esa run_get_method ni va argumentlarni oʻzi tanlaydi hamda maydonlarni tushuntiradi. Vazifa USDT balansini bilish boʻlsa, tayyor bitta buyruqli yoʻl bor: TONda USDT balansi bitta chaqiruvda.


Bepul Hobby kalitini oling va run_get_method ni toʻgʻridan-toʻgʻri agentdan chaqiringtonnode.io/dashboard?plan=hobby. Kalit tizimga kirgandan soʻng darhol, kartasiz beriladi, daqiqasiga 60 soʻrov — kontraktlarni oʻqish uchun bu zaxirasi bilan yetadi.

Hatto roʻyxatdan oʻtishni ham istamaysizmi — lokalda ishga tushiring: npx -y @tonnode/mcp. Vositalarning toʻliq roʻyxati va ularning parametrlari — tonnode.io/mcp sahifasida.

Blokcheyn holatini oʻqish endi klient yigʻish degani emas. Bu — soʻrovni ifodalash degani.

Agentingizga TONga yoʻl oching

16 ta MCP-vosita: oʻqish, nokastodial svoplar, krosscheyn va hamyonlar. Bepul tarif — 60 soʻrov/daq, karta kerak emas.