Деплойментт смарт-контрактів в Tron
Tron — це не EVM у звичайному сенсі, хоча підтримує Solidity. TVM (Tron Virtual Machine) сумісна з EVM на рівні байткоду, але gas модель, адресація, робота з нативним токеном та tooling принципово відрізняються. Розробник, який прийшов з Ethereum, наступить на кілька граблі перш ніж перший контракт задеплоїться коректно.
Ключові відмінності Tron від Ethereum
Адреси та конвертація
Tron використовує Base58Check адреси (T...), а не hex. Один аккаунт має два представлення:
- Tron address:
TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE - Hex address:
0x41d64a4e1d7af3bc84a5dd6d5b6d86bd1e45ef0ab
У смарт-контрактах та при роботі з ABI через TronWeb використовується hex-форма. При відображенні користувачу — Base58. TronWeb.address.toHex() та TronWeb.address.fromHex() для конвертації.
Energy та Bandwidth — не Gas
Tron не використовує gas у розумінні Ethereum. Замість цього:
- Bandwidth: вартість зберігання байт транзакції. Витрачається на будь-які транзакції. Відновлюється зі часом (1 bandwidth = 1 байт).
- Energy: аналог gas, витрачається при виконанні смарт-контрактів. Коштує TRX або замораживається TRX для отримання energy.
Замораживання TRX дає energy без спалювання — економічніше для активних користувачів. Для разових операцій energy купується напрямку.
Ліміти: при деплойменті контракту потрібно достатньо energy. Стандартний нескладний контракт — 50,000-200,000 energy. Без достатнього energy — транзакція фейлиться з OUT_OF_ENERGY.
Інструменти розробки
TronBox — Truffle для Tron
npm install -g tronbox
tronbox init
tronbox.js конфігурація:
const { TRON_PRIVATE_KEY } = process.env
module.exports = {
networks: {
shasta: { // Testnet
privateKey: TRON_PRIVATE_KEY,
userFeePercentage: 100, // 100% fees оплачує вызывающий
feeLimit: 1_000_000_000, // max TRX (в sun) на транзакцію
fullHost: "https://api.shasta.trongrid.io",
network_id: "*"
},
mainnet: {
privateKey: TRON_PRIVATE_KEY,
userFeePercentage: 100,
feeLimit: 1_000_000_000,
fullHost: "https://api.trongrid.io",
network_id: "*"
}
},
compilers: {
solc: {
version: "0.8.6" // Tron TVM має обмеження по версіям Solidity
}
}
}
Важливо по версіям Solidity: TVM не завжди підтримує найсвіжіші версії Solidity. На момент написання стабільно працюють версії до 0.8.18. Перед деплойментом перевірте сумісність на офіційній документації Tron.
Hardhat + tronbox-provider
Альтернатива якщо проект уже на Hardhat:
npm install @tronbox/hardhat-tron
// hardhat.config.ts
import "@tronbox/hardhat-tron"
const config = {
networks: {
tron: {
url: "https://api.trongrid.io",
accounts: [process.env.TRON_PRIVATE_KEY!]
}
}
}
TronGrid API Key
TronGrid — офіційний Tron API провайдер. Безплатний plan має ліміти, для production потрібен API ключ. Реєстрація на trondao.org.
Без API ключа в header запросів: публічний rate limit — дуже низький, в production нереально.
Деплойментт через TronBox
# Компіляція
tronbox compile
# Деплойментт на testnet Shasta
tronbox migrate --network shasta
# Деплойментт на mainnet
tronbox migrate --network mainnet
Скрипт миграції migrations/2_deploy_contract.js:
const MyContract = artifacts.require("MyContract")
module.exports = function(deployer) {
deployer.deploy(
MyContract,
"constructor_arg_1",
"constructor_arg_2",
{
feeLimit: 1_000_000_000,
callValue: 0, // TRX передаваємий при деплойменті (в sun, 1 TRX = 1,000,000 sun)
userFeePercentage: 100
}
)
}
TronWeb для взаємодії з контрактом
const TronWeb = require("tronweb")
const tronWeb = new TronWeb({
fullHost: "https://api.trongrid.io",
headers: { "TRON-PRO-API-KEY": process.env.TRONGRID_API_KEY },
privateKey: process.env.TRON_PRIVATE_KEY
})
// Взаємодія з контрактом
const contract = await tronWeb.contract().at(CONTRACT_ADDRESS)
// Виклик view функції
const result = await contract.balanceOf(address).call()
// Відправлення транзакції
const tx = await contract.transfer(recipientAddress, amount).send({
feeLimit: 100_000_000,
callValue: 0
})
TRC-20 vs ERC-20
TRC-20 — Tron-аналог ERC-20. ABI ідентичен, але:
- Немає
msg.valueу звичайному вигляді для нативного TRX — використовуйтеcallValueу параметрах транзакції -
address(this).balanceповертає баланс в sun (1 TRX = 1,000,000 sun) - Для transfer TRX між контрактами:
address payable target = address(uint160(hexAddress))— потрібна конвертація з Tron address
Популярні TRC-20: USDT на Tron обслуговує величезний обсяг стейблкоин транзакцій в Азії — часта задача інтеграції.
Верифікація на TronScan
TronScan (tronscan.org) — blockchain explorer Tron. Верифікація контракту через UI: завантажити вихідний код, вказати версію компілятора та optimization settings. Немає CLI-інструменту як hardhat-verify.
Терміни
Деплойментт готового EVM-контракту на Tron Shasta testnet: 4-8 годин (адаптація під TVM, налаштування TronBox, отримання testnet TRX через faucet). Деплойментт на mainnet з верифікацією: до 2 днів включаючи тестування з реальним energy та перевірку TRC-20 сумісності.







