Невозвращаемые сообщения
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Почти все внутренние сообщения, отправляемые между смарт-контрактами, должны быть возвратными, т. е. иметь установленный бит "возврата". Затем, если целевой смарт-контракт не существует или если он выдает необработанное исключение при обработке этого сообщения, сообщение будет "возвращено" обратно с остатком исходного значения (за вычетом всех комиссий за передачу сообщений и газа). Тело возвращенного сообщения будет содержать 32 бита 0xffffffff
, за которыми следуют 256 бит из исходного сообщения, но с очищенным флагом "возврата»"и установленным флагом "возврата". Поэтому все смарт-контракты должны проверять флаг "возвращено" всех входящих сообщений и либо молча принимать их (немедленно завершая с нулевым кодом выхода), либо выполнять специальную обработку для определения того, какой исходящий запрос не был выполнен. Запрос, содержащийся в теле возвращенного сообщения, никогда не должен выполняться.
Запрос, содержащийся в теле возвращенного сообщения никогда не должен выполняться .
В некоторых случаях необходимо использовать non-bounceable internal messages
. Например, новые аккаунты не могут быть созданы без отправки им хотя бы одного невозвращаемого внутреннего сообщения. Если это сообщение не содержит StateInit
с кодом и данными нового смарт-контракта, не имеет смысла указывать непустое тело во внутреннем сообщении, которое не может быть возвращено.
Рекомендуется - не разрешать
конечному пользователю (например, кошельку) отправлять не подлежащие оплате сообщения, содержащие большие суммы (например, более пяти Toncoin), или предупреждать их, если они это делают. "Лучшей идеей" будет сначала отправить небольшую сумму, затем инициализировать новый смарт-контракт, а затем отправить большую сумму.