December 1, 2022

Multicall - мастхэв всегда и везде

Всем привет! С вами Тёма!

Сегодня мы будем разбираться в работе multicall от 1inch

Начнем

Как всем известно простые call используются вообще везде: запросы балансов, запросы количества нфт у конкретного адреса и запросы других состояний, но есть большая проблема: один запрос = один ответ, что не очень приятно в случаях когда надо сделать условные 10к запросов, чтобы узнать всех овнеров какой-либо нфт коллекции, ведь займет это просто уйму времени

Multicall

Как я думаю понятно из названия - данная фича помогает нам избежать этой проблемы и сделать множественные запросы

Как оно работает

Для начала нам надо получить газлимит на каждый чанк (набор из запросов), а получается он так:

  1. У нас есть чанк с заранее указанным максимальным размером (в примере размер 6 запросов)
  2. Далее мы ручками указываем газлимит (Max gas limit), а так же получаем газлимит от ноды (Gas limit from node)
  3. Так же ручками мы прописываем gasBuffer, который нужен для покрытия погрешности неточного указания газа на каждом запросе
  4. Теперь мы вычитаем газ буффер из минимума от Gas limit from node и Max gas limit

Теперь мы знаем в какой газлимит нам надо уместить чанк, поэтому просто добавляем в этот самый чанк все наши запросы до тех пор пока не упремся в газлимит (на картинке это происходит на 5 и 11 запросе, поэтому с них начинается новый чанк)

Может случиться такое, что запросы 4, 9, 10, 12 не выполнились

Теперь мы повторно формируем чанки только из невыполненных запросов, так же у этих чанков уменьшается размер в два раза

Все запросы выполнены и мы получаем свой массивчик ответов)

В итоге мы получаем кратное увеличение скорости запросов!

Быстро пробежимся по практике

Сначала нам надо обозначить куда мы будем слать наш мультикол и как мы будем получать с ноды газлимит

Вот contractAddress на эфире ТЫК, его можете изучить сами, он гипер простой и понятный

Теперь надо создать сам запроc

Далее запрашиваем газлимит и составляем параметры чанков

Ну и в конце мы это все собираем вместе и делаем наш мультиколл

Профит, у нас есть наш массив с результатами запросов!

Репозиторий 1inch с документацией - https://github.com/1inch/multicall

Надеюсь статья была интересной и понятной!

Все мои ресурсы - https://t.me/ortomich_links