Проверка отправителя сообщения (sender) в Tact
Настроишь require(sender() == trusted): не примешь поддельные уведомления от чужих контрактов.
Проверка sender
В TON аутентификация на приёме internal-сообщения — это sender(): адрес контракта (или кошелька), который реально отправил сообщение. Поля body можно скопировать; адрес отправителя подделать нельзя. Доверяй данным только после сверки с известным адресом.
Уязвимо: доверие к opcode без sender
Исправлено: whitelist адреса
Как это работает
- Jetton deposit:
sender()должен быть ожидаемым jetton-wallet (вычисленным из master + owner), а не «любым контрактом с похожим body». - NFT ingress:
sender()= item, плюс проверка, что item принадлежит нужной collection. sender()— не «пользователь с фронта»; часто это промежуточный контракт в цепочке сообщений.- Owner-check и partner-check — один механизм (
requireна адрес), разные роли в storage.
Частые ошибки
Сверяешь строку/opcode и игнорируешь sender → классическая подделка уведомления.
Хардкодишь адрес testnet-oracle в mainnet → либо тишина, либо чужой контракт с тем же init-кодом на другом ключе.
Принимаешь «с любого wallet пользователя» без привязки к своему registry → спам и ложные зачисления.
Что дальше
- Access control: только владелец — admin vs доверенный oracle
- Взаимодействие контракт-контракт — связка запрос/ответ с проверкой sender
- Типичные уязвимости контрактов — место sender-check в карте рисков
Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация