# MEV从0到1

By [degendisco.eth](https://paragraph.com/@degendisco) · 2022-07-07

---

**The 0 to 1 Guide for MEV是我认为市面上关于MEV最好的小白入门文章之一，原文如下，浅作翻译**

**Credit to:**

[https://calblockchain.mirror.xyz/c56CHOu-Wow\_50qPp2Wlg0rhUvdz1HLbGSUWlB\_KX9o](https://calblockchain.mirror.xyz/c56CHOu-Wow_50qPp2Wlg0rhUvdz1HLbGSUWlB_KX9o)

原作者: [0xmebius](https://twitter.com/0xmebius)

这是一个快速的MEV入门指南，旨在让你快速获得这个领域的最新知识，没有废话，全是干货。指南中的每个板块都基于前一个板块的知识，难度递增，你可以跳过已知的内容。每个板块中包含延伸的知识，提供进一步的深度内容。大部分的Crypto/DeFi话题都只会po上一些已有的高质量文章和文档（不重复造轮子），但其中深度的MEV话题和alpha，会包含我这一路学到的干货。学习完整个指南，你应该有能力去构建属于自己的MEV机器人。祝君好运！

目录
--

*   **背景**
    
    *   什么是区块链?
        
    *   什么是以太坊?
        
    *   智能合约概览
        
    *   什么是DeFi?
        
    *   ERC-20概览
        
    *   什么是稳定币?
        
    *   什么是自动化做市商(AAM)?
        
    *   什么是去中心化银行?
        
    *   Forks
        
    *   中心化交易所
        
*   **MEV**
    
    *   MEV 策略 101
        
        *   三明治攻击
            
        *   套利
            
        *   清算
            
        *   抢先交易
            
        *   即时流动性
            
        *   长尾MEV
            
    *   MEV Bots实例
        
    *   最优gas费竞价
        
    *   Flashbots
        
    *   智能合约 & 开发工具
        
    *   博弈论, 社媒调性 & 安全
        
    *   Alpha Leaks
        
    *   Rust资源
        

背景
--

### 什么是区块链？

简单 (~5min):

[https://www.coinbase.com/learn/crypto-basics/what-is-a-blockchain](https://www.coinbase.com/learn/crypto-basics/what-is-a-blockchain)

中等 (~30min):

[https://www.investopedia.com/terms/b/blockchain.asp](https://www.investopedia.com/terms/b/blockchain.asp)

### 什么是以太坊?

简单 (~5min):

[https://ethereum.org/en/what-is-ethereum/](https://ethereum.org/en/what-is-ethereum/)

中等 (~1hr):

[https://ethereum.org/en/what-is-ethereum/](https://ethereum.org/en/what-is-ethereum/)

难 (~1 day):

[https://ethereum.org/en/whitepaper/](https://ethereum.org/en/whitepaper/)

开发文档:

[https://ethereum.org/en/developers/docs/](https://ethereum.org/en/developers/docs/)

兔子洞:

[https://ethereum.org/en/developers/docs/](https://ethereum.org/en/developers/docs/)

### Smart Contracts

简单:

[https://ethereum.org/en/smart-contracts](https://ethereum.org/en/smart-contracts)

难:

[https://github.com/ethereumbook/ethereumbook/blob/develop/07smart-contracts-solidity.asciidoc#what-is-a-smart-contract](https://github.com/ethereumbook/ethereumbook/blob/develop/07smart-contracts-solidity.asciidoc#what-is-a-smart-contract)

跟着课程学 (~7 Days):

[https://cryptozombies.io/](https://cryptozombies.io/)

快速入门 (~1 Day):

[https://docs.soliditylang.org/](https://docs.soliditylang.org/)

跟着实例学:

[https://github.com/James-Sangalli/learn-solidity-with-examples](https://github.com/James-Sangalli/learn-solidity-with-examples)

样板代码:

[https://docs.openzeppelin.com/contracts/4.x/](https://docs.openzeppelin.com/contracts/4.x/)

### 什么是DeFi?

概述:

[https://ethereum.org/en/defi/](https://ethereum.org/en/defi/)

如果你想了解更多:

[https://docs.ethhub.io/built-on-ethereum/open-finance/what-is-open-finance/](https://docs.ethhub.io/built-on-ethereum/open-finance/what-is-open-finance/)

### ERC-20 代币

[https://cointelegraph.com/explained/erc-20-tokens-explained](https://cointelegraph.com/explained/erc-20-tokens-explained)

任何人都可以在以太坊部署ERC20代币。基于不同的gas费，部署ERC20代币合约成本一般在$5到$500之间。相对于从零开始开发一条新的区块链，利用ERC20合约是创建加密货币最常用的方式。

开发文档:

[https://ethereum.org/en/developers/docs/standards/tokens/erc-20/#top](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/#top)

[https://docs.openzeppelin.com/contracts/4.x/erc20](https://docs.openzeppelin.com/contracts/4.x/erc20)

[https://eips.ethereum.org/EIPS/eip-20](https://eips.ethereum.org/EIPS/eip-20)

查找代币:

[https://etherscan.io/](https://etherscan.io/)

### 稳定币

稳定币是加密货币的一种类型，锚定某种法币的价值，最常见的是美元稳定币（下文提到的稳定币也以都美元稳定币为例）。有了稳定币之后，人们不再需要频繁地进行法币-加密货币兑换以锁定价值，大大增加了DeFi的流动性。

两大稳定币类型，中心化稳定币和算法稳定币：

**_中心化稳定币\*_** 通过美元保证金，来印发对应数额的稳定币。中心化稳定币的机制很好理解，是目前最常见的稳定币类型。很多传统的金融机构和中心化交易所都可以交易中心化稳定币。[_Tether’s USDT_](https://tether.to/) 和 [_Circle’s USDC_](https://www.circle.com/en/usdc) _是两个最广泛使用的稳定币，目前流通量在_ [_~117 Billion USD_](https://coinmarketcap.com/view/stablecoin/)_. 但是这类稳定币由于其中心化的特质，违背了区块链的去中心化精神。关于其美元保证金/抵押物是否足额，也常有争议。特别是USDT，常有暴雷传闻，他们也从没有发布过一个真正让人信服的抵押物审计报告。_[_Read more here_](https://www.bloomberg.com/news/features/2021-10-07/crypto-mystery-where-s-the-69-billion-backing-the-stablecoin-tether). USDC也是有类似的问题。\*

市面上有很多稳定币协议，其中使用最大最有名的是[MakerDAO’s](https://makerdao.com/en/)协议和它的稳定币DAI。

开发文档:

[https://makerdao.com/en/whitepaper](https://makerdao.com/en/whitepaper)

[https://docs.makerdao.com/](https://docs.makerdao.com/)

另一个比较新的项目是[Liquity protocol](https://www.liquity.org/)和它的稳定币LUSD。他们通过创新的流动性机制提高了资本利用率（同样资产能产出更多稳定币）。

开发者文档:

[https://docs.liquity.org/](https://docs.liquity.org/)

最后要提一句很有争议的算法稳定币。有些算稳尝试在没有抵押物的情况下，仅通过某种算法组合锚定美金。这种算稳往往风险较大，因为他们非常依赖外部市场动能，历史上很多的算稳都陷入了死亡螺旋。

[阅读更多](https://cointelegraph.com/news/iron-finance-bank-run-stings-investors-a-lesson-for-all-stablecoins)

### 什么是自动做市商(AMM)?

我有一个BTC，想把它换成对应价值的ETH。我可以把这个比特币转入中心化交易所，然后再挂单交易，就像我在传统股票市场里卖掉苹果股票，再买特斯拉股票一样。这些中心化交易所都采用交易委托账本模式。当我挂卖单想要卖X BTC来买入Y ETH，一个对手方会用对应的买单来进行成交。这种模式在高并发的中心化交易所没问题，但在去中心化网络中就遇到了瓶颈：想象一下，在一个每15秒只能成交150笔交易并且每笔交易还要付$50-$300的区块链网络中去实现这样一个交易委托账本模式，想想都头大。

显然我们需要一个新的机制实现在链上的资产自由交易：

[https://www.coindesk.com/learn/2021/08/20/what-is-an-automated-market-maker](https://www.coindesk.com/learn/2021/08/20/what-is-an-automated-market-maker)

### Uniswap V2是AMM鼻祖

深度阅读:

[https://uniswap.org/whitepaper.pdf](https://uniswap.org/whitepaper.pdf)

开发文档:

[https://docs.uniswap.org/protocol/V2/concepts/protocol-overview/how-uniswap-works](https://docs.uniswap.org/protocol/V2/concepts/protocol-overview/how-uniswap-works)

[https://github.com/Uniswap/v2-core](https://github.com/Uniswap/v2-core)

### Uniswap V3

[_Uniswap_](https://uniswap.org/)\* V3 引入了一个更复杂的AMM范式，以此来提高资本效率，减少价格波动。\*

深度阅读:

[https://uniswap.org/whitepaper-v3.pdf](https://uniswap.org/whitepaper-v3.pdf)

开发文档:

[https://docs.uniswap.org/protocol/introduction](https://docs.uniswap.org/protocol/introduction)

[https://github.com/Uniswap/v3-core](https://github.com/Uniswap/v3-core)

### 什么是Curve?

[_Curve_](https://curve.fi/)\* 本质上是Uniswap V2的复杂的数学模型版本，实现了更小的滑点。Curve这套机制更适合来交易价格相近的资产，比如稳定币和稳定币之间的大额交易。Curve流动性最好的池子是3CRV，其中包括了USDC, USDT和DAI。

深度阅读:

[https://curve.fi/files/stableswap-paper.pdf](https://curve.fi/files/stableswap-paper.pdf)

[https://curve.fi/files/crypto-pools-paper.pdf](https://curve.fi/files/crypto-pools-paper.pdf)

开发文档:

[https://curve.readthedocs.io/](https://curve.readthedocs.io/)

[https://github.com/curvefi/curve-contract](https://github.com/curvefi/curve-contract)

### 去中心化银行

传统银行能让你存钱和借贷，去中心化银行也是一样。我能在去中心化银行中存入各种加密货币(BTC, ETH, USDC, USDT, etc.)挣利息。利息通常是通过算法来控制的（例如有很多人想借BTC，那么我存入的BTC就会比我存入的USDC有更高的利息，供需关系摆在这里）。同样的，我也能抵押贷款，比如我抵押了10,000 USDC，我能借$5000价值的ETH出来。

**Aave**

介绍:

[https://decrypt.co/resources/what-is-aave-inside-the-defi-lending-protocol](https://decrypt.co/resources/what-is-aave-inside-the-defi-lending-protocol)

深度阅读:

[https://github.com/aave/protocol-v2/blob/master/aave-v2-whitepaper.pdf](https://github.com/aave/protocol-v2/blob/master/aave-v2-whitepaper.pdf)

开发文档:

[https://docs.aave.com/developers/getting-started/readme](https://docs.aave.com/developers/getting-started/readme)

[https://github.com/aave/aave-protocol](https://github.com/aave/aave-protocol)

**Compound**

Compound和AAVE类似，这部分可以跳过。

深度阅读:

[https://compound.finance/documents/Compound.Whitepaper.pdf](https://compound.finance/documents/Compound.Whitepaper.pdf)

开发文档:

[https://compound.finance/docs](https://compound.finance/docs)

[https://github.com/compound-finance/compound-protocol](https://github.com/compound-finance/compound-protocol)

### Liquity/MakerDAO

去中心化借贷银行/协议和去中心化稳定币的界限很模糊。两者都能让你存入抵押物来借出其他资产。关键区别在于稳定币协议是能产出新的稳定币，而借贷协议是把其他人的抵押物贷给你。

### 预言机

区块链是独立的分布式数据库，没有和万维网(WWW)的直接连接。这就意味着开发者无法通过以太坊上的智能合约调用API或者下载文件。你甚至无法在智能合约里生成一个密码学上严谨的随机数。所以就有了预言机的需求。

_简介:_

[https://chain.link/education/blockchain-oracles](https://chain.link/education/blockchain-oracles)

开发文档:

[https://docs.chain.link/](https://docs.chain.link/)

### Forks

很大一部分的区块链相关代码都是开源的，每个在区块链上运行的智能合约都是可以公开访问的。然而在区块链上的代码已经被编译为二进制机器码，正常人很难理解。很多项目都会在GitHub上公开未被编译的源代码，这样其他开发者和审计公司就能去检查这个项目代码的安全性。自然地很多人可以轻松地复制粘贴智能合约源码，并部署一个类似的合约，这种行为就被称为Forks。Forks有不同级别的更改程度，有人原封不动复制粘贴，有人会加入新的功能，提升原合约的安全性。

你可能会问为什么会有用户去用fork而不是原项目。通常来说，forks会使用很多拉新策略，为这个新协议提高用户量和流动性。最常见的策略叫吸血鬼攻击(Vampire Attack)，提供更多的用户奖励，更低的费用，去鼓励用户从原协议迁移。

SushiSwap是Uniswap V2的fork版本，并成功地应用了吸血鬼攻击从Uniswap拉人头，目前是最成功的fork之一。

阅读更多:

[https://www.gemini.com/cryptopedia/sushiswap-uniswap-vampire-attack](https://www.gemini.com/cryptopedia/sushiswap-uniswap-vampire-attack)

[https://finematics.com/vampire-attack-sushiswap-explained/](https://finematics.com/vampire-attack-sushiswap-explained/)

### 中心化交易所

在中心化交易所中，用户可以在交易所内部的系统里交易资产，就像传统的股票交易所一样。中心化交易所和去中心化交易所不同的地方在于：

1.  **几乎所有的中心化交易所都需要KYC\***(Know Your Customer) 来应对监管。KYC往往需要你提交个人敏感信息如全名、地址、SSN、护照等。中心化交易所也可能因为监管需要屏蔽某个特定区域的用户（你懂的）。去中心化交易所就没有类似的要求。
    
2.  **中心化交易所存有你的资产\***。这意味着你需要事先将资产转入交易所的钱包地址。如果这个中心化交易所被黑客攻击，你的资产就可能有危险。这不像股票交易市场，你如果觉得某笔交易有问题，可以revert该交易。区块链只关心交易是否有被私钥签名，一旦交易成功，就会永久记录在账本上，无法revert。黑客攻击案例：\*[https://www.wired.com/2014/03/bitcoin-exchange/](https://www.wired.com/2014/03/bitcoin-exchange/)
    
3.  \*\*中心化交易所在存入和提取资产时会有交易摩擦\*。\*\*如果你在Uniswap上交易，交易的资产会立马转至钱包，而中心化交易所提币往往会有等待时间，最好的情况也要等待5分钟左右才能转到钱包。最差的情况发生时（如大额提币），交易所往往会要求你提供进一步的验证，如果交易所流动性不足还需要等待他们从冷钱包中提币。交易所也可能会在gas费的基础上加收一笔手续费。
    

市面上有很多不同的中心化交易所，各自的用户体验、安全性、监管合规要求都很多样。交易量最大、最有声誉的几个交易所是Coinbase, Kraken, Gemini & Binance。

MEV
---

现在你应该有足够的知识能理解区块链生态，那么让我们进入MEV的世界吧！MEV, 英文全称Maximal Extractable Value/Miner Extractable Value，最大矿工可提取价值，本质上指的是一切能自动执行的链上交互并获取预期收益。需要注意的是，MEV不是去推测资产的价格涨跌，不是去参与某个链上流动性挖矿庞氏项目，也不是任何传统意义上的投资策略。其中一个精准的解释是，DeFi中的MEV就像是股票市场中的高频交易。

概览:

[https://ethereum.org/en/developers/docs/mev](https://ethereum.org/en/developers/docs/mev)

[https://research.paradigm.xyz/MEV](https://research.paradigm.xyz/MEV)

OG Flashboys 2.0 (难理解，但如果你想构建一个自己的MEV，真的真的要读一下):

[https://arxiv.org/pdf/1904.05234.pdf](https://arxiv.org/pdf/1904.05234.pdf)

非常好玩的内容 (不难，引发思考):

[https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest)

[https://samczsun.com/escaping-the-dark-forest/](https://samczsun.com/escaping-the-dark-forest/)

[https://rekt.news/return-to-the-dark-forest/](https://rekt.news/return-to-the-dark-forest/)

MEV策略101
--------

MEV策略包含一系列的链上交互，目标是在交互按顺序执行后，钱包里有更多的资产价值。

### Sandwiching 三明治攻击

三明治攻击是最有名的MEV。这个策略和高频交易公司的抢先交易策略在本质上是一样的[Michael Lewis’s Flash Boys](https://en.wikipedia.org/wiki/Flash_Boys)。三明治攻击会去观察待确认的链上交易，假如发现一笔交易是想在Uniswap上购买100,000 USDC价值的ETH，那么ETH的价格会在这笔交易后升高。三明治攻击要做的是在这笔交易执行前买入ETH，在这笔交易执行后卖出ETH。

在具体操作中，你可以根据Uniswap的白皮书中提供的计价公式去计算出\*准确\*的交易对价格波动。这是三明治攻击相较于高频交易抢跑策略的一个重要优势（抢跑策略中的滑点是通过概率计算而非准确计算）。这种确定性的价格计算能让你在每笔三明治攻击执行前就合理分配交易数额，提前锁定最终利润。

阅读更多:

[https://medium.com/coinmonks/defi-sandwich-attack-explain-776f6f43b2fd](https://medium.com/coinmonks/defi-sandwich-attack-explain-776f6f43b2fd)

三明治攻击常被DeFi玩家批评为负外部性。实际上可以从负向和正向两个角度来看三明治攻击：

**_负向\*_** 三明治攻击是一种剥削性策略，专门挑对区块链网络和交易滑点一无所知的小白用户下手。最暴力的三明治攻击发生在当小白用户在DEX上交易新上线的山寨币交易对的时候，滑点巨高（有时候能到达99%），导致他们最后收到的币被三明治夹击后所剩无几。

\*\*\*正向\*\*\*\*这种价值提取在经济效率上是完全合理的。当用户在DEX上提交一笔交易，他们会通过minOutput/maxInput来给出他们最大的支付意愿（maximum willingness to pay WTP)。如果这笔订单以更好的价格成交，说明还存在消费者剩余，并没有达到纳什均衡。此时，一个代表第三方的三明治攻击机器人通过一番操作，将经济系统移动至纳什均衡状态，不仅让市场实现了消费者的WTP，也从中获益。就这样，三明治攻击机器人帮助整个生态产出了更多的价值。

正向和负向评价都是合理的，下面是更多的对三明治攻击的解读：

*   三明治攻击永远会存在。如果你不构建自己的机器人，别人会。
    
*   类似的攻击也存在于传统证券市场
    
*   一个创新的交易机制，订单流付款（ [_Payment for Order Flow (PFOF)_](https://www.bloomberg.com/opinion/articles/2021-12-08/what-does-payment-for-order-flow-buy) ）让零售经纪商能通过像Citadel的做市商，为客户提供零费用的交易体验。这些订单不会直接发送到交易所，而是由做市商通过内部做市完成这笔交易。对于一些无法在交易所成交的订单，做市商就可以利用报价位数的差异实现成交，榨取最大价值。
    

### 套利Arbitrage

套利指的是从A处低价买入在B处高卖出，是一套让市场更有效率，抹平交易所价差的机制。

阅读更多：

[https://www.coindesk.com/learn/crypto-arbitrage-trading-how-to-make-low-risk-gains](https://www.coindesk.com/learn/crypto-arbitrage-trading-how-to-make-low-risk-gains)

有些套利可以归为MEV，有些则是传统金融策略：

**原子性套利Atomic Arbitrage**

如果你已经阅读过上文关于智能合约的章节，你应该知道智能合约能打包一系列的链上交互，按顺序执行，并检查各种条件。如果不符合某些条件，智能合约可以强制fail并revert前面发生的所有交互。

这种机制的影响是巨大的。在传统的外汇市场，如果你的策略启动了一笔n角套利，可能会在执行过程中面临市场的突然波动，由于没办法revert，最终的结果可能是亏损。有了智能合约的原子性执行机制，不仅你的每笔交易都会按顺序执行（以太坊是个单点状态机，按顺序执行交易），而且智能合约会保证你的策略执行结果一定是初始余额<最终余额。如果这个条件不符合，智能合约能revert，不会损失本金。

理论上来说，智能合约的revert机制能保证每笔交易都是无风险的。但其实不是真正的无风险，下面的章节会有进一步讨论。

更进一步来说，这种原子性执行特质带来了更多的传统计算机范式中不可能有的金融创新，特别是flashloans闪电贷和flashswaps闪电换。像Uniswap和AAVE这样的DeFi协议通过各种智能合约锁着几十亿美元的资产。传统来说，如果你要从银行贷款，首先需要提供抵押物，再不济也需要有信用，不然跑路了银行就倒霉。有了原子性执行后，借款人可以通过智能合约，从其他协议中进行贷款请求，并在同一个交易中还贷款（加一定费用）。如果贷款未在同一个交易中被返回，那么所有操作都将被revert，仿佛什么都没发生过。

闪电贷是DeFi领域最难理解的概念之一，要求你对区块链的程序执行逻辑有清晰的认知。

闪电贷是一个DeFi利器。当你在链上发现一个三角套利机会，并计算出了最佳套利输入资本为$1m，但你钱包里只有$1000，这个时候你就可以利用闪电贷借出$1m，执行这个三角套利，还款后留下套利利润。这种需要巨量资产才能执行的套利策略在以往是大公司的特权，但在DeFi领域，每个人都有能力通过闪电贷来实现。

AAVE 闪电贷:

[https://docs.aave.com/faq/flash-loans](https://docs.aave.com/faq/flash-loans)

Uniswap 闪电换 (闪电换能让你借出A资产，归还等值B资产）

[https://docs.uniswap.org/protocol/V2/guides/smart-contract-integration/using-flash-swaps](https://docs.uniswap.org/protocol/V2/guides/smart-contract-integration/using-flash-swaps)

**中心化交易所间套利**

中心化交易所间套利更接近传统的外汇套利策略，指的是在A交易所买入资产的同时在B交易所卖出相同资产。由于中心化交易所不允许把存入和提取操作放在同一个交易中，原子性执行就无法实现。由于交易会有延迟而且会产生费用，你必须在每个交易所里都保留对应的套利资产，产生对应的库存风险。由于缺少闪电贷，中心化交易所间套利往往是重资产的策略。

一个常用工具:

[https://hummingbot.io/](https://hummingbot.io/)

**混合套利**

在CEX和DEX之间的套利也很常见，如以下操作：

[_https://etherscan.io/address/0xa57bd00134b2850b2a1c55860c9e9ea100fdd6cf_](https://etherscan.io/address/0xa57bd00134b2850b2a1c55860c9e9ea100fdd6cf)

另一个常见的混合套利策略是在不同链的DEX间套利。如Ethereum和Polygon之间的相同资产可能有着不同的价格，形成套利空间。

### 清算Liquidations

DeFi借贷协议能让用户以存入抵押资产，借出另一种资产。如果抵押资产价格突然暴跌怎么办？DeFi协议如何保证在已借出的资产有充分的抵押物？

当用户借出一笔贷款，这笔贷款永远都是超额抵押的（抵押资产价值大于贷款价值）。但是如果当抵押资产价格暴跌至一定阈值（通常是贷款额的110%-300%），DeFi协议就能让任何人清算这笔贷款，以此来保证系统的偿付能力，协议也会付给清算人一笔费或让其保留一部分被清算的资产用来鼓励这种清算行为。

清算是由智能合约调用DeFi协议中的方法发起的。清算人需要帮助借款人偿还一部分或全部债务，协议也会同时将借款人的抵押资产转移到清算人账上（有时会有一笔额外奖励金）。由于之前提到的超额抵押机制，抵押资产的价值一定是比贷款资产的价值更高的（不然人们也没有动力去帮忙清算）。

当你用自有资金清算一笔贷款时，常常会有两个问题：1. 重资产，毕竟需要$1m的资产去偿还$1m的贷款。2. 如果短时间内抵押资产快速下跌，你的资产也会持续贬值。这时候用闪电贷就很完美，你可以把抵押物还给闪电贷，保留一部分利润。

AAVE 清算文档:

[https://docs.aave.com/faq/liquidations](https://docs.aave.com/faq/liquidations)

### 抢先交易Generalized Frontrunning

每当交易被提交到区块链网络上，某一个节点会通过p2p gossip协议将交易传达给其他节点，于是每笔交易在提交到最终写入区块链之间需要消耗一点时间。以太坊网络是一个公开可读写的状态机，每笔交易的执行确认都代表着全局状态的变更，这就意味着每笔公开广播的并未确认的交易都可以用来拿来用于模拟改变当前状态。一个简单的抢先交易机器人会模拟每笔未确认的交易，并观察改变后的状态。如果这个机器人在模拟中发现某笔交易有利润，则会尝试去复制这个交易的所有数据，包括交易发往哪里，数据字段，并通过支付更高的gas费，抢在原有交易确认前执行这笔复制的交易，来锁定利润。这就是抢先交易机器人仅仅通过模拟、复制其他交易发起方的行为就能拿捏套利机会的原理。

链上还有其他更复杂的抢先交易策略，包括模糊测试相关的交易字段，识别并替代call data中的钱包地址，追踪智能合约交互以获取有利润的subcalls。

阅读”非常好玩的内容”章节来看抢先交易策略的更多案例。

### 即时流动性Just In Time (JIT) Liquidity

**前提要求: 阅读Uniswap V3相关资料**

UniswapV3允许LPs把其提供的流动性集中在一段价格区间，以此来提高资本利用率。如果你认为Uniswap V3两个代币的价格可能保持相关，你可以设定一个小区间，以此来获得比大区间更多量级的手续费收入。

然而小区间也意味着更大的无常损失风险，价格变动也更有可能让交易对滑出设定的区间，导致收不到手续费。

有了以上背景，现在假设你在链上观察到了一笔大额的pending交易，在Uniswap V3中用$10m USDC兑换ETH，假定这个交易对的交易手续费是0.3%，这就意味着为这笔交易提供流动性能获得$30,000收入。如果你能在这笔交易发生前，在最精准的区间提供$10m流动性，你会相应地比大区间LPs获得更多手续费。你可以选择在收到手续费后立马撤掉流动性。

这套策略能让你榨取大额交易中的手续费的同时，不需要面对AMM中长期的不确定性风险。当然由于这套策略不是原子性策略，会比较重资产。

阅读更多:

[https://twitter.com/ChainsightLabs?ref\_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1457958811243778052%7Ctwgr%5E%7Ctwcon%5Es1\_&ref\_url=https%3A%2F%2Fcalblockchain.mirror.xyz%2Fc56CHOu-Wow\_50qPp2Wlg0rhUvdz1HLbGSUWlB\_KX9o](https://twitter.com/ChainsightLabs?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1457958811243778052%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fcalblockchain.mirror.xyz%2Fc56CHOu-Wow_50qPp2Wlg0rhUvdz1HLbGSUWlB_KX9o)

### 长尾 Long Tail

三明治攻击、套利、清算占MEV中的绝大多数，上文提到的策略都已经广为人知，结果就是非常内卷。如果你读完了这篇文章后，想通过实现上述任一策略来获利，可以说是基本不可能的：已经有大量科学家通过非常优化的实现垄断了这个市场。

长尾MEV包括了除了上述策略外的其他小众、晦涩、未知的MEV，可能出现在一些没那么有名的协议、突发事件、或者非传统经济机制中。

搜寻长尾MEV会是你最需要花时间精力的地方，也会最有成果，但需要你对DeFi领域有足够的理解和探索能力。

其中一个案例：

[https://twitter.com/ChainsightLabs/status/1460824051010744327?ref\_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1460824051010744327%7Ctwgr%5E%7Ctwcon%5Es1\_c10&ref\_url=https%3A%2F%2Fcalblockchain.mirror.xyz%2Fc56CHOu-Wow\_50qPp2Wlg0rhUvdz1HLbGSUWlB\_KX9o](https://twitter.com/ChainsightLabs/status/1460824051010744327?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1460824051010744327%7Ctwgr%5E%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fcalblockchain.mirror.xyz%2Fc56CHOu-Wow_50qPp2Wlg0rhUvdz1HLbGSUWlB_KX9o)

### 案例

读到现在你应该有了一些MEV的基础知识，让我们来看一些案例：

**从0到1跑通全流程，并且写得很详细的案例：**

[https://bertcmiller.com/2021/09/05/mev-synthetix.html](https://bertcmiller.com/2021/09/05/mev-synthetix.html)

**清算机器人实战：**

[https://github.com/haydenshively/New-Bedford](https://github.com/haydenshively/New-Bedford)

**Rari清算机器人:**

[https://github.com/Rari-Capital/fuse-liquidator-bot](https://github.com/Rari-Capital/fuse-liquidator-bot)

**Flashbot的套利机器人入门:**

[https://github.com/flashbots/simple-arbitrage](https://github.com/flashbots/simple-arbitrage)

最优Gas费竞价 PGAs
-------------

最优gas费竞价发生在当两个科学家发现了同样的MEV机会时，争先提高gas来争夺这个机会。PGA在以太坊MEV早期很常见，常常是导致链上拥堵的罪魁祸首。Flashbots的出现改变了这一局面，但在其他新出现的EVM链上仍然有出现。

Flashbots
---------

**什么是Flashbots?**

[https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752)

Flashbots的出现带来了以太坊EVM策略的范式转移。当科学家发现链上套利机会，他们不会直接向以太坊网络公开发送交易，而是通过Flashbots，直接发给Flashbots；而Flashbots会将这些交易打包后，绕过p2p gossip协议流程，直接发送给矿工。

一些要点：

*   Flashbots能保证每个交易包(bundle)要么执行成功，要么完全不被执行。
    
*   科学家能在交易包中实现更细颗粒度的交易执行顺序控制。如果一个交易包包含A,B,C三笔交易，那么就会按A,B,C的顺序执行。如果有任意一个交易被revert，那么A,B,C三笔交易都不会记录在区块链上。
    
*   任何有效的交易（符合规则，并已签名的交易）都可以被包含在交易包中。三明治攻击机器人会确保在目标交易前后执行攻击交易，准确夹击。
    
*   科学家可以明确在哪个block执行交易，如N+1, N+2。
    
*   如果两个交易包有冲突（同样交易内容，让其中一个revert），交易包会按最高有效合约价格来执行 \*[_highest effective gas price will execute._](https://docs.flashbots.net/flashbots-auction/searchers/advanced/bundle-pricing)
    

阅读更多:

[https://docs.flashbots.net/](https://docs.flashbots.net/)

[https://github.com/flashbots](https://github.com/flashbots)

智能合约&开发工具Smart Contracts / Dev Tooling
--------------------------------------

如果你理解了flashbots的文档，就不难发现其实gas效率(gas efficiency)是抢得机会的关键。单纯地调用Uniswap路由合约是不可能获得一个三明治攻击机会的，因为这个太消耗gas，无法和其他高度优化的机器人竞争。战场上幸存下来的MEV的智能合约一定是高度简洁有效，一切都为了gas效率服务。

一些思考:

*   任何能在链下完成的计算都需要在链下完成
    
*   需要移除任何冗余变量，多用msg.value, msg.sender去获取额外信息，把calldata精简至不能再精简
    
*   要跟尽量少的合约交互。比如不要用Uniswap的路由合约，而是直接调用swap()方法。
    
*   永远不要用storage，永远都要从memory和calldata中获取变量，因为storage读写会需要消耗更多的gas，而且没必要。
    

看最新的flashbots交易包:

[https://flashbots-explorer.marto.lol/](https://flashbots-explorer.marto.lol/)

一些活跃的MEV机器人

[https://etherscan.io/accounts/label/mev-bot](https://etherscan.io/accounts/label/mev-bot)

MEV相关机会:

[https://github.com/flashbots/mev-job-board](https://github.com/flashbots/mev-job-board)

解码和分析交易:

[https://etherscan.io/](https://etherscan.io/)

[https://ethtx.info/](https://ethtx.info/)

Web3后端框架:

[https://github.com/ethereum/web3.py](https://github.com/ethereum/web3.py)

[https://github.com/ChainSafe/web3.js](https://github.com/ChainSafe/web3.js)

[https://github.com/gakonst/ethers-rs](https://github.com/gakonst/ethers-rs)

### 合约测试!

**主流 (Dapps开发常用):**

[https://eth-brownie.readthedocs.io/en/stable](https://eth-brownie.readthedocs.io/en/stable)

[https://hardhat.org/](https://hardhat.org/)

### 运行一个以太坊节点

Flashbot 版本使用最多:

[https://github.com/flashbots/mev-geth](https://github.com/flashbots/mev-geth)

Erigon, 能本地储存整个链上数据:

[https://github.com/ledgerwatch/erigon](https://github.com/ledgerwatch/erigon)

脚本监测:

[https://github.com/tmux/tmux](https://github.com/tmux/tmux)

[https://github.com/tmuxinator/tmuxinator](https://github.com/tmuxinator/tmuxinator)

### 博弈论 / 社媒调性 / 安全

Flashbots Discord:

[https://discord.com/invite/7hvTycdNcK](https://discord.com/invite/7hvTycdNcK)

如果你真的是想自己构建一个MEV机器人，加入Flashbots的Discord，花一天时间来看历史消息，我保证你所有想问的问题以前都被人解答过。

在科学家中的社交动能非常有趣而且独特，像是在无情逆境中大家友善地手握着手。

一些基本情况:

*   **每个人都在尝试偷走你的钱**
    
*   真的是“每个人”
    
*   如果你写了一个有问题的智能合约，或者部署了一个有问题的策略，并把钱转进去了，很快会有人把钱“取走”。
    
*   [https://github.com/Defi-Cartel/salmonella](https://github.com/Defi-Cartel/salmonella)
    
*   [https://twitter.com/bertcmiller/status/1381296074086830091](https://twitter.com/bertcmiller/status/1381296074086830091)
    
*   [https://twitter.com/bertcmiller/status/1446416008709918732](https://twitter.com/bertcmiller/status/1446416008709918732)
    
*   [https://twitter.com/qiushui777/status/1450656352292925441](https://twitter.com/qiushui777/status/1450656352292925441)
    
*   有钱的科学家在取走你的前后会给你转回来
    
*   亲身经历，当我的智能合约被洗劫( [in this attack](https://twitter.com/bertcmiller/status/1443531579683442692)) ，这个攻击者联系了我并还了我一部分钱
    
*   [https://twitter.com/bertcmiller/status/1448063805695696902](https://twitter.com/bertcmiller/status/1448063805695696902)
    
*   很多时候，智能合约出问题是因为大家都挤破头在尝试gas最优化的方案
    
*   如果有人leak alpha，会被其他人骂。因为winner takes all，没有共享的空间
    
*   Crypto Twitter（特别是MEV细分领域，不是degen庞氏领域）是跟上开发动态的最好方式。一些优质账号可fo [https://twitter.com/0xmebius/following](https://twitter.com/0xmebius/following)
    
*   Just a good read:
    
    [https://twitter.com/bertcmiller/status/1402665992422047747?ref\_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1402665992422047747%7Ctwgr%5E%7Ctwcon%5Es1\_c10&ref\_url=https%3A%2F%2Fcalblockchain.mirror.xyz%2Fc56CHOu-Wow\_50qPp2Wlg0rhUvdz1HLbGSUWlB\_KX9o](https://twitter.com/bertcmiller/status/1402665992422047747?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1402665992422047747%7Ctwgr%5E%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fcalblockchain.mirror.xyz%2Fc56CHOu-Wow_50qPp2Wlg0rhUvdz1HLbGSUWlB_KX9o)
    

Alpha Leaks
-----------

是时候分享一些秘密了，一些其他地方很难找到的干货:

### ERC-20 Hacks

*   如果你尝试转账ERC-20代币，只要在智能合约中留有余额并调用transfer()方法。用外部钱包先approve，再transferFrom没多少用，也不会更安全。
    
*   当你的智能合约执行ERC-20代币转账，永远要留1单位的最小小数点代币在余额里。这会让你下次跟这个代币交互时省一点gas
    

### Uniswap Hacks

*   n角套利中调用swap()时，把to字段设置成下个交易对的地址，能省去从你的合约到下个交易对的转入过程。
    

### Calldata Hacks

*   假设你需要在智能合约中需要8458这个数字，与其在方法参数中多一个变量储存这个数字，不如在调用这个合约的时候发送8458wei，这样你就可以在msg.value中获取8458。
    
*   精简calldata。通常每个calldata中的argument都会被[abiEncode function](https://docs.soliditylang.org/en/v0.5.3/abi-spec.html)加上前置0s，你就会获得一个有很多无用0的calldata。每个额外的字节都会消耗gas。如果你能使用汇编语言手动切割calldata，就可以跳过solidity的标准abi解码器。
    

[https://gist.github.com/0xmebius/f161abff38b88c9005db31d47e39bbe0](https://gist.github.com/0xmebius/f161abff38b88c9005db31d47e39bbe0)

### 前置 0s

*   有发现一些MEV bots地址有很多前置0吗？0 byte calldata会比非0 calldata省gas
    
*   [https://medium.com/coinmonks/on-efficient-ethereum-addresses-3fef0596e263](https://medium.com/coinmonks/on-efficient-ethereum-addresses-3fef0596e263)
    
*   [https://ethereum.stackexchange.com/questions/101311/how-much-gas-do-0x00000000-addresses-and-0x00000000-methods-really-save](https://ethereum.stackexchange.com/questions/101311/how-much-gas-do-0x00000000-addresses-and-0x00000000-methods-really-save)
    
*   我的前置0地址生成器:
    

[https://github.com/johguse/profanity](https://github.com/johguse/profanity)

*   另一个前置0 hack。当你定义一个方法foo(uint x)，这个方法的签名(交易calldata的前4个byte是去选择调用的方法)会是Keccka-256对foo(uint x)hash后的的前4个bytes。你可以穷尽方法名，让Keccak256(FUNCTIONNAME(uint x))\[:4\] == 0x0000。这样能省gas，毕竟0 byte calldata会比非0 calldata省一丢丢。
    

[https://github.com/fxfactorial/cheap-name-](https://github.com/fxfactorial/cheap-name-)

### 短命合约

*   为什么一些顶级的MEV机器人(like [this](https://etherscan.io/address/0x00000000b7ca7e12dcc72290d1fe47b2ef14c607))会被打上ReInit标签？
    

![](https://storage.googleapis.com/papyrus_images/3f264010db05ff4fc61134f2cdb137d000b0dcfd85111fd1e8d52d5db029dcd7.jpg)

*   你知道智能合约如果通过某种方式部署，是可以改变其内容的吗？没有proxies，没有delegatecalls，就是一个纯纯的可编辑合约
    
*   为什么有人会选择去编辑一个已部署的合约而不是重新部署一个新合约?
    
*   如果你已经有了很多ERC-20的代币余额，就可以继续享受gas减免
    
*   如果你已经有了一个前置很多0的智能合约，就可以继续享受gas减免
    
*   利用两个底层的操作，CREATE2 and SELFDESTRUCT, 你可以部署合约，自毁，并重新部署到完全一样的地址
    
*   看看libevm说这个是怎么实现的
    

[https://twitter.com/libevm/status/1468390867996086275?ref\_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1468390867996086275%7Ctwgr%5E%7Ctwcon%5Es1\_c10&ref\_url=https%3A%2F%2Fcalblockchain.mirror.xyz%2Fc56CHOu-Wow\_50qPp2Wlg0rhUvdz1HLbGSUWlB\_KX9o](https://twitter.com/libevm/status/1468390867996086275?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1468390867996086275%7Ctwgr%5E%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fcalblockchain.mirror.xyz%2Fc56CHOu-Wow_50qPp2Wlg0rhUvdz1HLbGSUWlB_KX9o)

*   这是其中一种部署合约的方式 (credit: [@cupidhack](https://twitter.com/cupidhack)):
    

![](https://storage.googleapis.com/papyrus_images/a355b12405ed8225a829df3b623b46a7251fb457194523d5f4b8d75e63bf2053.png)

*   这是实现方式:
    

[https://github.com/0age/metamorphic](https://github.com/0age/metamorphic)

[https://github.com/johguse/ERADICATE2](https://github.com/johguse/ERADICATE2)

### 获取信息

*   每小时从flashbots explorer获取MEV机会
    
*   通过multicall合约执行链上问询:
    
    [https://github.com/indexed-finance/multicall](https://github.com/indexed-finance/multicall)
    
    *   如果你想获得链上的储存口子, 使用 [geth’s graphql endpoint](https://eips.ethereum.org/EIPS/eip-1767)
        
    *   启发来自 [@libevm](https://twitter.com/libevm): [https://twitter.com/libevm/status/1467376978697211904](https://twitter.com/libevm/status/1467376978697211904)
        

### 闪电贷和Multicall

*   研究到一定程度你会发现有些MEV策略需要模块化
    
*   举个例子，一个普通的套利策略可能需要在不同交易对中执行2-N次的交易来套利。你可以为每次交易写N-1个方法。但是如果某个交易对的方法名称不同，比如正常是用swap()，但这个交易方法是swapToken()，这是你就需要写个不同的方法来执行这笔交易，导致代码冗余，合约部署的gas费升高。
    
*   这时候multicall合约就有用了:
    
    [https://github.com/makerdao/multicall](https://github.com/makerdao/multicall)
    
*   这时候也需要复习一下什么是delegate call和call:
    
    [https://ethereum.stackexchange.com/questions/3667/difference-between-call-callcode-and-delegatecall](https://ethereum.stackexchange.com/questions/3667/difference-between-call-callcode-and-delegatecall)
    
*   闪电贷的提供方一般都会在闪电贷之后调用一个回调函数，函数名称根据项目名称略有不同
    
    For [Uniswap V2](https://docs.uniswap.org/protocol/V2/guides/smart-contract-integration/using-flash-swaps) :
    

![](https://storage.googleapis.com/papyrus_images/db8a6e338ba98bcfef54b26fae1cd278e8c1f64e790ef7592db66bb4175f31c5.png)

For [Uniswap V3](https://docs.uniswap.org/protocol/guides/flash-integrations/flash-callback) :

![](https://storage.googleapis.com/papyrus_images/2b87832663de8b837780d4b5f64a152104bf7894af33b6bb139e7678505d329d.png)

For [AAVE](https://docs.aave.com/developers/guides/flash-loans) :

![](https://storage.googleapis.com/papyrus_images/0f8198e7c44616ff93277e2f26e67c49336338a899029ca7052655f6c8622231.png)

这三个不同的方法基本都是相同的逻辑，对于你的multicall合约来说只是3不同的selectors选择器，但者破坏了合约的模块化。这是我们就可以把所有的闪电贷逻辑用到[fallback function](https://docs.soliditylang.org/en/v0.6.2/contracts.html#fallback-function)里。但这样做会有一些安全性问题，留给读者自己去找解决办法啦 :)

Rust 学习:
--------

Rust是一个性能很好的编程语言，不仅在MEV社区，而且在软件开发行业也逐渐有了热度。Rust提供了高速的底层交互，而且你不用担心memory allocation和garbage collection问题。一些高性能链像solana, Polkadot, Avalanche都用Rust作为他们的智能合约编程语言。

**阅读更多:**

[https://doc.rust-lang.org/stable/book/](https://doc.rust-lang.org/stable/book/)

**跟着案例学习:**

[https://doc.rust-lang.org/rust-by-example/hello.html](https://doc.rust-lang.org/rust-by-example/hello.html)

---

*Originally published on [degendisco.eth](https://paragraph.com/@degendisco/mev-0-1)*
