[Решено] Как один смарт-контракт на блокчейне TON может вызывать метод в другом смарт-контракте?
-
Существует существующий контракт, который был развернут кем-то другим, например токен, у которого есть методы получения, такие как
get_balance(address)
илиget_total_supply()
Я пишу новый смарт-контракт в FunC, который должен считывать информацию из этого токен-контракта, например, мне нужно прочитать чей-то баланс из моего кода
Как я могу это сделать?
-
Для одного контракта на TON невозможно вызвать метод в другом смарт-контракте на TON.
Шаблон контрактов, вызывающих контракты синхронно (в рамках потока одной и той же транзакции), исходит от Solidity и EVM, но этот шаблон применим не ко всем блокчейнам. Существует несколько концептуальных различий между TON и EVM - вы можете прочитать о них подробнее [здесь](https://society.ton.org/six-unique-aspects-of-ton-blockchain-that-will - неожиданность-солидность-разработчики).
Лучше просматривать смарт-контракты на TON, такие как micro services, которые запущены на разных машинах. Они могут отправлять сообщения друг другу, но эти сообщения являются асинхронными, а не атомарными - поэтому они могут обрабатываться в разных блоках (в разных транзакциях).
Вам нужно будет учесть это в вашей контрактной архитектуре. Вот несколько идей о том, как это сделать:
-
Допустим, вашему контракту необходимо знать свой собственный баланс токенов. Вы можете сохранить этот баланс в переменной в вашем собственном контракте. Каждый раз, когда ваш токеновый кошелек получает токены, вы можете организовать отправку вам уведомления и обновлять эту переменную при получении этого сообщения.
-
Чтобы запросить данные из другого контракта, вы можете отправить ему сообщение, и другой контракт ответит сообщением, содержащим ответ. Это разделит поток на 3 разные транзакции, что повлечет за собой свои собственные сложности, такие как отмена любых эффектов первой, если одна из последующих завершится неудачей.
-