Internal vs external message

Чем internal message отличается от external на TON: кто платит, откуда приходит, и как это влияет на контракт.

Internal vs external message — коротко

External — вход в сеть снаружи (обычно кошелёк пользователя подписал и отправил). Internal — сообщение от контракта к контракту внутри TON. Бизнес-логику почти всегда пиши в recv_internal / receive(...); external у кошелька — только «принять подпись и разослать internal».


Таблица сравнения

ПараметрExternal messageInternal message
ИсточникВне сети (кошелёк, бот с ключом)Другой контракт / тот же аккаунт
ПодписьНужна (для wallet)Не «подпись человека», а доверие к sender
Оплата газаВнешний отправитель платит за deliveryvalue / gas из сообщения и баланса контракта
BounceНет классического bounce как у internalМожет bounce при ошибке
Типичный входrecv_external у walletrecv_internal у приложений
В контракте dAppРедко как основной APIОсновной способ вызова

Когда это external

  • Пользователь подтверждает действие в Tonkeeper / TON Connect
  • Твой сервис шлёт boc, собранный из signed external wallet message
  • Инициализируешь кошелёк (deploy) через внешнюю схему

Когда это internal

  • Jetton wallet пишет на vault
  • NFT item уведомляет маркетплейс
  • Контракт A отвечает контракту B (или bounce возвращает value)

Пример: кошелёк → контракт

typescript
// Пользователь подписывает external (через TON Connect / wallet).
// Сеть доставляет его на wallet-контракт → wallet шлёт internal на твой dApp.

// В Tact прикладной контракт обычно слушает только internal:
//
// receive(msg: Deposit) { ... }
//
// Проверяй sender (jetton-wallet / router), а не «факт external».
tact (fallback highlight)
// Tact 1.6+ — прикладной вход всегда internal-сообщение
message Deposit {
    queryId: Int as uint64;
    amount: Int as coins;
}

contract Vault {
    receive(msg: Deposit) {
        // sender() — адрес контракта-отправителя (internal), не EOA
        require(sender() == self.trustedJettonWallet, "bad sender");
        // ...
    }
}

Правило: аутентификация в TON — это проверка sender internal-сообщения, а не «как на Ethereum msg.sender после одной транзакции пользователя».

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация