External Message
Сообщение в TON извне сети — обычно это транзакция, которую кошелёк присылает на свой собственный wallet-контракт, чтобы запустить цепочку действий.
Синонимы: внешнее сообщение, ext-msg, ext-in
External Message — это сообщение, которое попадает в TON-сеть извне: его источник не другой контракт, а внешний клиент (кошелёк, бот, бэкенд). Почти всегда external-message — это запрос, идущий от пользовательского кошелька на его же wallet-контракт.
Зачем нужны
В акторной модели TON каждое действие — это сообщение между контрактами. Но первое сообщение должно откуда-то взяться. Им и становится external-message: например, пользователь в Tonkeeper нажимает «Send» — приложение собирает external-message, подписывает его приватным ключом, шлёт в сеть. Wallet-контракт его принимает, проверяет подпись и уже от своего имени рассылает internal-messages.
Чем отличается от internal
| Параметр | External | Internal |
|---|---|---|
| Источник | вне сети | другой контракт |
| Подпись | обычно требуется (приватный ключ) | не нужна |
| Кто платит газ | контракт-получатель из своего баланса | как правило отправитель |
| Bounce | нет | да, если флаг включён |
External-message не приносит TON в сеть напрямую: газ списывается с баланса контракта-получателя. Поэтому wallet-контракт обязан хранить достаточный баланс — если он пуст, сеть просто отвергает external.
Защита от спама
Любой может слать external-сообщения куда угодно — это публичный канал. Поэтому wallet-контракт первым делом проверяет подпись и nonce: невалидное сообщение отбрасывается до того, как тратится газ. Это особенность TON: отвергнуть внешнее сообщение должно быть дешевле, чем его обработать.