샌드위치 공격

8790 단어
MEV(채굴 가능한 가치)는 현재 PoW(작업 증명)에도 존재하지만 PoS(지분 증명)에서도 계속될 문제입니다. MEV는 일반 사용자보다 광부에게 온체인 이점을 제공합니다. 이는 일반 사용자에게 불공평하기 때문에 원하지 않습니다. 플래시봇과 같은 솔루션 또는 이더리움 프로토콜 수준의 솔루션과 같은 몇 가지 아이디어가 현재 단기 및 장기적으로 작업 중입니다. 그럼에도 불구하고 이는 지속되는 문제이며 우리는 다른 측면에서 이를 공격해야 합니다. 이 비디오에서는 Solidity에서 가장 일반적인 공격 중 하나를 억제할 수 있는 방법을 보여주고 ERC20 토큰에서 샌드위치 공격을 방지할 수 있는 방법을 탐색할 것입니다.

eigenphi에서 메인넷의 샌드위치 공격 사례를 찾을 수 있습니다.



시작하기 전에



이 튜토리얼에서는 Metamask 또는 faucet에서 얻을 수 있는 Goerli 자금과 호환되는 다른 지갑이 필요합니다.

샌드위치 방지 메커니즘이 있는 ERC20 토큰



사용 중인 블록체인에 존재하는 라우터 주소를 사용하고 있는지 확인하십시오.
  • 유니스왑 라우터: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
  • 퀵스왑 라우터: 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff
  • 팬케이크스왑 라우터: 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 및 in에서 우리를 팔로우하세요.

    좋은 웹페이지 즐겨찾기