Атака на сэндвич

MEV (извлечение ценности для майнеров) — это проблема, которая существует как в PoW (доказательство работы), так и в PoS (доказательство заклада). MEV дает майнерам преимущество перед другими пользователями блокчейна. Мы этого не хотим. Поэтому существуют различные способы борьбы с ним, например, флэш-боты или даже протокольные идеи. К сожалению, эта проблема сохраняется, и лучше всего атаковать ее с разных сторон. В этом видео мы покажем, как предотвратить одну из самых известных атак: Атака на сэндвич. Мы создадим токен, который защитит покупку или продажу токена в эн-цепочке DEXes.

В собственных примерах «Бутербродные атаки на цепь».

Перед началом работы

Для этого видео вам понадобится Metamask или любой другой EVM-совместимый кошелек, а также GoerliETH, который вы можете бесплатно найти в кране.

Токен ERC20 с анти-сэндвич механизмом

Будьте осторожны и используйте маршрутизатор, который существует в блокчейне, который вы используете.

  • Uniswap Router: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
  • Quickswap Router: 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff
  • Pancakeswap Router: 0x10ED43C718714eb63d5aA57B78B54704E256024E
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
}

contract MyToken is ERC20 {
    mapping(address => uint256) public lastTxByAddress;
    uint public blockCooldownAmount = 1;
    address pair;

    constructor() ERC20("My Token", "MTKN") {
        _mint(msg.sender, 1_000_000 ether);

        IUniswapV2Router uniswapRouter = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(uniswapRouter.factory()).createPair(address(this), uniswapRouter.WETH());
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        amount;
        if(from == pair)
        {
            ensureMaxTxFrequency(to);
            lastTxByAddress[to] = block.number;
        } else if(to == pair)
        {
            ensureMaxTxFrequency(from);
            lastTxByAddress[from] = block.number;
        }else
        {
            ensureMaxTxFrequency(from);
            lastTxByAddress[from] = block.number;
            ensureMaxTxFrequency(to);
            lastTxByAddress[to] = block.number;
        }
    }

    function ensureMaxTxFrequency(address addr) internal virtual {
        bool isAllowed = lastTxByAddress[addr] == 0 ||
            ((lastTxByAddress[addr] + blockCooldownAmount) < (block.number + 1));
        require(isAllowed, "Max tx frequency exceeded!");
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Спасибо за просмотр этого видео!

Следите за нами на сайте dev.to и на Youtube, чтобы узнать обо всем, что связано с блокчейном на английском языке.

Оцените статью
devanswers.ru
Добавить комментарий