Multicall - мастхэв всегда и везде
Сегодня мы будем разбираться в работе multicall от 1inch
Начнем
Как всем известно простые call используются вообще везде: запросы балансов, запросы количества нфт у конкретного адреса и запросы других состояний, но есть большая проблема: один запрос = один ответ, что не очень приятно в случаях когда надо сделать условные 10к запросов, чтобы узнать всех овнеров какой-либо нфт коллекции, ведь займет это просто уйму времени
Multicall
Как я думаю понятно из названия - данная фича помогает нам избежать этой проблемы и сделать множественные запросы
Как оно работает
Для начала нам надо получить газлимит на каждый чанк (набор из запросов), а получается он так:
- У нас есть чанк с заранее указанным максимальным размером (в примере размер 6 запросов)
- Далее мы ручками указываем газлимит (Max gas limit), а так же получаем газлимит от ноды (Gas limit from node)
- Так же ручками мы прописываем gasBuffer, который нужен для покрытия погрешности неточного указания газа на каждом запросе
- Теперь мы вычитаем газ буффер из минимума от Gas limit from node и Max gas limit
Теперь мы знаем в какой газлимит нам надо уместить чанк, поэтому просто добавляем в этот самый чанк все наши запросы до тех пор пока не упремся в газлимит (на картинке это происходит на 5 и 11 запросе, поэтому с них начинается новый чанк)
Может случиться такое, что запросы 4, 9, 10, 12 не выполнились
Теперь мы повторно формируем чанки только из невыполненных запросов, так же у этих чанков уменьшается размер в два раза
Все запросы выполнены и мы получаем свой массивчик ответов)
В итоге мы получаем кратное увеличение скорости запросов!
Быстро пробежимся по практике
Сначала нам надо обозначить куда мы будем слать наш мультикол и как мы будем получать с ноды газлимит
Вот contractAddress на эфире ТЫК, его можете изучить сами, он гипер простой и понятный
Теперь надо создать сам запроc
Далее запрашиваем газлимит и составляем параметры чанков
Ну и в конце мы это все собираем вместе и делаем наш мультиколл
Профит, у нас есть наш массив с результатами запросов!
Репозиторий 1inch с документацией - https://github.com/1inch/multicall
Надеюсь статья была интересной и понятной!