Solidity на TRON: написание смарт-контрактов для TVM — TRON Wiki

Solidity на TRON: написание смарт-контрактов для TVM

11 мин чтения · ⌘K поиск

Solidity является доминирующим языком для смарт-контрактов TRON. Разработчики, знакомые с шаблонами Ethereum ERC-20 и DeFi, могут перенести большую часть своих знаний на TRC-20 и TVM — уделяя внимание форматам адресов, затратам на электроэнергию и различиям в наборе инструментов.

В этом руководстве рассматриваются соглашения Solidity для TRON, реализация стандартных токенов, распространенные ошибки и путь от кода до основной сети.

Solidity → Конвейер TVM

  1. Запишите файлы .sol с помощью pragma solidity.
  2. Компилируем через TronBox/TronIDE → байткод + ABI
  3. Развертывание с помощью миграции или TronWeb.
  4. Взаимодействуйте через TronWeb или HTTP-триггер
  5. Проверьте источник на TronScan.

Среда выполнения: объяснение TVM.

TRC-20 шаблон

Стандартный взаимозаменяемый токен с использованием OpenZeppelin:

Код
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract ExampleToken is ERC20, Ownable {
    constructor() ERC20("Example", "EXM") Ownable(msg.sender) {
        _mint(msg.sender, 1_000_000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) external onlyOwner {
        _mint(to, amount);
    }
}

mint с onlyOwner удобно, но опасно, если ключ владельца скомпрометирован — руководство по безопасности.

Обработка адреса

  • Внутренний тип address имеет шестнадцатеричный размер 20 байт.
  • TronWeb преобразует Base58 T... ↔ шестнадцатеричный код для API
  • msg.sender — адрес контрактного абонента в TVM.

Всегда проверяйте входные данные:

⟦Т1⟧

Отличия от Ethereum Solidity

ТемаПривычка ЭфириумаTRON регулировка
Газ⟦Т10⟧Учет энергии по сети
⟦Т11⟧разрешение ~12 с~3s блоки
⟦Т12⟧Анти-шаблонВсе еще против шаблона на TRON
Цепные оракулыШироко используетсяПроверьте доступность оракула TRON
feeLimitН/ДУстановите в TronWeb параметры отправки

Повторно проверьте защиту повторного входа, шаблоны call и delegatecall на Шасте.

Энергоэффективные модели

  • Пакет переменных хранения
  • Минимизировать строки в цепочке (имя/символ допустимы при развертывании)
  • Избегайте неограниченных циклов над пользовательскими массивами.
  • Используйте immutable и constant, где это возможно.

Дорогие контракты увеличивают стоимость трансфера для интеграторов на USDT.

Рабочий процесс тестирования

  1. TronBox скомпилировать
  2. Развертывание Шасты
  3. Скрипт TronWeb: передать, утвердить, передать из
  4. Краевые случаи нечеткости: нулевое количество, максимальное количество uint, попытка повторного входа.

Распространенные уязвимости на TRON

Тот же класс, что и EVM:

  • Реентерабельность
  • Целочисленное переполнение (в Solidity 0.8+ есть встроенные проверки)
  • На mint/withdraw отсутствует контроль доступа.
  • Черный список Honeypot (вредоносные токены)

Аудиторы применяют методологии Ethereum к байт-коду TVM.

Интеграция с dApps

Вызовы внешнего интерфейса через внедренный TronLink TronWeb:

⟦Т2⟧

Бэкэнд: отправить USDT программно.

Проверьте и опубликуйте ABI

После развертывания:

  • TronScan проверка контракта
  • Публикация ABI в документации для интеграторов.
  • Функции администратора документов и право собственности

Закрепление версии компилятора

Зафиксируйте точную версию solc в конфигурации TronBox. Проверка TronScan требует соответствия настроек компилятора, включая прогоны оптимизации. Несовпадающие настройки не проходят проверку даже при наличии правильного исходного кода.

Пути импорта и OpenZeppelin

Используйте версии @openzeppelin/contracts, протестированные на TVM. Некоторые шаблоны, специфичные для Ethereum (например, определенные интерфейсы Oracle), требуют адаптации. Проверьте SafeERC20 на предмет взаимодействия TRC-20 в ваших контрактах — на TRON существуют нестандартные токены с комиссией за перевод, нарушающей наивную интеграцию.

Контрольный список устранения неполадок

Если что-то пойдет не так на TRON, отнеситесь к этому как к проблеме структурированной отладки: подтвердите точный txid в цепочке, проверьте адрес целевого контракта и только затем решите, можно ли устранить сбой. В TRON многие «загадочные» проблемы — это просто одна из следующих: неправильная сеть (основная сеть или тестовая сеть), неправильный контракт токена (поддельный USDT / токены с одинаковым названием), недостаточность ресурсов (OUT_OF_ENERGY / пропускная способность) или задержка пользовательского интерфейса/индексатора между кошельком и проводником.

Начните с этих цепочек проверок:

  • Всегда копируйте полный txid/хэш из своего кошелька или проводника.
  • Подтвердите статус результата передачи на TronScan (SUCCESS, REVERT, OUT_OF_ENERGY или все еще в ожидании).
  • Проверьте, соответствует ли адрес получателя/договора тому, что вы намеревались отправить.
  • Если это вызов контракта, убедитесь, что селектор функций и параметры соответствуют стандарту токена, который, по вашему мнению, вы используете (TRC-20 vs TRC-10 vs BEP-20 на BSC).

Затем примените путь исправления для вашей категории:

  • Подтвердите статус и параметры транзакции.
  • Проверка адресов (контракт токена, получатель, маршрутизатор/отправитель).
  • Добавляйте или делегируйте ресурсы (энергию/пропускную способность), если сбой связан с ресурсами.

Распространенные ошибкиЭти шаблоны вызывают большинство сбоев на уровне пользователя:

  • Использование адресов основной сети в тестовой сети (или наоборот).
  • Копирование символа токена вместо фактического адреса контракта TRC-20.
  • Подписание неправильного адреса одобрения/платежа, поскольку ссылка пользовательского интерфейса является вредоносной или устаревшей.
  • Повторная попытка без изменения ошибочного ввода (например, REVERT продолжает возвращаться до тех пор, пока вы не исправите параметр).

Если вы не уверены, не «просто отправьте еще раз». Внесите одно контролируемое изменение, проверьте на TronScan, затем продолжайте.

Часто задаваемые вопросы

Как узнать, действительно ли транзакция подтверждена?

Используйте TronScan и проверьте статус результата передачи. Ярлыки кошелька «ожидающие» могут отставать; Статус цепочки является источником истины. Скопируйте txid и проверьте SUCCESS/REVERT/OUT_OF_ENERGY, а не только текст пользовательского интерфейса.

Почему пользовательский интерфейс отличается от TronScan?

Некоторые кошельки и децентрализованные приложения используют разные индексаторы или уровни кэша. Короткая задержка между трансляцией и индексированием является нормальной; сравните txid и подождите, пока цепочка стабилизируется, прежде чем сделать вывод об ошибке.

Что мне делать после REVERT?

Остановитесь и декодируйте неудачный вызов. Большинство ошибок REVERT вызваны недопустимыми параметрами, неправильным адресом контракта, отсутствием утверждений или несоответствием между стандартом токена и методом. Устраните причину и подпишите заново.

Безопасно ли подписывать неограниченное разрешение?

Неограниченное одобрение безопасно только для проверенных вами адресов доверенных отправителей (проверенный источник, правильный маршрутизатор и ожидаемый контракт токена). Для тестирования отдавайте предпочтение ограниченному утверждению и отзыву после завершения.

Какие ресурсы требуются TRON для вызовов контракта?

Выполнение смарт-контракта в основном потребляет энергию, а байты транзакций потребляют пропускную способность. Если вы получили OUT_OF_ENERGY, добавьте/заморозьте/делегируйте Энергию. Если пропускная способность исчерпана, сосредоточьтесь на сохранении достаточного количества TRX для байтов и распределения ресурсов.

Как я могу уменьшить количество обращений в службу поддержки?

Покажите пользователям четкое сообщение «что произошло» на основе статуса цепочки и дайте прямую ссылку на соответствующее руководство (ожидание, сбой, отсутствие энергии или проверка). Сохраните txid, чтобы можно было быстро выполнить согласование.

Похожие руководства {#связанные}

Часто задаваемые вопросы

Какую версию Solidity мне следует использовать на TRON?

Сопоставьте версию, поддерживаемую вашим компилятором TronBox или TronIDE — обычно 0.8.x. Закрепите версии в производстве и проверьте с помощью того же компилятора на TronScan.

Могу ли я использовать контракты OpenZeppelin на TRON?

Да. Импортируйте OpenZeppelin ERC20, Ownable и т. д. и скомпилируйте с помощью TronBox. Проверьте совместимость лицензии и версии.

Является ли Solidity единственным вариантом?

Солидность доминирует. Некоторые инструменты экспериментируют с другими языками, компилируемыми в TVM — практически все производственные токены состоят из Solidity.

Как мне вызвать другой контракт?

Паттерн interface + Contract(addr).method() идентичен Ethereum.

TRC-20 то же имя файла, что и ERC20.sol?

В названиях пакетов OpenZeppelin указано ERC20, но развертывание на TRON соответствует стандартному поведению TRC-20.