> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Защита от MEV в Apex

> Включите mevProtect, чтобы OrbitFlare Apex пропускал лидеров из блок-листа Shield и снижал риск сэндвич-атак на свопы. Работает в JSON-RPC, HTTP и QUIC.

## Что она делает

Известно, что некоторые валидаторы проводят сэндвич-атаки или иным образом эксплуатируют транзакции, которые получают. При включённой защите от MEV Apex **пропускает лидеров из блок-листа Shield**, когда пересылает вашу транзакцию. Транзакция ждёт лидера, которого нет в списке, вместо того чтобы попасть к тому, кто в нём есть.

Блок-лист представляет собой ончейн-политику [Yellowstone Shield](https://github.com/rpcpool/yellowstone-shield), поэтому он публичен и доступен для аудита.

## Компромисс

|                               | `mevProtect: false` (по умолчанию)                                     | `mevProtect: true`                                    |
| ----------------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------- |
| **Используемые лидеры**       | Все лидеры                                                             | Все лидеры, кроме тех, что в блок-листе Shield        |
| **Скорость попадания в блок** | Максимальная                                                           | Может быть ниже на время слотов лидеров из блок-листа |
| **Лучше всего для**           | Переводов, минтов, ликвидаций, всего, что не подвержено сэндвич-атакам | Свопов и других сделок, чувствительных к цене         |

Лидер производит 4 слота подряд, около 1.6 секунды. Когда очередь доходит до лидера из блок-листа, защищённая транзакция пережидает его ход. Убедитесь, что у вашего blockhash осталось время, и не используйте защиту как замену разумному ограничению проскальзывания.

## Как её включить

Защита от MEV задаётся для каждой транзакции по HTTP и для каждого соединения по QUIC.

| Транспорт                       | Настройка                                                                                                  |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| JSON-RPC `sendTransaction`      | Третий параметр `true`                                                                                     |
| `POST /send`                    | `"mevProtect": true` в теле JSON                                                                           |
| `POST /send-bin`, `/send-batch` | Флаг запроса `?mev_protect=1`                                                                              |
| QUIC, клиент на Rust            | `ClientOptions::mev_protect = true`                                                                        |
| QUIC, другие языки              | Байт `mev_protect`, равный `1`, в [пакете транзакции](/ru/apex/sending-transactions#quic-из-других-языков) |

В примерах ниже `TX_BASE64` и хелпер `apex-tx` взяты из раздела [Отправка транзакций](/ru/apex/sending-transactions#соберите-подписанную-транзакцию-с-чаевыми).

<CodeGroup>
  ```bash cURL theme={null}
  TX_BASE64=$(node apex-tx.mjs)

  # JSON-RPC: the third param is mevProtect.
  curl -s "$APEX_RPC" \
    -H "Content-Type: application/json" \
    -H "x-api-key: $APEX_API_KEY" \
    -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"sendTransaction\",\"params\":[\"$TX_BASE64\",{\"encoding\":\"base64\"},true]}"

  # Binary route: the mev_protect query flag.
  TX_BASE64=$(node apex-tx.mjs)
  echo "$TX_BASE64" | base64 --decode | curl -s "$APEX_RPC/send-bin?mev_protect=1" \
    -H "Content-Type: application/octet-stream" \
    -H "x-api-key: $APEX_API_KEY" \
    --data-binary @-
  ```

  ```javascript JavaScript theme={null}
  import { apexRpc, buildTx, confirm } from "./apex-tx.mjs";

  const tx = await buildTx({ label: "apex mev protect" });
  const signature = await apexRpc("sendTransaction", [
    Buffer.from(tx.serialize()).toString("base64"),
    { encoding: "base64" },
    true, // mevProtect
  ]);
  console.log("accepted:", signature);
  console.log("landed in slot", await confirm(signature));
  ```

  ```python Python theme={null}
  import base64

  from apex_tx import apex_rpc, build_tx, confirm

  tx = build_tx(label="apex mev protect")
  signature = apex_rpc("sendTransaction", [
      base64.b64encode(bytes(tx)).decode(),
      {"encoding": "base64"},
      True,  # mevProtect
  ])
  print("accepted:", signature)
  print("landed in slot", confirm(signature))
  ```

  ```rust Rust theme={null}
  // QUIC: protection is a connection option. Every send on this client is protected.
  use apex_sender_client::{ApexSenderClient, ClientOptions, Region};

  let client = ApexSenderClient::connect_with_options(
      ClientOptions {
          endpoint: Some(Region::Frankfurt.quic_endpoint()),
          mev_protect: true,
          ..Default::default()
      },
      &api_key,
  )
  .await?;
  let signature = client.send_transaction(&tx).await?;
  ```
</CodeGroup>

<Tip>
  Если в Rust вам нужны и защищённые, и незащищённые отправки, держите два клиента: один с `mev_protect: true` и один без него. У каждого своё соединение, и оба остаются прогретыми.
</Tip>
