Деплой смарт-контрактов в 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 совместимости.







