изучено: internal vs external calls, msg.sender/msg.value в цепочке вызовов, factory pattern и создания контакта из контракта
📕 выжимка изученого:
🟠internal vs external calls
в solidity контракты могут вызывать функции внутри себя или вызывать другие контракты🟠msg.sender и msg.value в цепочке вызовов
internal call это внутренний вызов функции внутри того же контракта. Он работает как обычный вызов функции в коде и выполняется быстрее, потому что не создаётся новый вызов в EVM
external call это когда контракт вызывает функцию другого контракта. В этом случае происходит отдельный вызов через EVM и передаются данные между контрактами
простой пример: есть контракт кошелька и контракт токена. Если контракт кошелька вызывает функцию перевода в контракте токена, это уже external call
важно понимать что external calls могут быть опаснее, потому что в этот момент управление временно передаётся другому контракту
msg.sender это адрес того кто непосредственно вызвал функцию🟠factory pattern
msg.value это количество ETH которое было отправлено вместе с вызовом
интересный момент появляется когда контракты вызывают друг друга
например пользователь вызывает контракт обменника, а этот контракт внутри вызывает контракт токена чтобы перевести монеты
для контракта токена:
msg.sender будет контракт обменника, а не пользователь
то есть msg.sender всегда показывает последнего участника в цепочке вызовов
это важно учитывать при написании логики доступа и проверок внутри контрактов
factory pattern это паттерн при котором один контракт создаёт другие контракты
то есть у вас есть основной контракт который выступает как фабрика и может создавать новые экземпляры контрактов
это часто используется например для:
>создания новых пулов
>создания новых DAO
>создания новых NFT коллекций
>создания персональных контрактов для пользователей
простой принцип работы:
есть контракт Factory. Пользователь вызывает функцию create. После этого Factory деплоит новый контракт прямо из своего кода
например это может быть фабрика которая создаёт новый NFT контракт для каждого проекта или новый пул ликвидности
в итоге один контракт может создавать много одинаковых контрактов, а также хранить список всех созданных.
главная идея этого паттерна в том, чтобы удобно масштабировать систему и управлять созданием новых контрактов через один центр
Gn 🤑