[Решено] В чем разница между внутренними и внешними сообщениями в смарт-контрактах TON?
-
В блокчейне TON, при реализации моего смарт-контракта dapp в FunC, мой контракт может принимать как internal сообщения, обрабатываемые
recv_internal()
, так и external сообщения, обрабатываемыеrecv_external()
.Какой тип сообщений я должен обрабатывать? Внутренний или внешний?
В чем разница между ними?
-
TLDR
При реализации dapps - всегда используйте только internal messages.
Никогда не используйте external сообщения. Вы можете спокойно игнорировать тот факт, что существуют внешние сообщения.
Кошельки на TON тоже являются смарт-контрактами
В отличие от большинства блокчейнов, включая Ethereum, когда пользователь TON загружает приложение для кошелька, это приложение для кошелька развертывает смарт-контракт кошелька для пользователя. Этот смарт-контракт кошелька хранит баланс пользователя TON coin.
Каждое взаимодействие, которое совершает пользователь, происходит через этот смарт-контракт кошелька. Смарт-контракт кошелька - это то, что удерживает баланс пользователя TON coin, поэтому любое действие, такое как отправка транзакции в контракт dapp, должно проходить через смарт-контракт кошелька для оплаты газа с этого баланса.
Прочтите [это](https://society.ton.org/how-ton-wallets-work-and-how-to-access - them-from-javascript), чтобы узнать больше о смарт-контрактах кошелька на TON.
Контракты # Message и TON
Чтобы связаться со смарт-контрактом на TON, вы должны отправить ему сообщение. Каждая транзакция - это, по сути, сообщение. Основной точкой входа в смарт-контракт является обработчик сообщений.
Внутренние сообщения
Это сообщения, отправляемые другими смарт-контрактами - в частности, сообщения, отправляемые смарт-контрактами кошелька. Поскольку мы сказали выше, что каждое взаимодействие пользователя с dapp будет проходить через смарт-контракт их кошелька (для оплаты газа), это означает, что каждое взаимодействие пользователя с dapp будет осуществляться в форме internal сообщения.
Внешние сообщения
Чтобы понять, почему существуют эти сообщения, мы должны спросить себя, как реализуются смарт-контракты кошелька. Вы действительно можете самостоятельно реализовать смарт-контракт кошелька! [Здесь](https://github.com/ton-blockchain/wallet - contract) - это пример последнего на сегодняшний день кода для кошелька по умолчанию. Однако обычно вам никогда не приходилось бы этого делать! Эта задача обычно возлагается на основную команду TON или проекты, непосредственно разрабатывающие кошельки.
Как вы, наверное, догадались, пользователи общаются со смарт-контрактами своего кошелька с помощью внешнего сообщения. Эти сообщения предназначены для внешних объектов, которые не являются смарт-контрактами, таких как приложение кошелька. Но ... поскольку каждое такое действие должно проходить через контракт кошелька для оплаты газа, ваше dapp в конечном итоге будет получать свои сообщения из смарт-контракта в виде internal сообщений.
Стандартный поток сообщений
Давайте предположим, что пользователь пытается передать токен jetton другому пользователю. Это взаимодействие требует отправки транзакции в смарт-контракт jetton (dapp). Поток был бы таким:
пользователь
---(внешний msg)--->смарт-контракт кошелька пользователя
---(внутренний msg)--->смарт-контракт jetton
Например, если пользователь использует кошелек TonKeeper, внешнее сообщение будет закодировано мобильным приложением TonKeeper.
Почему я видел, что некоторые dapps обрабатывают внешние сообщения?
Контракт dapp может обрабатывать внешние сообщения. Я видел, что некоторые разработчики используют этот подход для развертывания, а некоторые разработчики используют это для действий с ролью администратора, таких как обновления.
Однако в обоих случаях лучше всего использовать внутренние сообщения, а не внешние. Роль администратора также может быть контрактом с несколькими сигнатурами, используя внешнее сообщение, они нарушают абстракцию и не смогут поддерживать multi-sig.
-
Блокчейн-сети часто состоят из различных узлов (компьютеров), которые взаимодействуют друг с другом. Они отправляют и получают сообщения, содержащие транзакции, блоки и другие данные. Это сообщение обычно подразделяется на внутренние и внешние сообщения:
** Внутренние сообщения **: Обычно это транзакции или сообщения, отправляемые между смарт-контрактами внутри блокчейн-сети. Они также известны как "внутренние транзакции".
Внешние сообщения: Это сообщения, отправляемые в блокчейн-сеть из внешнего источника. Например, когда пользователь инициирует транзакцию, это будет внешнее сообщение для сети.
Следовательно, "recv_external предназначен для входящих внешних сообщений" означает, что функция или метод "recv_external" используется для получения и обработки сообщений, которые отправляются в блокчейн-сеть извне.