Используемый MEV или как навести порядок в блоке Ethereum

На Хабре мы уже вошли в темный лес MEV, но почти не коснулись его подержанной стороны. В этой статье мы рассмотрим основную инфраструктуру MEV в эфире и рассмотрим несколько примеров того, как она работает сегодня.

Вступление

MEV (Maximum Extractable Value) — это процесс извлечения прибыли из сети блокчейна путем добавления, удаления или перестановки транзакций, включенных в блок. Это понятие зародилось в сообществе Ethereum давно (конечно, если исчислять его в крипто-годах), но MEV начал выходить на новый уровень объемов с ростом инфраструктуры DeFi, что открыло больше возможностей для серверов.

Проще говоря, принцип MEV выглядит следующим образом: «Эй, майнер, поставь мою транзакцию рядом с ней, чтобы я заработал 1 ETH, и я отдам тебе за это половину». Это явно беспроигрышная ситуация, как для тех, кто нашел эту транзакцию (сервера), так и для тех, кто может изменить порядок транзакции при создании блока.

Важным понятием в работе с MEV является мемпул. В терминологии блокчейна мемпул — это пул ожидания для транзакций, которые еще не были добавлены в блок и все еще не подтверждены, то есть находятся в состоянии ожидания. Конечно, любой может увидеть все незавершенные транзакции и понять, как они могут повлиять на определенные состояния контракта.

Что они ищут в блокчейне сегодня?

На момент написания наиболее популярными вариантами использования механики MEV были:

  • Арбитраж и сэндвич DEX. Mempul предоставляет трейдерам уникальную возможность прогнозировать цены на биржах. Большинство децентрализованных бирж работают алгоритмы маркетмейкинга, что дает возможность узнавать состояние цены после каждой предстоящей транзакции в блоке, зная текущее состояние пулов (контрактов биржи) и поступающих транзакций из мемпула. Здесь перед серферами открывается возможность как для обычного арбитража между разными биржами внутри одного блока, так и для сэндвичинга — покупки и продажи вокруг одной сделки или наоборот.

    Например, трейдер увидел в мемпуле крупную транзакцию на покупку токена AOWL, после чего отправил майнеру свои 2 транзакции: на покупку этого токена непосредственно перед крупной сделкой и мгновенную продажу после этой сделки.

    https://eigenphi.io/mev/ethereum/tx/0xaf55763add3e93292c9981aeca6a8e087c07d982005538e11ba43fd4c6d7e697
  • Ликвидация. Протоколы кредитования, такие как Maker, Compound и Aave, требуют, чтобы пользователи вносили залог (например, ETH). Этот депонированный залог затем используется для предоставления кредита другим пользователям. Когда данный залог имеет потенциальный риск необеспечения кредита (параметры риска для этого заранее определяются сообществом DAO), то любой пользователь сети может погасить долг, взяв залог. В этом случае, например, долг может быть 80 тысяч долларов, а его залог 100 тысяч долларов, поэтому ликвидатор получает немедленную прибыль.

  • НФТ МЭВ. Имея доступ к общей информации о поступающих транзакциях, также можно обнаружить завершение аукционов NFT или их крах, что открывает возможности для извлечения прибыли из этого. Например, если есть популярный дроп NFT и серверу нужен конкретный NFT или пакет NFT, он может разместить транзакцию таким образом, чтобы он был первым в очереди на покупку NFT, или он может купить весь пакет NFT в один раз.

XBNFNM   zkEVM от Polygon против zkSync — «как» все это

Инфраструктура

6dfad58c0f001e1d54aa26bb9239c7f3

Сообщество Flashbots сыграло важную роль в развитии инфраструктуры MEV. Они предложили себя инфраструктура mev-boost – по существу, улучшенный клиент geth (т.е. клиент узла Ethereum). В этой статье мы рассмотрим именно эту инфраструктуру, так как на данный момент все разработчики в сети Эфир используют ее. Однако доминирование Flashbots Builder резко упало в добыче блоков, хотя на вершине они собирали почти 80% всех блоков Эфира.

92f4cef05ae0abf88a5c269327e01033

Кратко пройдемся по процессу «майнинга» в Ethereum 2.0 после слияния. Теперь за создание блоков отвечают 3 агента: билдер, реле (реле) и валидатор.

Конструктор блоков получает транзакции от серверов и пользователей, которые, помимо оплаты газа, выражают свою предпочтительную позицию в блоке, делая ставки с закрытой ценой. Задача строителя — построить максимально прибыльный блок, используя разные стратегии.

Ретранслятор — это агент, отвечающий за проверку блоков перед их передачей валидаторам. Relay защищает валидаторы от спама, проверяя строительные блоки и оценивая значение MEV для каждого блока.

Валидатор mev-boost — это участник Beacon Chain, выбранный для предложения блока для конкретной дорожки. Валидатор связывается с реле, чтобы получить наиболее прибыльный заголовок блока, который он проверяет, подписывая его своим открытым ключом через условное депонирование.

Диаграмма бустинга Мэв. Источник: https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177.
Диаграмма бустинга Мэв. Источник: https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177.

Таким образом, пользователи сети могут напрямую влиять на сбор блоков через инфраструктуру mev-boost. Для заказа транзакций используются бандлы или бандлы, представляющие собой упорядоченный набор транзакций, которые сервер отправляет в билдер через API.

Для примера посмотрим эта ликвидационная сделка, что было сделано через конструктор flashbots. Посмотрим на его позицию в блоке и увидим, что он второй в блоке сразу после публичной трансфертной транзакции, которая обновляет цепную цену актива. В этом примере транзакции 0xcc101… и 0xba0c4… являются атомарными ссылками.

XBNFNM   Названы самые дорогие молочные продукты в России
ae3da3c81b52d709a8dee4cfa96cae16

Пример использования

Клиент mev-boost имеет общие методы REST API, такие как в документации флешбота. Рассмотрим пример отправки пакета через go:

import (
	"errors"
	"fmt"

	"github.com/ethereum/go-ethereum/crypto"
	"github.com/metachris/flashbotsrpc"
)


rpc := flashbotsrpc.New("

// Список подписанных raw транзакций в порядке исполнения бандла
txs := []string{"0x1234...", "0x4567.."}

// Номер блока, для которого бандл будет валиден
blockNumber := 13281018

sendBundleArgs := flashbotsrpc.FlashbotsSendBundleRequest{
    Txs:         txs,
    BlockNumber: blockNumber,
}


// Приватный ключ, который используется в качестве подписи именно запроса в FB
var privateKey, _ = crypto.GenerateKey()

result, err := rpc.FlashbotsSendBundle(privateKey, sendBundleArgs)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", result)

Подробнее о МЭВ

Source