Pull to refresh

Прикладной MEV или как наводить свой порядок в блоке Еthereum

Reading time4 min
Views3K

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

Введение

MEV (maximal extractable value) - это процесс извлечения профита из сети блокчейна путем добавления, удаления или изменения порядка транзакций, включенных в блок. Данная концепция зародилась в комьюнити эфира довольно давно (конечно, если исчислять в криптогодах), но начал MEV выходить на новый уровень объемов с ростом DeFi инфраструктуры, которая открыла больше возможностей для серчеров.

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

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

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

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

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

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

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

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

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

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


Вкратце пройдёмся по процессу "майнинга" в Ethereum 2.0 после мержа. Теперь за создание блоков отвечает 3 агента: билдер, релэй (ретранслятор) и валидатор.

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

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

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

Mev-boost chart. Источник: https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177
Mev-boost chart. Источник: https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177

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

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

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

Mev-boost клиент имеет универсальные REST API методы, который можно найти, например, в документации flashbots. Рассмотрим пример отправки бандлы через go:

import (
	"errors"
	"fmt"

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


rpc := flashbotsrpc.New("https://relay.flashbots.net")

// Список подписанных 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)

Больше про MEV

Tags:
Hubs:
Total votes 9: ↑8 and ↓1+7
Comments2

Articles